diff --git a/_app/immutable/chunks/31.DSOxMhdt.js b/_app/immutable/chunks/31.DSOxMhdt.js deleted file mode 100644 index cc858cc..0000000 --- a/_app/immutable/chunks/31.DSOxMhdt.js +++ /dev/null @@ -1,551 +0,0 @@ -import{r as Wn,s as gt,n as wt,c as On,A as Un,B as Nn,C as Rn,D as Qn,o as Bn,h as xe,b as Ae,I as Be}from"./scheduler.DK_yUdRf.js";import{l as mt,n as yt,S as vt,i as bt,e as o,A as jn,E as Vn,c as l,d as e,y as h,h as ct,g as t,u as xt,s as a,t as Xt,v as kt,f as s,a as jt,b as en,w as _t,j as tn,x as Ct,z as Jn,F as r,B as Zt,H as Rt,q as Qt}from"./index.BH5W4qoH.js";import{p as Kn}from"./stores.BM3ezKuT.js";import{b as Bt,w as Hn}from"./entry.D3evG2He.js";import{_ as Zn}from"./preload-helper.C1FmrZbK.js";function $n(y){return(y==null?void 0:y.length)!==void 0?y:Array.from(y)}function Va(y,n){mt(y,1,1,()=>{n.delete(y.key)})}function Ja(y,n,f,p,d,i,u,c,de,D,v,we){let q=y.length,x=i.length,ce=q;const L={};for(;ce--;)L[y[ce].key]=ce;const k=[],he=new Map,K=new Map,T=[];for(ce=x;ce--;){const ue=we(d,i,ce),j=f(ue);let S=u.get(j);S?T.push(()=>S.p(ue,n)):(S=D(j,ue),S.c()),he.set(j,k[ce]=S),j in L&&K.set(j,Math.abs(ce-L[j]))}const me=new Set,A=new Set;function C(ue){yt(ue,1),ue.m(c,v),u.set(ue.key,ue),v=ue.first,x--}for(;q&&x;){const ue=k[x-1],j=y[q-1],S=ue.key,Pe=j.key;ue===j?(v=ue.first,q--,x--):he.has(Pe)?!u.has(S)||me.has(S)?C(ue):A.has(Pe)?q--:K.get(S)>K.get(Pe)?(A.add(S),C(ue)):(me.add(Pe),q--):(de(j,u),q--)}for(;q--;){const ue=y[q];he.has(ue.key)||de(ue,u)}for(;x;)C(k[x-1]);return Wn(T),k}function St(y,n){const f={},p={},d={$$scope:1};let i=y.length;for(;i--;){const u=y[i],c=n[i];if(c){for(const de in u)de in c||(p[de]=1);for(const de in c)d[de]||(f[de]=c[de],d[de]=1);y[i]=c}else for(const de in u)d[de]=1}for(const u in p)u in f||(f[u]=void 0);return f}function Ve(y){return typeof y=="object"&&y!==null?y:{}}const Yn="https://www.spyder-ide.org/",Yt=Yn,Xn="Spyder",eo="The Python IDE that scientists and data analysts deserve",to="Designed by the community, for the community",Ka="Spyder Website Contributors",no="Get the ease of use of Jupyter along with many advanced features found in PyCharm and VSCode in a single programming environment",Za=`${Yt}assets/media/website_screenshot.png`,Ya=["Python","IDE","Spyder","Matplotlib","iPython","Jupyter","Science","Data-Science","Data-Analytics","Programming"],Xa="Welcome to Spyder's Blog",es=no,Ln="blog",oo="og",lo=`${Yt}assets/media/blog_screenshot.png`,ts=[[{text:"Download",href:`${Bt}/download/`,target:"_self"},{text:"About",href:`${Bt}/about/`,target:"_self"},{text:"Blog",href:`${Bt}/${Ln}/`,target:"_self"},{text:"Docs",href:"https://docs.spyder-ide.org/",target:"_blank"}]],ao={github:"https://github.com/spyder-ide/spyder",twitter:"https://twitter.com/spyder_ide",facebook:"https://www.facebook.com/SpyderIDE/",mastodon:"https://fosstodon.org/@Spyder",instagram:"https://instagram.com/spyderide",rss:`${Bt}/blog/feed.xml`},ns={title:eo,description:to},os={dark:`${Bt}/assets/media/screenshot_dark.webp`,light:`${Bt}/assets/media/screenshot_light.webp`},ls={highlight:!1,icon:"github",text:"Checkout on GitHub",href:"https://github.com/spyder-ide/spyder/"},as={windows:{x64:{name:"Windows 10+",link:"https://github.com/spyder-ide/spyder/releases/latest/download/Spyder-Windows-x86_64.exe"}},linux:{x64:{name:"Linux",link:"https://github.com/spyder-ide/spyder/releases/latest/download/Spyder-Linux-x86_64.sh"}},mac:{arm64:{name:"macOS 14.0+ (M1)",link:"https://github.com/spyder-ide/spyder/releases/latest/download/Spyder-macOS-arm64.pkg"},x64:{name:"macOS 12.0+ (Intel)",link:"https://github.com/spyder-ide/spyder/releases/latest/download/Spyder-macOS-x86_64.pkg"}}},ss="Connect with us on";function An(y){let n;return{c(){n=o("link"),this.h()},l(f){n=l(f,"LINK",{rel:!0,href:!0}),this.h()},h(){h(n,"rel","stylesheet"),h(n,"href",Bt+"/assets/vendor/prism/prism-nord.css")},m(f,p){t(f,n,p)},d(f){f&&e(n)}}}function so(y){let n,f,p,d,i,u,c,de,D,v,we,q,x,ce,L,k,he,K,T,me,A,C,ue,j,S,Pe,R,P,Le,H,b,ke,fe;document.title=n=y[1].title;let E=y[0]&&An();return{c(){f=o("meta"),d=o("meta"),u=o("meta"),de=o("link"),D=o("link"),v=o("meta"),we=o("meta"),q=o("meta"),ce=o("meta"),k=o("meta"),K=o("meta"),me=o("meta"),A=o("meta"),C=o("meta"),ue=o("meta"),j=o("meta"),S=o("meta"),R=o("meta"),Le=o("meta"),b=o("meta"),E&&E.c(),fe=jn(),this.h()},l($e){const se=Vn("svelte-ez8xnx",document.head);f=l(se,"META",{name:!0,content:!0}),d=l(se,"META",{name:!0,content:!0}),u=l(se,"META",{name:!0,content:!0}),de=l(se,"LINK",{rel:!0,href:!0}),D=l(se,"LINK",{rel:!0,type:!0,title:!0,href:!0}),v=l(se,"META",{property:!0,content:!0}),we=l(se,"META",{property:!0,content:!0}),q=l(se,"META",{property:!0,content:!0}),ce=l(se,"META",{property:!0,content:!0}),k=l(se,"META",{property:!0,content:!0}),K=l(se,"META",{property:!0,content:!0}),me=l(se,"META",{property:!0,content:!0}),A=l(se,"META",{property:!0,content:!0}),C=l(se,"META",{name:!0,content:!0}),ue=l(se,"META",{name:!0,content:!0}),j=l(se,"META",{name:!0,content:!0}),S=l(se,"META",{name:!0,content:!0}),R=l(se,"META",{name:!0,content:!0}),Le=l(se,"META",{name:!0,content:!0}),b=l(se,"META",{name:!0,content:!0}),E&&E.l(se),fe=jn(),se.forEach(e),this.h()},h(){h(f,"name","description"),h(f,"content",p=y[1].description),h(d,"name","keywords"),h(d,"content",i=y[1].keywords),h(u,"name","author"),h(u,"content",c=y[1].author),h(de,"rel","canonical"),h(de,"href",y[3]),h(D,"rel","alternate"),h(D,"type","application/rss+xml"),h(D,"title","Spyder's Blog"),h(D,"href",Yt+Ln+"/feed.xml"),h(v,"property","og:type"),h(v,"content","website"),h(we,"property","og:url"),h(we,"content",y[3]),h(q,"property","og:title"),h(q,"content",x=y[1].title),h(ce,"property","og:description"),h(ce,"content",L=y[1].description),h(k,"property","og:image"),h(k,"content",he=y[1].image),h(K,"property","og:image:secure_url"),h(K,"content",T=y[1].image),h(me,"property","og:locale"),h(me,"content","en_US"),h(A,"property","og:site_name"),h(A,"content","Spyder IDE"),h(C,"name","twitter:card"),h(C,"content","summary_large_image"),h(ue,"name","twitter:site"),h(ue,"content",y[2]),h(j,"name","twitter:creator"),h(j,"content",y[2]),h(S,"name","twitter:title"),h(S,"content",Pe=y[1].title),h(R,"name","twitter:description"),h(R,"content",P=y[1].description),h(Le,"name","twitter:image"),h(Le,"content",H=y[1].image),h(b,"name","twitter:image:alt"),h(b,"content",ke=y[1].title)},m($e,se){ct(document.head,f),ct(document.head,d),ct(document.head,u),ct(document.head,de),ct(document.head,D),ct(document.head,v),ct(document.head,we),ct(document.head,q),ct(document.head,ce),ct(document.head,k),ct(document.head,K),ct(document.head,me),ct(document.head,A),ct(document.head,C),ct(document.head,ue),ct(document.head,j),ct(document.head,S),ct(document.head,R),ct(document.head,Le),ct(document.head,b),E&&E.m(document.head,null),ct(document.head,fe)},p($e,[se]){se&2&&n!==(n=$e[1].title)&&(document.title=n),se&2&&p!==(p=$e[1].description)&&h(f,"content",p),se&2&&i!==(i=$e[1].keywords)&&h(d,"content",i),se&2&&c!==(c=$e[1].author)&&h(u,"content",c),se&2&&x!==(x=$e[1].title)&&h(q,"content",x),se&2&&L!==(L=$e[1].description)&&h(ce,"content",L),se&2&&he!==(he=$e[1].image)&&h(k,"content",he),se&2&&T!==(T=$e[1].image)&&h(K,"content",T),se&2&&Pe!==(Pe=$e[1].title)&&h(S,"content",Pe),se&2&&P!==(P=$e[1].description)&&h(R,"content",P),se&2&&H!==(H=$e[1].image)&&h(Le,"content",H),se&2&&ke!==(ke=$e[1].title)&&h(b,"content",ke),$e[0]?E||(E=An(),E.c(),E.m(fe.parentNode,fe)):E&&(E.d(1),E=null)},i:wt,o:wt,d($e){e(f),e(d),e(u),e(de),e(D),e(v),e(we),e(q),e(ce),e(k),e(K),e(me),e(A),e(C),e(ue),e(j),e(S),e(R),e(Le),e(b),E&&E.d($e),e(fe)}}}function io(y,n,f){let p;On(y,Fn,c=>f(1,p=c));const d=`@${ao.twitter.split("/").pop()}`,i=p.url.replace(/\/+$/,"");let{prism:u=!1}=n;return y.$$set=c=>{"prism"in c&&f(0,u=c.prism)},[u,p,d,i]}class ro extends vt{constructor(n){super(),bt(this,n,io,so,gt,{prism:0})}}function En(y,n,f){const p=y.slice();return p[2]=n[f],p}function zn(y){let n,f,p;return{c(){n=o("img"),this.h()},l(d){n=l(d,"IMG",{class:!0,src:!0,alt:!0}),this.h()},h(){h(n,"class","w-24 h-24 rounded-full object-cover"),xe(n.src,f=y[2].src)||h(n,"src",f),h(n,"alt",p=y[2].name)},m(d,i){t(d,n,i)},p(d,i){i&8&&!xe(n.src,f=d[2].src)&&h(n,"src",f),i&8&&p!==(p=d[2].name)&&h(n,"alt",p)},d(d){d&&e(n)}}}function Dn(y){let n,f,p,d=y[2].name+"",i,u,c=y[2].src&&zn(y);return{c(){n=o("div"),c&&c.c(),f=a(),p=o("div"),i=Xt(d),u=a(),this.h()},l(de){n=l(de,"DIV",{class:!0});var D=jt(n);c&&c.l(D),f=s(D),p=l(D,"DIV",{class:!0});var v=jt(p);i=en(v,d),v.forEach(e),u=s(D),D.forEach(e),this.h()},h(){h(p,"class","font-light text-center w-36"),h(n,"class","flex flex-col items-center gap-2")},m(de,D){t(de,n,D),c&&c.m(n,null),ct(n,f),ct(n,p),ct(p,i),ct(n,u)},p(de,D){de[2].src?c?c.p(de,D):(c=zn(de),c.c(),c.m(n,f)):c&&(c.d(1),c=null),D&8&&d!==(d=de[2].name+"")&&tn(i,d)},d(de){de&&e(n),c&&c.d()}}}function uo(y){let n,f,p,d,i,u,c,de,D=qn(y[1])+"",v,we,q,x,ce,L,k;n=new ro({props:{prism:!0}});let he=$n(y[3]),K=[];for(let A=0;Af(9,p=he));let{$$slots:d={},$$scope:i}=n,{data:u}=n,{form:c}=n,{title:de}=n,{pub_date:D}=n,{author:v}=n,{tags:we}=n,{category:q}=n,{summary:x}=n,ce=[];const L=p.url.pathname.replace(`/${Ln}`,"").replaceAll("/",""),k=`${Yt}assets/${oo}/${L}.png`;return Bn(async()=>{const he=Array.isArray(v)?v:v?[v]:[];f(3,ce=await Ea(he))}),y.$$set=he=>{"data"in he&&f(4,u=he.data),"form"in he&&f(5,c=he.form),"title"in he&&f(0,de=he.title),"pub_date"in he&&f(1,D=he.pub_date),"author"in he&&f(2,v=he.author),"tags"in he&&f(6,we=he.tags),"category"in he&&f(7,q=he.category),"summary"in he&&f(8,x=he.summary),"$$scope"in he&&f(10,i=he.$$scope)},y.$$.update=()=>{y.$$.dirty&973&&Fn.setMetadata({title:`${Xn} | ${de}`,description:x,keywords:`${we}, ${q}`,author:ce.map(he=>he.name).join(", ")||v||"",url:p.url.href,image:k||lo})},[de,D,v,ce,u,c,we,q,x,p,i,d]}class Tt extends vt{constructor(n){super(),bt(this,n,ho,uo,gt,{data:4,form:5,title:0,pub_date:1,author:2,tags:6,category:7,summary:8})}}function po(y){let n,f=`STX Next, one of Europe’s largest Python development companies, has shared with us how Spyder has been a powerful tool for them when performing data analysis. -It is a pleasure for us on the Spyder team to work every day to improve the workflow of developers, scientists, engineers and data analysts. -We are very glad to receive and share a STX Next testimonial about Spyder, along with an interview with one of their developers, Michael Wiśniewski, who has found Spyder very useful in his job.`,p,d,i,u,c,de="What Michael Wiśniewski says about Spyder",D,v,we=`In an era of a continuously growing demand for analysis of vast amounts of data, we are facing increasingly complex tasks to perform. -Sure, we are not alone—there are many great tools designed for scientists and data analysts. -We have NumPy, SciPy, Matplotlib, Pandas, and others. -But, wouldn’t it be nice to have one extra tool that could combine all the required packages into one compact working environment? Asking this question is precisely how my journey with Spyder began.`,q,x,ce=`In my opinion, Spyder is the go-to-solution that helps to speed up the data analysis processes. -For me, the biggest strength of this IDE is that it has all the benefits of Matlab/RStudio and makes them available to the Pythonista community. -It provides us with an easy-to-organize workspace that accommodates code, visualizations and shell in just one window. -Besides, the pane called variable explorer allows direct access to all data placed in the memory.`,L,k,he=`Another cool feature is the tool’s integration with Jupyter notebooks. -Just open and browse different notebooks without thinking about server-side and file paths. -Want to run a single line of code or quickly check a chart update? IPython is on board and ready by default.`,K,T,me="Michael Wiśniewski’s interview",A,C,ue,j,S,Pe=`I’m Michael Wiśniewski and I’ve been working at STX Next as a full-stack developer for over a year. -During this time, I was involved in various projects from many different areas—from typical web applications where I used Python and JavaScript to implementing ML solutions for image recognition on the nVidia Jetson platform. -After hours, my colleagues and I run a machine learning community of practice. Today, I’d like to share my thoughts on using Spyder.`,R,P,Le="How long have you been using Spyder?",H,b,ke="I discovered Spyder around a year ago, at the time it was transitioning from version 3 to the current one.",fe,E,$e="How many people in your company use Spyder?",se,ee,qe=`In my department, three of my colleagues use Spyder on a daily basis. -Some of them use it for commercial projects, while others use it for personal research. -The number is growing, since most people try Spyder out after their first contact with it.`,Z,O,We="What kind of projects have you done using Spyder?",J,Q,Ue=`I’ve found applications for Spyder in many different areas. -One time, I used it for a project that relied on machine learning algorithms to assess risk based on documents provided by a user. -Since Spyder aggregates out-of-the-box the most popular scientific Python packages, it was used during the whole development process, from data pre-processing and visualization to assessment of the final solution.`,ve,ie,Je=`Another time, Spyder proved to be very helpful in a project involving the analysis of ancient religious texts. -The task was to create a script that would check file integrity and the correctness of the texts themselves. -Because of the large size of the data sets, the script had to be efficient and able to handle a lot of edge cases. -A built-in ipdb debugger and script profiler (together with the Spyder-memory-profiler plugin) was very helpful in achieving this goal.`,Ce,oe,Re=`To me, this IDE is also a great tool for conducting workshops. -The ability to discuss algorithms while visualizing their results in a separate plot panel, without the need to switch windows, greatly facilitates presentations.`,Se,le,Qe="What are the Spyder features that you like the most?",_,M,Ye=`One of my personal favorites is the Variable Explorer and its integration withJupyter notebooks through the Spyder-notebook plugin. -I also greatly appreciate the way that plugin automatically handles Jupyter server management.`,V,Y,Xe="Integration with Kite is also a great feature that makes it easier to use dozens of packages without the need to memorize all their methods and dependencies.",X,te,et="I also highly enjoy the ability to manage Spyder’s window layouts, especially when using large/many displays.",De,ge,tt="How does Spyder make your workflow better?",Ge,ye,nt=`The possibility to work on code, track its performance, debug it, and analyze visualized data at the same time is invaluable. -It saves time and helps me to stay focused longer.`,B,ne,ot=`The great thing about Spyder is that it allows you to compare several solutions side by side. -We can easily test several sets of given parameter values and examine how that affects a given function by observing charts.`,Oe,Te,lt=`Interactive window tools often simplify and speed up code analysis. -For example, checking class inheritance via the new object explorer is clearer and immediately gives more information than when doing it through the editor.`,Fe,_e,at="What features would you like to see in the future in Spyder?",F,ae,it=`Possibly further integration with Git services would be a good idea. -Personally, I like to use Git directly from the Spyder-terminal plugin together with the Gitk repository browser. -However, many users prefer to have some features like comparing file versions, conflict solving, and auto update changes to the repository built into the IDE.`,U,re,dt="Closing remarks",Ke,Ee,rt=`We would like to thank Michael Wiśniewski, Milosz Galganek and all the STX Next team for sharing their experiences with Spyder. -It is very important for us to provide a scientific tool that can make a positive impact on the amazing work our users are doing, and Michael’s testimony gives us great insight on how Spyder is making a difference in the real world and how to make it better for the future.`,Ze,ze,st=`If you have your own stories about how Spyder is helping you with a cool programming project, conduct critical scientific research, or use data to improve your community, we’d love to feature it here! -Feel free to reach out to us on Github, Gitter, Twitter, Facebook or our other platforms linked below if you’re interested. -We’re looking forward to hearing about what Spyder means to you! Happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("img"),u=a(),c=o("h2"),c.textContent=de,D=a(),v=o("p"),v.textContent=we,q=a(),x=o("p"),x.textContent=ce,L=a(),k=o("p"),k.textContent=he,K=a(),T=o("h2"),T.textContent=me,A=a(),C=o("img"),j=a(),S=o("p"),S.innerHTML=Pe,R=a(),P=o("h3"),P.innerHTML=Le,H=a(),b=o("p"),b.textContent=ke,fe=a(),E=o("h3"),E.innerHTML=$e,se=a(),ee=o("p"),ee.textContent=qe,Z=a(),O=o("h3"),O.innerHTML=We,J=a(),Q=o("p"),Q.innerHTML=Ue,ve=a(),ie=o("p"),ie.textContent=Je,Ce=a(),oe=o("p"),oe.textContent=Re,Se=a(),le=o("h3"),le.innerHTML=Qe,_=a(),M=o("p"),M.textContent=Ye,V=a(),Y=o("p"),Y.textContent=Xe,X=a(),te=o("p"),te.textContent=et,De=a(),ge=o("h3"),ge.innerHTML=tt,Ge=a(),ye=o("p"),ye.textContent=nt,B=a(),ne=o("p"),ne.textContent=ot,Oe=a(),Te=o("p"),Te.textContent=lt,Fe=a(),_e=o("h3"),_e.innerHTML=at,F=a(),ae=o("p"),ae.textContent=it,U=a(),re=o("h2"),re.textContent=dt,Ke=a(),Ee=o("p"),Ee.textContent=rt,Ze=a(),ze=o("p"),ze.innerHTML=st,this.h()},l(g){n=l(g,"P",{"data-svelte-h":!0}),r(n)!=="svelte-kews3d"&&(n.innerHTML=f),p=s(g),d=l(g,"IMG",{src:!0,alt:!0}),u=s(g),c=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-fds9bo"&&(c.textContent=de),D=s(g),v=l(g,"P",{"data-svelte-h":!0}),r(v)!=="svelte-tls944"&&(v.textContent=we),q=s(g),x=l(g,"P",{"data-svelte-h":!0}),r(x)!=="svelte-11gdkg3"&&(x.textContent=ce),L=s(g),k=l(g,"P",{"data-svelte-h":!0}),r(k)!=="svelte-f7p1p0"&&(k.textContent=he),K=s(g),T=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-tyqqpr"&&(T.textContent=me),A=s(g),C=l(g,"IMG",{src:!0,alt:!0,style:!0}),j=s(g),S=l(g,"P",{"data-svelte-h":!0}),r(S)!=="svelte-r3tlcv"&&(S.innerHTML=Pe),R=s(g),P=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-1u0qnka"&&(P.innerHTML=Le),H=s(g),b=l(g,"P",{"data-svelte-h":!0}),r(b)!=="svelte-kb9g40"&&(b.textContent=ke),fe=s(g),E=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-3h0xdv"&&(E.innerHTML=$e),se=s(g),ee=l(g,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-1ftru3t"&&(ee.textContent=qe),Z=s(g),O=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(O)!=="svelte-qx6ucj"&&(O.innerHTML=We),J=s(g),Q=l(g,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-fxaik2"&&(Q.innerHTML=Ue),ve=s(g),ie=l(g,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-1nrra0"&&(ie.textContent=Je),Ce=s(g),oe=l(g,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-zabeqe"&&(oe.textContent=Re),Se=s(g),le=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(le)!=="svelte-15n1h4"&&(le.innerHTML=Qe),_=s(g),M=l(g,"P",{"data-svelte-h":!0}),r(M)!=="svelte-18chqp3"&&(M.textContent=Ye),V=s(g),Y=l(g,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1govvtq"&&(Y.textContent=Xe),X=s(g),te=l(g,"P",{"data-svelte-h":!0}),r(te)!=="svelte-1gpnatq"&&(te.textContent=et),De=s(g),ge=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(ge)!=="svelte-t88324"&&(ge.innerHTML=tt),Ge=s(g),ye=l(g,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-ql0rbr"&&(ye.textContent=nt),B=s(g),ne=l(g,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1g3s3gx"&&(ne.textContent=ot),Oe=s(g),Te=l(g,"P",{"data-svelte-h":!0}),r(Te)!=="svelte-xt4eh4"&&(Te.textContent=lt),Fe=s(g),_e=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(_e)!=="svelte-of4y7"&&(_e.innerHTML=at),F=s(g),ae=l(g,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-yme7yj"&&(ae.textContent=it),U=s(g),re=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(re)!=="svelte-1mvchr8"&&(re.textContent=dt),Ke=s(g),Ee=l(g,"P",{"data-svelte-h":!0}),r(Ee)!=="svelte-p7lgn8"&&(Ee.textContent=rt),Ze=s(g),ze=l(g,"P",{"data-svelte-h":!0}),r(ze)!=="svelte-iukeoi"&&(ze.innerHTML=st),this.h()},h(){xe(d.src,i="stxnext.jpg")||h(d,"src",i),h(d,"alt","The Company"),h(c,"class","section"),h(T,"class","section"),xe(C.src,ue="profile.png")||h(C,"src",ue),h(C,"alt","Michael Wiśniewski"),Zt(C,"margin-top","0.5em"),Zt(C,"width","200px"),Zt(C,"margin-right","1em"),Zt(C,"float","left"),h(P,"class","subsection"),h(E,"class","subsection"),h(O,"class","subsection"),h(le,"class","subsection"),h(ge,"class","subsection"),h(_e,"class","subsection"),h(re,"class","section")},m(g,$){t(g,n,$),t(g,p,$),t(g,d,$),t(g,u,$),t(g,c,$),t(g,D,$),t(g,v,$),t(g,q,$),t(g,x,$),t(g,L,$),t(g,k,$),t(g,K,$),t(g,T,$),t(g,A,$),t(g,C,$),t(g,j,$),t(g,S,$),t(g,R,$),t(g,P,$),t(g,H,$),t(g,b,$),t(g,fe,$),t(g,E,$),t(g,se,$),t(g,ee,$),t(g,Z,$),t(g,O,$),t(g,J,$),t(g,Q,$),t(g,ve,$),t(g,ie,$),t(g,Ce,$),t(g,oe,$),t(g,Se,$),t(g,le,$),t(g,_,$),t(g,M,$),t(g,V,$),t(g,Y,$),t(g,X,$),t(g,te,$),t(g,De,$),t(g,ge,$),t(g,Ge,$),t(g,ye,$),t(g,B,$),t(g,ne,$),t(g,Oe,$),t(g,Te,$),t(g,Fe,$),t(g,_e,$),t(g,F,$),t(g,ae,$),t(g,U,$),t(g,re,$),t(g,Ke,$),t(g,Ee,$),t(g,Ze,$),t(g,ze,$)},p:wt,d(g){g&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae),e(U),e(re),e(Ke),e(Ee),e(Ze),e(ze))}}}function co(y){let n,f;const p=[y[0],nn];let d={$$slots:{default:[po]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let mo=class extends vt{constructor(n){super(),bt(this,n,fo,co,gt,{})}};const yo=Object.freeze(Object.defineProperty({__proto__:null,default:mo,metadata:nn},Symbol.toStringTag,{value:"Module"}));function wo(y){let n,f=`For the last several years, Spyder has offered standalone installers for Windows and macOS which isolate Spyder’s runtime environment from users’ development environments. -This provides a more stable user experience than traditional conda or pip installation methods. -However, these standalone installers did not allow implementing desirable features, such as automatic incremental updates or installing external Spyder plugins like Spyder-Notebook and Spyder-Unittest. -Additionally, these standalone applications were limited to Windows and macOS.`,p,d,i=`Our new installers will provide a more consistent experience for users across all platforms, including Linux, while maintaining the benefits of an isolated runtime environment for Spyder. -Additionally, they are fully compatible with incremental updates and external plugin management. -Look for future announcements about these and other features!`,u,c,de=`So, what will you see with these new installers? -If you are a Windows user, you will continue to have a graphical interface guiding you through the installation process, and will likely not notice any difference from the previous experience.`,D,v,we,q,x,ce=`If you are a macOS user, you will now have a .pkg package installer instead of a .dmg disk image. -Rather than drag-and-drop the application to the Applications folder, the .pkg installer provides a graphical interface that will guide you through the installation process with more flexibility.`,L,k,he,K,T,me=`If you are a Linux user, you will have an interactive shell script guiding you through the installation process. -This ensures it is compatible with as many distributions and desktop environments as possible.`,A,C,ue,j,S,Pe=`In all cases, you will not need to have Anaconda installed, nor do you need an existing Python environment; in fact, you don’t even need a preexisting Python installation! -These installers are completely self-contained. -Spyder will continue to include popular packages such as NumPy, SciPy, Pandas and Matplotlib so you can start coding out-of-the-box. -However, you will still be able to use Spyder with your existing conda, venv, Python.org, and other Python installers and environments as before. -Furthermore, only Spyder and its critical dependencies will be updated on each new release, which will make getting the latest version a lean and frictionless process.`,R,P,Le="The Spyder team is really excited about these new installers and the new features they will make possible, and we hope you enjoy them too!";return{c(){n=o("p"),n.textContent=f,p=a(),d=o("p"),d.textContent=i,u=a(),c=o("p"),c.textContent=de,D=a(),v=o("img"),q=a(),x=o("p"),x.innerHTML=ce,L=a(),k=o("img"),K=a(),T=o("p"),T.textContent=me,A=a(),C=o("img"),j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("p"),P.textContent=Le,this.h()},l(H){n=l(H,"P",{"data-svelte-h":!0}),r(n)!=="svelte-17k8m9n"&&(n.textContent=f),p=s(H),d=l(H,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1xb2iod"&&(d.textContent=i),u=s(H),c=l(H,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1hp8xla"&&(c.textContent=de),D=s(H),v=l(H,"IMG",{src:!0,alt:!0}),q=s(H),x=l(H,"P",{"data-svelte-h":!0}),r(x)!=="svelte-1gj7hcv"&&(x.innerHTML=ce),L=s(H),k=l(H,"IMG",{src:!0,alt:!0}),K=s(H),T=l(H,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1rk3wa0"&&(T.textContent=me),A=s(H),C=l(H,"IMG",{src:!0,alt:!0}),j=s(H),S=l(H,"P",{"data-svelte-h":!0}),r(S)!=="svelte-d1uzh2"&&(S.textContent=Pe),R=s(H),P=l(H,"P",{"data-svelte-h":!0}),r(P)!=="svelte-6951fz"&&(P.textContent=Le),this.h()},h(){xe(v.src,we="windows.png")||h(v,"src",we),h(v,"alt","Windows installer"),xe(k.src,he="macos.png")||h(k,"src",he),h(k,"alt","macOS installer"),xe(C.src,ue="linux.png")||h(C,"src",ue),h(C,"alt","Linux installer")},m(H,b){t(H,n,b),t(H,p,b),t(H,d,b),t(H,u,b),t(H,c,b),t(H,D,b),t(H,v,b),t(H,q,b),t(H,x,b),t(H,L,b),t(H,k,b),t(H,K,b),t(H,T,b),t(H,A,b),t(H,C,b),t(H,j,b),t(H,S,b),t(H,R,b),t(H,P,b)},p:wt,d(H){H&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P))}}}function go(y){let n,f;const p=[y[0],on];let d={$$slots:{default:[wo]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let bo=class extends vt{constructor(n){super(),bt(this,n,vo,go,gt,{})}};const xo=Object.freeze(Object.defineProperty({__proto__:null,default:bo,metadata:on},Symbol.toStringTag,{value:"Module"}));function ko(y){let n,f=`During the last few years, Spyder has positioned itself as a popular data science IDE by combining interactive computing and ease of use with robust programming tools. -However, limited remote development support compared to some other IDEs has hindered adoption, as many users would like to work with data and code on high performance computing (HPC) clusters or cloud providers like AWS, GCP or DigitalOcean while developing on their personal computers. Adding such features would open up many new research possibilities by enabling the scientific community to tackle data and compute-intensive programming tasks from the ease and efficiency of their local development environments. Thanks to a two-year grant from the Chan Zuckerberg Initiative, we will be now able to address this shortcoming.`,p,d,i=`Right now, users have two main options to work remotely using a local IDE (aside from a purely web browser-based approach, which is sometimes not available or desirable): -They can either edit and execute their files in a terminal, which is not user-friendly; or start their IDE on the server and display it locally, which is typically slow, resource-intensive and difficult to set up. Furthermore, scientists typically find it difficult to sync remote files to the local machine and version control their code on the remote one, so remote changes are often lost, out of sync or difficult to integrate with code developed locally.`,u,c,de=`To address this situation, we will add and enhance support for local Spyder installations to run code and sync files on remote servers and clusters. -The first step in that direction is to enhance the existing remote code execution features in Spyder, as the current workflow is error-prone and quite cumbersome. -It requires users to install the Spyder-Kernels package on the remote machine, manually start a kernel on it and provide the kernel connection file to the local machine.`,D,v,we,q,x,ce="Since Spyder does not currently have a way to identify and store state changes, users currently have to repeat this costly setup process if there are any configuration modifications on the remote machine. Our plan is to fully automate this procedure so that Spyder can start and connect to a remote kernel automatically, with the user only needing to provide their SSH credentials and specify the Python environment they want to use.",L,k,he='After that is implemented, we will add support to create and manage remote Python environments, explore the remote filesystem in the Files pane, and edit remote files in the Editor. This will make most of the core Spyder functionality work when developing code remotely. In addition, users will be able to easily start system shells connected to the server once we implement that capability in Spyder-Terminal. This will allow the remote execution of any operating system-level command or program, such as Git commit and push instructions.',K,T,me='Finally, we want to announce that we’re hiring for this project! We are looking for a Python developer with solid networking knowledge to help us implement the backend infrastructure that will power the features described above. This is a part time position to work as a contractor through NumFOCUS; it does not require experience with PyQt (although some would be beneficial) and it lasts until the end of the year, with the possibility to renew the contract for the next. Interested? Contact me to talk more about it!',A,C,ue="We hope you will be as thrilled as we are by this fantastic news, and are looking forward to sharing more with you on this project in the near future!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.textContent=i,u=a(),c=o("p"),c.textContent=de,D=a(),v=o("img"),q=a(),x=o("p"),x.textContent=ce,L=a(),k=o("p"),k.innerHTML=he,K=a(),T=o("p"),T.innerHTML=me,A=a(),C=o("p"),C.textContent=ue,this.h()},l(j){n=l(j,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1g1hb0u"&&(n.innerHTML=f),p=s(j),d=l(j,"P",{"data-svelte-h":!0}),r(d)!=="svelte-17bxxnw"&&(d.textContent=i),u=s(j),c=l(j,"P",{"data-svelte-h":!0}),r(c)!=="svelte-5icbhl"&&(c.textContent=de),D=s(j),v=l(j,"IMG",{src:!0,alt:!0}),q=s(j),x=l(j,"P",{"data-svelte-h":!0}),r(x)!=="svelte-11hbk73"&&(x.textContent=ce),L=s(j),k=l(j,"P",{"data-svelte-h":!0}),r(k)!=="svelte-16qirh4"&&(k.innerHTML=he),K=s(j),T=l(j,"P",{"data-svelte-h":!0}),r(T)!=="svelte-dehezw"&&(T.innerHTML=me),A=s(j),C=l(j,"P",{"data-svelte-h":!0}),r(C)!=="svelte-17tyvcv"&&(C.textContent=ue),this.h()},h(){xe(v.src,we="remote-kernel-connection.png")||h(v,"src",we),h(v,"alt","Dialog to create a connection to a remote kernel")},m(j,S){t(j,n,S),t(j,p,S),t(j,d,S),t(j,u,S),t(j,c,S),t(j,D,S),t(j,v,S),t(j,q,S),t(j,x,S),t(j,L,S),t(j,k,S),t(j,K,S),t(j,T,S),t(j,A,S),t(j,C,S)},p:wt,d(j){j&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C))}}}function _o(y){let n,f;const p=[y[0],ln];let d={$$slots:{default:[ko]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let So=class extends vt{constructor(n){super(),bt(this,n,Co,_o,gt,{})}};const To=Object.freeze(Object.defineProperty({__proto__:null,default:So,metadata:ln},Symbol.toStringTag,{value:"Module"}));function Po(y){let n,f,p,d,i=`The Spyder team hosted a Birds of a Feather (BoF) session, What do you want to see from your scientific IDE?, at SciPy 2024. -The focus was on users’ experiences, both positive and negative, with IDEs and other scientific interfaces, and how their developers (like us) can make them better for everyone. -We along with the community recorded collaborative notes from the meeting, which you’re welcome to check out for the full details! -Here, we’ll focus on summarizing the points raised at the session and our insights from them.`,u,c,de=`Around 40 people attended, comprising a diverse mix between interface/IDE developers, users and external stakeholders. -In a brief, informal survey of the room, many hands went up when asked how many people used VSCode, and about as many for Jupyter. Perhaps a half dozen to a dozen identified as Spyder users, and a handful mentioned other IDEs and platforms, such as RStudio, PyCharm and Emacs.`,D,v,we=`In addition to myself, attending the session we had Pierre Raybaut, the original creator of Spyder (who also gave a great talk on Spyder’s history and his current work), as well as another former Spyder developer. -What’s more, to our delight there were also multiple representatives from both Posit/RStudio and Jupyter, perhaps the two other best known and most used interfaces aimed specifically at scientists and engineers. -We were hoping to have the discussion focus more broadly on many different IDEs and tools and to have leaders from other communities present to give their input as well, and it certainly did not disappoint.`,q,x,ce="Generative AI in scientific research",L,k,he="Unsurprisingly given its recent surge in popularity in the programming world, generative AI, the challenges it faces and how and whether IDEs should offer it was a popular topic of discussion.",K,T,me=`Participants empathized that scientific coding is different from other forms of programming, and that the “Copilots of the world” may not help with the former. -Indeed, they would not necessarily be expected to assist with properly designing valid digital experiments, correctly implementing appropriate scientific algorithms, ensuring the analysis techniques used are valid for the data, and choosing appropriate metrics and statistics to interpret the results. -Rather, unless both specifically trained and high performing in these tasks, they may lull newer students or even veteran PIs into a false sense of security in code that ultimately outputs subtly invalid results, feeding the present reproducibility crisis.`,A,C,ue=`Attendees also commented that LLMs, particularly general-purpose examples like ChatGPT, generated code that breaks “a lot” when actually used. -This has also been the author’s experience, particularly with systems not specialized in actually generating correct, best-practice code, and is also supported by research in the literature. -In response to the question one participant posed to the room, as to whether there are any LLMs that work well out of the box for scientific programming, only silence was the answer.`,j,S,Pe=`However, it was also mentioned that specialized systems can be quite helpful, with a particularly high amount of interest in GitHub Copilot. -We mentioned that we are currently working with GitHub and others about a potential optional integration in Spyder, specialized for scientific tasks.`,R,P,Le=`One participant shared that their large scientific organization was very reticent to use Jupyter AI because it was effectively a blackbox, and they needed to be able to show where their code comes from. -They expressed the desire for an AI that generates citations, to help address this issue. -Responding to their question of whether others were interested in the same, attendees stated that they’d still need to go and verify the generated citation, and were unsure it would save them much time overall. -Another participant added that more so than citations for code, the most important thing AI would help with is tests that verify that the code does what it is supposed to do. -Others agreed, saying that AI tend to do much better iterating on existing code than writing brand new code, and recommended that people try asking LLMs to write tests for existing code and examining the results. -They also found that AIs tend to do much better on code that has proper variable names and literate structure, which is certainly a benefit to everyone but very much not always found in scientific scripts.`,H,b,ke="Overall, attitudes in the room toward LLMs and generative AI varied quite a bit, but there was a general consensus that while scientists were open to considering the technology as an aid, it had to be reasonably correct and verifiable, which is a rather difficult challenge for the current AI state of the art.",fe,E,$e="Interactive computation with diverse data types",se,ee,qe="Another common theme was a desire for scientific IDEs to allow users to visualize and interact with more of the diverse array of data types and structures used in scientific computation.",Z,O,We=`One participant in the geospatial field mentioned that interactivity with these data is limited with IDEs, and that they generally like notebooks but there are workflows where an IDE would be nice. -THey also expressed a desire for IDEs having native support for interactive map displays like in QGIS or ArcGIS rather than just static Matplolib images, which would make for more rapid prototyping.`,J,Q,Ue=`Another attendee shared their focus on using dataframes and other rich data structures backed by a database instead of instead of just plain CSVs, asking if IDEs can add a “database browser” instead of just a way to view a single Pandas table. -They described how their data lives in databases, possibly remote or in the cloud, rather than flat files on their filesystem, and have made this the norm at their institution. -Their solution supports any database type that pandas does, with the simplest interface to it, so it feels like a CSV file, and would like IDEs to support that workflow. -In response, an audience member following on Slack mentioned that Ibis covers a lot of territory for exploring tabular data in many different data storage backends, and this might be a path to database exploration in IDEs.`,ve,ie,Je=`Other participants shared their challenges when debugging large datasets, saying this led to slow stepping through the code (of around 30 seconds per step) when a very large variable needs to be refetched at every step. -This, they related, resulted from a lack of a facility to do “lazy data loading” in Python; everything needs a wrapper. -They’d like to see a streaming wrapper plugin that data types can implement lazy loading in, which could be then used in all IDEs and notebooks. -In response, other attendees mentioned that the main challenge here was creating a way to indicate to consumers that data is expensive to generate a repr, which is where the costs really come in.`,Ce,oe,Re=`Finally, a PyCharm user shared how the xarray/pandas data types and their extension systems and data accessors were all opaque to that IDE’s autocomplete, at least without further tagging or augmentation in the IDE or the code. -They expressed that to address this, IDEs should be better aware of extensions such as these. -Others, including ourselves, mentioned in response that using customizable LSP servers can help make editors better aware of extensible syntaxes like this, which is indeed what Spyder and other IDEs do (and the Spyder team maintains the de-facto standard pluggable Python implementation of).`,Se,le,Qe="While user needs here varied, there was a clear theme that users greatly value being able to interactively view, edit and analyze a diverse array of data types right within their IDE, as Spyder continues to particularly focus on.",_,M,Ye="Desktop vs web-based IDEs",V,Y,Xe="A popular point of discussion was the merits of desktop versus web-based interfaces and IDEs for science research, which saw some mixed opinions on the topic.",X,te,et=`Posing the question directly, we asked people to share their opinions on a web-based vs. desktop applications, and on a true desktop programs versus those just with a webview as a UI. -One participant stated that a web browser can help them be effective for collaboration, but may not be as useful for single-user situations as a native application would be. -Another had concerns with the usability of Zoom screen sharing, as sharing a desktop application just shared that application, while sharing a web-based IDE shared the user’s entire web browser. -A third suggested vscode.dev, which runs in a browser and which can be self-hosted, but stated that Python support is not “fully on par” with the desktop version. -A final point discussed was the possibility of running desktop IDEs inside a web-based container to improve security and ease of deployment, particularly using Python’s new WASM support.`,De,ge,tt=`On a related note, an attendee shared that they support a small statistics group, and their biggest challenge is helping students learn scientific computing. -They have a rather “rugged individualist culture”, and feel they need to learn how to share knowledge with others, asking the audience how they could accomplish that with IDEs. -This prompted others to relate how, where they work, platforms for accessing data require a lot of authentication. -This entails using JupyterHub as their default IDE/platform, with very little flexibility in the matter. -They would like a platform for other IDEs to be able to connect to a shared JupyterHub environment, which is exactly what we are working on for Spyder 6.1 and beyond.`,Ge,ye,nt="GPU compute integration",B,ne,ot=`One fairly specific topic that got a disproportionate amount of attention was incorporating better support for GPU computing (e.g. CUDA) within IDEs and interfaces, thanks to Nvidia representatives in the room posing the initial question. -They stated that Nvidia was “getting serious” about Python and CUDA, and they would love to “hear people’s gripes about developing GPU apps in Python, what tooling you use and what problems you face and how do you debug them”. -They also asked for people’s experiences working in Python together with native code (C++).`,Oe,Te,lt=`Responding first to the question on native code, one participant described how they had to compile a Fortran module and import it from Python. -They just used f2py and the workflow was already in there and worked: they’d change the native code, recompile and rinse and repeat. -However, they said it would be nice to offer a workflow to shorten that development loop. -It was mentioned that this was particularly a problem with two separate codebases, where changes in one can affect the other, which is difficult to conceptualize and work with the coupling between them. -The Nvidia representatives then asked them how they would like to have a debugger with the ability to step into their code from Python to Fortran but still able to inspect your variables on the Python side, to which they replied “Sounds awesome!“.`,Fe,_e,at=`Another attendee supervises a postdoc using a bunch of A100 GPUs, and asked the postdoc how he knew he was getting the most performance out of it. -The postdoc’s reply, which the attendee found rather telling, was that “PyTorch [just] runs”: it was painful enough for them to just get it running. so they were not particularly interested in spending even more time optimizing it further. -The participant now has new students doing JAX and expect the same thing to happen, since diving into hardware level optimization is something that students really won’t do and can be very intimidating. -They have students who don’t know how to use the 4 CPUs in their laptop, much less the GPUs in a supercomputer center. -When asked what they feel is the main problem causing this, such as documentation or tooling, the researcher replied it was courage on the student’s part to actually “go down there” and dig into the low-level code. -The postdoc clearly likes the platform and bought 40 new A100s, and is fine with the platform abstracting that for him. -However, the attendee expressed concern that this poses a real sociological challenge to get students used to using—much less optimizing—GPUs.`,F,ae,it=`Finally, it was asked what IDEs could do to make GPU workflows more convenient. -In reply, participants suggested better integration with NVSMI or an integrated dashboard of GPU usage, which would allow users to see that, for instance, a particular kernel crunching data is too big to use the full potential of the GPU. -The Nvidia folks mentioned that they do have a profiling tool that could potentially address some of those concerns, gives visibility on GPU utilization, bottlenecks and efficiency, and for interested folks to follow up with them directly. -In response to people asking about support for such tools in a VSCode extension, they shared that these tools have their own UI but could explore IDE integration. -They mentioned that tooling in Python tends to be “pretty thin” as users often don’t go looking for tools and use the ones that are there, whereas their profiler can be really intimidating and throws a lot of information at such users, potentially putting them off.`,U,re,dt=`All told, there was a surprising amount of interest and discussion around this once-niche topic, signaling that GPU computing has become something much closer to a mainstream need in the scientific space. -Thus, while the discussion is of course of most interest to GPU companies like Nvidia, it suggests an IDE plugin to support this profiling tooling and other GPU integration features might be of significant benefit to the wider user community.`,Ke,Ee,rt="Spyder feedback",Ze,ze,st=`While most of the discussion focused on topics applicable to broader categories of IDEs, there were a few specific bits of Spyder feedback. -In particular, attendees praised Spyder’s plotting functionality, though some expressed a preference for the non-default mode of displaying plots in separate windows over the Plots pane. -Others mentioned that the one killer feature for them that it was missing was multi-line editing, a common request over the years and something we plan to work on for forthcoming Spyder versions, along with support for collaborative editing.`,g,$,ht=`A particularly salient comment was one of the attendees’ request that “We need RStudio for Python”, with another replying that Spyder fills most of that gap. -Perhaps the main RStudio feature not built in is Quarto/RMarkdown, though we are currently exploring the possibility of helping develop a plugin supporting that. -Other comments, such as a desire for GitHub Copilot, better data exploration and visualization capabilities, and support for connecting to remote JupyterHub instances, are also features we already offer or are developing or exploring.`,ut,Ne,pt="Next steps",z,pe,ft=`Overall, the broader learnings gained here for IDE and interface developers were perhaps less in the detailed specifics of each comment, but rather the common themes users focused the most on. -Perhaps the least surprising was interest in generative AI, suggesting that IDE developers should continue to explore integration possibilities, but keeping a critical eye while doing so. -By contrast, the most surprising was the extensive discussion about GPU computing and how IDEs and tools can help with that, which seems to indicate that IDE plugins for assisting in this regard might be valuable.`,m,w,Ie=`Another area of user emphasis was the importance of interactive data exploration for a variety of formats and structures. -While a subset of such could be built into an IDE (as we have with Spyder’s Variable Explorer), given the diversity of scientific data types across fields this suggests the need for a more pluggable/extensible approach to variable exploration. -Finally, the consensus was unresolved on desktop versus web-based IDEs, though participants did identify a need for a common framework to connect local IDEs to remote platforms like JupyterHub. -To that end, we’re working to provide those facilities in Spyder 6.1, and could eventually be developed into such an common interface.`,Pt,Mt,$t=`Thanks to everyone for attending and sharing such great ideas and insights, and we look forward to continuing to learn from the community and hear more in the future. -And until then, as always, happy Spydering!`;return{c(){n=o("img"),p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("p"),c.textContent=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("h2"),x.textContent=ce,L=a(),k=o("p"),k.textContent=he,K=a(),T=o("p"),T.textContent=me,A=a(),C=o("p"),C.textContent=ue,j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("p"),P.textContent=Le,H=a(),b=o("p"),b.textContent=ke,fe=a(),E=o("h2"),E.textContent=$e,se=a(),ee=o("p"),ee.textContent=qe,Z=a(),O=o("p"),O.textContent=We,J=a(),Q=o("p"),Q.textContent=Ue,ve=a(),ie=o("p"),ie.innerHTML=Je,Ce=a(),oe=o("p"),oe.innerHTML=Re,Se=a(),le=o("p"),le.textContent=Qe,_=a(),M=o("h2"),M.textContent=Ye,V=a(),Y=o("p"),Y.textContent=Xe,X=a(),te=o("p"),te.innerHTML=et,De=a(),ge=o("p"),ge.textContent=tt,Ge=a(),ye=o("h2"),ye.textContent=nt,B=a(),ne=o("p"),ne.textContent=ot,Oe=a(),Te=o("p"),Te.innerHTML=lt,Fe=a(),_e=o("p"),_e.textContent=at,F=a(),ae=o("p"),ae.textContent=it,U=a(),re=o("p"),re.textContent=dt,Ke=a(),Ee=o("h2"),Ee.textContent=rt,Ze=a(),ze=o("p"),ze.textContent=st,g=a(),$=o("p"),$.textContent=ht,ut=a(),Ne=o("h2"),Ne.textContent=pt,z=a(),pe=o("p"),pe.textContent=ft,m=a(),w=o("p"),w.textContent=Ie,Pt=a(),Mt=o("p"),Mt.textContent=$t,this.h()},l(G){n=l(G,"IMG",{src:!0,alt:!0}),p=s(G),d=l(G,"P",{"data-svelte-h":!0}),r(d)!=="svelte-lu0ydx"&&(d.innerHTML=i),u=s(G),c=l(G,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1bc3olv"&&(c.textContent=de),D=s(G),v=l(G,"P",{"data-svelte-h":!0}),r(v)!=="svelte-3dovr9"&&(v.innerHTML=we),q=s(G),x=l(G,"H2",{class:!0,"data-svelte-h":!0}),r(x)!=="svelte-eielu3"&&(x.textContent=ce),L=s(G),k=l(G,"P",{"data-svelte-h":!0}),r(k)!=="svelte-n8xz0g"&&(k.textContent=he),K=s(G),T=l(G,"P",{"data-svelte-h":!0}),r(T)!=="svelte-16hm2os"&&(T.textContent=me),A=s(G),C=l(G,"P",{"data-svelte-h":!0}),r(C)!=="svelte-blg16k"&&(C.textContent=ue),j=s(G),S=l(G,"P",{"data-svelte-h":!0}),r(S)!=="svelte-akno4u"&&(S.textContent=Pe),R=s(G),P=l(G,"P",{"data-svelte-h":!0}),r(P)!=="svelte-1uh015v"&&(P.textContent=Le),H=s(G),b=l(G,"P",{"data-svelte-h":!0}),r(b)!=="svelte-5pud6u"&&(b.textContent=ke),fe=s(G),E=l(G,"H2",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-rw6uso"&&(E.textContent=$e),se=s(G),ee=l(G,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-ivcgfv"&&(ee.textContent=qe),Z=s(G),O=l(G,"P",{"data-svelte-h":!0}),r(O)!=="svelte-159wy01"&&(O.textContent=We),J=s(G),Q=l(G,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-1vmnk07"&&(Q.textContent=Ue),ve=s(G),ie=l(G,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-142f6na"&&(ie.innerHTML=Je),Ce=s(G),oe=l(G,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-inh8qo"&&(oe.innerHTML=Re),Se=s(G),le=l(G,"P",{"data-svelte-h":!0}),r(le)!=="svelte-19ni7j5"&&(le.textContent=Qe),_=s(G),M=l(G,"H2",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-137rydu"&&(M.textContent=Ye),V=s(G),Y=l(G,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1jpx7cl"&&(Y.textContent=Xe),X=s(G),te=l(G,"P",{"data-svelte-h":!0}),r(te)!=="svelte-1c4v8vo"&&(te.innerHTML=et),De=s(G),ge=l(G,"P",{"data-svelte-h":!0}),r(ge)!=="svelte-i91zzh"&&(ge.textContent=tt),Ge=s(G),ye=l(G,"H2",{class:!0,"data-svelte-h":!0}),r(ye)!=="svelte-1x703ch"&&(ye.textContent=nt),B=s(G),ne=l(G,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1onr3au"&&(ne.textContent=ot),Oe=s(G),Te=l(G,"P",{"data-svelte-h":!0}),r(Te)!=="svelte-f22fkw"&&(Te.innerHTML=lt),Fe=s(G),_e=l(G,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-g7zuo6"&&(_e.textContent=at),F=s(G),ae=l(G,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-1hk25dq"&&(ae.textContent=it),U=s(G),re=l(G,"P",{"data-svelte-h":!0}),r(re)!=="svelte-y1j6uc"&&(re.textContent=dt),Ke=s(G),Ee=l(G,"H2",{class:!0,"data-svelte-h":!0}),r(Ee)!=="svelte-zsclc2"&&(Ee.textContent=rt),Ze=s(G),ze=l(G,"P",{"data-svelte-h":!0}),r(ze)!=="svelte-19n26lb"&&(ze.textContent=st),g=s(G),$=l(G,"P",{"data-svelte-h":!0}),r($)!=="svelte-1u8ft65"&&($.textContent=ht),ut=s(G),Ne=l(G,"H2",{class:!0,"data-svelte-h":!0}),r(Ne)!=="svelte-18hazx0"&&(Ne.textContent=pt),z=s(G),pe=l(G,"P",{"data-svelte-h":!0}),r(pe)!=="svelte-dqx381"&&(pe.textContent=ft),m=s(G),w=l(G,"P",{"data-svelte-h":!0}),r(w)!=="svelte-10mksgn"&&(w.textContent=Ie),Pt=s(G),Mt=l(G,"P",{"data-svelte-h":!0}),r(Mt)!=="svelte-1etodbu"&&(Mt.textContent=$t),this.h()},h(){xe(n.src,f="scipy-2024-bof-ide-ui-ux.jpg")||h(n,"src",f),h(n,"alt","Photo of the Spyder BoF, showing a room full of attendees engaging with a moderator"),h(x,"class","section"),h(E,"class","section"),h(M,"class","section"),h(ye,"class","section"),h(Ee,"class","section"),h(Ne,"class","section")},m(G,je){t(G,n,je),t(G,p,je),t(G,d,je),t(G,u,je),t(G,c,je),t(G,D,je),t(G,v,je),t(G,q,je),t(G,x,je),t(G,L,je),t(G,k,je),t(G,K,je),t(G,T,je),t(G,A,je),t(G,C,je),t(G,j,je),t(G,S,je),t(G,R,je),t(G,P,je),t(G,H,je),t(G,b,je),t(G,fe,je),t(G,E,je),t(G,se,je),t(G,ee,je),t(G,Z,je),t(G,O,je),t(G,J,je),t(G,Q,je),t(G,ve,je),t(G,ie,je),t(G,Ce,je),t(G,oe,je),t(G,Se,je),t(G,le,je),t(G,_,je),t(G,M,je),t(G,V,je),t(G,Y,je),t(G,X,je),t(G,te,je),t(G,De,je),t(G,ge,je),t(G,Ge,je),t(G,ye,je),t(G,B,je),t(G,ne,je),t(G,Oe,je),t(G,Te,je),t(G,Fe,je),t(G,_e,je),t(G,F,je),t(G,ae,je),t(G,U,je),t(G,re,je),t(G,Ke,je),t(G,Ee,je),t(G,Ze,je),t(G,ze,je),t(G,g,je),t(G,$,je),t(G,ut,je),t(G,Ne,je),t(G,z,je),t(G,pe,je),t(G,m,je),t(G,w,je),t(G,Pt,je),t(G,Mt,je)},p:wt,d(G){G&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae),e(U),e(re),e(Ke),e(Ee),e(Ze),e(ze),e(g),e($),e(ut),e(Ne),e(z),e(pe),e(m),e(w),e(Pt),e(Mt))}}}function Mo(y){let n,f;const p=[y[0],an];let d={$$slots:{default:[Po]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Lo=class extends vt{constructor(n){super(),bt(this,n,Ho,Mo,gt,{})}};const Io=Object.freeze(Object.defineProperty({__proto__:null,default:Lo,metadata:an},Symbol.toStringTag,{value:"Module"}));function jo(y){let n,f='Juan Sebastian Bautista, C.A.M. Gerlach and Carlos Cordoba also contributed to this post.',p,d,i=`Spyder 5.4.0 was released recently, featuring some major enhancements to its Windows and macOS standalone installers. -You’ll now get more detailed feedback when new versions are available, and you can download and start the update to them from right within Spyder, instead of having to install them manually. -In this post, we’ll go over how these new update features work and how you can start using them!`,u,c,de='Before proceeding, we want to acknowledge that this work was made possible by a Small Development Grant awarded to Spyder by NumFOCUS, which has enabled us to hire a new developer (Juan Sebastian Bautista Rojas) to be in charge of all the implementation details.',D,v,we=`Before these improvements, Spyder already had a mechanism to detect more recent versions, but that functionality was very simple. -There was a pop-up dialog warning that a new version was available, but users had to follow a link to manually download the installer and then run it themselves:`,q,x,ce,L,k,he="Once you upgrade to Spyder 5.4.0 or above, you’ll get this message on future Spyder updates:",K,T,me,A,C,ue="Spyder will now be able to automatically download and install a new version for you, much like many other popular applications.",j,S,Pe="After clicking “Yes” on that dialog, Spyder will display another with the status and percent completion of the download.",R,P,Le,H,b,ke="If it is closed, the download will continue in the background, with its progress shown in a new status bar widget.",fe,E,$e,se,ee,qe="After the download completes, Spyder will ask if you want to update immediately, cancel the update or defer it to when you close Spyder, to avoid interrupting your current workflow.",Z,O,We,J,Q,Ue=`If you chose to update immediately, or once you close Spyder if you deferred the update, our installer will be started automatically. -On Windows, the installer has a series of automated prompts to close the current instance, uninstall the previous version and finally install the new one:`,ve,ie,Je,Ce,oe,Re="On macOS, Spyder will automatically mount the new version’s DMG, so you can simply drag and drop it in the Applications folder",Se,le,Qe,_,M,Ye="We hope these improvements will make updating to future Spyder versions smoother and more straightforward, so we can bring you new features and enhancements more easily in the future!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("p"),v.textContent=we,q=a(),x=o("img"),L=a(),k=o("p"),k.textContent=he,K=a(),T=o("img"),A=a(),C=o("p"),C.textContent=ue,j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("img"),H=a(),b=o("p"),b.textContent=ke,fe=a(),E=o("img"),se=a(),ee=o("p"),ee.textContent=qe,Z=a(),O=o("img"),J=a(),Q=o("p"),Q.textContent=Ue,ve=a(),ie=o("img"),Ce=a(),oe=o("p"),oe.textContent=Re,Se=a(),le=o("img"),_=a(),M=o("p"),M.textContent=Ye,this.h()},l(V){n=l(V,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1ftrv0b"&&(n.innerHTML=f),p=s(V),d=l(V,"P",{"data-svelte-h":!0}),r(d)!=="svelte-17vnzk9"&&(d.innerHTML=i),u=s(V),c=l(V,"P",{"data-svelte-h":!0}),r(c)!=="svelte-ioyfa7"&&(c.innerHTML=de),D=s(V),v=l(V,"P",{"data-svelte-h":!0}),r(v)!=="svelte-16nh17h"&&(v.textContent=we),q=s(V),x=l(V,"IMG",{src:!0,alt:!0}),L=s(V),k=l(V,"P",{"data-svelte-h":!0}),r(k)!=="svelte-v1njoz"&&(k.textContent=he),K=s(V),T=l(V,"IMG",{src:!0,alt:!0}),A=s(V),C=l(V,"P",{"data-svelte-h":!0}),r(C)!=="svelte-1vp66pc"&&(C.textContent=ue),j=s(V),S=l(V,"P",{"data-svelte-h":!0}),r(S)!=="svelte-ibvyz7"&&(S.textContent=Pe),R=s(V),P=l(V,"IMG",{src:!0,alt:!0}),H=s(V),b=l(V,"P",{"data-svelte-h":!0}),r(b)!=="svelte-poq8kp"&&(b.textContent=ke),fe=s(V),E=l(V,"IMG",{src:!0,alt:!0}),se=s(V),ee=l(V,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-12d0ric"&&(ee.textContent=qe),Z=s(V),O=l(V,"IMG",{src:!0,alt:!0}),J=s(V),Q=l(V,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-pnhb8r"&&(Q.textContent=Ue),ve=s(V),ie=l(V,"IMG",{src:!0,alt:!0}),Ce=s(V),oe=l(V,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-7cjgq9"&&(oe.textContent=Re),Se=s(V),le=l(V,"IMG",{src:!0,alt:!0}),_=s(V),M=l(V,"P",{"data-svelte-h":!0}),r(M)!=="svelte-1443q5a"&&(M.textContent=Ye),this.h()},h(){xe(x.src,ce="update-available-old.png")||h(x,"src",ce),h(x,"alt","Update available dialog from Spyder version 5.3.3 to 5.4.0 - Old update available dialog"),xe(T.src,me="update-available-new.png")||h(T,"src",me),h(T,"alt","Update available dialog from Spyder version 5.4.0 to 5.4.1 - New update available dialog"),xe(P.src,Le="download-status.png")||h(P,"src",Le),h(P,"alt","Dialog downloading Spyder 5.4.1 installer"),xe(E.src,$e="downloading-update.gif")||h(E,"src",$e),h(E,"alt","User clicking the update status in the taskbar to monitor the download status"),xe(O.src,We="starting-update.gif")||h(O,"src",We),h(O,"alt","Options available to run installer, run installer after Spyder closes or not run it at all"),xe(ie.src,Je="installation-flow.png")||h(ie,"src",Je),h(ie,"alt","Series of screenshots of installation steps, with arrows between: Yes/no dialog to close spyder, confirm close dialog, uninstall old version dialog, uninstalling status and finally installation wizard"),xe(le.src,Qe="macos-dmg.png")||h(le,"src",Qe),h(le,"alt","macOS new version's DMG mounted with a drag and drop dialog to move new Spyder version into the Application folder")},m(V,Y){t(V,n,Y),t(V,p,Y),t(V,d,Y),t(V,u,Y),t(V,c,Y),t(V,D,Y),t(V,v,Y),t(V,q,Y),t(V,x,Y),t(V,L,Y),t(V,k,Y),t(V,K,Y),t(V,T,Y),t(V,A,Y),t(V,C,Y),t(V,j,Y),t(V,S,Y),t(V,R,Y),t(V,P,Y),t(V,H,Y),t(V,b,Y),t(V,fe,Y),t(V,E,Y),t(V,se,Y),t(V,ee,Y),t(V,Z,Y),t(V,O,Y),t(V,J,Y),t(V,Q,Y),t(V,ve,Y),t(V,ie,Y),t(V,Ce,Y),t(V,oe,Y),t(V,Se,Y),t(V,le,Y),t(V,_,Y),t(V,M,Y)},p:wt,d(V){V&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M))}}}function $o(y){let n,f;const p=[y[0],sn];let d={$$slots:{default:[jo]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Eo=class extends vt{constructor(n){super(),bt(this,n,Ao,$o,gt,{})}};const zo=Object.freeze(Object.defineProperty({__proto__:null,default:Eo,metadata:sn},Symbol.toStringTag,{value:"Module"}));function Do(y){let n,f='Automatic testing can increase the quality of your code. This is especially true of dynamic languages like Python, where a typo may only be noticed when that particular code path is executed. The new Spyder unittest plugin lets you run tests and view the results, all within the IDE. Here, I’ll demonstrate what it can do by way of a real-world example.',p,d,i='There are numerous unit testing frameworks available for Python, of which the plugin supports several of the most prominent. However, I’m using my favorite here, pytest. I prefer to write the tests in a separate file from the code, so that’s what I’ll do here.',u,c,de="Installing the plugin",D,v,we="If you use the Anaconda distribution (as we recommend), then you can install the Spyder unittest plugin with the command",q,x,ce,L='conda install -c spyder-ide spyder-unittest',k,he,K="This will also grab all its mandatory dependencies (including Spyder itself if necessary). The -c option instructs conda to use the custom channel spyder-ide run by the Spyder developers, since the plugin isn’t part of the default channel.",T,me,A="Since we will be using the pytest framework, you also need to install it:",C,ue,j,S='conda install pytest',Pe,R,P="We’ll be running Python 3.6.4, Spyder 3.2.6, spyder-unittest 0.3.0 and pytest 3.3.2 for this example.",Le,H,b="Creating a project",ke,fe,E="I’ll be using separate files for the tests and the code to be tested, so let’s start by creating a project which will contain these files. In the Projects menu, click on New Project .... Enter a name for the project (in my example, prime_example), and under Location, select the directory in which to store it. Click Create.",$e,se,ee,qe,Z,O="Writing code to be tested",We,J,Q="Create a Python file primes.py with the following function, which checks whether a number is prime:",Ue,ve,ie,Je=`def is_prime(number): - """Return True if `number` is prime.""" - for element in range(2, number): - if number % element == 0: - return False - return True`,Ce,oe,Re='This example is taken from the blog post Improve Your Python: Understanding Unit Testing by Jeff Knupp.',Se,le,Qe="Writing the tests",_,M,Ye="To test our is_prime function, we will write two tests: one to check that 5 is considered a prime, and one to ensure 4 is not. They can be implemented as follows:",V,Y,Xe,X=`from primes import is_prime - -def test_five_is_prime(): - assert is_prime(5) == True - -def test_four_is_not_prime(): - assert is_prime(4) == False`,te,et,De="One of the cool things about pytest is that it can find the tests automatically, so you don’t need to mark them in any way. By default pytest uses a naming convention: all functions starting with test_ in files starting with test_ are considered test functions. We’ll save the code in the file test_primes.py which follows this naming convention.",ge,tt,Ge="In Spyder, the project now looks as follows:",ye,nt,B,ne,ot,Oe="Running the tests",Te,lt,Fe="Now comes the fun part, where we actually get to use the plugin. In the Run menu, select Run unit tests. If you do not see this menu item, then the plugin is not installed; refer to the installation instructions above.",_e,at,F="A window appears in which to configure the test run. One of the advantages of using a project is that it is automatically selected as the directory in which to find tests (another advantage is that Spyder will remember the testing configuration). So the only thing we need to do is select the test framework, which is pytest.",ae,it,U,re,dt,Ke="Press the OK button to run the tests, and lo and behold, the results appear in a new pane called “Unit testing”:",Ee,rt,Ze,ze,st,g="As you can see, both tests pass. This means that our function correctly identifies 5 as prime and 4 as not prime.",$,ht,ut="A failing test",Ne,pt,z="Unfortunately, our function is_prime has a bug. The number 1 is not considered a prime, but is_prime(1) in fact returns True. Therefore, to test for this, we add the following code to test_primes.py:",pe,ft,m,w=`def test_one_is_not_prime(): - assert is_prime(1) == False`,Ie,Pt,Mt="Now, run the tests again by clicking on Run unit tests in the Run menu. Spyder remembers the configuration so you are not asked for it again. This time, the results are:",$t,G,je,Gt,Ht,Et="Our new test fails. The details clarify that is_prime(1) returns True, while the assert in the test function claims that it should return False.",qt,Lt,At="Where to go from here",Ot,It,zt="With this demonstration under your belt, you should be able to write tests for your code and run them with the plugin. For example, try fixing the bug so that 1 is correctly identified as non-prime, and run the tests again to check verify it.",W,be,Dt='Spyder-unittest supports not only the pytest framework, but also the nose framework and the unittest module in the Python standard library. It is still fairly new (as its version number suggests), so I look forward to your comments. Please send your ideas, bug reports and pull requests to the spyder-unittest repo on Github.',Vt,Ft,Wt="Happy Spydering with automatic tests!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("h2"),c.textContent=de,D=a(),v=o("p"),v.textContent=we,q=a(),x=o("pre"),ce=new Rt(!1),k=a(),he=o("p"),he.innerHTML=K,T=a(),me=o("p"),me.innerHTML=A,C=a(),ue=o("pre"),j=new Rt(!1),Pe=a(),R=o("p"),R.innerHTML=P,Le=a(),H=o("h2"),H.textContent=b,ke=a(),fe=o("p"),fe.innerHTML=E,$e=a(),se=o("img"),qe=a(),Z=o("h2"),Z.textContent=O,We=a(),J=o("p"),J.innerHTML=Q,Ue=a(),ve=o("pre"),ie=new Rt(!1),Ce=a(),oe=o("p"),oe.innerHTML=Re,Se=a(),le=o("h2"),le.textContent=Qe,_=a(),M=o("p"),M.innerHTML=Ye,V=a(),Y=o("pre"),Xe=new Rt(!1),te=a(),et=o("p"),et.innerHTML=De,ge=a(),tt=o("p"),tt.textContent=Ge,ye=a(),nt=o("img"),ne=a(),ot=o("h2"),ot.textContent=Oe,Te=a(),lt=o("p"),lt.innerHTML=Fe,_e=a(),at=o("p"),at.innerHTML=F,ae=a(),it=o("img"),re=a(),dt=o("p"),dt.innerHTML=Ke,Ee=a(),rt=o("img"),ze=a(),st=o("p"),st.innerHTML=g,$=a(),ht=o("h2"),ht.textContent=ut,Ne=a(),pt=o("p"),pt.innerHTML=z,pe=a(),ft=o("pre"),m=new Rt(!1),Ie=a(),Pt=o("p"),Pt.innerHTML=Mt,$t=a(),G=o("img"),Gt=a(),Ht=o("p"),Ht.innerHTML=Et,qt=a(),Lt=o("h2"),Lt.textContent=At,Ot=a(),It=o("p"),It.innerHTML=zt,W=a(),be=o("p"),be.innerHTML=Dt,Vt=a(),Ft=o("p"),Ft.textContent=Wt,this.h()},l(N){n=l(N,"P",{"data-svelte-h":!0}),r(n)!=="svelte-10px6oi"&&(n.innerHTML=f),p=s(N),d=l(N,"P",{"data-svelte-h":!0}),r(d)!=="svelte-k0bcfd"&&(d.innerHTML=i),u=s(N),c=l(N,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-kfy64d"&&(c.textContent=de),D=s(N),v=l(N,"P",{"data-svelte-h":!0}),r(v)!=="svelte-16t9tw8"&&(v.textContent=we),q=s(N),x=l(N,"PRE",{class:!0});var Me=jt(x);ce=Qt(Me,!1),Me.forEach(e),k=s(N),he=l(N,"P",{"data-svelte-h":!0}),r(he)!=="svelte-njy31v"&&(he.innerHTML=K),T=s(N),me=l(N,"P",{"data-svelte-h":!0}),r(me)!=="svelte-1sexflf"&&(me.innerHTML=A),C=s(N),ue=l(N,"PRE",{class:!0});var Ut=jt(ue);j=Qt(Ut,!1),Ut.forEach(e),Pe=s(N),R=l(N,"P",{"data-svelte-h":!0}),r(R)!=="svelte-1xrf77s"&&(R.innerHTML=P),Le=s(N),H=l(N,"H2",{class:!0,"data-svelte-h":!0}),r(H)!=="svelte-txs3l7"&&(H.textContent=b),ke=s(N),fe=l(N,"P",{"data-svelte-h":!0}),r(fe)!=="svelte-1245yxu"&&(fe.innerHTML=E),$e=s(N),se=l(N,"IMG",{src:!0,alt:!0}),qe=s(N),Z=l(N,"H2",{class:!0,"data-svelte-h":!0}),r(Z)!=="svelte-1v4ahdm"&&(Z.textContent=O),We=s(N),J=l(N,"P",{"data-svelte-h":!0}),r(J)!=="svelte-1xjia97"&&(J.innerHTML=Q),Ue=s(N),ve=l(N,"PRE",{class:!0});var Kt=jt(ve);ie=Qt(Kt,!1),Kt.forEach(e),Ce=s(N),oe=l(N,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-16e9nmo"&&(oe.innerHTML=Re),Se=s(N),le=l(N,"H2",{class:!0,"data-svelte-h":!0}),r(le)!=="svelte-16ooc6o"&&(le.textContent=Qe),_=s(N),M=l(N,"P",{"data-svelte-h":!0}),r(M)!=="svelte-f8jn7"&&(M.innerHTML=Ye),V=s(N),Y=l(N,"PRE",{class:!0});var Jt=jt(Y);Xe=Qt(Jt,!1),Jt.forEach(e),te=s(N),et=l(N,"P",{"data-svelte-h":!0}),r(et)!=="svelte-eb8p40"&&(et.innerHTML=De),ge=s(N),tt=l(N,"P",{"data-svelte-h":!0}),r(tt)!=="svelte-1yiixpi"&&(tt.textContent=Ge),ye=s(N),nt=l(N,"IMG",{src:!0,alt:!0}),ne=s(N),ot=l(N,"H2",{class:!0,"data-svelte-h":!0}),r(ot)!=="svelte-1h4aoe5"&&(ot.textContent=Oe),Te=s(N),lt=l(N,"P",{"data-svelte-h":!0}),r(lt)!=="svelte-23q0zs"&&(lt.innerHTML=Fe),_e=s(N),at=l(N,"P",{"data-svelte-h":!0}),r(at)!=="svelte-109famq"&&(at.innerHTML=F),ae=s(N),it=l(N,"IMG",{src:!0,alt:!0}),re=s(N),dt=l(N,"P",{"data-svelte-h":!0}),r(dt)!=="svelte-ksdppo"&&(dt.innerHTML=Ke),Ee=s(N),rt=l(N,"IMG",{src:!0,alt:!0}),ze=s(N),st=l(N,"P",{"data-svelte-h":!0}),r(st)!=="svelte-j36jai"&&(st.innerHTML=g),$=s(N),ht=l(N,"H2",{class:!0,"data-svelte-h":!0}),r(ht)!=="svelte-btgw7r"&&(ht.textContent=ut),Ne=s(N),pt=l(N,"P",{"data-svelte-h":!0}),r(pt)!=="svelte-16ntxvs"&&(pt.innerHTML=z),pe=s(N),ft=l(N,"PRE",{class:!0});var Nt=jt(ft);m=Qt(Nt,!1),Nt.forEach(e),Ie=s(N),Pt=l(N,"P",{"data-svelte-h":!0}),r(Pt)!=="svelte-uptah"&&(Pt.innerHTML=Mt),$t=s(N),G=l(N,"IMG",{src:!0,alt:!0}),Gt=s(N),Ht=l(N,"P",{"data-svelte-h":!0}),r(Ht)!=="svelte-15ajb52"&&(Ht.innerHTML=Et),qt=s(N),Lt=l(N,"H2",{class:!0,"data-svelte-h":!0}),r(Lt)!=="svelte-1u9atu6"&&(Lt.textContent=At),Ot=s(N),It=l(N,"P",{"data-svelte-h":!0}),r(It)!=="svelte-rz1utf"&&(It.innerHTML=zt),W=s(N),be=l(N,"P",{"data-svelte-h":!0}),r(be)!=="svelte-1e7smp0"&&(be.innerHTML=Dt),Vt=s(N),Ft=l(N,"P",{"data-svelte-h":!0}),r(Ft)!=="svelte-uewclk"&&(Ft.textContent=Wt),this.h()},h(){h(c,"class","section"),ce.a=null,h(x,"class","language-bash"),j.a=null,h(ue,"class","language-bash"),h(H,"class","section"),xe(se.src,ee="new-project.png")||h(se,"src",ee),h(se,"alt","'Create new project' window"),h(Z,"class","section"),ie.a=null,h(ve,"class","language-python"),h(le,"class","section"),Xe.a=null,h(Y,"class","language-python"),xe(nt.src,B="code.png")||h(nt,"src",B),h(nt,"alt","Spyder window with code"),h(ot,"class","section"),xe(it.src,U="test-config.png")||h(it,"src",U),h(it,"alt","'Configure tests' window"),xe(rt.src,Ze="test-results.png")||h(rt,"src",Ze),h(rt,"alt","Test results in Spyder windows"),h(ht,"class","section"),m.a=null,h(ft,"class","language-python"),xe(G.src,je="test-results2.png")||h(G,"src",je),h(G,"alt","Test results in Spyder windows"),h(Lt,"class","section")},m(N,Me){t(N,n,Me),t(N,p,Me),t(N,d,Me),t(N,u,Me),t(N,c,Me),t(N,D,Me),t(N,v,Me),t(N,q,Me),t(N,x,Me),ce.m(L,x),t(N,k,Me),t(N,he,Me),t(N,T,Me),t(N,me,Me),t(N,C,Me),t(N,ue,Me),j.m(S,ue),t(N,Pe,Me),t(N,R,Me),t(N,Le,Me),t(N,H,Me),t(N,ke,Me),t(N,fe,Me),t(N,$e,Me),t(N,se,Me),t(N,qe,Me),t(N,Z,Me),t(N,We,Me),t(N,J,Me),t(N,Ue,Me),t(N,ve,Me),ie.m(Je,ve),t(N,Ce,Me),t(N,oe,Me),t(N,Se,Me),t(N,le,Me),t(N,_,Me),t(N,M,Me),t(N,V,Me),t(N,Y,Me),Xe.m(X,Y),t(N,te,Me),t(N,et,Me),t(N,ge,Me),t(N,tt,Me),t(N,ye,Me),t(N,nt,Me),t(N,ne,Me),t(N,ot,Me),t(N,Te,Me),t(N,lt,Me),t(N,_e,Me),t(N,at,Me),t(N,ae,Me),t(N,it,Me),t(N,re,Me),t(N,dt,Me),t(N,Ee,Me),t(N,rt,Me),t(N,ze,Me),t(N,st,Me),t(N,$,Me),t(N,ht,Me),t(N,Ne,Me),t(N,pt,Me),t(N,pe,Me),t(N,ft,Me),m.m(w,ft),t(N,Ie,Me),t(N,Pt,Me),t(N,$t,Me),t(N,G,Me),t(N,Gt,Me),t(N,Ht,Me),t(N,qt,Me),t(N,Lt,Me),t(N,Ot,Me),t(N,It,Me),t(N,W,Me),t(N,be,Me),t(N,Vt,Me),t(N,Ft,Me)},p:wt,d(N){N&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(k),e(he),e(T),e(me),e(C),e(ue),e(Pe),e(R),e(Le),e(H),e(ke),e(fe),e($e),e(se),e(qe),e(Z),e(We),e(J),e(Ue),e(ve),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(te),e(et),e(ge),e(tt),e(ye),e(nt),e(ne),e(ot),e(Te),e(lt),e(_e),e(at),e(ae),e(it),e(re),e(dt),e(Ee),e(rt),e(ze),e(st),e($),e(ht),e(Ne),e(pt),e(pe),e(ft),e(Ie),e(Pt),e($t),e(G),e(Gt),e(Ht),e(qt),e(Lt),e(Ot),e(It),e(W),e(be),e(Vt),e(Ft))}}}function Go(y){let n,f;const p=[y[0],rn];let d={$$slots:{default:[Do]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Oo=class extends vt{constructor(n){super(),bt(this,n,qo,Go,gt,{})}};const Fo=Object.freeze(Object.defineProperty({__proto__:null,default:Oo,metadata:rn},Symbol.toStringTag,{value:"Module"}));function Wo(y){let n,f=`Spyder’s Variable Explorer is a great tool which aids the development and debugging of Python code by displaying all variables from the current scope. -One thing the Variable Explorer is missing is the ability to display the value of arbitrary, user-definable expressions while debugging. -For example, it might be useful to see the value of a specific attribute of an object, or the value of an array at some index. -Such a feature is known as a “watchlist” or “watches” in other Integrated Development Environments (IDEs). -This blog post introduces the Watchlist plugin developed for Spyder.`,p,d,i="Features",u,c,de=`The watchlist consists of a user-definable list of expressions. -They are evaluated after each debugger step, and the result of the evaluation is displayed as a string. -This means that value = str(eval(expression)) is performed behind the scenes, and the result is shown in the plugin. -The watchlist is a very powerful tool, but this comes at a cost: Any side effect of an expression will affect the execution environment.`,D,v,we=`Expressions can be added, removed and modified at any time. -The value of an invalid expression is shown as <exception name>. -You can hover the mouse over the value to show the full exception message in a tooltip. -Values which have changed with the most recent debugger step are shown with a bold font, so you can recognise them more easily.`,q,x,ce="A picture is worth a thousand words, as they say, so here is a whole screencast of the Watchlist plugin in action:",L,k,he=` - Sorry, your browser doesn’t support HTML5 video. Download the MP4 file`,K,T,me="Installation and going forwards",A,C,ue="For conda or pip-installed Spyder, the plugin can be installed by running the following with your Spyder environment activated:",j,S,Pe,R='pip install spyder-watchlist',P,Le,H='Feel free to send your ideas, bug reports and pull requests to the spyder-watchlist repository on GitHub.';return{c(){n=o("p"),n.textContent=f,p=a(),d=o("h2"),d.textContent=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("p"),x.textContent=ce,L=a(),k=o("video"),k.innerHTML=he,K=a(),T=o("h2"),T.textContent=me,A=a(),C=o("p"),C.innerHTML=ue,j=a(),S=o("pre"),Pe=new Rt(!1),P=a(),Le=o("p"),Le.innerHTML=H,this.h()},l(b){n=l(b,"P",{"data-svelte-h":!0}),r(n)!=="svelte-do3eua"&&(n.textContent=f),p=s(b),d=l(b,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-6uqxh"&&(d.textContent=i),u=s(b),c=l(b,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1tlqj16"&&(c.innerHTML=de),D=s(b),v=l(b,"P",{"data-svelte-h":!0}),r(v)!=="svelte-1jwwz49"&&(v.innerHTML=we),q=s(b),x=l(b,"P",{"data-svelte-h":!0}),r(x)!=="svelte-pztoku"&&(x.textContent=ce),L=s(b),k=l(b,"VIDEO",{"data-svelte-h":!0}),r(k)!=="svelte-18vyys8"&&(k.innerHTML=he),K=s(b),T=l(b,"H2",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-1ujtgcf"&&(T.textContent=me),A=s(b),C=l(b,"P",{"data-svelte-h":!0}),r(C)!=="svelte-1fx19nf"&&(C.innerHTML=ue),j=s(b),S=l(b,"PRE",{class:!0});var ke=jt(S);Pe=Qt(ke,!1),ke.forEach(e),P=s(b),Le=l(b,"P",{"data-svelte-h":!0}),r(Le)!=="svelte-1sbgnrp"&&(Le.innerHTML=H),this.h()},h(){h(d,"class","section"),k.controls=!0,h(T,"class","section"),Pe.a=null,h(S,"class","language-bash")},m(b,ke){t(b,n,ke),t(b,p,ke),t(b,d,ke),t(b,u,ke),t(b,c,ke),t(b,D,ke),t(b,v,ke),t(b,q,ke),t(b,x,ke),t(b,L,ke),t(b,k,ke),t(b,K,ke),t(b,T,ke),t(b,A,ke),t(b,C,ke),t(b,j,ke),t(b,S,ke),Pe.m(R,S),t(b,P,ke),t(b,Le,ke)},p:wt,d(b){b&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(P),e(Le))}}}function Uo(y){let n,f;const p=[y[0],un];let d={$$slots:{default:[Wo]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Ro=class extends vt{constructor(n){super(),bt(this,n,No,Uo,gt,{})}};const Qo=Object.freeze(Object.defineProperty({__proto__:null,default:Ro,metadata:un},Symbol.toStringTag,{value:"Module"}));function Bo(y){let n,f=`We’re excited to announce a significant update to QtConsole—the package that powers Spyder’s IPython Console interface—which the Spyder team maintains in collaboration with Project Jupyter. -Two of the biggest changes—user-selectable syntax highlighting themes, and enhanced external editor/IDE integration—are already built right into Spyder, so they’ll likely be of more interest if you use QtConsole standalone or with another editor/IDE. -However, most of the other changes should prove quite useful within Spyder as well, and many were in fact suggested and even implemented by users of our IDE. -Particular highlights include a block indent/unindent feature, Select-All (Ctrl-Shift-A) being made cell-specific, Ctrl-Backspace and Ctrl-Delete behaving more intelligently across whitespace and line boundaries, Ctrl-D allowing you to easily exit ipdb, input() and the like, and numerous smaller enhancements and bug fixes. -If you’d like to learn more about what’s new, please check out our article over on the Jupyter blog, where we go over the major changes in more detail, with plenty of screenshots and GIFs to illustrate each feature and how to use it.`,p,d,i,u,c,de=`To update to the newest version with your existing Spyder install, open an Anaconda Prompt (Windows), Terminal (macOS) or command line (Linux), activate the conda environment or virtualenv/venv of the Spyder install you are using, and run conda update qtconsole (or pip install --upgrade qtconsole, if not using Anaconda). -If you’d like to try QtConsole out separate from Spyder or integrate it in with your own editor or IDE, it is also available as a standalone GUI by running jupyter qtconsole from the Python environment where it or Spyder is installed.`,D,v,we=`If you have any questions, problems or feedback, we’d love to hear from you. Report issues, request features or participate in QtConsole’s development at its Github site, and check out its documentation for help using it. -For the latest Spyder news, releases, previews and tips, you can follow our Facebook and Twitter, and help support the development on Spyder and its sister projects like QtConsole on OpenCollective.`,q,x,ce=`Our new documentation and Spyder 4 beta 1 have been fully live for some time now; given the dramatic scale of the changes in both, their respective blog posts are still in the works. -We’ll also have an upcoming article on our official Spyder 4 feature roadmap and more, and Spyder 3.3.2 is due out soon, so keep in right here for your Spyder fix! -Until then, happy Spydering and enjoy QtConsole 4.4!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("img"),u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("p"),x.textContent=ce,this.h()},l(L){n=l(L,"P",{"data-svelte-h":!0}),r(n)!=="svelte-tpudl9"&&(n.innerHTML=f),p=s(L),d=l(L,"IMG",{src:!0,alt:!0}),u=s(L),c=l(L,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1mdc2k8"&&(c.innerHTML=de),D=s(L),v=l(L,"P",{"data-svelte-h":!0}),r(v)!=="svelte-stzk5x"&&(v.innerHTML=we),q=s(L),x=l(L,"P",{"data-svelte-h":!0}),r(x)!=="svelte-18gepk8"&&(x.textContent=ce),this.h()},h(){xe(d.src,i="qtconsole-syntax-highlighting.png")||h(d,"src",i),h(d,"alt","Screenshot of the QtConsole main window, with a new syntax highlighting theme applied")},m(L,k){t(L,n,k),t(L,p,k),t(L,d,k),t(L,u,k),t(L,c,k),t(L,D,k),t(L,v,k),t(L,q,k),t(L,x,k)},p:wt,d(L){L&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x))}}}function Vo(y){let n,f;const p=[y[0],dn];let d={$$slots:{default:[Bo]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Ko=class extends vt{constructor(n){super(),bt(this,n,Jo,Vo,gt,{})}};const Zo=Object.freeze(Object.defineProperty({__proto__:null,default:Ko,metadata:dn},Symbol.toStringTag,{value:"Module"}));function Yo(y){let n,f=`We’re pleased to release the next significant update in the stable Spyder 3 line, 3.3.0, along with its follow-on bugfix point release, 3.3.1, which is now live on PyPI and conda. -As always, you can update with conda update spyder in the Anaconda Prompt/Terminal/command line (on Windows/macOS/Linux, respectively) if on Anaconda (recommended), or pip update spyder otherwise. -If you run into any trouble, please carefully read our new installation documentation and consult our Troubleshooting Guide, which contains straightforward solutions to the vast majority of install-related issues users have reported.`,p,d,i=`As a new minor version (3.3), it makes several substantial changes to Spyder’s underpinnings that deserve some explanation, particularly the newly modular and portable console system that’s now separated into its own spyder-kernels package, opening up several new options for users running Spyder in different environments. -There’s also a brand-new error reporting process, new options in the IPython console, usability and performance improvements for the Variable Explorer, multiple new and changed dependency requirements and more, so there’s plenty to go over. -Finally, we’d like to briefly share a few final notes on this release and the latest on our plans going forward.`,u,c,de="Modular, flexible Console architecture",D,v,we=`The biggest single change with version 3.3.0/3.3.1 is a major overhaul of how IPython Consoles are started and managed in Spyder. -More precisely, we’ve moved all the kernel-related code from the Spyder core into a new modular package, spyder-kernels, available on the same distribution channels as Spyder itself (and installed automatically when updating to >=3.3.0). -While the most dramatic differences are under the hood, there’s plenty for everyone to like (and a few things to be aware of).`,q,x,ce=`Most importantly, for our everyday users, this makes Spyder much more flexible and powerful when working with multiple Python environments. -With the changes, Spyder itself does not need to be present in every environment you’d like to launch a kernel in; you can install the full IDE in whatever manner you prefer, and then set it to run code and consoles in any Anaconda environment, virtualenv/venv, or even a totally separate Python installation, so long as it has spyder-kernels package available. -Just set the path under Tools -> Preferences -> Python interpreter -> Use the following Python interpreter to the desired Python executable, and any new Console you open will start in the selected environment. -Check out our new wiki page on using environments with Spyder, for more details and tips on the subject, and keep an eye out for the further improvements coming in Spyder 4, which will greatly simplify the process and include full GUI-based project, package and environment management functionality built right in.`,L,k,he,K,T,me=`Furthermore, the new package allows you to independently launch a kernel from anywhere (on your local computer, or a remote machine, server or even supercomputing cluster), connect to it with Spyder, and use it just like a “natively” started one. -After installing spyder-kernels on the host environment, you can start one with python -m spyder_kernels.console, and then enter the kernel’s 4-digit ID (and SSH connection details, if a remote machine) in the Spyder Connect to an existing kernel dialog under the IPython Console pane context- or “gear”-menu). -For more information on the process, see the Connecting to a Console section in our new documentation.`,A,C,ue,j,S,Pe=`Best of all, no matter how or where a kernel is started, every console now supports the full suite of Spyder’s features, including completion, the Variable Explorer, interactive Help and more, unlike before. -You can even mix and match internal, external and remote kernels in different environments, all in the same Spyder session, by either changing the Python interpreter preferences setting between starting a console, or starting and connecting to multiple consoles externally—or both! -Finally, for those of us (and those of you!) who help develop Spyder, the changes also make it easier to maintain and improve the code, and opens the door to one of the biggest features coming in Spyder 4: a new, full-featured debugging kernel that many of you have been asking for.`,R,P,Le=`The one key thing to remember: make sure you install the appropriate version of spyder-kernels for your version of Spyder. For most users, that will be spyder-kernels 0.x (currently 0.2.6) to match Spyder 3 on our stable 3.x branch; if testing a Spyder 4 beta or Github clone of the master branch, you’ll want the latest 1.x version of spyder-kernels (currently 1.1.0). -To install the correct build, you can use the following conda command,`,H,b,ke,fe='conda install spyder-kernels=<0 or 1>.*',E,$e,se="or with pip,",ee,qe,Z,O='pip install spyder-kernels==<0 or 1>.*',We,J,Q=`replacing <0 or 1> with the major version number (0 or 1) to match your Spyder version. -Further details specific to installing a development build can be found in our Contributing Guide or our install documentation.`,Ue,ve,ie="New IPython Console completion and plotting features",Je,Ce,oe,Re,Se,le=`Spyder’s IPython Consoles can now use an advanced jedi-based completion engine that, similar to the Editor, analyzes your code without actually having to run it first. -This allows for advanced completion functionality on objects not yet assigned to a variable, similar to the existing “greedy” completion option, but without the need for dynamic evaluation. -It can be slow if working with very large Pandas DataFrames so it is disabled by default, but you can activate it under Tools -> Preferences -> IPython console -> Advanced Settings -> Jedi completion. -The descriptive text for the “greedy” completion option (also off by default) was also clarified, particularly to explain an IPython bug (not present in the jedi completer) with the feature and a consequent workaround.`,Qe,_,M,Ye,V,Y=`We’ve also added a new plotting setting, Use a tight layout for inline plots, for the Inline Matplotlib graphics backend. -The default behavior (as in previous Spyder versions) sets bbox_inches to "tight" in Matplotlib calls when drawing to the inline backend. -However, if you prefer your own bbox_inches argument be respected even when plots are rendered in the Console, you can now do so by unchecking this option under Tools -> Preferences -> IPython console -> Graphics -> Inline backend.`,Xe,X,te,et,De,ge="Better Variable Explorer usability and performance",tt,Ge,ye=`We’ve made several changes and optimizations to greatly improve performance and efficiency in the Variable Explorer, to make it much faster and use less memory when opening and editing large objects. -In particular, we’ve fixed several major memory leaks when saving edited objects and closing the Variable Explorer dialogs through better length validation and garbage collection, and now skip the whole saving process entirely if the object was not modified (or cannot be modified). -We’ve also changed the names and functions of the Cancel and Ok buttons in Variable Explorer dialogs to be easier to understand and use. -They now feature a Close button which exits the dialog without saving any edits to the object’s contents, and a Save and Close button—automatically enabled once modifications are made—that commits the changes back to the kernel.`,nt,B,ne,ot,Oe,Te="Streamlined error reporting experience",lt,Fe,_e=`While we hope you never need to use it, Spyder 3.3.0 includes a brand-new error handling backend that can submit bug reports directly through the Github API. -Based off Colin Duquesnoy’s excellent QCrash framework, this is a major improvement in speed, functionality, reliability and user convenience over the old approach (essentially just opening a link in a web browser). -Just as before, we won’t send anything without your explicit consent, you need a Github account (or create one for free), and you can view and edit the report on Github at any time.`,at,F,ae,it,U,re=`You will need to enter your Github credentials the first time you submit a report. -For this, you can create an app token which only grants the very limited permissions needed to create a public issue report, can be easily revoked and re-created, and works with two-factor authentication (which you should be using); however, if you have not yet enabled 2FA, it also offers the option to enter your Github username and password. -Either way, Spyder can securely remember your login using the keyring package, so you only have to do this once on any given machine (if you select the “remember” option).`,dt,Ke,Ee,rt,Ze,ze=`The dialog itself has also been made more functional and user-friendly, designed to help encourage high-quality, useful reports, and with more accessible, descriptive text. -The reports themselves also contain more useful data about the problem, and there is now a --safe-mode command-line option for Spyder to start in a clean, temporary config directly, so you can test to see if the problem reoccurs without the hassle of a spyder --reset, and play around with other settings without impacting your main configuration. Finally, we’ve fixed over 40 bugs in this release and further improved our documentation and troubleshooting material, so hopefully you’ll see this less often.`,st,g,$="Cleaner under the hood and more",ht,ut,Ne=`Alongside the aforementioned internal changes, we’ve also made a number of other under-the-hood changes to clean out old cruft and improve maintainability, readability and performance of our codebase. -In particular, we’ve officially dropped support for Python 3.3, PyQt4, and PyQt5 under 5.5, all versions which have been end-of-life for years, and (aside from PyQt4) have minimal or no remaining Spyder users. -Furthermore, dropping PyQt4 in particular allows us to avoid or resolve a number of unfixable bugs specific to that version that have been causing problems for users, and opens the door to easier development in the future. -Finally, we moved our legacy documentation (and its many associated images) from the main Spyder codebase to its own repo, executed a major overhaul to greatly modernize and expand the text, images, style, and presentation, and now deploy them onto their own subdomain of our site, all of which we will discuss in a separate post coming soon.`,pt,z,pe="Even more fixes and refinements with Spyder 3.3.1",ft,m,w=`As a quick follow-on to the 3.3.0 release, Spyder 3.3.1 fixed a handful of bugs and minor issues with the new functionality and cleaned up several other existing ones, as well made a number of lower-level maintenance and development-oriented changes—over two dozen in all. -Furthermore, several user-visible enhancements made it into the release, primary aimed at improving usability. -To make it easier for users to manage multiple environments, the selection UI under Preferences > Python interpreter > Use the following Python interpreter remembers the executables you’ve previously selected and allows quick switching between them.`,Ie,Pt,Mt,$t,G,je=`In the Console, mundane ipdb commands are automatically filtered from the history, and the Editor now supports syntax highlighting for the new numeric literal syntax introduced in Python 3.6. -Spyder’s tutorial has been re-written for modern Spyder as well as to be clearer and more understandable, and overhauled for better and more consistent formatting and visuals with the rest of our documentation. -Finally, our update checker now consults the Anaconda defaults channel rather than PyPI to determine if an update is available, so it doesn’t bug the majority of our users on Anaconda until they can actually acquire the package.`,Gt,Ht,Et="What to know and what’s next",qt,Lt,At=`If you have any questions, problems or feedback, we’d love to hear from you (just make sure you read our documentation, Troubleshooting Guide and the other previously-mentioned resources first)! -For general questions or install issues that aren’t addressed by the above, our Google Group and Gitter live chat are a good place to ask, while our Github is the place to report bugs, request features, or help develop Spyder itself (though make sure to search our issues list to ensure it hasn’t already been submitted). -Finally, you can follow our Facebook and Twitter for the latest Spyder news, releases, previews and tips, and help support Spyder development on OpenCollective.`,Ot,It,zt=`There’s plenty to look forward to in the coming days, with the official release of our all-new documentation (that’s already live now), Spyder 4 beta 1 having just been released on PyPI, conda-forge and our own spyder-ide channel (with a blog post coming soon), an upcoming article on our official Spyder 4 feature roadmap and more, so stay tuned! -In the meantime, happy Spydering and enjoy the new 3.3.1!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("h2"),c.textContent=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("p"),x.innerHTML=ce,L=a(),k=o("img"),K=a(),T=o("p"),T.innerHTML=me,A=a(),C=o("img"),j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("p"),P.innerHTML=Le,H=a(),b=o("pre"),ke=new Rt(!1),E=a(),$e=o("p"),$e.innerHTML=se,ee=a(),qe=o("pre"),Z=new Rt(!1),We=a(),J=o("p"),J.innerHTML=Q,Ue=a(),ve=o("h2"),ve.textContent=ie,Je=a(),Ce=o("img"),Re=a(),Se=o("p"),Se.innerHTML=le,Qe=a(),_=o("img"),Ye=a(),V=o("p"),V.innerHTML=Y,Xe=a(),X=o("img"),et=a(),De=o("h2"),De.textContent=ge,tt=a(),Ge=o("p"),Ge.innerHTML=ye,nt=a(),B=o("img"),ot=a(),Oe=o("h2"),Oe.textContent=Te,lt=a(),Fe=o("p"),Fe.innerHTML=_e,at=a(),F=o("img"),it=a(),U=o("p"),U.innerHTML=re,dt=a(),Ke=o("img"),rt=a(),Ze=o("p"),Ze.innerHTML=ze,st=a(),g=o("h2"),g.textContent=$,ht=a(),ut=o("p"),ut.innerHTML=Ne,pt=a(),z=o("h2"),z.textContent=pe,ft=a(),m=o("p"),m.innerHTML=w,Ie=a(),Pt=o("img"),$t=a(),G=o("p"),G.innerHTML=je,Gt=a(),Ht=o("h2"),Ht.textContent=Et,qt=a(),Lt=o("p"),Lt.innerHTML=At,Ot=a(),It=o("p"),It.innerHTML=zt,this.h()},l(W){n=l(W,"P",{"data-svelte-h":!0}),r(n)!=="svelte-mg9z24"&&(n.innerHTML=f),p=s(W),d=l(W,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1ykc4ml"&&(d.innerHTML=i),u=s(W),c=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-1wmevih"&&(c.textContent=de),D=s(W),v=l(W,"P",{"data-svelte-h":!0}),r(v)!=="svelte-4zemt9"&&(v.innerHTML=we),q=s(W),x=l(W,"P",{"data-svelte-h":!0}),r(x)!=="svelte-nnkqp3"&&(x.innerHTML=ce),L=s(W),k=l(W,"IMG",{src:!0,alt:!0}),K=s(W),T=l(W,"P",{"data-svelte-h":!0}),r(T)!=="svelte-19rgc6"&&(T.innerHTML=me),A=s(W),C=l(W,"IMG",{src:!0,alt:!0}),j=s(W),S=l(W,"P",{"data-svelte-h":!0}),r(S)!=="svelte-szwtzd"&&(S.textContent=Pe),R=s(W),P=l(W,"P",{"data-svelte-h":!0}),r(P)!=="svelte-1g7rkrc"&&(P.innerHTML=Le),H=s(W),b=l(W,"PRE",{class:!0});var be=jt(b);ke=Qt(be,!1),be.forEach(e),E=s(W),$e=l(W,"P",{"data-svelte-h":!0}),r($e)!=="svelte-152yfdn"&&($e.innerHTML=se),ee=s(W),qe=l(W,"PRE",{class:!0});var Dt=jt(qe);Z=Qt(Dt,!1),Dt.forEach(e),We=s(W),J=l(W,"P",{"data-svelte-h":!0}),r(J)!=="svelte-1gxhmsj"&&(J.innerHTML=Q),Ue=s(W),ve=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(ve)!=="svelte-1fdwxup"&&(ve.textContent=ie),Je=s(W),Ce=l(W,"IMG",{src:!0,alt:!0}),Re=s(W),Se=l(W,"P",{"data-svelte-h":!0}),r(Se)!=="svelte-1xagtyr"&&(Se.innerHTML=le),Qe=s(W),_=l(W,"IMG",{src:!0,alt:!0}),Ye=s(W),V=l(W,"P",{"data-svelte-h":!0}),r(V)!=="svelte-2p22vt"&&(V.innerHTML=Y),Xe=s(W),X=l(W,"IMG",{src:!0,alt:!0}),et=s(W),De=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(De)!=="svelte-ik1l0a"&&(De.textContent=ge),tt=s(W),Ge=l(W,"P",{"data-svelte-h":!0}),r(Ge)!=="svelte-at3942"&&(Ge.innerHTML=ye),nt=s(W),B=l(W,"IMG",{src:!0,alt:!0}),ot=s(W),Oe=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(Oe)!=="svelte-1pxsziw"&&(Oe.textContent=Te),lt=s(W),Fe=l(W,"P",{"data-svelte-h":!0}),r(Fe)!=="svelte-y6otfj"&&(Fe.innerHTML=_e),at=s(W),F=l(W,"IMG",{src:!0,alt:!0}),it=s(W),U=l(W,"P",{"data-svelte-h":!0}),r(U)!=="svelte-2g04g9"&&(U.innerHTML=re),dt=s(W),Ke=l(W,"IMG",{src:!0,alt:!0}),rt=s(W),Ze=l(W,"P",{"data-svelte-h":!0}),r(Ze)!=="svelte-nkjzz9"&&(Ze.innerHTML=ze),st=s(W),g=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(g)!=="svelte-1ola6uf"&&(g.textContent=$),ht=s(W),ut=l(W,"P",{"data-svelte-h":!0}),r(ut)!=="svelte-16df67"&&(ut.innerHTML=Ne),pt=s(W),z=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(z)!=="svelte-i2ag27"&&(z.textContent=pe),ft=s(W),m=l(W,"P",{"data-svelte-h":!0}),r(m)!=="svelte-18tidt1"&&(m.innerHTML=w),Ie=s(W),Pt=l(W,"IMG",{src:!0,alt:!0}),$t=s(W),G=l(W,"P",{"data-svelte-h":!0}),r(G)!=="svelte-26y4pa"&&(G.innerHTML=je),Gt=s(W),Ht=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(Ht)!=="svelte-e0owd2"&&(Ht.textContent=Et),qt=s(W),Lt=l(W,"P",{"data-svelte-h":!0}),r(Lt)!=="svelte-1a467wt"&&(Lt.innerHTML=At),Ot=s(W),It=l(W,"P",{"data-svelte-h":!0}),r(It)!=="svelte-18p7ian"&&(It.innerHTML=zt),this.h()},h(){h(c,"class","section"),xe(k.src,he="spyder-prefs-python.png")||h(k,"src",he),h(k,"alt","Python interpreter pane of the Spyder preferences dialog, with the 'Use the following Python interpreter' option highlighted"),xe(C.src,ue="spyder-remote-kernel.png")||h(C,"src",ue),h(C,"alt","A remote kernel running in a system console alongside Spyder's connect to kernel dialog"),ke.a=null,h(b,"class","language-bash"),Z.a=null,h(qe,"class","language-bash"),h(ve,"class","section"),xe(Ce.src,oe="jedi-greedy-completion-prefs.png")||h(Ce,"src",oe),h(Ce,"alt","Advanced tab of the IPython console pane of Spyder's preferences, with the new Jedi completion section highlighted"),xe(_.src,M="tight-layout-preferences.png")||h(_,"src",M),h(_,"alt","Graphics tab of the IPython console pane of Spyder's preferences, with the new 'Use a tight layout for inline plots' option highlighted"),xe(X.src,te="plot-comparison.png")||h(X,"src",te),h(X,"alt","Comparison of inline plots in Spyder's IPython Console with and without the 'tight layout' option set"),h(De,"class","section"),xe(B.src,ne="variable-explorer-ux.png")||h(B,"src",ne),h(B,"alt","A Variable Explorer DataFrame editor dialog, showing the new 'Close' and 'Save and Close' buttons"),h(Oe,"class","section"),xe(F.src,ae="new-authent-dialog-both.png")||h(F,"src",ae),h(F,"alt","The new authentication dialogs for submitting a Github report, with a username/password and a token option"),xe(Ke.src,Ee="new-error-dialog-full.png")||h(Ke,"src",Ee),h(Ke,"alt","The new error reporting interface, with a title field, more descriptive text, and a polished UI"),h(g,"class","section"),h(z,"class","section"),xe(Pt.src,Mt="interpreter-selection-ux.png")||h(Pt,"src",Mt),h(Pt,"alt","Python interpreter pane of Spyder's preferences, showing the new environment selection UI"),h(Ht,"class","section")},m(W,be){t(W,n,be),t(W,p,be),t(W,d,be),t(W,u,be),t(W,c,be),t(W,D,be),t(W,v,be),t(W,q,be),t(W,x,be),t(W,L,be),t(W,k,be),t(W,K,be),t(W,T,be),t(W,A,be),t(W,C,be),t(W,j,be),t(W,S,be),t(W,R,be),t(W,P,be),t(W,H,be),t(W,b,be),ke.m(fe,b),t(W,E,be),t(W,$e,be),t(W,ee,be),t(W,qe,be),Z.m(O,qe),t(W,We,be),t(W,J,be),t(W,Ue,be),t(W,ve,be),t(W,Je,be),t(W,Ce,be),t(W,Re,be),t(W,Se,be),t(W,Qe,be),t(W,_,be),t(W,Ye,be),t(W,V,be),t(W,Xe,be),t(W,X,be),t(W,et,be),t(W,De,be),t(W,tt,be),t(W,Ge,be),t(W,nt,be),t(W,B,be),t(W,ot,be),t(W,Oe,be),t(W,lt,be),t(W,Fe,be),t(W,at,be),t(W,F,be),t(W,it,be),t(W,U,be),t(W,dt,be),t(W,Ke,be),t(W,rt,be),t(W,Ze,be),t(W,st,be),t(W,g,be),t(W,ht,be),t(W,ut,be),t(W,pt,be),t(W,z,be),t(W,ft,be),t(W,m,be),t(W,Ie,be),t(W,Pt,be),t(W,$t,be),t(W,G,be),t(W,Gt,be),t(W,Ht,be),t(W,qt,be),t(W,Lt,be),t(W,Ot,be),t(W,It,be)},p:wt,d(W){W&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(E),e($e),e(ee),e(qe),e(We),e(J),e(Ue),e(ve),e(Je),e(Ce),e(Re),e(Se),e(Qe),e(_),e(Ye),e(V),e(Xe),e(X),e(et),e(De),e(tt),e(Ge),e(nt),e(B),e(ot),e(Oe),e(lt),e(Fe),e(at),e(F),e(it),e(U),e(dt),e(Ke),e(rt),e(Ze),e(st),e(g),e(ht),e(ut),e(pt),e(z),e(ft),e(m),e(Ie),e(Pt),e($t),e(G),e(Gt),e(Ht),e(qt),e(Lt),e(Ot),e(It))}}}function Xo(y){let n,f;const p=[y[0],hn];let d={$$slots:{default:[Yo]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let tl=class extends vt{constructor(n){super(),bt(this,n,el,Xo,gt,{})}};const nl=Object.freeze(Object.defineProperty({__proto__:null,default:tl,metadata:hn},Symbol.toStringTag,{value:"Module"}));function ol(y){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,i=`After more than three years in development and more than 5000 commits from 60 authors around the world, Spyder 4 finally saw the light on December 5, 2019! -I decided to wait until now to write a blogpost about it because shortly after the initial release, we found several critical performance issues and some regressions with respect to Spyder 3, most of which are fixed now in version 4.1.3, released on May 8th 2020.`,u,c,de=`This new release comes with a lengthy list of user-requested features aimed at providing an enhanced development experience at the level of top general-purpose editors and IDEs, while strengthening Spyder’s specialized focus on scientific programming in Python. -The interested reader can take a look at some of them in previous blog posts, and in detail in our Changelog. -However, this post is not meant to describe those improvements, but to acknowledge all people that contributed to making Spyder 4 possible.`,D,v,we=`Spyder 4 is the first version developed with financial support from multiple companies and organizations, as well as donations by the international user community. -However, as a project, we couldn’t have been able to reach the level of maturity needed to receive and handle that support without the pivotal opportunities Travis Oliphant, former CEO of Anaconda and current leader of Quansight, gave me to work in Scientific Python. -Thanks to him, I became part of Anaconda Inc. in 2015; I was able to hire a small small team to improve Spyder within Anaconda in late 2016; and I was hired by Quansight to work solely on Spyder in 2018. -As with other projects in our ecosystem, such as Bokeh, Dask and Numba, Spyder benefited immensely from Travis’ trust in the role these efforts and ours could play in the future. -He certainly believed in the vision their maintainers worked so hard to make a reality, even if their beginnings were humble and their chances of survival uncertain. -Therefore, my first big acknowledgment is to Travis: thanks for giving us a chance!`,q,x,ce=`I also want to thank our community for its continued support. -As I’ve witnessed during my years as Spyder’s lead developer, many newbies and veterans alike keep choosing Spyder as their primary tool for scientific programming in Python. -It’s really you, the members of this fantastic community, which keep Spyder relevant in a highly competitive field by using and contributing back to it. -Furthermore, when the future looked grim, after my team and I were let go from Anaconda at the end of 2017 (not by Travis’ decision), a lot of users came to our rescue by making donations through our Open Collective page. -That, and a NumFOCUS development grant we received the next year, filled us with confidence and allowed us to continue with Spyder’s development in 2018, even after losing part of our team in the process.`,L,k,he=`Last year it was also a pleasant surprise to learn that several companies were interested in seeing Spyder prosper and thrive. -Through Quansight Labs and its Community Work Order concept, we were able to sign contracts with two of them: TDK-Micronas and Kite. -Their support was critical to finish Spyder 4 because it allowed me to hire most of my old Anaconda team back, plus two new additions, to work full-time on the project. -Therefore, I can’t thank them enough for showing up just at the right time!`,K,T,me=`And finally, even when I am often seen as the public face of Spyder, due to my presence in our issue tracker and Stack Overflow, it’s really the Spyder team that is in charge of implementing new features and fixing most bugs. -So my last round of acknowledgments goes to them. -I was fortunate enough to convince some of the most talented Colombian software developers to work for the project, and to attract the interest of several other equally accomplished developers from around the world. -All of them did a hell of a job in this release!`,A,C,ue=`Jean-Sébastien Gosselin contributed our new Plots pane in its entirety; Quentin Peter did a complete re-architecting of our IPython console, which enabled numerous improvements to our debugger; Jitse Niesen added auto-saving functionality to our editor; Brian Olsen contributed the initial implementation of the runcell command; and CAM Gerlach made significant improvements to our documentation. -Gonzalo Peña-Castellanos helped us to greatly improve the user experience of code completion and linting in the editor, implemented most of the enhancements to the Files pane, and refactored and improved our configuration system; Edgar Margffoy single-handedly created a client to support the same protocol used by VSCode to provide completion and linting for lots of programming languages, added code snippet completions and vastly improved code folding in the editor; Daniel Althviz developed the necessary infrastructure to install and use Kite smoothly within Spyder, and added the new object viewer to the Variable Explorer. -Finally, our junior developers, Stephannie Jimenez and Juanita Gomez, although still finding their way around our complex codebase, managed to make important contributions, such as improving the icons we use per file type in Files (Juanita), and allowing users to run code in an external system terminal on macOS (Stephannie).`,j,S,Pe=`I hope you all enjoy the results of this massive effort! -And happy Spydering!!!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("p"),x.innerHTML=ce,L=a(),k=o("p"),k.innerHTML=he,K=a(),T=o("p"),T.innerHTML=me,A=a(),C=o("p"),C.innerHTML=ue,j=a(),S=o("p"),S.textContent=Pe},l(R){n=l(R,"P",{"data-svelte-h":!0}),r(n)!=="svelte-9f6r3h"&&(n.innerHTML=f),p=s(R),d=l(R,"P",{"data-svelte-h":!0}),r(d)!=="svelte-118umf4"&&(d.innerHTML=i),u=s(R),c=l(R,"P",{"data-svelte-h":!0}),r(c)!=="svelte-19d7044"&&(c.innerHTML=de),D=s(R),v=l(R,"P",{"data-svelte-h":!0}),r(v)!=="svelte-1t3rmts"&&(v.innerHTML=we),q=s(R),x=l(R,"P",{"data-svelte-h":!0}),r(x)!=="svelte-q3u02e"&&(x.innerHTML=ce),L=s(R),k=l(R,"P",{"data-svelte-h":!0}),r(k)!=="svelte-ma1pu9"&&(k.innerHTML=he),K=s(R),T=l(R,"P",{"data-svelte-h":!0}),r(T)!=="svelte-epmo9k"&&(T.innerHTML=me),A=s(R),C=l(R,"P",{"data-svelte-h":!0}),r(C)!=="svelte-wwph68"&&(C.innerHTML=ue),j=s(R),S=l(R,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1nf22io"&&(S.textContent=Pe)},m(R,P){t(R,n,P),t(R,p,P),t(R,d,P),t(R,u,P),t(R,c,P),t(R,D,P),t(R,v,P),t(R,q,P),t(R,x,P),t(R,L,P),t(R,k,P),t(R,K,P),t(R,T,P),t(R,A,P),t(R,C,P),t(R,j,P),t(R,S,P)},p:wt,d(R){R&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S))}}}function ll(y){let n,f;const p=[y[0],pn];let d={$$slots:{default:[ol]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let sl=class extends vt{constructor(n){super(),bt(this,n,al,ll,gt,{})}};const il=Object.freeze(Object.defineProperty({__proto__:null,default:sl,metadata:pn},Symbol.toStringTag,{value:"Module"}));function rl(y){let n,f='This blogpost was originally published on the Quansight Labs website',p,d,i=`It has been almost two months since I joined Quansight in April, to start -working on Spyder maintenance and -development. So far, it has been a very exciting and rewarding journey under -the guidance of long time Spyder maintainer -Carlos Córdoba. -This is the first of a series of blog posts we will be writing to showcase -updates on the development of Spyder, new planned features and news on the -road to Spyder 4.0 and beyond.`,u,c,de=`First off, I would like to give a warm welcome to -Edgar Margffoy, -who recently joined Quansight and will be working with the Spyder team to -take its development even further. Edgar has been a core Spyder developer -for more than two years now, and we are very excited to have his (almost) -full-time commitment to the project.`,D,v,we="Spyder 4.0 Beta 2 released!",q,x,ce=`Since August 2018, when the first beta of the 4.x series was released, the -Spyder development team has been working hard on our next release. -Over the past year, we’ve implemented the long awaited full-interface dark theme; -overhauled our entire code completion and linting architecture to use the -Language Server Protocol, -opening the door to supporting many other languages in the future; -added a new Plots pane to view and manage the figures generated by your code; -and numerous other feature enhancements, bug fixes and internal improvements.`,L,k,he="Dark theme",K,T,me=`A full-interface dark theme has been a -long awaited feature, -and is enabled by default in Spyder 4. You can still select the -light theme under Preferences > Appearance by either choosing a light-background -syntax-highlighting scheme, or changing Interface theme to Light.`,A,C,ue,j,S,Pe="Pretty, right :-) ?",R,P,Le=`This enhancement was made possible by the work of -Colin Duquesnoy, -Daniel Pizzeta -and their QDarkStyle -package. The Spyder team is now actively collaborating with Colin and Daniel -to pursue the release of QDarkStyle 3.x, which will be using Spyder’s -QtSASS -package to harness the power of SASS/SCSS and allow users to fully customize -the theme dynamically.`,H,b,ke="Language Server Protocol architecture",fe,E,$e=`The Language Server Protocol (LSP) was created by Microsoft for Visual Studio Code to standardize how -development tools (e.g. editors and IDEs) communicate with -servers that provide code completion, linting and related facilities for -different programming languages. With LSP, as -they describe it:`,se,ee,qe=`

A single Language Server can be reused in multiple development tools, -which in turn can support multiple languages with minimal effort. -LSP is a win for both language providers and tooling vendors!

`,Z,O,We=`As of Spyder 4 Beta 2, Spyder is now one of those tools! -We developed our own client to communicate with any server that implements -LSP v3.0 through a transport layer that uses ZeroMQ sockets. Code completion, -help generation, calltips, and real-time code/style analysis were rewritten to take advantage of this -architecture, and hover hints and docstring style analysis were added. -Further LSP features, such as workspace functionality and on the fly completion, will come in future betas.`,J,Q,Ue,ve,ie,Je=`Our current support is geared towards Python, using the great -Python-Language-Server -package. This has allowed us to provide fine-grained configurability for -Pycodestyle and -Pydocstyle options, and in future -betas we’ll also add the ability to use and configure code formatters like -YAPF and autopep8.`,Ce,oe,Re,Se,le,Qe=`We support configuring LSP servers for additional, non-Python programming languages. -In the future, we hope to include out-of-the-box LSP integration for -some of the most popular languages in the scientific computing space, -including Fortran, Julia and C/C++.`,_,M,Ye,V,Y,Xe="Plots pane",X,te,et=`Similar to RStudio and other data science IDEs, -Spyder now includes a Plots pane, allowing you to browse all figures created during a -session. Beyond just viewing plots, you can also zoom, save/export, copy and remove -them.`,De,ge,tt,Ge,ye,nt="But wait, there’s more!",B,ne,ot=`There are numerous additional features we’ve added in the previous 10 -months! These include:`,Oe,Te,lt=`
  • Autosave and File Recovery in the editor, so Spyder can restore your -unsaved files in case it crashes or something else goes wrong.
  • Dedicated Sympy, Cython and Pylab consoles, making it -very simple to quickly explore and create code for these libraries.
  • OS level window pane undocking, allowing you to easily -organize panes across different monitors.
  • Support for multi-indexes -in our Dataframe viewer, making working with complex datasets much easier.
  • `,Fe,_e,at=`We will describe all of these additional enhancements in greater detail in -future blog posts.`,F,ae,it="You can help!",U,re,dt=`If would like to help us test this beta release and try out the new features it offers, -you can! You can install it with conda (if using Anaconda/Miniconda, as we recommend), -or with pip; we suggest doing so in a new Conda env or virtualenv/venv -so you can easily switch between your existing Spyder install and the Spyder 4 beta. -For example, to do so with conda, enter the following at the Terminal/Anaconda prompt:`,Ke,Ee,rt,Ze=`$ conda create --channel spyder-ide --name spyder-beta spyder=4.0.0b2 -$ conda activate spyder-beta -$ spyder`,ze,st,g=`This is a safe process because Spyder now uses a different configuration -directory for its development versions, so you can easily switch between our stable -and beta releases without worrying about one affecting the other.`,$,ht,ut=`If you find any bugs, you can report them on our -issue tracker; -make sure to search for your error message or behavior before making a new one.`,Ne,pt,z="Closing remarks",pe,ft,m=`I would like to thank Quansight for the opportunity of working in open source -development on an awesome project like Spyder. I am also grateful to our -users, contributors -and core developers for helping -making Spyder amazing!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("h1"),v.textContent=we,q=a(),x=o("p"),x.innerHTML=ce,L=a(),k=o("h2"),k.textContent=he,K=a(),T=o("p"),T.innerHTML=me,A=a(),C=o("img"),j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("p"),P.innerHTML=Le,H=a(),b=o("h2"),b.textContent=ke,fe=a(),E=o("p"),E.innerHTML=$e,se=a(),ee=o("blockquote"),ee.innerHTML=qe,Z=a(),O=o("p"),O.textContent=We,J=a(),Q=o("img"),ve=a(),ie=o("p"),ie.innerHTML=Je,Ce=a(),oe=o("img"),Se=a(),le=o("p"),le.textContent=Qe,_=a(),M=o("img"),V=a(),Y=o("h2"),Y.textContent=Xe,X=a(),te=o("p"),te.innerHTML=et,De=a(),ge=o("img"),Ge=a(),ye=o("h2"),ye.textContent=nt,B=a(),ne=o("p"),ne.textContent=ot,Oe=a(),Te=o("ul"),Te.innerHTML=lt,Fe=a(),_e=o("p"),_e.textContent=at,F=a(),ae=o("h2"),ae.textContent=it,U=a(),re=o("p"),re.innerHTML=dt,Ke=a(),Ee=o("pre"),rt=new Rt(!1),ze=a(),st=o("p"),st.textContent=g,$=a(),ht=o("p"),ht.innerHTML=ut,Ne=a(),pt=o("h2"),pt.textContent=z,pe=a(),ft=o("p"),ft.innerHTML=m,this.h()},l(w){n=l(w,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1wz2w3n"&&(n.innerHTML=f),p=s(w),d=l(w,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1eabgyx"&&(d.innerHTML=i),u=s(w),c=l(w,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1ihfkr1"&&(c.innerHTML=de),D=s(w),v=l(w,"H1",{"data-svelte-h":!0}),r(v)!=="svelte-7kmlv3"&&(v.textContent=we),q=s(w),x=l(w,"P",{"data-svelte-h":!0}),r(x)!=="svelte-4cvjwe"&&(x.innerHTML=ce),L=s(w),k=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-1a2hh4r"&&(k.textContent=he),K=s(w),T=l(w,"P",{"data-svelte-h":!0}),r(T)!=="svelte-gf6243"&&(T.innerHTML=me),A=s(w),C=l(w,"IMG",{src:!0,alt:!0}),j=s(w),S=l(w,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1yijxxv"&&(S.textContent=Pe),R=s(w),P=l(w,"P",{"data-svelte-h":!0}),r(P)!=="svelte-q9vdms"&&(P.innerHTML=Le),H=s(w),b=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(b)!=="svelte-11mywl0"&&(b.textContent=ke),fe=s(w),E=l(w,"P",{"data-svelte-h":!0}),r(E)!=="svelte-1bk4269"&&(E.innerHTML=$e),se=s(w),ee=l(w,"BLOCKQUOTE",{"data-svelte-h":!0}),r(ee)!=="svelte-1j0l5ju"&&(ee.innerHTML=qe),Z=s(w),O=l(w,"P",{"data-svelte-h":!0}),r(O)!=="svelte-awzqvi"&&(O.textContent=We),J=s(w),Q=l(w,"IMG",{src:!0,alt:!0}),ve=s(w),ie=l(w,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-1cdnc4"&&(ie.innerHTML=Je),Ce=s(w),oe=l(w,"IMG",{src:!0,alt:!0}),Se=s(w),le=l(w,"P",{"data-svelte-h":!0}),r(le)!=="svelte-1yzljlb"&&(le.textContent=Qe),_=s(w),M=l(w,"IMG",{src:!0,alt:!0}),V=s(w),Y=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(Y)!=="svelte-1jbtxpk"&&(Y.textContent=Xe),X=s(w),te=l(w,"P",{"data-svelte-h":!0}),r(te)!=="svelte-r6n6cd"&&(te.innerHTML=et),De=s(w),ge=l(w,"IMG",{src:!0,alt:!0}),Ge=s(w),ye=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(ye)!=="svelte-66qyz8"&&(ye.textContent=nt),B=s(w),ne=l(w,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-11dz64v"&&(ne.textContent=ot),Oe=s(w),Te=l(w,"UL",{"data-svelte-h":!0}),r(Te)!=="svelte-1u30ia1"&&(Te.innerHTML=lt),Fe=s(w),_e=l(w,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-r8brsp"&&(_e.textContent=at),F=s(w),ae=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(ae)!=="svelte-vp73cb"&&(ae.textContent=it),U=s(w),re=l(w,"P",{"data-svelte-h":!0}),r(re)!=="svelte-ye9ycf"&&(re.innerHTML=dt),Ke=s(w),Ee=l(w,"PRE",{class:!0});var Ie=jt(Ee);rt=Qt(Ie,!1),Ie.forEach(e),ze=s(w),st=l(w,"P",{"data-svelte-h":!0}),r(st)!=="svelte-1w248v4"&&(st.textContent=g),$=s(w),ht=l(w,"P",{"data-svelte-h":!0}),r(ht)!=="svelte-1mi7edq"&&(ht.innerHTML=ut),Ne=s(w),pt=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(pt)!=="svelte-1mvchr8"&&(pt.textContent=z),pe=s(w),ft=l(w,"P",{"data-svelte-h":!0}),r(ft)!=="svelte-19r1btb"&&(ft.innerHTML=m),this.h()},h(){h(k,"class","section"),xe(C.src,ue="spyder-qdarkstyle.png")||h(C,"src",ue),h(C,"alt","Screenshot of the Spyder main window with default panes, with the dark theme applied across the entire interface"),h(b,"class","section"),xe(Q.src,Ue="spyder-hover-hint-calltip.png")||h(Q,"src",Ue),h(Q,"alt","Hover hint and calltips"),xe(oe.src,Re="spyder-doc-prefs.png")||h(oe,"src",Re),h(oe,"alt","Docstring style preferences"),xe(M.src,Ye="spyder-preferences-lsp.png")||h(M,"src",Ye),h(M,"alt","Spyder Completion and Linting preferences pane, showing example PyLS servers configured for Go and Julia"),h(Y,"class","section"),xe(ge.src,tt="spyder-plots.png")||h(ge,"src",tt),h(ge,"alt","Spyder main window, showing a figure displayed in the plots pane"),h(ye,"class","section"),h(ae,"class","section"),rt.a=null,h(Ee,"class","language-bash"),h(pt,"class","section")},m(w,Ie){t(w,n,Ie),t(w,p,Ie),t(w,d,Ie),t(w,u,Ie),t(w,c,Ie),t(w,D,Ie),t(w,v,Ie),t(w,q,Ie),t(w,x,Ie),t(w,L,Ie),t(w,k,Ie),t(w,K,Ie),t(w,T,Ie),t(w,A,Ie),t(w,C,Ie),t(w,j,Ie),t(w,S,Ie),t(w,R,Ie),t(w,P,Ie),t(w,H,Ie),t(w,b,Ie),t(w,fe,Ie),t(w,E,Ie),t(w,se,Ie),t(w,ee,Ie),t(w,Z,Ie),t(w,O,Ie),t(w,J,Ie),t(w,Q,Ie),t(w,ve,Ie),t(w,ie,Ie),t(w,Ce,Ie),t(w,oe,Ie),t(w,Se,Ie),t(w,le,Ie),t(w,_,Ie),t(w,M,Ie),t(w,V,Ie),t(w,Y,Ie),t(w,X,Ie),t(w,te,Ie),t(w,De,Ie),t(w,ge,Ie),t(w,Ge,Ie),t(w,ye,Ie),t(w,B,Ie),t(w,ne,Ie),t(w,Oe,Ie),t(w,Te,Ie),t(w,Fe,Ie),t(w,_e,Ie),t(w,F,Ie),t(w,ae,Ie),t(w,U,Ie),t(w,re,Ie),t(w,Ke,Ie),t(w,Ee,Ie),rt.m(Ze,Ee),t(w,ze,Ie),t(w,st,Ie),t(w,$,Ie),t(w,ht,Ie),t(w,Ne,Ie),t(w,pt,Ie),t(w,pe,Ie),t(w,ft,Ie)},p:wt,d(w){w&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae),e(U),e(re),e(Ke),e(Ee),e(ze),e(st),e($),e(ht),e(Ne),e(pt),e(pe),e(ft))}}}function ul(y){let n,f;const p=[y[0],cn];let d={$$slots:{default:[rl]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let hl=class extends vt{constructor(n){super(),bt(this,n,dl,ul,gt,{})}};const pl=Object.freeze(Object.defineProperty({__proto__:null,default:hl,metadata:cn},Symbol.toStringTag,{value:"Module"}));function cl(y){let n,f=`After two years in development and more than 2600 commits from over two dozen authors around the world, Spyder 6.0.0 had its stable release on September 3, 2024! -Now that 6.0.1 is out and the dust has settled, we’d like to formally announce the release here, summarize the major changes, thank those who’ve contributed to it, and introduce a series of posts highlighting its biggest new features and improvements.`,p,d,i=`You can download the latest installer on our website (recommended), or you can also install this version via a variety of other methods, including Conda and Conda distributions, Pip, WinPython, OS and distro package managers, from source and GitHub and more. -We can’t wait for you to try Spyder 6.0 if you haven’t already, and to find out more about what we’re excited about, read on!`,u,c,de="Highlights and new features",D,v,we=`This new release comes with a lengthy list of user-requested features that improve both Spyder’s interactive computing facilities and its software development capabilities, along with many UI and usability enhancements. -Additionally, it completes the migration process to the new plugin API introduced in Spyder 5 and adds further new features for Spyder plugin developers, allowing them to build even more powerful extensions for our beloved IDE. -Overall, over two dozen contributors made more than 2600 commits and contributed 312 pull requests closing 137 unique issues, adding or modifying approximately 200 000 lines of code across 900 files. -We’re excited that in less than a month and a half since being published, just our new standalone installers for Spyder 6.0.0 and 6.0.1 have been downloaded over 350 000 times across Windows, Mac and Linux!`,q,x,ce=`We’ll have followup blogs by each of our team members highlighting the biggest improvements, including among others our new remote development architecture, UI/UX improvements, updated plugins, and a new website, docs site and translations, in addition to Ryan’s existing post on the Conda-based installers/updaters. -Keep an eye out for those in the coming weeks!`,L,k,he='In the meantime, here’s a summary of what’s new in the Spyder 6 release! Check out the Spyder 6 Changelog for a complete list of new features, UI improvements, bug fixes, API changes and more.',K,T,me="Major new features",A,C,ue='
  • Initial support for connecting to remote workstations, cloud desktops, computing clusters and other severs via SSH, allowing automatically installing and starting a kernel and running code remotely (part of our CZI grant)
  • Conda-based installers for Windows, macOS and Linux, with more convenient and robust updates, newer Python versions and opening the door to many future features
  • A Debugger pane to explore the stack frame of the current debugging session, centralizing debugger functionality in one place, and including a new button to enter the debugger during the current execution
  • ',j,S,Pe="Global enhancements",R,P,Le="
  • Add ability to manage external plugins (e.g. Spyder-Notebook) in Preferences > Plugins
  • The interface font used by the application is now configurable
  • Support accepting Chinese, Japanese and Korean input on Linux
  • Show intro message for panes that don’t display content at startup
  • Experimental support for Qt 6 and increase minimum version to Qt 5.15
  • ",H,b,ke="Editor and files",fe,E,$e="
  • Quick switcher (Ctrl/Cmd-P) can now browse and open files present in the current project
  • Allow files to be opened in the Editor by pasting their path in the Working Directory toolbar item
  • Allow copying the absolute and relative paths of the current file in the Editor tab context menu
  • Improve performance in Projects when checking for filesystem changes
  • ",se,ee,qe="IPython Console",Z,O,We="
  • New submenu to start a new console in any registered Conda or Pyenv environment in one click
  • Kernel restarts are now much faster
  • Environment variables declared in ~/.bashrc or ~/.zhrc are now passed to the console
  • ",J,Q,Ue="Variable Explorer",ve,ie,Je="
  • New refresh button for viewer windows to update the variables within them (at last!)
  • All real number data types are now supported in the DataFrame viewer
  • Add back ability to load HDF5 and Dicom files (removed in Spyder 5)
  • Improve how options are displayed and handled in the different viewers
  • New button to indicate when variables are being filtered
  • ",Ce,oe,Re="Plots",Se,le,Qe="
  • Plots pane is now used to display figures generated by the Variable Explorer
  • Increase DPI of Matplotlib plots so they look better on high resolution screens
  • Respect Matplotlib user settings configured outside Spyder
  • Matplotlib backend and Python environment information now shown in the status bar
  • ",_,M,Ye="Major plugin changes",V,Y,Xe="
  • Add a Debugger plugin to centralize all functionality related to debugging
  • Port the Editor to the new API introduced in Spyder 5, completing Spyder’s migration of internal panes to fully modular plugins
  • Generalize the Run plugin to support generic inputs and executors, allowing custom plugins to run specific files, cells and selections and display the results
  • Add a Switcher plugin for the files and symbols switcher
  • Add an External Terminal plugin to execute Python and Bash/Batch/PwSh files in a system terminal
  • Declare a proper API for the Projects plugin.
  • Move the former Breakpoints plugin’s functionality to the new Debugger plugin
  • ",X,te,et="A special thanks from Spyder",De,ge,tt=`First and foremost, we’d like to thank YOU, our amazing Spyder users, for helping use, test, support, and contribute to Spyder! -Its because of you all, the members of this fantastic community, that we’re motivated and able to keep making Spyder better for everyone! -We’d like to especially thank the many folks who financially support Spyder development via charitable donations through our Open Collective page. -If you like Spyder and would like to see it keep moving forward and and becoming even better, we appreciate whatever you are able to give, financially or otherwise. -If every Wikipedia Spyder user gave $1 per year, we would be able to cover our entire annual budget several times over, so every little bit helps!`,Ge,ye,nt=`Next, we’d like to give a round of applause to our many dedicated contributors who made significant code contributions to this release: @AngelaRemolina, @Mte90, @dpturibio, @rear1019, @stevetracvc, @remisalmon, @sthibaul, @hmaarrfk, @jnsebgosselin, @rhkarls, @musicinmybrain, @isabela-pf, @habibmy, and @kevinsmia1939. -We also want to thank our translators, who make it possible to use Spyder in nearly a dozen different languages!`,B,ne,ot=`We’d also like to thank our other major fiscal sponsors, NumFOCUS and the Chan Zuckerberg Initiative! -NumFOCUS is a 501(c)3-registered charitable nonprofit that serves as the current home of the Spyder project along with the rest of the core PyData ecosystem. -We couldn’t have gotten where we are now without their help, as well as their Small Development Grants that helped fund a number of features in this release. -CZI has provided critical funding for Spyder 6, particularly the new remote development architecture, through a grant in Cycle 5 of its Essential Open Source Software for Science program.`,Oe,Te,lt=`Finally, we’d like to extend personal thanks to our fellow current and former core developers and Spyder team members for their amazing efforts to make Spyder 6 possible! -In no particular order, and mentioning only the most prominent contribution of each person:`,Fe,_e,at='
  • Ryan Clary created and maintains our brand new Conda-based installers and much of their related features and infrastructure
  • Jitse Niesen updated and improved many of our plugins for Spyder 6, including Spyder-Notebook, Spyder-Unittest and Spyder-Line-Profiler
  • Quentin Peter created the new Debugger pane and improved the IPython Console and Spyder-Kernels
  • Daniel Althviz served as Release Manager throughout the Spyder 6 cycle, ported the Editor to our new API and mentored Juan Sebastian
  • Juan Sebastian Bautista made many UI/UX improvements to make Spyder’s interface more user-friendly
  • Hendrik Louzada created the backend for the whole remote development architecture
  • Edgar Margffoy and Stephannie Jimenez created a brand new, pluggable and configurable Run architecture for Spyder as well as several other major API/under the hood improvements
  • Andrés Montoya helped improve the UI/UX, design and theming of Spyder 6 and created this brand new website for the project
  • And of course, Carlos Cordoba lead the project throughout the Spyder 6 development process, both managing and supporting the team as well as making innumerable contributions of his own
  • ',F,ae,it="Three cheers for everyone who made Spyder 6 a reality!",U,re,dt="What’s next",Ke,Ee,rt=`Spyder 6.0 will continue to receive point release updates with bug fixes and minor improvements, but we’re already working on the next big release for Spyder, 6.1! -We currently are planning for it to be closer to a major release than a typical minor release, with a number of further new features and enhancements building directly on the groundwork introduced in Spyder 6.0. -Our plans and the specific features are likely to evolve as we get closer to release, so stay tuned to this blog and @Spyder_IDE on Twitter/X for updates. -However, some of the biggest new features we hope to bring you include:`,Ze,ze,st="
  • Major improvements to the remote development platform first introduced in 6.0, including the ability to easily open, manage and run remote files just as if you were working locally.
  • A new built-in package and environment manager that’ll let you create Conda environments (automatically linked to projects) and install packages right from the Spyder graphical interface, leveraging our existing Conda-based installers.
  • A graphical Spyder plugin browser, allowing you to find, install and manage external plugins with one click in a standalone-installed Spyder.
  • ",g,$,ht=`Want to start using Spyder 6 right now? -The easiest way is by downloading our own installers for Windows, macOS and Linux from our website. -You can also install it via a variety of other methods, such as Conda and Conda distributions, Pip, WinPython, OS and distro package managers and from source on GitHub.`,ut,Ne,pt=`Keep in mind that if you use our standalone installers and want to install your own Python packages not included with Spyder, for now you’ll need to have another Python environment installed on your machine and select it in Spyder, if you don’t have one already configured. -We have an FAQ entry on how to install one that includes a short video tutorial and step by step instructions, as well as an entry on connecting an existing environment.`,z,pe,ft="We hope you all enjoy the new features and improvements in Spyder 6, and as as always, happy Spydering!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("h2"),c.textContent=de,D=a(),v=o("p"),v.textContent=we,q=a(),x=o("p"),x.innerHTML=ce,L=a(),k=o("p"),k.innerHTML=he,K=a(),T=o("h3"),T.textContent=me,A=a(),C=o("ul"),C.innerHTML=ue,j=a(),S=o("h3"),S.textContent=Pe,R=a(),P=o("ul"),P.innerHTML=Le,H=a(),b=o("h3"),b.textContent=ke,fe=a(),E=o("ul"),E.innerHTML=$e,se=a(),ee=o("h3"),ee.textContent=qe,Z=a(),O=o("ul"),O.innerHTML=We,J=a(),Q=o("h3"),Q.textContent=Ue,ve=a(),ie=o("ul"),ie.innerHTML=Je,Ce=a(),oe=o("h3"),oe.textContent=Re,Se=a(),le=o("ul"),le.innerHTML=Qe,_=a(),M=o("h3"),M.textContent=Ye,V=a(),Y=o("ul"),Y.innerHTML=Xe,X=a(),te=o("h2"),te.textContent=et,De=a(),ge=o("p"),ge.innerHTML=tt,Ge=a(),ye=o("p"),ye.innerHTML=nt,B=a(),ne=o("p"),ne.innerHTML=ot,Oe=a(),Te=o("p"),Te.textContent=lt,Fe=a(),_e=o("ul"),_e.innerHTML=at,F=a(),ae=o("p"),ae.textContent=it,U=a(),re=o("h2"),re.textContent=dt,Ke=a(),Ee=o("p"),Ee.innerHTML=rt,Ze=a(),ze=o("ul"),ze.innerHTML=st,g=a(),$=o("p"),$.innerHTML=ht,ut=a(),Ne=o("p"),Ne.innerHTML=pt,z=a(),pe=o("p"),pe.textContent=ft,this.h()},l(m){n=l(m,"P",{"data-svelte-h":!0}),r(n)!=="svelte-151irch"&&(n.innerHTML=f),p=s(m),d=l(m,"P",{"data-svelte-h":!0}),r(d)!=="svelte-4ecn6b"&&(d.innerHTML=i),u=s(m),c=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-1wslmct"&&(c.textContent=de),D=s(m),v=l(m,"P",{"data-svelte-h":!0}),r(v)!=="svelte-1erhi7e"&&(v.textContent=we),q=s(m),x=l(m,"P",{"data-svelte-h":!0}),r(x)!=="svelte-r82lif"&&(x.innerHTML=ce),L=s(m),k=l(m,"P",{"data-svelte-h":!0}),r(k)!=="svelte-1i5lqwh"&&(k.innerHTML=he),K=s(m),T=l(m,"H3",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-2xwfvo"&&(T.textContent=me),A=s(m),C=l(m,"UL",{"data-svelte-h":!0}),r(C)!=="svelte-bbcsac"&&(C.innerHTML=ue),j=s(m),S=l(m,"H3",{class:!0,"data-svelte-h":!0}),r(S)!=="svelte-2z3iiu"&&(S.textContent=Pe),R=s(m),P=l(m,"UL",{"data-svelte-h":!0}),r(P)!=="svelte-1rqlz28"&&(P.innerHTML=Le),H=s(m),b=l(m,"H3",{class:!0,"data-svelte-h":!0}),r(b)!=="svelte-92xjzf"&&(b.textContent=ke),fe=s(m),E=l(m,"UL",{"data-svelte-h":!0}),r(E)!=="svelte-1oz08qb"&&(E.innerHTML=$e),se=s(m),ee=l(m,"H3",{class:!0,"data-svelte-h":!0}),r(ee)!=="svelte-175wkxw"&&(ee.textContent=qe),Z=s(m),O=l(m,"UL",{"data-svelte-h":!0}),r(O)!=="svelte-1pnxvbu"&&(O.innerHTML=We),J=s(m),Q=l(m,"H3",{class:!0,"data-svelte-h":!0}),r(Q)!=="svelte-c4sqtv"&&(Q.textContent=Ue),ve=s(m),ie=l(m,"UL",{"data-svelte-h":!0}),r(ie)!=="svelte-1jqhg91"&&(ie.innerHTML=Je),Ce=s(m),oe=l(m,"H3",{class:!0,"data-svelte-h":!0}),r(oe)!=="svelte-1xary64"&&(oe.textContent=Re),Se=s(m),le=l(m,"UL",{"data-svelte-h":!0}),r(le)!=="svelte-13w56qc"&&(le.innerHTML=Qe),_=s(m),M=l(m,"H3",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-9tgovd"&&(M.textContent=Ye),V=s(m),Y=l(m,"UL",{"data-svelte-h":!0}),r(Y)!=="svelte-r84eif"&&(Y.innerHTML=Xe),X=s(m),te=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(te)!=="svelte-qd82uy"&&(te.textContent=et),De=s(m),ge=l(m,"P",{"data-svelte-h":!0}),r(ge)!=="svelte-zqdykh"&&(ge.innerHTML=tt),Ge=s(m),ye=l(m,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-nmc92n"&&(ye.innerHTML=nt),B=s(m),ne=l(m,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1oj010m"&&(ne.innerHTML=ot),Oe=s(m),Te=l(m,"P",{"data-svelte-h":!0}),r(Te)!=="svelte-wiipsy"&&(Te.textContent=lt),Fe=s(m),_e=l(m,"UL",{"data-svelte-h":!0}),r(_e)!=="svelte-30evor"&&(_e.innerHTML=at),F=s(m),ae=l(m,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-ai0350"&&(ae.textContent=it),U=s(m),re=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(re)!=="svelte-rht9sr"&&(re.textContent=dt),Ke=s(m),Ee=l(m,"P",{"data-svelte-h":!0}),r(Ee)!=="svelte-1ezsxu0"&&(Ee.innerHTML=rt),Ze=s(m),ze=l(m,"UL",{"data-svelte-h":!0}),r(ze)!=="svelte-i2sf6t"&&(ze.innerHTML=st),g=s(m),$=l(m,"P",{"data-svelte-h":!0}),r($)!=="svelte-1u0ihyj"&&($.innerHTML=ht),ut=s(m),Ne=l(m,"P",{"data-svelte-h":!0}),r(Ne)!=="svelte-rbnnby"&&(Ne.innerHTML=pt),z=s(m),pe=l(m,"P",{"data-svelte-h":!0}),r(pe)!=="svelte-2mvmj3"&&(pe.textContent=ft),this.h()},h(){h(c,"class","section"),h(T,"class","subsection"),h(S,"class","subsection"),h(b,"class","subsection"),h(ee,"class","subsection"),h(Q,"class","subsection"),h(oe,"class","subsection"),h(M,"class","subsection"),h(te,"class","section"),h(re,"class","section")},m(m,w){t(m,n,w),t(m,p,w),t(m,d,w),t(m,u,w),t(m,c,w),t(m,D,w),t(m,v,w),t(m,q,w),t(m,x,w),t(m,L,w),t(m,k,w),t(m,K,w),t(m,T,w),t(m,A,w),t(m,C,w),t(m,j,w),t(m,S,w),t(m,R,w),t(m,P,w),t(m,H,w),t(m,b,w),t(m,fe,w),t(m,E,w),t(m,se,w),t(m,ee,w),t(m,Z,w),t(m,O,w),t(m,J,w),t(m,Q,w),t(m,ve,w),t(m,ie,w),t(m,Ce,w),t(m,oe,w),t(m,Se,w),t(m,le,w),t(m,_,w),t(m,M,w),t(m,V,w),t(m,Y,w),t(m,X,w),t(m,te,w),t(m,De,w),t(m,ge,w),t(m,Ge,w),t(m,ye,w),t(m,B,w),t(m,ne,w),t(m,Oe,w),t(m,Te,w),t(m,Fe,w),t(m,_e,w),t(m,F,w),t(m,ae,w),t(m,U,w),t(m,re,w),t(m,Ke,w),t(m,Ee,w),t(m,Ze,w),t(m,ze,w),t(m,g,w),t(m,$,w),t(m,ut,w),t(m,Ne,w),t(m,z,w),t(m,pe,w)},p:wt,d(m){m&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae),e(U),e(re),e(Ke),e(Ee),e(Ze),e(ze),e(g),e($),e(ut),e(Ne),e(z),e(pe))}}}function fl(y){let n,f;const p=[y[0],fn];let d={$$slots:{default:[cl]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let yl=class extends vt{constructor(n){super(),bt(this,n,ml,fl,gt,{})}};const wl=Object.freeze(Object.defineProperty({__proto__:null,default:yl,metadata:fn},Symbol.toStringTag,{value:"Module"}));function gl(y){let n,f=`The Spyder team and collaborators hosted a Birds of a Feather (BoF) session at SciPy 2023, focused on moving beyond just scripts and notebooks toward truly reproducible, reusable research. -In Part 1 of this two-part series, we went over our motivation and goals for the session and the challenges that attendees brought up. -Now, we’ll review the tips, strategies, tools and platforms (including Spyder!) that participants shared as ways to address these obstacles. -We’d again like to thank Juanita Gomez for helping organize the BoF, Hari for his hard work compiling a summary of the outcomes, and everyone for attending and sharing such great ideas and insights!`,p,d,i="Making notebooks more reusable",u,c,de=`As far as reproducibility is concerned, it was brought up that it can be difficult to easily compare outputs between notebooks created by different researchers. -In response, one participant mentioned that VSCode recently made an improvement to the notebook diff viewers to more easily show just the code changes. -However, users stressed that it was critical to be able to diff the actual notebook output, not just its contents, and expressed a desire for a tool to cover that aspect.`,D,v,we=`In response to these concerns, others responded that notebooks should not be considered a unit of reproducible research, which should instead be a complete software project, including notebooks or scripts, an environment/requirements file and a record of commands to run there. -They recommended the 8-levels of Reproducibility and Conda Project to help guide and implement this.`,q,x,ce=`Additionally, attendees recommended Papermill, describing it as a very useful tool for parameterizing and executing notebooks programmatically. -Others suggested Devcontainers, to allow collaborating with a lab group or team in a shared environment and seeing everything on their screen, as well as Live Share in VSCode.`,L,k,he=`Participants also expressed frustration that despite notebooks being intended to make programming more literate, this often does not happen in practice. -Beginners like the interactivity in notebooks because they don’t know how to use more advanced programming tools, but they don’t always take advantage of their readability features. -To address this, attendees stressed the importance of getting users accustomed to best practices that can also be helpful for reproducibility. -A participant mentioned a nbflake8 tool to lint notebooks, though it could not be easily found online, and others wished for a Ruff implementation (which at the time of this writing is now complete).`,K,T,me="Migrating notebooks to modules",A,C,ue=`As one participant put it, “I love notebooks, and also love modules, and love the flow of code from notebooks into modules once it approaches that point.” -They went on to describe modules as a key unit of documented, tested code, but which doesn’t mean a lot on its own, whereas combined with a notebook, it gives them context and meaning. -For communities that may be afraid of modules, the participant recommended trying to make creating and transitioning to them easier, so users have fully importable, reusable Python code. -For students, notebooks often turn into a fancy scratch pad or script file, and once they get stuff that works, they can move that stuff out into modules, and then the notebooks start to morph into examples and the history of what the work was about that can be interpreted by other researchers.`,j,S,Pe=`Other attendees chimed in with similar stories, with a NIST researcher mentioning this is an area they’d been working on for 10 years, with their approach being putting the stuff they want to be modular in a regular Python module, and then have a Jupyter notebook that shows an example using the code, such as in their IPRPy project. -To aid this process, participants suggested tools like the Autodocstring extension in VSCode and the docstring generator built into Spyder’s editor as great ways to reduce the friction for students when writing documentation, as they just add the triple quotes and the IDE generates a pre-filled docstring for them.`,R,P,Le=`An important reproducibility and reusability tool many cited for this was nbdev, which can allow users to develop their code and let it grow, and then eventually export the parts as modules at the end. -According to attendees, its documentation mostly talks about everything as packages, but it can also be used for individual notebooks and modules. -Some participants were initially hesitant to show it to their students since they’re early Python programmers, but it was actually quite easy for them, only requiring as little as one line of code at the end. -(Unfortunately as of this writing, it seems ndbdev development has stalled due to its expected commercial opportunities not materializing.) -Others asked for more documentation resources for this, since they were still learning Python themselves and would like to learn more about this and teach it to their students. -In addition to this very blog post and guide, one attendee brought up that they did a tutorial on that topic at SciPy, adding that the documentation is pretty intimidating but it would be great to have something more focused on smaller-scale usage.`,H,b,ke=`As additional approaches, attendees mentioned they have their students use Jupytext, which helps the student to convert notebooks to Python files that can be committed to a Git repository. -This allows the code to be committed as a Python file, while allowing Jupyter to open it as a notebook and continue working on it. -Others brought up nb-convert, a command line tool that can convert notebooks to many different formats including a Python script, which is integrated into IDEs like Spyder, and that there is also a similar VSCode feature.`,fe,E,$e="Enabling reusable Python packages",se,ee,qe=`When it comes to overall workflow, all agreed that going from a script or notebook to a reusable, installable Python package could be a major challenge, especially for students and non-programmers. -Attendees from NASA mentioned that for their projects everything has to be documented, and one of the things they’ve struggled with was converting a notebook to the type of report NASA is typically looking for. -Others described their workflow being as simple and “old school” as writing a aaa_readme.txt file where they record a diary of what they were doing on that project so if they have a break working on it, they can go back to those notes and remind themselves.`,Z,O,We=`To help address this, participants recommended a “really cool” tool called “Show Your Work” that comes out of the astrophysics community, which is primarily aimed at producing a paper at the end but also a Python package, and includes all the steps that show users’ work along the way. -It is built around a tool called Snakemake, which then sets up a template for both the Python package and the paper. -Additionally, attendees described it as having a “really helpful” guide for getting started and ensuring all of a user’s projects have the same structure. -It was brought up that Azel Donath, maintainer of Gammapy and speaker at SciPy 2023, published their Gammapy paper by using this tool.`,J,Q,Ue=`As a followup, participants asked how this differed from Quarto, to which the response was that Quarto is much more general, whereas Show Your Work was specifically built to allow users to produce a PDF in LaTeX at the end. -Others mentioned Duecredit, a related tool for citing open source authors which looks at code and finds the authors (via Git commits) that wrote it.`,ve,ie,Je=`Additionally, users expressed particular appreciation for the Cookiecutter template that Henry Schreiner III has for packaging. -They mentioned that a lot of their workflows are just messing around with their data, and having something like a package structure from the get go helps make it easier to not miss things. -As a followup, a nuclear engineer mentioned they often have two week projects leveraging Jupyter at their center, with a cookiecutter template that has Sphinx, and a directory structure, and metadata that looks familiar and has everything set up by default. -They described how this particularly helps ensure that different colleagues and team members are on the same page with doing things. -Finally, others suggested the data-driven Cookiecutter template, which provides an ordered structure for where things go, what they are named and how they are run.`,Ce,oe,Re="Next steps",Se,le,Qe=`Now that we’ve gathered a wealth of community feedback, ideas and resources, we’re currently working to further translate these insights into an actionable guide (or series of such) on a community platform, to make it easier for everyone to apply them. -Keep an eye out for that, and until then, happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("h2"),d.textContent=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("p"),x.innerHTML=ce,L=a(),k=o("p"),k.innerHTML=he,K=a(),T=o("h2"),T.textContent=me,A=a(),C=o("p"),C.textContent=ue,j=a(),S=o("p"),S.innerHTML=Pe,R=a(),P=o("p"),P.innerHTML=Le,H=a(),b=o("p"),b.innerHTML=ke,fe=a(),E=o("h2"),E.textContent=$e,se=a(),ee=o("p"),ee.innerHTML=qe,Z=a(),O=o("p"),O.innerHTML=We,J=a(),Q=o("p"),Q.innerHTML=Ue,ve=a(),ie=o("p"),ie.innerHTML=Je,Ce=a(),oe=o("h2"),oe.textContent=Re,Se=a(),le=o("p"),le.textContent=Qe,this.h()},l(_){n=l(_,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1rsron7"&&(n.innerHTML=f),p=s(_),d=l(_,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-1oivyqz"&&(d.textContent=i),u=s(_),c=l(_,"P",{"data-svelte-h":!0}),r(c)!=="svelte-usjxwz"&&(c.innerHTML=de),D=s(_),v=l(_,"P",{"data-svelte-h":!0}),r(v)!=="svelte-hx5j5j"&&(v.innerHTML=we),q=s(_),x=l(_,"P",{"data-svelte-h":!0}),r(x)!=="svelte-1089bxp"&&(x.innerHTML=ce),L=s(_),k=l(_,"P",{"data-svelte-h":!0}),r(k)!=="svelte-1ms9red"&&(k.innerHTML=he),K=s(_),T=l(_,"H2",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-paakq"&&(T.textContent=me),A=s(_),C=l(_,"P",{"data-svelte-h":!0}),r(C)!=="svelte-173yon5"&&(C.textContent=ue),j=s(_),S=l(_,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1799m22"&&(S.innerHTML=Pe),R=s(_),P=l(_,"P",{"data-svelte-h":!0}),r(P)!=="svelte-1upcstj"&&(P.innerHTML=Le),H=s(_),b=l(_,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1x1q5a2"&&(b.innerHTML=ke),fe=s(_),E=l(_,"H2",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-18hhit8"&&(E.textContent=$e),se=s(_),ee=l(_,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-m81akp"&&(ee.innerHTML=qe),Z=s(_),O=l(_,"P",{"data-svelte-h":!0}),r(O)!=="svelte-eee2gu"&&(O.innerHTML=We),J=s(_),Q=l(_,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-185l8gx"&&(Q.innerHTML=Ue),ve=s(_),ie=l(_,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-1y8nhb4"&&(ie.innerHTML=Je),Ce=s(_),oe=l(_,"H2",{class:!0,"data-svelte-h":!0}),r(oe)!=="svelte-18hazx0"&&(oe.textContent=Re),Se=s(_),le=l(_,"P",{"data-svelte-h":!0}),r(le)!=="svelte-w2m65z"&&(le.textContent=Qe),this.h()},h(){h(d,"class","section"),h(T,"class","section"),h(E,"class","section"),h(oe,"class","section")},m(_,M){t(_,n,M),t(_,p,M),t(_,d,M),t(_,u,M),t(_,c,M),t(_,D,M),t(_,v,M),t(_,q,M),t(_,x,M),t(_,L,M),t(_,k,M),t(_,K,M),t(_,T,M),t(_,A,M),t(_,C,M),t(_,j,M),t(_,S,M),t(_,R,M),t(_,P,M),t(_,H,M),t(_,b,M),t(_,fe,M),t(_,E,M),t(_,se,M),t(_,ee,M),t(_,Z,M),t(_,O,M),t(_,J,M),t(_,Q,M),t(_,ve,M),t(_,ie,M),t(_,Ce,M),t(_,oe,M),t(_,Se,M),t(_,le,M)},p:wt,d(_){_&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le))}}}function vl(y){let n,f;const p=[y[0],mn];let d={$$slots:{default:[gl]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let xl=class extends vt{constructor(n){super(),bt(this,n,bl,vl,gt,{})}};const kl=Object.freeze(Object.defineProperty({__proto__:null,default:xl,metadata:mn},Symbol.toStringTag,{value:"Module"}));function _l(y){let n,f=`The Spyder team and collaborators hosted a Birds of a Feather (BoF) session at SciPy 2023, focused on moving beyond just scripts and notebooks toward truly reproducible, reusable research. -Here, we’ll recap the motivation and goals of the BoF and share the common challenges that participants brought up with notebooks and moving toward reproducible, reusable research. -In our next post, we’ll follow up with some of the tips, tools, platforms and strategies attendees brought up as ways to address them, including using Spyder! -We’d like to thank Juanita Gomez for helping organize the BoF, Hari for his hard work compiling a summary of the outcomes, and everyone for attending and sharing such great ideas and insights!`,p,d,i="The trouble with notebooks",u,c,de=`The overwhelming majority of current scientific code is siloed away into one-off scripts and notebooks, where the only real mechanism for reusing and building upon them is good old copy and paste. -In order to keep “building upon the shoulders of giants”, we need to achieve not only reproducibility of individual results but also true reusability of research methods, that can be shared, built upon, and deployed by researchers across the world.`,D,v,we="In particular, scripts and notebooks are not typically very reproducible or reusable, as users generally cannot easily import them, specify dependencies, extend them or use them for another project (without copy/paste and managing multiple code versions by hand). Additionally, for notebooks specifically, authors and readers alike cannot easily track them in Git (with clean diffs), lint, type check, test or format them with standard Python tools, or interoperate with most other non-notebook-specific ecosystems.",q,x,ce=`To address these pressing issues, the Spyder team and interested community members convened a Birds of a Feather (BoF) session, “Beyond Notebooks: From reproducible to reusable research”, at the SciPy 2023 conference in Austin, TX, where we invited attendees to share their tools and workflows for reusable science, and explored how we can encourage users to expand beyond the current notebook-centric monoculture and toward more holistic, modular and interoperable approaches to conducting research and developing scientific code. -The goal was to not only share and discuss ideas and insights on the topic among BoF participants, which numbered over ≈50 interested community members, but also to help inform future guides and resources on this topic, to be hosted on central platforms like the Scientific Python organization, as is currently in progress.`,L,k,he="Goals and themes",K,T,me="The BoF was motivated by the following key questions:",A,C,ue="
  • What is reusable research and why is it important?
  • What tools and techniques do people have to share for effective reusable research?
  • How can we integrate reusable research into existing workflows?
  • How do we teach students and researchers about reusable research, and encourage them to practice it?
  • ",j,S,Pe="While the resulting community ideas and insights centered around three related themes:",R,P,Le="
  • How can we make existing notebooks more readable, reproducible and reusable?
  • How can notebooks be progressively migrated to Python modules for basic reusability?
  • How can the community simplify and advocate the process of creating fully reusable Python packages?
  • ",H,b,ke="Common challenges",fe,E,$e=`Participants commented that students mostly get introduced to notebooks through classes in contexts that are very different from how they would use them for their research, and they don’t have a good resource for that to hand to them if they have a question or are confused about that. -Others responded that they think that should be part of the curriculum, questioning why are people learning machine learning using Jupyter notebooks without actually learning how to use Jupyter notebooks themselves, and that many folks don’t come from a traditional computer science background and may not know about all these tools.`,se,ee,qe='It was also remarked that some feel the fact that students are only exposed to notebooks really makes them not necessarily want to reach for other tools even when they would be more appropriate down the line, which participants suggested addressing by encouraging students to use IDEs like Spyder and JupyterLab that offer many features for reusability and reproducibility, but while also allowing them to take advantage of notebooks.',Z,O,We=`In particular, one former Spyder developer commented that they feel that we should show students how to use tools like debugging and make it easier for them to do that, but give them the choice whether they want to use those tools, and that the right approach is not necessarily telling them what tool to use, but having documentation and exposure to those tools so students can pick the best option for them. -Others remarked in response that we do want to give students options, though many might not need a full debugger.`,J,Q,Ue=`One library worker mentioned that they often only have an hour to introduce users to Python, and use Google Collab notebooks because it makes it a lot easier for students to get started with Python over having to download and install an IDE, but then students tend to be familiar with that tool and continue to use it. -Another participant mentioned they are a big fan of using videos to help reach students over reading the documentation, as they feel students are much more likely to watch them.`,ve,ie,Je="The discussion shifted to tools in larger organizations, with a participant commenting “It’s one thing when it’s students, but how do you do that when it’s your whole organizational culture that needs to change?” One participant responded saying she’s a student herself, and no one ever really talked to her about IDEs and explained what they were and why you’d want to use one, remarking that it’s important for teachers to actually train them to use the proper tools, but they have no idea when it comes to coworkers using these things.",Ce,oe,Re=`Another participant suggested “nerd sniping” as an effective way to handle that in larger organizations, which involves figuring out what is the biggest pain point for the team, usually something that should be automated, and then getting them to follow better practices by showing them how these tools can fix that problem. -Others agreed that it’s really about awareness, and if you show someone a cool tool most people will make the decision to adopt them on their own, but there will always be some who might not want that.`,Se,le,Qe="Finally, it was brought up that students might have familiarity with Python or R, but Git is a completely different animal and is quite challenging to factor that into education; people like writers would really benefit from Git but it’s really hard to get them to use it, and people might not be aware of how inefficient the workflows they use are, because that’s all they know.",_,M,Ye="Next up",V,Y,Xe=`Now that we’ve surfaced the reproducibility and reusability challenges that participants brought up at the BoF, check out our next blog post, where we share all the helpful tips, cool tools, awesome platforms and useful strategies attendees suggested to help address them. -Until then, happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("h2"),d.textContent=i,u=a(),c=o("p"),c.textContent=de,D=a(),v=o("p"),v.textContent=we,q=a(),x=o("p"),x.innerHTML=ce,L=a(),k=o("h2"),k.textContent=he,K=a(),T=o("p"),T.textContent=me,A=a(),C=o("ul"),C.innerHTML=ue,j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("ul"),P.innerHTML=Le,H=a(),b=o("h2"),b.textContent=ke,fe=a(),E=o("p"),E.textContent=$e,se=a(),ee=o("p"),ee.innerHTML=qe,Z=a(),O=o("p"),O.textContent=We,J=a(),Q=o("p"),Q.innerHTML=Ue,ve=a(),ie=o("p"),ie.textContent=Je,Ce=a(),oe=o("p"),oe.textContent=Re,Se=a(),le=o("p"),le.textContent=Qe,_=a(),M=o("h2"),M.textContent=Ye,V=a(),Y=o("p"),Y.innerHTML=Xe,this.h()},l(X){n=l(X,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1ph6npe"&&(n.innerHTML=f),p=s(X),d=l(X,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-1yzon88"&&(d.textContent=i),u=s(X),c=l(X,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1tnobeu"&&(c.textContent=de),D=s(X),v=l(X,"P",{"data-svelte-h":!0}),r(v)!=="svelte-hnmsep"&&(v.textContent=we),q=s(X),x=l(X,"P",{"data-svelte-h":!0}),r(x)!=="svelte-165q07j"&&(x.innerHTML=ce),L=s(X),k=l(X,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-32889v"&&(k.textContent=he),K=s(X),T=l(X,"P",{"data-svelte-h":!0}),r(T)!=="svelte-17px8a5"&&(T.textContent=me),A=s(X),C=l(X,"UL",{"data-svelte-h":!0}),r(C)!=="svelte-vf89vd"&&(C.innerHTML=ue),j=s(X),S=l(X,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1bfog1w"&&(S.textContent=Pe),R=s(X),P=l(X,"UL",{"data-svelte-h":!0}),r(P)!=="svelte-1oppegz"&&(P.innerHTML=Le),H=s(X),b=l(X,"H2",{class:!0,"data-svelte-h":!0}),r(b)!=="svelte-1uxg9mh"&&(b.textContent=ke),fe=s(X),E=l(X,"P",{"data-svelte-h":!0}),r(E)!=="svelte-spy2hy"&&(E.textContent=$e),se=s(X),ee=l(X,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-10m97u6"&&(ee.innerHTML=qe),Z=s(X),O=l(X,"P",{"data-svelte-h":!0}),r(O)!=="svelte-47otnf"&&(O.textContent=We),J=s(X),Q=l(X,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-1uq8h27"&&(Q.innerHTML=Ue),ve=s(X),ie=l(X,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-1am33iv"&&(ie.textContent=Je),Ce=s(X),oe=l(X,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-jbmlzp"&&(oe.textContent=Re),Se=s(X),le=l(X,"P",{"data-svelte-h":!0}),r(le)!=="svelte-qfjoan"&&(le.textContent=Qe),_=s(X),M=l(X,"H2",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-1yo5tes"&&(M.textContent=Ye),V=s(X),Y=l(X,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-11j93d7"&&(Y.innerHTML=Xe),this.h()},h(){h(d,"class","section"),h(k,"class","section"),h(b,"class","section"),h(M,"class","section")},m(X,te){t(X,n,te),t(X,p,te),t(X,d,te),t(X,u,te),t(X,c,te),t(X,D,te),t(X,v,te),t(X,q,te),t(X,x,te),t(X,L,te),t(X,k,te),t(X,K,te),t(X,T,te),t(X,A,te),t(X,C,te),t(X,j,te),t(X,S,te),t(X,R,te),t(X,P,te),t(X,H,te),t(X,b,te),t(X,fe,te),t(X,E,te),t(X,se,te),t(X,ee,te),t(X,Z,te),t(X,O,te),t(X,J,te),t(X,Q,te),t(X,ve,te),t(X,ie,te),t(X,Ce,te),t(X,oe,te),t(X,Se,te),t(X,le,te),t(X,_,te),t(X,M,te),t(X,V,te),t(X,Y,te)},p:wt,d(X){X&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y))}}}function Cl(y){let n,f;const p=[y[0],yn];let d={$$slots:{default:[_l]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Tl=class extends vt{constructor(n){super(),bt(this,n,Sl,Cl,gt,{})}};const Pl=Object.freeze(Object.defineProperty({__proto__:null,default:Tl,metadata:yn},Symbol.toStringTag,{value:"Module"}));function Ml(y){let n,f,p,d,i=`The foundations of Spyder’s new remote development architecture are available now in Spyder 6.0, with more features to come in 6.1 and beyond! -The goal is to make it easy for you to host your files, data and computations on remote desktops, clusters, servers and the cloud while being able to use Spyder locally.`,u,c,de=`Spyder 6.0 features a new remote connection manager that allows you to connect to any machine with a SSH server, no prior installation or configuration needed, and automatically set up and use a remote Python environment on the host. -It also features graphical status checking and reporting, host configuration management, and more. -In addition, it brings a new Consoles submenu allowing you to connect to any remote host and launch a console with one click. -You can also stop code execution as well as restart remote kernels from within Spyder.`,D,v,we='',q,x,ce=`We’re excited to have our newest core developer, Hendrik Louzada, share with you his insights and perspectives on Spyder 6’s new remote development architecture he helped implement! -Join us as Hendrik shares how he got started with Spyder and the project, how the new achetecture is implemented under the hood, what challenges he faced and what he learned from them, and what’s next for Spyder 6.1.0!`,L,k,he="How’d you find out about Spyder and why’d you join the project?",K,T,me=`I first started to work on Spyder around three years ago, developing a series of plugins to control remote magnetic resonance equipment (such as MRI machines) directly in the IDE. -As part of that project, I made several upstream contributions to Spyder itself to improve the Language Server Protocol support (LSP, the architecture that powers Spyder’s code completion, introspection, analysis and formatting).`,A,C,ue=`In 2023, Spyder received a Chan Zuckerberg Initiative Essential Open Source Software for Science Cycle 5 grant to implement a new remote development architecture and features in Spyder to allow users to develop and run code in remote servers and cloud machines. -After a six-month search by Spyder lead maintainer Carlos Cordoba to find the right candidate to engineer the backend and network architecture for this project, he found me, so I joined the core development team near the end of 2023.

    `,j,S,Pe='New remote connection manager dialog in Spyder listing the configurable settings for a new remote host
    Spyder's new remote connection manager lists the configurable SSH settings for creating a remote host
    ',R,P,Le="How is the new remote development platform implemented?",H,b,ke=`The backend, spyder-remote-services, uses Jupyter Server and the JupyterHub API, since Spyder already leverages the Jupyter architecture to manage kernels and run code. -We decided to use SSH to communicate with the remote machine, since it’s secure and widely used for this purpose.`,fe,E,$e=`That project is managed through an internal Spyder plugin, Remote Client, which uses the Jupyter API to manage remote Spyder kernels and connect them to Spyder. -The Remote Client frontend and backend were developed as an interface for Spyder to connect and manage the Jupyter Server installed on the remote machine. -The plugin connects to the machine, installs the server, and creates SSH tunnels for the exposed server and extra APIs implemented by spyder-remote-services. -Once that’s complete, Spyder will be able to automatically create remote IPython Consoles on behalf of users. -Furthermore, you can now stop remote computations and restart remote kernels, which was not possible before.

    `,se,ee,qe='Spyder consoles menu listing remote as well as local Python environments to open
    Spyder's Consoles menu now has a new submenu allowing one-click launch of consoles on remote hosts
    ',Z,O,We="What challenges did you face and how’d you overcome them?",J,Q,Ue=`There are a number of Python libraries that implement the SSH protocol, but most of them use the underlying SSH client and server installed by the operating system. -Unfortunately, the Windows SSH client has a serious issue that prevents tunnels from working correctly, so I needed to find an implementation that uses the underlying SSH libraries directly instead. -After investigating a number of options, the AsyncSSH project was the only one that both meets that requirement and is also robust and well maintained. -Hence, I implemented tunneling using that library in the pull request spyder-ide/spyder#22223.`,ve,ie,Je=`However, there was still an important problem with AsyncSSH: Spyder uses the Qt framework’s event loop for its graphical user interface, which is not async-enabled. -Therefore, I had to write an async API that was flexible enough to be able to call several async functions in a specific event loop, allow for loops to be run concurrently (to avoid blocking the main Qt event loop and causing Spyder’s GUI to freeze), and be thread-safe so it can be called from any Qt thread.`,Ce,oe,Re=`To cover all those requirements, I created the @AsyncDispatcher decorator function, which starts a thread to run an async loop if needed, schedules the async function in a specific loop, and returns a future object with the async function’s result. -That result is emitted in a Qt signal which is then used by Spyder synchronously to perform other tasks (e.g. check if the server is running).

    `,Se,le,Qe='Spyder remote connection manager, showing a successfully connected host
    The new remote connection manager shows detailed connection and status information for remote hosts
    ',_,M,Ye="What have you learned so far?",V,Y,Xe=`Working on an open source project has provided me with the opportunity to witness how my contributions directly impact users in real time. -Seeing my work being utilized and appreciated by the Spyder community is very rewarding and motivates me to strive for excellence and dedication. -Additionally, observing individuals dedicated to improving Spyder for many years with a common goal to help the scientific community, and without focusing primarily on profit, is incredibly inspiring.`,X,te,et=`This project has taught me the importance of adaptability and perseverance. -There were moments with problems too hard to understand by myself, but with the team’s support I was able to push through those obstacles, making me more confident and resilient.`,De,ge,tt=`I’m very grateful for the opportunity to work on Spyder with such a dedicated and supportive team. -I am excited to apply the lessons learned as we move into the next phases of this project!`,Ge,ye,nt="What’s next for the project?",B,ne,ot=`Our plans for the next feature version, Spyder 6.1.0, include adding the necessary APIs to spyder-remote-services so it can manipulate the remote file system. -This will allow you to view, copy, move and delete remote files and directories right from Spyder’s Files pane. -Users will also be able to create and manage local and remote Python environments, so they can work in different scientific and programming projects remotely at the same time.`,Oe,Te,lt=`Finally, we plan to enable connecting to an already running JupyterHub instance, for situations where the user’s organization already has one set up that they want to work with using Spyder. -The changes required will be relatively straightforward since instead of talking to our own server for remote development, users will communicate with the existing JupyterHub instead.`,Fe,_e,at=`We can’t wait to bring these features to you in our next feature version, coming in the first half of next year, and see all the cool things you all end up doing with them. -And until then, as always—Happy Spydering!🕸️`;return{c(){n=o("img"),p=a(),d=o("p"),d.textContent=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("video"),v.innerHTML=we,q=a(),x=o("p"),x.textContent=ce,L=a(),k=o("h2"),k.textContent=he,K=a(),T=o("p"),T.textContent=me,A=a(),C=o("p"),C.innerHTML=ue,j=a(),S=o("figure"),S.innerHTML=Pe,R=a(),P=o("h2"),P.textContent=Le,H=a(),b=o("p"),b.innerHTML=ke,fe=a(),E=o("p"),E.innerHTML=$e,se=a(),ee=o("figure"),ee.innerHTML=qe,Z=a(),O=o("h2"),O.textContent=We,J=a(),Q=o("p"),Q.innerHTML=Ue,ve=a(),ie=o("p"),ie.textContent=Je,Ce=a(),oe=o("p"),oe.innerHTML=Re,Se=a(),le=o("figure"),le.innerHTML=Qe,_=a(),M=o("h2"),M.textContent=Ye,V=a(),Y=o("p"),Y.textContent=Xe,X=a(),te=o("p"),te.textContent=et,De=a(),ge=o("p"),ge.textContent=tt,Ge=a(),ye=o("h2"),ye.textContent=nt,B=a(),ne=o("p"),ne.innerHTML=ot,Oe=a(),Te=o("p"),Te.textContent=lt,Fe=a(),_e=o("p"),_e.textContent=at,this.h()},l(F){n=l(F,"IMG",{src:!0,alt:!0}),p=s(F),d=l(F,"P",{"data-svelte-h":!0}),r(d)!=="svelte-b1qyrp"&&(d.textContent=i),u=s(F),c=l(F,"P",{"data-svelte-h":!0}),r(c)!=="svelte-14j8h23"&&(c.innerHTML=de),D=s(F),v=l(F,"VIDEO",{"data-svelte-h":!0}),r(v)!=="svelte-1l2htvy"&&(v.innerHTML=we),q=s(F),x=l(F,"P",{"data-svelte-h":!0}),r(x)!=="svelte-13vsu2c"&&(x.textContent=ce),L=s(F),k=l(F,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-1g4eozn"&&(k.textContent=he),K=s(F),T=l(F,"P",{"data-svelte-h":!0}),r(T)!=="svelte-ezm7r3"&&(T.textContent=me),A=s(F),C=l(F,"P",{"data-svelte-h":!0}),r(C)!=="svelte-1b7dejq"&&(C.innerHTML=ue),j=s(F),S=l(F,"FIGURE",{class:!0,"data-svelte-h":!0}),r(S)!=="svelte-1hgpcve"&&(S.innerHTML=Pe),R=s(F),P=l(F,"H2",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-1ie5u8o"&&(P.textContent=Le),H=s(F),b=l(F,"P",{"data-svelte-h":!0}),r(b)!=="svelte-106ovnw"&&(b.innerHTML=ke),fe=s(F),E=l(F,"P",{"data-svelte-h":!0}),r(E)!=="svelte-5fi4rr"&&(E.innerHTML=$e),se=s(F),ee=l(F,"FIGURE",{class:!0,"data-svelte-h":!0}),r(ee)!=="svelte-1pvwzu8"&&(ee.innerHTML=qe),Z=s(F),O=l(F,"H2",{class:!0,"data-svelte-h":!0}),r(O)!=="svelte-bgd1cn"&&(O.textContent=We),J=s(F),Q=l(F,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-1jav5ek"&&(Q.innerHTML=Ue),ve=s(F),ie=l(F,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-6id8ty"&&(ie.textContent=Je),Ce=s(F),oe=l(F,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1egmtyc"&&(oe.innerHTML=Re),Se=s(F),le=l(F,"FIGURE",{class:!0,"data-svelte-h":!0}),r(le)!=="svelte-c1x2i6"&&(le.innerHTML=Qe),_=s(F),M=l(F,"H2",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-1ff6hdi"&&(M.textContent=Ye),V=s(F),Y=l(F,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1gwmnw1"&&(Y.textContent=Xe),X=s(F),te=l(F,"P",{"data-svelte-h":!0}),r(te)!=="svelte-1q7io5m"&&(te.textContent=et),De=s(F),ge=l(F,"P",{"data-svelte-h":!0}),r(ge)!=="svelte-x3t62t"&&(ge.textContent=tt),Ge=s(F),ye=l(F,"H2",{class:!0,"data-svelte-h":!0}),r(ye)!=="svelte-15v4oah"&&(ye.textContent=nt),B=s(F),ne=l(F,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-yridht"&&(ne.innerHTML=ot),Oe=s(F),Te=l(F,"P",{"data-svelte-h":!0}),r(Te)!=="svelte-1aixe2x"&&(Te.textContent=lt),Fe=s(F),_e=l(F,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-bnizfq"&&(_e.textContent=at),this.h()},h(){xe(n.src,f="hero.png")||h(n,"src",f),h(n,"alt","Graphic with the Spyder icon connected to a network, with the words Easy Remote Execution is available now"),v.controls=!0,h(k,"class","section"),h(S,"class","figure"),h(P,"class","section"),h(ee,"class","figure"),h(O,"class","section"),h(le,"class","figure"),h(M,"class","section"),h(ye,"class","section")},m(F,ae){t(F,n,ae),t(F,p,ae),t(F,d,ae),t(F,u,ae),t(F,c,ae),t(F,D,ae),t(F,v,ae),t(F,q,ae),t(F,x,ae),t(F,L,ae),t(F,k,ae),t(F,K,ae),t(F,T,ae),t(F,A,ae),t(F,C,ae),t(F,j,ae),t(F,S,ae),t(F,R,ae),t(F,P,ae),t(F,H,ae),t(F,b,ae),t(F,fe,ae),t(F,E,ae),t(F,se,ae),t(F,ee,ae),t(F,Z,ae),t(F,O,ae),t(F,J,ae),t(F,Q,ae),t(F,ve,ae),t(F,ie,ae),t(F,Ce,ae),t(F,oe,ae),t(F,Se,ae),t(F,le,ae),t(F,_,ae),t(F,M,ae),t(F,V,ae),t(F,Y,ae),t(F,X,ae),t(F,te,ae),t(F,De,ae),t(F,ge,ae),t(F,Ge,ae),t(F,ye,ae),t(F,B,ae),t(F,ne,ae),t(F,Oe,ae),t(F,Te,ae),t(F,Fe,ae),t(F,_e,ae)},p:wt,d(F){F&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e))}}}function Hl(y){let n,f;const p=[y[0],wn];let d={$$slots:{default:[Ml]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Il=class extends vt{constructor(n){super(),bt(this,n,Ll,Hl,gt,{})}};const jl=Object.freeze(Object.defineProperty({__proto__:null,default:Il,metadata:wn},Symbol.toStringTag,{value:"Module"}));function $l(y){let n,f='IPython is a great improvement over the standard Python interpreter, bringing many enhancements such as autocompletion and “magic” commands. When debugging, however, many of these features become inaccessible. With Spyder, we aim to bring back these capabilities and more for a truly premium debugging experience! (And believe me, I use this debugger a lot, and not only because I write code that might contain bugs :p).',p,d,i="In this post, I will describe the debugger improvements we’ve already made in Spyder 4, as well as those that are already implemented or under review for Spyder 4.2 and beyond.",u,c,de="Make the debugger more like IPython",D,v,we=`IPython improves on the stock Python interpreter by adding syntax highlighting, completion, and history. -We have done the same for the debugger!`,q,x,ce,L,k,he="The output is prettier (and easier to read) than plain black text, as it was in Spyder 3!",K,T,me=`Code completion and history for the debugger use the same functionality as the IPython console, so you should not notice any difference in behaviour. -Just press Tab to trigger autocomplete suggestions, and use the up and down arrows to recall previous commands.`,A,C,ue,j,S,Pe="This can result useful if you don’t know every library’s documentation by heart!",R,P,Le="Another improvement that we added is the ability to write multiline statements.",H,b,ke,fe,E,$e="This is better than getting SyntaxError: unexpected EOF while parsing, as was the case in Spyder 3.",se,ee,qe=`Finally, IPython has a lot of nice magic functions you can take advantage of. -I personally often use %matplotlib to switch between the qt5 and inline plotting backends, and %timeit to check how fast a given snippet of code is. -Now, these can be used in the debugger as well!`,Z,O,We,J,Q,Ue="Core improvements",ve,ie,Je=`When debugging code, a lot of time can be lost stepping through other Python packages. -To avoid that, enable the new Ignore Python libraries while debugging option in Spyder’s preferences under IPython Console > Debugger > Debug. -This will skip all the built-in and third-party Python modules and help you focus on your own code.`,Ce,oe,Re,Se,le,Qe=`Another pain point for me is the mix of Pdb commands and Python statements when using the interactive prompt. -While debugging a script with a variable named step, for example, typing step in the Pdb prompt will not display the value of step, but will instead step through the code. -To avoid this, the Spyder 4.2 debugger will give precedence to Python expressions over Pdb commands; prefixing an expression with an exclamation mark will explicitly run it as a Pdb command. -This matches how the IPython Console handles clashes between magic functions and Python expressions, and contrasts with the previous behavior, where Pdb commands took precedence. -You can toggle this under IPython Console > Debugger > Debug in Spyder’s preferences.`,_,M,Ye,V,Y,Xe="Here, you can see I can have a variable named step, and use it just as I would in the IPython console!",X,te,et=`While debugging, the context changes constantly, which can be annoying if you need to use a certain module in each frame. -To address this, Spyder 4.2 will allow you to execute a snippet of code before any Pdb command. -I personally use import matplotlib.pyplot as plt so I can use Matplotlib anywhere with no extra commands! -You’ll be able to set this up for yourself under Preferences > IPython Console > Debugger > Run code while debugging.`,De,ge,tt,Ge,ye,nt="Matplotlib support",B,ne,ot=`Speaking of using Matplotlib, two improvements will make your plotting life much easier while in the debugger. -First, if you use the inline backend, the Process execute events while debugging option in Preferences > IPython console > Debugger (on by defaults) enables plotting after each command.`,Oe,Te,lt,Fe,_e,at=`If you would rather use an interactive backend, Spyder 4.2 will allow you to do that too! -The event loop will be running while waiting for a Pdb input, which will bring Matplotlib figures to life!`,F,ae,it,U,re,dt="For example, interactive figures are great to zoom and pan.",Ke,Ee,rt="Spyder Editor integration",Ze,ze,st=`By clicking next to the line number in the Editor, you can set a breakpoint to stop the debugger upon reaching that line. -With a Shift-click, you can set a conditional breakpoint that will only pause execution if an expression you write evaluates to True. -This is very useful if you are debugging a loop and want to go to a specific iteration, for example! -While debugging, the Editor will show you the line on which execution is stopped. -If you move around in the Editor, you can always go back to the current line by using the Pdb (w)here command.`,g,$,ht,ut,Ne,pt=`Here, you can see the Spyder debugger is stopped at the breakpoint on line 385, which is highlighted. -The next line has a conditional breakpoint.`,z,pe,ft="Other Spyder panes",m,w,Ie=`Several other Spyder panes are useful while debugging. -Breakpoints gives you a list of all the breakpoints you have set throughout your code.`,Pt,Mt,$t,G,je,Gt="The Variable Explorer pane allows you to browse and modify the local namespace wherever the debugger is stopped.",Ht,Et,qt,Lt,At,Ot="The future",It,zt,W=`I’m excited for the new Frames Explorer pane, which is currently almost ready for Spyder 5. -Usually while debugging, it can be hard to tell from where the current function was invoked, and one must often step up a long chain of calls to figure it out. -With the Frames Explorer, you have direct access to all the relevant call information, and you can jump around the stack easily!`,be,Dt,Vt,Ft,Wt,N="I can see where the current function was called from!",Me,Ut,Kt=`The next challenge I will be tackling is to enable the debugger to stop in threads. -This is a bit difficult to implement because if two threads reach a breakpoint at the same time, only one of them can take control of the shell, leading to skipped breakpoints. -This might be okay, but I’m still figuring that out.`,Jt,Nt,In="Try out the new improvements in the Spyder debugger and let us know if they make your debugging easier!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.textContent=i,u=a(),c=o("h2"),c.textContent=de,D=a(),v=o("p"),v.textContent=we,q=a(),x=o("img"),L=a(),k=o("p"),k.textContent=he,K=a(),T=o("p"),T.innerHTML=me,A=a(),C=o("img"),j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("p"),P.textContent=Le,H=a(),b=o("img"),fe=a(),E=o("p"),E.innerHTML=$e,se=a(),ee=o("p"),ee.innerHTML=qe,Z=a(),O=o("img"),J=a(),Q=o("h2"),Q.textContent=Ue,ve=a(),ie=o("p"),ie.innerHTML=Je,Ce=a(),oe=o("img"),Se=a(),le=o("p"),le.innerHTML=Qe,_=a(),M=o("img"),V=a(),Y=o("p"),Y.innerHTML=Xe,X=a(),te=o("p"),te.innerHTML=et,De=a(),ge=o("img"),Ge=a(),ye=o("h2"),ye.textContent=nt,B=a(),ne=o("p"),ne.innerHTML=ot,Oe=a(),Te=o("img"),Fe=a(),_e=o("p"),_e.textContent=at,F=a(),ae=o("img"),U=a(),re=o("p"),re.textContent=dt,Ke=a(),Ee=o("h2"),Ee.textContent=rt,Ze=a(),ze=o("p"),ze.innerHTML=st,g=a(),$=o("img"),ut=a(),Ne=o("p"),Ne.textContent=pt,z=a(),pe=o("h2"),pe.textContent=ft,m=a(),w=o("p"),w.textContent=Ie,Pt=a(),Mt=o("img"),G=a(),je=o("p"),je.textContent=Gt,Ht=a(),Et=o("img"),Lt=a(),At=o("h2"),At.textContent=Ot,It=a(),zt=o("p"),zt.textContent=W,be=a(),Dt=o("img"),Ft=a(),Wt=o("p"),Wt.textContent=N,Me=a(),Ut=o("p"),Ut.textContent=Kt,Jt=a(),Nt=o("p"),Nt.textContent=In,this.h()},l(I){n=l(I,"P",{"data-svelte-h":!0}),r(n)!=="svelte-eq6djb"&&(n.innerHTML=f),p=s(I),d=l(I,"P",{"data-svelte-h":!0}),r(d)!=="svelte-14iqtkk"&&(d.textContent=i),u=s(I),c=l(I,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-1hhjgz9"&&(c.textContent=de),D=s(I),v=l(I,"P",{"data-svelte-h":!0}),r(v)!=="svelte-1kytrz5"&&(v.textContent=we),q=s(I),x=l(I,"IMG",{src:!0,alt:!0}),L=s(I),k=l(I,"P",{"data-svelte-h":!0}),r(k)!=="svelte-17zug5m"&&(k.textContent=he),K=s(I),T=l(I,"P",{"data-svelte-h":!0}),r(T)!=="svelte-y5a8wy"&&(T.innerHTML=me),A=s(I),C=l(I,"IMG",{src:!0,alt:!0}),j=s(I),S=l(I,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1mhhocy"&&(S.textContent=Pe),R=s(I),P=l(I,"P",{"data-svelte-h":!0}),r(P)!=="svelte-u84fw"&&(P.textContent=Le),H=s(I),b=l(I,"IMG",{src:!0,alt:!0}),fe=s(I),E=l(I,"P",{"data-svelte-h":!0}),r(E)!=="svelte-hcqh6c"&&(E.innerHTML=$e),se=s(I),ee=l(I,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-xkeuem"&&(ee.innerHTML=qe),Z=s(I),O=l(I,"IMG",{src:!0,alt:!0}),J=s(I),Q=l(I,"H2",{class:!0,"data-svelte-h":!0}),r(Q)!=="svelte-1glm3mm"&&(Q.textContent=Ue),ve=s(I),ie=l(I,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-1wye7ed"&&(ie.innerHTML=Je),Ce=s(I),oe=l(I,"IMG",{src:!0,alt:!0}),Se=s(I),le=l(I,"P",{"data-svelte-h":!0}),r(le)!=="svelte-1jix07i"&&(le.innerHTML=Qe),_=s(I),M=l(I,"IMG",{src:!0,alt:!0}),V=s(I),Y=l(I,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1ycdd4o"&&(Y.innerHTML=Xe),X=s(I),te=l(I,"P",{"data-svelte-h":!0}),r(te)!=="svelte-1bo8rlr"&&(te.innerHTML=et),De=s(I),ge=l(I,"IMG",{src:!0,alt:!0}),Ge=s(I),ye=l(I,"H2",{class:!0,"data-svelte-h":!0}),r(ye)!=="svelte-iagrp5"&&(ye.textContent=nt),B=s(I),ne=l(I,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1y3or5c"&&(ne.innerHTML=ot),Oe=s(I),Te=l(I,"IMG",{src:!0,alt:!0}),Fe=s(I),_e=l(I,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-za37fn"&&(_e.textContent=at),F=s(I),ae=l(I,"IMG",{src:!0,alt:!0}),U=s(I),re=l(I,"P",{"data-svelte-h":!0}),r(re)!=="svelte-1ue0ftz"&&(re.textContent=dt),Ke=s(I),Ee=l(I,"H2",{class:!0,"data-svelte-h":!0}),r(Ee)!=="svelte-1tog8pa"&&(Ee.textContent=rt),Ze=s(I),ze=l(I,"P",{"data-svelte-h":!0}),r(ze)!=="svelte-164gu6o"&&(ze.innerHTML=st),g=s(I),$=l(I,"IMG",{src:!0,alt:!0}),ut=s(I),Ne=l(I,"P",{"data-svelte-h":!0}),r(Ne)!=="svelte-1qwhc92"&&(Ne.textContent=pt),z=s(I),pe=l(I,"H2",{class:!0,"data-svelte-h":!0}),r(pe)!=="svelte-1x5u0ly"&&(pe.textContent=ft),m=s(I),w=l(I,"P",{"data-svelte-h":!0}),r(w)!=="svelte-9vkyuo"&&(w.textContent=Ie),Pt=s(I),Mt=l(I,"IMG",{src:!0,alt:!0}),G=s(I),je=l(I,"P",{"data-svelte-h":!0}),r(je)!=="svelte-10y0bh"&&(je.textContent=Gt),Ht=s(I),Et=l(I,"IMG",{src:!0,alt:!0}),Lt=s(I),At=l(I,"H2",{class:!0,"data-svelte-h":!0}),r(At)!=="svelte-1wpdo9o"&&(At.textContent=Ot),It=s(I),zt=l(I,"P",{"data-svelte-h":!0}),r(zt)!=="svelte-12unpsb"&&(zt.textContent=W),be=s(I),Dt=l(I,"IMG",{src:!0,alt:!0}),Ft=s(I),Wt=l(I,"P",{"data-svelte-h":!0}),r(Wt)!=="svelte-146oq1y"&&(Wt.textContent=N),Me=s(I),Ut=l(I,"P",{"data-svelte-h":!0}),r(Ut)!=="svelte-e80c8v"&&(Ut.textContent=Kt),Jt=s(I),Nt=l(I,"P",{"data-svelte-h":!0}),r(Nt)!=="svelte-193jkga"&&(Nt.textContent=In),this.h()},h(){h(c,"class","section"),xe(x.src,ce="debugger-ipdb.png")||h(x,"src",ce),h(x,"alt","Debugger ipdb"),xe(C.src,ue="debugger-autocomplete.png")||h(C,"src",ue),h(C,"alt","Debugger-autocomplete"),xe(b.src,ke="debugger-multiline.png")||h(b,"src",ke),h(b,"alt","Debugger-multiline"),xe(O.src,We="debugger-timeit.png")||h(O,"src",We),h(O,"alt","Debugger timeit"),h(Q,"class","section"),xe(oe.src,Re="debugger-preferences.png")||h(oe,"src",Re),h(oe,"alt","Debugger preferences"),xe(M.src,Ye="debugger-step.png")||h(M,"src",Ye),h(M,"alt","Debugger"),xe(ge.src,tt="debugger-modules.png")||h(ge,"src",tt),h(ge,"alt","Debugger modules"),h(ye,"class","section"),xe(Te.src,lt="debugger-plots.png")||h(Te,"src",lt),h(Te,"alt","Debugger plots"),xe(ae.src,it="debugger-interactive-plots.png")||h(ae,"src",it),h(ae,"alt","Debugger interactive plots"),h(Ee,"class","section"),xe($.src,ht="editor-breakpoints.png")||h($,"src",ht),h($,"alt","Editor breakpoints"),h(pe,"class","section"),xe(Mt.src,$t="debugger-breakpoint.png")||h(Mt,"src",$t),h(Mt,"alt","Debugger breakpoint"),xe(Et.src,qt="variable-explorer.png")||h(Et,"src",qt),h(Et,"alt","Variable Explorer"),h(At,"class","section"),xe(Dt.src,Vt="frames-explorer.png")||h(Dt,"src",Vt),h(Dt,"alt","Frames Explorer")},m(I,He){t(I,n,He),t(I,p,He),t(I,d,He),t(I,u,He),t(I,c,He),t(I,D,He),t(I,v,He),t(I,q,He),t(I,x,He),t(I,L,He),t(I,k,He),t(I,K,He),t(I,T,He),t(I,A,He),t(I,C,He),t(I,j,He),t(I,S,He),t(I,R,He),t(I,P,He),t(I,H,He),t(I,b,He),t(I,fe,He),t(I,E,He),t(I,se,He),t(I,ee,He),t(I,Z,He),t(I,O,He),t(I,J,He),t(I,Q,He),t(I,ve,He),t(I,ie,He),t(I,Ce,He),t(I,oe,He),t(I,Se,He),t(I,le,He),t(I,_,He),t(I,M,He),t(I,V,He),t(I,Y,He),t(I,X,He),t(I,te,He),t(I,De,He),t(I,ge,He),t(I,Ge,He),t(I,ye,He),t(I,B,He),t(I,ne,He),t(I,Oe,He),t(I,Te,He),t(I,Fe,He),t(I,_e,He),t(I,F,He),t(I,ae,He),t(I,U,He),t(I,re,He),t(I,Ke,He),t(I,Ee,He),t(I,Ze,He),t(I,ze,He),t(I,g,He),t(I,$,He),t(I,ut,He),t(I,Ne,He),t(I,z,He),t(I,pe,He),t(I,m,He),t(I,w,He),t(I,Pt,He),t(I,Mt,He),t(I,G,He),t(I,je,He),t(I,Ht,He),t(I,Et,He),t(I,Lt,He),t(I,At,He),t(I,It,He),t(I,zt,He),t(I,be,He),t(I,Dt,He),t(I,Ft,He),t(I,Wt,He),t(I,Me,He),t(I,Ut,He),t(I,Jt,He),t(I,Nt,He)},p:wt,d(I){I&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae),e(U),e(re),e(Ke),e(Ee),e(Ze),e(ze),e(g),e($),e(ut),e(Ne),e(z),e(pe),e(m),e(w),e(Pt),e(Mt),e(G),e(je),e(Ht),e(Et),e(Lt),e(At),e(It),e(zt),e(be),e(Dt),e(Ft),e(Wt),e(Me),e(Ut),e(Jt),e(Nt))}}}function Al(y){let n,f;const p=[y[0],gn];let d={$$slots:{default:[$l]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let zl=class extends vt{constructor(n){super(),bt(this,n,El,Al,gt,{})}};const Dl=Object.freeze(Object.defineProperty({__proto__:null,default:zl,metadata:gn},Symbol.toStringTag,{value:"Module"}));function Gl(y){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,i='Version 4.0 of Spyder is almost ready! It has been in the making for well over two years, and it contains lots of interesting new features. We will focus on the Files pane in this post, where we’ve made several improvements to the interface and file management tools.',u,c,de="Simplified interface",D,v,we="In order to simplify the Files pane’s interface, the columns corresponding to size and kind are hidden by default. To change which columns are shown, use the top-right pane menu or right-click the header directly.",q,x,ce,L,k,he,K,T,me="Custom file associations",A,C,ue="First, we added the ability to associate different external applications with specific file extensions they can open. Under the File associations tab of the Files preferences pane, you can add file types and set the external program used to open each of them by default.",j,S,Pe,R,P,Le="Once you’ve set this up, files will automatically launch in the associated application when opened from the Files pane in Spyder. Additionally, when you right-click a file you will find an Open with... option that will show the application associated with this extension.",H,b,ke,fe,E,$e="Single click open option",se,ee,qe="We’ve added a new option to open files and directories with a single-click instead of a double-click, to suit different user preferences. To enable this option, go to the General tab of the Files preferences pane and check the option Single click to open files. With this setting, only a single click is needed to open a file in the Files pane either externally or in Spyder.",Z,O,We,J,Q,Ue="Bear in mind that changing this configuration option will also affect the behaviour of the Project Explorer pane.",ve,ie,Je="Open files externally",Ce,oe,Re="We added the option to open files with the operating system’s default program for the file type to the Files pane’s context menu. To use this feature, right-click any file in the Files pane and click Open externally",Se,le,Qe,_,M,Ye=`Moreover, it is now possible to select more than one file on which to perform a context menu action, thanks to the Files pane’s new multi-select functionality. For this, press Ctrl (Cmd on macOS) or Shift while clicking on the files to select, just as you would in your operating system’s file manager (Windows Explorer, macOS Finder, etc). As you’d expect, Ctrl (Cmd) selects individual files one by one, while Shift selects all the files between the one you click and the one previously selected. -Once you’ve selected multiple files, it is now possible to execute many of the actions available in the context menu on all the selected files, including delete, rename, move, copy and open externally.`,V,Y,Xe,X,te,et="Absolute and relative path handling",De,ge,tt="Spyder 4 now allows you to easily copy the absolute or relative paths of one or more files in the Files pane and pasting them as well-formatted text anywhere else in Spyder. Just right-clicking any file or files in the Files or Project panes and select the desired option.",Ge,ye,nt,B,ne,ot="Beyond just copying a single path, when pasting more than one Spyder will intelligently format it into a comma-separated collection of quoted strings, one path per line, that can be pasted directly into a list with no additional formatting needed.",Oe,Te,lt,Fe,_e,at="The Copy Absolute Path option gets us the complete path of each selected file, starting from the drive root.",F,ae,it,U,re,dt="Alternatively, Copy Relative Path gets us the path of the file relative to the current working (displayed in the top right of the Spyder window).",Ke,Ee,rt,Ze,ze,st="File type icons",g,$,ht="Finally, files in the Files pane are now displayed with icons depending on their type. There are custom icons for the source files of a variety of common programming languages including C C++, C Sharp, Java, Python, R, and Swift; for media types like JPEG, MP3, and M4A; and for other common extensions such as .txt and .tex. This allows you to identify file types with just a glance and select the appropriate application accordingly.",ut,Ne,pt,z,pe,ft='With these new features and UI options in Spyder’s Files pane, we hope you will enjoy the improved file management experience coming in Spyder 4! We would like to thank Quansight, our donors, and most of all our dedicated users and contributors from around the world for making these features possible. The final version will be released very soon, but if you’d like to try it out now and share your feedback, follow the instructions on our Github. Happy Spydering!';return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("h2"),c.textContent=de,D=a(),v=o("p"),v.textContent=we,q=a(),x=o("img"),L=a(),k=o("img"),K=a(),T=o("h2"),T.textContent=me,A=a(),C=o("p"),C.textContent=ue,j=a(),S=o("img"),R=a(),P=o("p"),P.innerHTML=Le,H=a(),b=o("img"),fe=a(),E=o("h2"),E.textContent=$e,se=a(),ee=o("p"),ee.innerHTML=qe,Z=a(),O=o("img"),J=a(),Q=o("p"),Q.textContent=Ue,ve=a(),ie=o("h2"),ie.textContent=Je,Ce=a(),oe=o("p"),oe.innerHTML=Re,Se=a(),le=o("img"),_=a(),M=o("p"),M.innerHTML=Ye,V=a(),Y=o("img"),X=a(),te=o("h2"),te.textContent=et,De=a(),ge=o("p"),ge.innerHTML=tt,Ge=a(),ye=o("img"),B=a(),ne=o("p"),ne.textContent=ot,Oe=a(),Te=o("img"),Fe=a(),_e=o("p"),_e.innerHTML=at,F=a(),ae=o("img"),U=a(),re=o("p"),re.innerHTML=dt,Ke=a(),Ee=o("img"),Ze=a(),ze=o("h2"),ze.textContent=st,g=a(),$=o("p"),$.innerHTML=ht,ut=a(),Ne=o("img"),z=a(),pe=o("p"),pe.innerHTML=ft,this.h()},l(m){n=l(m,"P",{"data-svelte-h":!0}),r(n)!=="svelte-azjo9p"&&(n.innerHTML=f),p=s(m),d=l(m,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1vzrev8"&&(d.innerHTML=i),u=s(m),c=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-64n2sn"&&(c.textContent=de),D=s(m),v=l(m,"P",{"data-svelte-h":!0}),r(v)!=="svelte-1qns2hr"&&(v.textContent=we),q=s(m),x=l(m,"IMG",{src:!0,alt:!0}),L=s(m),k=l(m,"IMG",{src:!0,alt:!0}),K=s(m),T=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-bw5n4z"&&(T.textContent=me),A=s(m),C=l(m,"P",{"data-svelte-h":!0}),r(C)!=="svelte-qnj996"&&(C.textContent=ue),j=s(m),S=l(m,"IMG",{src:!0,alt:!0}),R=s(m),P=l(m,"P",{"data-svelte-h":!0}),r(P)!=="svelte-sbs8mx"&&(P.innerHTML=Le),H=s(m),b=l(m,"IMG",{src:!0,alt:!0}),fe=s(m),E=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-r9kw23"&&(E.textContent=$e),se=s(m),ee=l(m,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-1slqqwg"&&(ee.innerHTML=qe),Z=s(m),O=l(m,"IMG",{src:!0,alt:!0}),J=s(m),Q=l(m,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-7e0gg6"&&(Q.textContent=Ue),ve=s(m),ie=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(ie)!=="svelte-897z0l"&&(ie.textContent=Je),Ce=s(m),oe=l(m,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-14zm4mn"&&(oe.innerHTML=Re),Se=s(m),le=l(m,"IMG",{src:!0,alt:!0}),_=s(m),M=l(m,"P",{"data-svelte-h":!0}),r(M)!=="svelte-bhjge1"&&(M.innerHTML=Ye),V=s(m),Y=l(m,"IMG",{src:!0,alt:!0}),X=s(m),te=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(te)!=="svelte-1em1ffi"&&(te.textContent=et),De=s(m),ge=l(m,"P",{"data-svelte-h":!0}),r(ge)!=="svelte-1vpx8f9"&&(ge.innerHTML=tt),Ge=s(m),ye=l(m,"IMG",{src:!0,alt:!0}),B=s(m),ne=l(m,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-12somj2"&&(ne.textContent=ot),Oe=s(m),Te=l(m,"IMG",{src:!0,alt:!0}),Fe=s(m),_e=l(m,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-1ngtco8"&&(_e.innerHTML=at),F=s(m),ae=l(m,"IMG",{src:!0,alt:!0}),U=s(m),re=l(m,"P",{"data-svelte-h":!0}),r(re)!=="svelte-d0kivk"&&(re.innerHTML=dt),Ke=s(m),Ee=l(m,"IMG",{src:!0,alt:!0}),Ze=s(m),ze=l(m,"H2",{class:!0,"data-svelte-h":!0}),r(ze)!=="svelte-1pwpvz6"&&(ze.textContent=st),g=s(m),$=l(m,"P",{"data-svelte-h":!0}),r($)!=="svelte-uw20bn"&&($.innerHTML=ht),ut=s(m),Ne=l(m,"IMG",{src:!0,alt:!0}),z=s(m),pe=l(m,"P",{"data-svelte-h":!0}),r(pe)!=="svelte-z72452"&&(pe.innerHTML=ft),this.h()},h(){h(c,"class","section"),xe(x.src,ce="pane-menu.png")||h(x,"src",ce),h(x,"alt","Pane Menu"),xe(k.src,he="header-menu.png")||h(k,"src",he),h(k,"alt","Header Menu"),h(T,"class","section"),xe(S.src,Pe="file-associations.png")||h(S,"src",Pe),h(S,"alt","File associations"),xe(b.src,ke="open-with.png")||h(b,"src",ke),h(b,"alt","Open With"),h(E,"class","section"),xe(O.src,We="single-click.png")||h(O,"src",We),h(O,"alt","Single click"),h(ie,"class","section"),xe(le.src,Qe="open-externally.png")||h(le,"src",Qe),h(le,"alt","Open Externally"),xe(Y.src,Xe="select-files.png")||h(Y,"src",Xe),h(Y,"alt","Select Files"),h(te,"class","section"),xe(ye.src,nt="copy-path.png")||h(ye,"src",nt),h(ye,"alt","Copy Path"),xe(Te.src,lt="multiple-paths.png")||h(Te,"src",lt),h(Te,"alt","Multiple Paths"),xe(ae.src,it="absolute-path.png")||h(ae,"src",it),h(ae,"alt","Absolute Path"),xe(Ee.src,rt="relative-path.png")||h(Ee,"src",rt),h(Ee,"alt","Relative Path"),h(ze,"class","section"),xe(Ne.src,pt="file-extensions.png")||h(Ne,"src",pt),h(Ne,"alt","File Extensions")},m(m,w){t(m,n,w),t(m,p,w),t(m,d,w),t(m,u,w),t(m,c,w),t(m,D,w),t(m,v,w),t(m,q,w),t(m,x,w),t(m,L,w),t(m,k,w),t(m,K,w),t(m,T,w),t(m,A,w),t(m,C,w),t(m,j,w),t(m,S,w),t(m,R,w),t(m,P,w),t(m,H,w),t(m,b,w),t(m,fe,w),t(m,E,w),t(m,se,w),t(m,ee,w),t(m,Z,w),t(m,O,w),t(m,J,w),t(m,Q,w),t(m,ve,w),t(m,ie,w),t(m,Ce,w),t(m,oe,w),t(m,Se,w),t(m,le,w),t(m,_,w),t(m,M,w),t(m,V,w),t(m,Y,w),t(m,X,w),t(m,te,w),t(m,De,w),t(m,ge,w),t(m,Ge,w),t(m,ye,w),t(m,B,w),t(m,ne,w),t(m,Oe,w),t(m,Te,w),t(m,Fe,w),t(m,_e,w),t(m,F,w),t(m,ae,w),t(m,U,w),t(m,re,w),t(m,Ke,w),t(m,Ee,w),t(m,Ze,w),t(m,ze,w),t(m,g,w),t(m,$,w),t(m,ut,w),t(m,Ne,w),t(m,z,w),t(m,pe,w)},p:wt,d(m){m&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae),e(U),e(re),e(Ke),e(Ee),e(Ze),e(ze),e(g),e($),e(ut),e(Ne),e(z),e(pe))}}}function ql(y){let n,f;const p=[y[0],vn];let d={$$slots:{default:[Gl]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Fl=class extends vt{constructor(n){super(),bt(this,n,Ol,ql,gt,{})}};const Wl=Object.freeze(Object.defineProperty({__proto__:null,default:Fl,metadata:vn},Symbol.toStringTag,{value:"Module"}));function Ul(y){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,i='Note: Kite is sponsoring the work discussed in this blog post, and in addition supports Spyder 4.0 development through a Quansight Labs Community Work Order.',u,c,de='As part of our next release, we are proud to announce an additional completion client for Spyder, Kite. Kite is a novel completion client that uses Machine Learning techniques to find and predict the best autocompletion for a given text. Additionally, it collects improved documentation for compiled packages, e.g. Matplotlib, NumPy and SciPy, that cannot be obtained easily by using traditional code analysis packages such as Jedi. Although Kite is not open source like Spyder, you can download it without charge at the Kite website.',D,v,we,q,x,ce="By incorporating Kite into Spyder, we will improve and provide the ultimate autocompletion and signature retrieval experience for most of the scientific Python stack and beyond. For instance, let’s take a look at the following PyTorch completion. While the Language Server Protocol server would not complete some of the functions, e.g. torch.linspace, Kite is able to return it successfully:",L,k,he,K,T,me="Another benefit of using Kite is that of personalized completions, due to incremental ML analysis performed by the analysis engine, which keeps track of the keypresses and text writing style, alongside common usage patterns, this way users will get a personalized experience that improves over time.",A,C,ue="We are working in collaboration with the Kite team to improve our autocompletion experience for the upcoming 4.0 release of Spyder. We plan to have all Kite features tested and ready to be used; that includes adding on-the-fly completions and code snippets for autocompletions.",j,S,Pe="To start using Kite, you just need to install the Kite client from their web page. They offer client packages for Windows, Linux and MacOS that are easy to install. Once Kite is installed on the system, Spyder is able to detect it and start the Kite client automatically.",R,P,Le='Our new Kite client will work alongside the new Language Server Protocol and the usual fallback tokenizer for files that cannot be analyzed by either the LSP or Kite. Thus, Spyder will be able to provide an optimal autocompletion experience for Python and other languages. Besides that, it is possible to define the priority between different completion plugins to show a completion source result first over the other completion plugins.',H,b,ke="Last but not least, as part of this novel client, we are introducing a new completion API that enables to write third-party completion clients for Spyder that require integration with the code editor and project manager. We offer calls to perform autocompletion, hover requests, signature hints, among others without any hassle. By leveraging this API, it should be possible to add completions and documentation suitable for domain-specific applications developed using Spyder.",fe,E,$e="The function calls and constants of the new completion API will be added to the Spyder documentation and should be available in the next release of Spyder. Additionally, we will provide code snippets support for both LSP and Kite for the next release - please stay tuned!",se,ee,qe="We, the Spyder development team, hope that these new improvements accelerate your productivity, and we invite you to beta-test them to improve them even more. As always, we are open to your questions, issue reports and contributions on all of our communication channels and our Github repository.";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("img"),q=a(),x=o("p"),x.innerHTML=ce,L=a(),k=o("img"),K=a(),T=o("p"),T.textContent=me,A=a(),C=o("p"),C.textContent=ue,j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("p"),P.innerHTML=Le,H=a(),b=o("p"),b.textContent=ke,fe=a(),E=o("p"),E.textContent=$e,se=a(),ee=o("p"),ee.textContent=qe,this.h()},l(Z){n=l(Z,"P",{"data-svelte-h":!0}),r(n)!=="svelte-eotn7j"&&(n.innerHTML=f),p=s(Z),d=l(Z,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1pywkh7"&&(d.innerHTML=i),u=s(Z),c=l(Z,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1fbgn4i"&&(c.innerHTML=de),D=s(Z),v=l(Z,"IMG",{src:!0,alt:!0}),q=s(Z),x=l(Z,"P",{"data-svelte-h":!0}),r(x)!=="svelte-y2k5fd"&&(x.innerHTML=ce),L=s(Z),k=l(Z,"IMG",{src:!0,alt:!0}),K=s(Z),T=l(Z,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1pqgtfu"&&(T.textContent=me),A=s(Z),C=l(Z,"P",{"data-svelte-h":!0}),r(C)!=="svelte-f9uqef"&&(C.textContent=ue),j=s(Z),S=l(Z,"P",{"data-svelte-h":!0}),r(S)!=="svelte-lthd3c"&&(S.textContent=Pe),R=s(Z),P=l(Z,"P",{"data-svelte-h":!0}),r(P)!=="svelte-1rbdp3d"&&(P.innerHTML=Le),H=s(Z),b=l(Z,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1jtibkh"&&(b.textContent=ke),fe=s(Z),E=l(Z,"P",{"data-svelte-h":!0}),r(E)!=="svelte-1duftot"&&(E.textContent=$e),se=s(Z),ee=l(Z,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-6g4d07"&&(ee.textContent=qe),this.h()},h(){xe(v.src,we="spyder-kite-hover.png")||h(v,"src",we),h(v,"alt","Completions with Kite"),xe(k.src,he="spyder-kite-completions.gif")||h(k,"src",he),h(k,"alt","Completions with Kite")},m(Z,O){t(Z,n,O),t(Z,p,O),t(Z,d,O),t(Z,u,O),t(Z,c,O),t(Z,D,O),t(Z,v,O),t(Z,q,O),t(Z,x,O),t(Z,L,O),t(Z,k,O),t(Z,K,O),t(Z,T,O),t(Z,A,O),t(Z,C,O),t(Z,j,O),t(Z,S,O),t(Z,R,O),t(Z,P,O),t(Z,H,O),t(Z,b,O),t(Z,fe,O),t(Z,E,O),t(Z,se,O),t(Z,ee,O)},p:wt,d(Z){Z&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee))}}}function Nl(y){let n,f;const p=[y[0],bn];let d={$$slots:{default:[Ul]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Ql=class extends vt{constructor(n){super(),bt(this,n,Rl,Nl,gt,{})}};const Bl=Object.freeze(Object.defineProperty({__proto__:null,default:Ql,metadata:bn},Symbol.toStringTag,{value:"Module"}));function Vl(y){let n,f=`For the last couple of months, the Spyder team has been working on defining a new roadmap and submitting grant proposals to fund more features and improvements. -We are pleased to announce our roadmap for the rest of 2022, and that two proposals were funded!`,p,d,i="The roadmap",u,c,de=`Considering the importance of sharing a clear perspective of where the Spyder project is going and where we will be focusing our efforts over the coming months, the team has created an initial roadmap for the rest of 2022. -We prioritized the highlighted features and enhancements based on input from issues, face-to-face and virtual discussions, Stack Overflow, social media and other feedback, to try to best capture the interests of our users and community.`,D,v,we="The proposals",q,x,ce=`To help make our roadmap achievable, we wrote and submitted proposals to several different venues and organizations in the last couple of months. -While we have yet to hear back from some of them, two have already been funded!`,L,k,he=`The first was for the Google Season of Docs (GSoD) 2022). -This grant will be focused mainly on improving and updating our user documentation for Spyder 5’s Editor features. -It also will help enhance our developer documentation and add tutorials and detailed information covering our new plugin API. -For more details, check out the Spyder wiki page for the proposal.`,K,T,me=`The second proposal accepted was a Small Development Grant from NumFOCUS. -For this grant, we will be working on improving the installation experience for Windows users by making the standalone installers auto-updatable and providing a simpler way to install custom packages not bundled with the installers. -With this grant, we were able to hire a new developer—Juan Sebastian Bautista, a recent graduate in systems and computing engineering from Universidad de los Andes in Bogotá, Colombia—who will implement these features over the next six months. -For more details, see the Spyder wiki page for the proposal.`,A,C,ue="Next steps",j,S,Pe=`We will be focusing our efforts as a project on moving forward with the accepted proposals and submitting new ones. -On top of that, we will gather more feedback about what volunteers, users and the community at large want to see for Spyder 6, and share the progress of the proposals in the relaunched Spyder Community calls.`,R,P,Le="We would like to thank NumFOCUS and Google Season of Docs for granting us the funds to be able to work on these projects and making our roadmap possible!";return{c(){n=o("p"),n.textContent=f,p=a(),d=o("h2"),d.textContent=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("h2"),v.textContent=we,q=a(),x=o("p"),x.textContent=ce,L=a(),k=o("p"),k.innerHTML=he,K=a(),T=o("p"),T.innerHTML=me,A=a(),C=o("h2"),C.textContent=ue,j=a(),S=o("p"),S.innerHTML=Pe,R=a(),P=o("p"),P.textContent=Le,this.h()},l(H){n=l(H,"P",{"data-svelte-h":!0}),r(n)!=="svelte-176zl42"&&(n.textContent=f),p=s(H),d=l(H,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-4fbp7v"&&(d.textContent=i),u=s(H),c=l(H,"P",{"data-svelte-h":!0}),r(c)!=="svelte-z5sir4"&&(c.innerHTML=de),D=s(H),v=l(H,"H2",{class:!0,"data-svelte-h":!0}),r(v)!=="svelte-go9hhu"&&(v.textContent=we),q=s(H),x=l(H,"P",{"data-svelte-h":!0}),r(x)!=="svelte-1v42iy0"&&(x.textContent=ce),L=s(H),k=l(H,"P",{"data-svelte-h":!0}),r(k)!=="svelte-blo2qp"&&(k.innerHTML=he),K=s(H),T=l(H,"P",{"data-svelte-h":!0}),r(T)!=="svelte-3yzhgt"&&(T.innerHTML=me),A=s(H),C=l(H,"H2",{class:!0,"data-svelte-h":!0}),r(C)!=="svelte-18hazx0"&&(C.textContent=ue),j=s(H),S=l(H,"P",{"data-svelte-h":!0}),r(S)!=="svelte-ryn14r"&&(S.innerHTML=Pe),R=s(H),P=l(H,"P",{"data-svelte-h":!0}),r(P)!=="svelte-tw6p7q"&&(P.textContent=Le),this.h()},h(){h(d,"class","section"),h(v,"class","section"),h(C,"class","section")},m(H,b){t(H,n,b),t(H,p,b),t(H,d,b),t(H,u,b),t(H,c,b),t(H,D,b),t(H,v,b),t(H,q,b),t(H,x,b),t(H,L,b),t(H,k,b),t(H,K,b),t(H,T,b),t(H,A,b),t(H,C,b),t(H,j,b),t(H,S,b),t(H,R,b),t(H,P,b)},p:wt,d(H){H&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P))}}}function Jl(y){let n,f;const p=[y[0],xn];let d={$$slots:{default:[Vl]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Zl=class extends vt{constructor(n){super(),bt(this,n,Kl,Jl,gt,{})}};const Yl=Object.freeze(Object.defineProperty({__proto__:null,default:Zl,metadata:xn},Symbol.toStringTag,{value:"Module"}));function Xl(y){let n,f=`As we approach some major development milestones, now is as good a time as ever to share with you some perspective on where we’ve been, what’s happening now, and where we’re going in the world of Spyder. -In this post, part one of a three part series, we’ll take a look back over the past six months at some of the key events, accomplishments and challenges for Spyder and its community, and how that all leads up to where we are now.`,p,d,i=`Stay tuned right here, since part two will share several exciting announcements that affect the project (in a good way, we promise!) and its immediate future. -Even better, part three will formally announce the next Spyder 3 release and—what I’m sure you are all looking forward to—the plan for the first official Spyder 4 beta, plus our schedule and feature roadmap for Spyder 4 and beyond!`,u,c,de="A Call Answered",D,v,we=`Starting off, as we announced back in mid-November, our funding from Anaconda, Inc was discontinued, leaving Spyder without formal institutional financial support. -As Spyder was, is and always will be a community-developed and supported IDE, this was far from a mortal blow to the project, but it did impact the pace and breadth of development. -Developer effort previously spent on our Spyder plugins, like spyder-notebook, spyder-reports, and spyder-terminal, among others, was refocused on the Spyder core, and the development and release of Spyder 4 was put mostly on hold. -To help make up for the loss of funding, we appealed to the community for support, asking users who found Spyder valuable to back our project on OpenCollective, in order to accelerate development and fund more features for Spyder 4.`,q,x,ce,L,k,he=`To our unending gratitude, you responded! In the few months since then, we’ve gone from zero to a budget of well over $4500 per year and rising at an increasing pace, thanks to the continuing contributions of over 80 (and counting!) individual and institutional backers. -We also had several new core team members and community contributors pitch in to help carry the load, and we’ve got some more great news in the very next post on the funding front. -While we’ve got a ways to go to match the level of funding we’ve received under Anaconda, your support has helped make possible several of the new features we’ve planned for Spyder 4, and allow us to commit to releasing it much sooner than we would be able to otherwise. -Your generous donations go directly toward funding the Spyder community’s most-requested new and improved features for Spyder 4, so keep them coming! -Stay tuned; we are considering rolling out new donation tiers and rewards at some point soon so you won’t want to miss that.`,K,T,me="Development by the Numbers",A,C,ue=`On the development side of the project, while our overall pace is modestly lower than its peak under our Anaconda funding, we’ve been quite active fixing bugs and adding new features and enhancements over the past six months. -By the numbers, since mid-November, we’ve pushed approximately 1200 commits to master (Spyder 4), comprising over 37 000 lines added and 16 000 removed, and 900 commits to 3.x (Spyder 3), with over 16 500 additions and 10 000 deletions. -Users have opened over 1375 issues (bugs, feature requests and other feedback), of which we’ve managed to resolve more than 1330, or nearly 97%.`,j,S,Pe,R,P,Le=`Further, over 250 pull requests from almost two dozen unique contributors, some old, some new, have been submitted since that time—fixing bugs, adding new or enhanced functionality, or making other improvements—of which 226 have been merged to the main Spyder codebase. -This work has coalesced into four separate official releases during that period, with another only days away. -Finally, we’ve recently blown past the 3000 Github stars milestone a few weeks ago (we’re now at more than 3200), with almost 700 unique forks to date.`,H,b,ke="Key Spyder Improvements",fe,E,$e=`All those numbers are nice, but what matters most are the tangible improvements that you all get to use every day in your favorite IDE. -Over those same past six months, alongside hundreds of bugfixes and minor enhancements, we’ve made multiple significant improvements to the Spyder 3 Editor, IPython Console, Variable Explorer, and Find in Files tool, along with a number of others under the hood and to the application as a whole. -Even better, the majority of these were suggested by you, our users, and some of you even pitched in to help implement them.`,se,ee,qe=`Especially since you will probably be spending most of your time in it, we added a several new commands and functions to the Editor that will hopefully make your life easier, each with corresponding customizable shortcuts for easier access. -You can now insert a new line below the current one regardless of the cursor’s current position with Ctrl-Shift-Enter, and you can now use Shift-Delete to cut selected text, and Shift-Insert to paste it. -Ctrl-PageUp, Ctrl-PageDown, and Ctrl-Tab shortcuts are all now fully configurable. -Finally, you can now easily Tab from the Find to the Replace box when open, and better yet your Find text is automatically copied to the Replace box to make modifications easier.`,Z,O,We=`Second only to the Editor in terms of them most critical Spyder components, the IPython Console also got a lot of love in recent releases. -We’ve made several improvements to significantly improve the startup time, and added an optional feature to show the elapsed time each kernel has been running. -You can now remove all user-defined variables with a GUI command, and changes in imported modules now take effect instantly and automatically in the console, without even a re-import needed. -Cloudpickle is now used to serialize objects from the Console to the Variable Explorer, greatly improving the latter’s capabilities (as discussed below). -Finally, Cython files are now automatically run in dedicated Cython consoles, and you can now use the edit magic command from the Console to open any file right inside Spyder’s Editor.`,J,Q,Ue,ve,ie,Je=`The Variable Explorer, which many of you cite as Spyder’s “killer feature”, has greatly improved as well. -Most notably, thanks to the aforementioned cloudpickle change, you now have access to rich, deep exploration of nearly any object, builtin or custom, and can traverse, view, and when possible even edit complex hierarchies of nested types with ease. -The Variable Explorer now fully supports Timedelta objects, both built-in and Pandas variants, allowing you to easily view and edit them just like datetime and Timestamp. -It also now uses a “pretty”, more human-readable format for dates, times, timedeltas and the like, and also now supports displaying a much wider range of Numpy array types. -As a quality of life change, it has much better handling of immutable types, like tuples, clearly showing they can’t be edited upfront and avoiding bothersome errors when trying to do so.`,Ce,oe,Re=`Rounding out the major changes, the Find in Files tool now allows you to remove items from the Search In list by hovering over them and pressing Delete, and there’s also a new option to clear all recent directories. -Under the hood, we’ve made PyQt5 a dependency for easier, one-command installation and added many more tests and better project infrastructure to help catch errors. -To make things easier on you if something does go wrong, we’ve greatly improved the error reporting system, the UI/UX and the explanatory text to be more up to date, informative, and user friendly.`,Se,le,Qe,_,M,Ye=`All of the mentioned additions are included in the latest released version of Spyder, 3.2.8, which you can update to with conda update spyder (if using Anaconda), with your package manager/distribution (if installed that way) or with pip update spyder (otherwise). -Even more are already implemented for our next release, due out in a week’s time, and we’ll have a preview of what to expect right here on the blog even sooner.`,V,Y,Xe="Affiliated Project Progress",X,te,et=`Outside the core Spyder IDE, while most plugins have been paused until the Spyder 4 release, work on other affiliated projects has continued. The new spyder-unittest plugin has seen particularly active development, and lead developer and Spyder team member Jitse Niesen recently published a tutorial on its use. -Since November, it has gotten improved pytest support with realtime test results and click-to-open, better UI/UX, a robust communications backend (ZeroMQ), and numerous bug fixes and minor improvements. -QtPy, another affiliated project which Spyder uses as its Qt GUI abstraction layer, has had three releases including one major, with new Qt classes, early support for PySide2, better performance, and a number of bugfixes.`,De,ge,tt,Ge,ye,nt=`Other projects under the Spyder umbrella are also making major progress. The pywinpty pseudo-terminal library has seen six official releases (three major), with a new rich high level interface to create and track processes, new process wrappers, Python 2.7 support, major performance, stability and security improvements, and many bug fixes. -Most importantly, we are proud to report that since this January Jupyter Notebook (in 5.3.0) and JupyterLab have both adopted it to create and manage system terminals on Windows! -The qtsass SASS to Qt stylesheet compiler has a new maintainer, with development including new dev infrastructure, refactoring work, a PyPI release, and new features, with more on the way. -Finally, our loghub automatic changelog generator has seen significant internal and external developer interest, as well as three releases, bug fixes, additional examples, and the ability to group issues and PRs together if desired. -The common thread between all five of these projects has been a substantially increased development pace in recent weeks, so expect to see even more good news soon if that trend continues.`,B,ne,ot="Beyond the Code",Oe,Te,lt=`The team has made progress on a number of fronts outside core program development. -We’ve been joined by several new team members from around the world, who have each contributed new skillsets to the project. -Further, we’ve created, developed and deployed a brand new, modern and responsive website and blog, to provide an accessible, central source for Spyder news and information for both newcomers and old hands alike, as you might have noticed :)`,Fe,_e,at=`Our new, comprehensive Troubleshooting Guide and FAQ will help users easily resolve common issues without having to wait for a response from us, and we’ve revised and improved our Github issue tracking workflow to do an even better job at quickly responding to users’ needs. -On top of that, our Readme, contributing guide, install docs, and developer wiki have all been thoroughly overhauled to make them more up to date, informative and accessible. -Finally, we’ve deepened our relationship with NumFOCUS, integrating us more closely with the broader PyData community, as well as leading to some exciting news…but that will have to wait for our next post!`,F,ae,it="Until then, thanks for all you do for us and the community, and happy Spydering!";return{c(){n=o("p"),n.textContent=f,p=a(),d=o("p"),d.textContent=i,u=a(),c=o("h2"),c.textContent=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("img"),L=a(),k=o("p"),k.textContent=he,K=a(),T=o("h2"),T.textContent=me,A=a(),C=o("p"),C.innerHTML=ue,j=a(),S=o("img"),R=a(),P=o("p"),P.textContent=Le,H=a(),b=o("h2"),b.textContent=ke,fe=a(),E=o("p"),E.textContent=$e,se=a(),ee=o("p"),ee.innerHTML=qe,Z=a(),O=o("p"),O.innerHTML=We,J=a(),Q=o("img"),ve=a(),ie=o("p"),ie.innerHTML=Je,Ce=a(),oe=o("p"),oe.innerHTML=Re,Se=a(),le=o("img"),_=a(),M=o("p"),M.innerHTML=Ye,V=a(),Y=o("h2"),Y.textContent=Xe,X=a(),te=o("p"),te.innerHTML=et,De=a(),ge=o("img"),Ge=a(),ye=o("p"),ye.innerHTML=nt,B=a(),ne=o("h2"),ne.textContent=ot,Oe=a(),Te=o("p"),Te.textContent=lt,Fe=a(),_e=o("p"),_e.innerHTML=at,F=a(),ae=o("p"),ae.textContent=it,this.h()},l(U){n=l(U,"P",{"data-svelte-h":!0}),r(n)!=="svelte-pz772z"&&(n.textContent=f),p=s(U),d=l(U,"P",{"data-svelte-h":!0}),r(d)!=="svelte-181muck"&&(d.textContent=i),u=s(U),c=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-1725v2a"&&(c.textContent=de),D=s(U),v=l(U,"P",{"data-svelte-h":!0}),r(v)!=="svelte-c9xudx"&&(v.innerHTML=we),q=s(U),x=l(U,"IMG",{src:!0,alt:!0}),L=s(U),k=l(U,"P",{"data-svelte-h":!0}),r(k)!=="svelte-47g8gm"&&(k.textContent=he),K=s(U),T=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-1iyzcs1"&&(T.textContent=me),A=s(U),C=l(U,"P",{"data-svelte-h":!0}),r(C)!=="svelte-8k5uw4"&&(C.innerHTML=ue),j=s(U),S=l(U,"IMG",{src:!0,alt:!0}),R=s(U),P=l(U,"P",{"data-svelte-h":!0}),r(P)!=="svelte-ryx303"&&(P.textContent=Le),H=s(U),b=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(b)!=="svelte-phh6l5"&&(b.textContent=ke),fe=s(U),E=l(U,"P",{"data-svelte-h":!0}),r(E)!=="svelte-raeu8r"&&(E.textContent=$e),se=s(U),ee=l(U,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-1pzgygh"&&(ee.innerHTML=qe),Z=s(U),O=l(U,"P",{"data-svelte-h":!0}),r(O)!=="svelte-mdkheq"&&(O.innerHTML=We),J=s(U),Q=l(U,"IMG",{src:!0,alt:!0}),ve=s(U),ie=l(U,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-179t22p"&&(ie.innerHTML=Je),Ce=s(U),oe=l(U,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1i3k1yp"&&(oe.innerHTML=Re),Se=s(U),le=l(U,"IMG",{src:!0,alt:!0}),_=s(U),M=l(U,"P",{"data-svelte-h":!0}),r(M)!=="svelte-599c63"&&(M.innerHTML=Ye),V=s(U),Y=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(Y)!=="svelte-19sfrxz"&&(Y.textContent=Xe),X=s(U),te=l(U,"P",{"data-svelte-h":!0}),r(te)!=="svelte-1wt5kgk"&&(te.innerHTML=et),De=s(U),ge=l(U,"IMG",{src:!0,alt:!0}),Ge=s(U),ye=l(U,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-159zybe"&&(ye.innerHTML=nt),B=s(U),ne=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(ne)!=="svelte-1o8ccqd"&&(ne.textContent=ot),Oe=s(U),Te=l(U,"P",{"data-svelte-h":!0}),r(Te)!=="svelte-1m7652o"&&(Te.textContent=lt),Fe=s(U),_e=l(U,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-4w5n7c"&&(_e.innerHTML=at),F=s(U),ae=l(U,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-ia2mbp"&&(ae.textContent=it),this.h()},h(){h(c,"class","section"),xe(x.src,ce="spyder_opencollective.png")||h(x,"src",ce),h(x,"alt","Spyder OpenCollective, showing many donations and backers"),h(T,"class","section"),xe(S.src,Pe="github_commit_history.png")||h(S,"src",Pe),h(S,"alt","Github commit timeseries for Spyder, with high activity over the past few years"),h(b,"class","section"),xe(Q.src,Ue="varexp_array_display.png")||h(Q,"src",Ue),h(Q,"alt","Variable Explorer, with a variety of array types displayed"),xe(le.src,Qe="error_report_dialog.png")||h(le,"src",Qe),h(le,"alt","New Spyder error report dialog, with more helpful UI text"),h(Y,"class","section"),xe(ge.src,tt="spyder_unittest.png")||h(ge,"src",tt),h(ge,"alt","Spyder-unittest dialog, displaying test results"),h(ne,"class","section")},m(U,re){t(U,n,re),t(U,p,re),t(U,d,re),t(U,u,re),t(U,c,re),t(U,D,re),t(U,v,re),t(U,q,re),t(U,x,re),t(U,L,re),t(U,k,re),t(U,K,re),t(U,T,re),t(U,A,re),t(U,C,re),t(U,j,re),t(U,S,re),t(U,R,re),t(U,P,re),t(U,H,re),t(U,b,re),t(U,fe,re),t(U,E,re),t(U,se,re),t(U,ee,re),t(U,Z,re),t(U,O,re),t(U,J,re),t(U,Q,re),t(U,ve,re),t(U,ie,re),t(U,Ce,re),t(U,oe,re),t(U,Se,re),t(U,le,re),t(U,_,re),t(U,M,re),t(U,V,re),t(U,Y,re),t(U,X,re),t(U,te,re),t(U,De,re),t(U,ge,re),t(U,Ge,re),t(U,ye,re),t(U,B,re),t(U,ne,re),t(U,Oe,re),t(U,Te,re),t(U,Fe,re),t(U,_e,re),t(U,F,re),t(U,ae,re)},p:wt,d(U){U&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae))}}}function ea(y){let n,f;const p=[y[0],kn];let d={$$slots:{default:[Xl]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let na=class extends vt{constructor(n){super(),bt(this,n,ta,ea,gt,{})}};const oa=Object.freeze(Object.defineProperty({__proto__:null,default:na,metadata:kn},Symbol.toStringTag,{value:"Module"}));function la(y){let n,f=`After sharing some major milestones, development progress, and other tidbits from the past six months in Part 1 of this series (check that one out first if you haven’t already), we now have some amazing news to share with you all here in Part 2, along with other status updates. -That’s not all, though—Part 3 will look ahead toward Spyder 4 and beyond, unveiling and explaining our full roadmap and going over the future possibilities even further afield.`,p,d,i="Spyder Wins NumFOCUS Development Grant",u,c,de=`First up, we’re thrilled to announce a major part of what’s making that plan possible (along with your support, of course!). -This May, Spyder was awarded a $3000 development grant from NumFOCUS, an organization promoting better science through open code, to help with finishing Spyder 4! -NumFOCUS is a nonprofit dedicated to supporting key scientific computing projects; promoting sustainability in the open source ecosystem; educating the next generation of scientists, engineers, developers and data analysts through their flagship PyData program; and enabling and inspiring the next generation through their grants, scholarships and fellowships, diversity and inclusion program, and involvement in the Google Summer of Code.`,D,v,we=`We applied for the funding back in March of this year, along with many other scientific Python projects, and were one of the fortunate projects selected after the review process. -The award runs from May through this November, and will enable multiple betas with new features to be released throughout 2018, with the first feature-complete release candidate of Spyder 4 planned by the year’s end (we’ll have more detail on all that in Part 3). -Check out our bio and the other projects that were funded over on the NumFOCUS announcement, and make sure to thank and support them if you get the chance.`,q,x,ce="Quansight Hires Spyder Maintainer; Helps Fund Development",L,k,he=`Equally exciting, Spyder’s maintainer, Carlos Cordoba, was recently hired by Quansight, the brand-new company headed by scientific Python luminary Travis Oliphant! -The father of much of the modern PyData ecosystem including NumPy, SciPy and Numba, Travis has been instrumental in the dramatic growth of open-source data analysis with Python through founding or helping lead Enthought, Continuum/Anaconda, NumFOCUS, and more. -Quansight, Travis’ newest venture, focuses on scaling up the PyData ecosystem to solve even larger and more integrated problems, connecting companies with the open-source tools that can benefit their business, and helping build a more robust ecosystem for open-source scientific development.`,K,T,me=`As part of that mission, Carlos was hired through at least the end of 2018 to help make several open-source projects more sustainable in the long run, and I’m sure you all will be happy to hear that one of them will be our very own Spyder! -After previously helping support the project over at Anaconda, Travis and Quansight will fund Carlos to work part-time on Spyder development, helping the project continue to grow and evolve, and keeping Spyder 4 moving along at a faster pace. -Congratulations Carlos, and thanks to Travis and Quansight!`,A,C,ue=`Aside from those two, we also have several other potential long-term funding opportunities in the pipeline. -Stay tuned to hear more about those in the coming months.`,j,S,Pe="Spyder 3.3.0 Ready to Go",R,P,Le=`Meanwhile, on the development side of things, we’ve just finished the rollout of the next update in the stable Spyder 3 line, 3.3.0, and will have a full post shortly going over the changes and enhancements in detail. -In brief, it has some significant under the hood revisions, cleaning house of some old end of life dependencies and legacy support (Python 3.3 and PyQt4 below 5.5), and separates the IPython Console kernel code into a new spyder-kernels package to make it easier for you to work with different Python environments and remote sessions, and easier for us to add exciting new features down the road. -Additionally, it adds new preferences options for console plotting and autocompletion, improves the usability and performance of Variable Explorer object viewers, includes a new, fully automated error reporting feature to make submitting reports faster, easier and more helpful, and contains a number of other minor improvements and usability enhancements, along with numerous bug fixes.`,H,b,ke,fe,E,$e="Spyder 4 Public Beta 1 on Deck",se,ee,qe=`We’ll also be releasing the first public beta of Spyder 4 in the very near future, to allow users and developers to get their hands on the next generation of the IDE and start using and testing it as soon as possible. -There are far too many significant new features to list here, and they are more than worthy of their own full-length post, as there are many substantial changes to the Editor, Console, Variable Explorer, File Explorer, Outline Explorer, API and more.`,Z,O,We,J,Q,Ue=`Some of the major highlights in the Editor include code folding, indentation guides, multiple line length indicators, a live class/method/function panel (a la Visual Studio), many more shortcut commands, better comment/uncomment, and more. -The IPython Console gains the ability to start specialized Pylab, SymPy, and Cython consoles, and the Variable Explorer gets MultiIndex support, now natively handles all Pandas indexers, and can display sets in a dedicated GUI editor. -Meanwhile, the File Explorer now has multi-select functionality and can open any file with the user’s OS-configured external default program, while the outline explorer can now group items by cell, and in multiple levels. -Finally, Spyder 4 exposes a public API for external plugins, offers more language translations, features several global UI improvements and has numerous under the hood and refactoring changes, and countless other enhancements big and small. -It’s the future of Spyder, so if you’d like to get a taste of the cutting edge, we’d love for you to try it when it drops and let us know what you think!`,ve,ie,Je="Spyder Documentation, Reborn",Ce,oe,Re=`Aside from Spyder 3 and 4, we’ve got another big ticket item for you all in the next few days: our brand new docs! -We’ve been working on a major overhaul of our documentation, which will saw its first official release with Spyder 3.3.0. -Our old docs were hosted on PyPI/PythonHosted and, with the freezing of that service, couldn’t be updated. -Therefore, we’ve now moved to maintain them in a new dedicated repo, build, deploy and host them ourselves with Sphinx, doctr and Github Pages on a subdomain of our new site making them more convenient, responsive and accessible.`,Se,le,Qe,_,M,Ye=`Furthermore, we’ve taken the opportunity to perform a comprehensive overhaul from top to bottom, dramatically improving their usefulness to users. -We’ve greatly expanded many pages and sections and adding new ones, updated outdated references, performed an exhaustive copyedit over nearly every line of the text, developed and implemented a consistent style guide, transitioned to a modern theme with our own custom CSS extensions, added or replaced many dozens of high-resolution screenshots, modified the source code and infrastructure to be easier to develop, build and maintain, and much more. -Even better, you can expect even more improvements in the coming months, as we further expand them toward the standard you’d expect for a feature-rich, multifaceted application like Spyder. -If you find an issue with them, see a section that could use expansion or improvement or even just have general actionable feedback feel free to open an issue or send us a pull request on our new repo. -We’ll have more information about what’s new and our future plans when we officially release them shortly.`,V,Y,Xe="More News and Notes",X,te,et="Finally, we want to make sure you all can stay better informed of Spyder-related happenings going forward, as well as get the chance to interact directly with the Spyder team.",De,ge,tt=`We’re planning on much more frequent announcements, status reports, news, and tutorials right here on our blog, as well as more timely updates on our social media, including our Facebook page and Twitter account. -Make sure to subscribe/follow if you’d like to stay up to date or want to get in touch; we only post important happenings, so we won’t inundate your feeds with trivialities. -You can also reach us on our Google Groups discussion board, our Gitter live chat, or post a comment right here below this post.`,Ge,ye,nt=`Thanks again for all you do to make Spyder possible, and keep a look out for the next post in this series on the future of Spyder, along with our three major releases (3.3.0, 4.0b1, and the new docs) over the next few weeks. -Happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("h2"),d.textContent=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("h2"),x.textContent=ce,L=a(),k=o("p"),k.innerHTML=he,K=a(),T=o("p"),T.textContent=me,A=a(),C=o("p"),C.textContent=ue,j=a(),S=o("h2"),S.textContent=Pe,R=a(),P=o("p"),P.innerHTML=Le,H=a(),b=o("img"),fe=a(),E=o("h2"),E.textContent=$e,se=a(),ee=o("p"),ee.textContent=qe,Z=a(),O=o("img"),J=a(),Q=o("p"),Q.innerHTML=Ue,ve=a(),ie=o("h2"),ie.textContent=Je,Ce=a(),oe=o("p"),oe.innerHTML=Re,Se=a(),le=o("img"),_=a(),M=o("p"),M.innerHTML=Ye,V=a(),Y=o("h2"),Y.textContent=Xe,X=a(),te=o("p"),te.textContent=et,De=a(),ge=o("p"),ge.innerHTML=tt,Ge=a(),ye=o("p"),ye.textContent=nt,this.h()},l(B){n=l(B,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1hxqb5i"&&(n.innerHTML=f),p=s(B),d=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-19bcwx5"&&(d.textContent=i),u=s(B),c=l(B,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1vujq9i"&&(c.innerHTML=de),D=s(B),v=l(B,"P",{"data-svelte-h":!0}),r(v)!=="svelte-12ox8lz"&&(v.innerHTML=we),q=s(B),x=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(x)!=="svelte-1nbjcvl"&&(x.textContent=ce),L=s(B),k=l(B,"P",{"data-svelte-h":!0}),r(k)!=="svelte-100rehe"&&(k.innerHTML=he),K=s(B),T=l(B,"P",{"data-svelte-h":!0}),r(T)!=="svelte-gxtm8m"&&(T.textContent=me),A=s(B),C=l(B,"P",{"data-svelte-h":!0}),r(C)!=="svelte-12rmlke"&&(C.textContent=ue),j=s(B),S=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(S)!=="svelte-1r0pzr9"&&(S.textContent=Pe),R=s(B),P=l(B,"P",{"data-svelte-h":!0}),r(P)!=="svelte-aswwh3"&&(P.innerHTML=Le),H=s(B),b=l(B,"IMG",{src:!0,alt:!0}),fe=s(B),E=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-1n46y8r"&&(E.textContent=$e),se=s(B),ee=l(B,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-1vjcv3q"&&(ee.textContent=qe),Z=s(B),O=l(B,"IMG",{src:!0,alt:!0}),J=s(B),Q=l(B,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-14d4ii3"&&(Q.innerHTML=Ue),ve=s(B),ie=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(ie)!=="svelte-14w6993"&&(ie.textContent=Je),Ce=s(B),oe=l(B,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-n233qz"&&(oe.innerHTML=Re),Se=s(B),le=l(B,"IMG",{src:!0,alt:!0}),_=s(B),M=l(B,"P",{"data-svelte-h":!0}),r(M)!=="svelte-15wekgt"&&(M.innerHTML=Ye),V=s(B),Y=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(Y)!=="svelte-1bc20bm"&&(Y.textContent=Xe),X=s(B),te=l(B,"P",{"data-svelte-h":!0}),r(te)!=="svelte-1xq67kh"&&(te.textContent=et),De=s(B),ge=l(B,"P",{"data-svelte-h":!0}),r(ge)!=="svelte-1o5j99t"&&(ge.innerHTML=tt),Ge=s(B),ye=l(B,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-1mo5pro"&&(ye.textContent=nt),this.h()},h(){h(d,"class","section"),h(x,"class","section"),h(S,"class","section"),xe(b.src,ke="spyder-remote-kernel.png")||h(b,"src",ke),h(b,"alt","A remote kernel running in a system console alongside Spyder's connect to kernel dialog"),h(E,"class","section"),xe(O.src,We="spyder-4b1-preview-editor.png")||h(O,"src",We),h(O,"alt","Preview of the new Spyder 4 Editor, showing several of the mentioned features"),h(ie,"class","section"),xe(le.src,Qe="spyder-docs-preview.png")||h(le,"src",Qe),h(le,"alt","Preview of new Spyder documentation website, displaying a modern theme/layout and better screenshots"),h(Y,"class","section")},m(B,ne){t(B,n,ne),t(B,p,ne),t(B,d,ne),t(B,u,ne),t(B,c,ne),t(B,D,ne),t(B,v,ne),t(B,q,ne),t(B,x,ne),t(B,L,ne),t(B,k,ne),t(B,K,ne),t(B,T,ne),t(B,A,ne),t(B,C,ne),t(B,j,ne),t(B,S,ne),t(B,R,ne),t(B,P,ne),t(B,H,ne),t(B,b,ne),t(B,fe,ne),t(B,E,ne),t(B,se,ne),t(B,ee,ne),t(B,Z,ne),t(B,O,ne),t(B,J,ne),t(B,Q,ne),t(B,ve,ne),t(B,ie,ne),t(B,Ce,ne),t(B,oe,ne),t(B,Se,ne),t(B,le,ne),t(B,_,ne),t(B,M,ne),t(B,V,ne),t(B,Y,ne),t(B,X,ne),t(B,te,ne),t(B,De,ne),t(B,ge,ne),t(B,Ge,ne),t(B,ye,ne)},p:wt,d(B){B&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye))}}}function aa(y){let n,f;const p=[y[0],_n];let d={$$slots:{default:[la]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let ia=class extends vt{constructor(n){super(),bt(this,n,sa,aa,gt,{})}};const ra=Object.freeze(Object.defineProperty({__proto__:null,default:ia,metadata:_n},Symbol.toStringTag,{value:"Module"}));function ua(y){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,i='The Spyder-Terminal project is revitalized! The new 0.3.0 version adds numerous features that improve the user experience, and enhances compatibility with the latest Spyder 4 release, in part thanks to the improvements made in the xterm.js project.',u,c,de,D,v,we="Upgrade to ES6/JSX syntax",q,x,ce="First, we were able to update all the old JavaScript files to use ES6/JSX syntax and the tests for the client terminal. This change simplified the code base and maintenance and allows us to easily extend the project to new functionalities that the xterm.js API offers. In order to compile this code and run it inside Spyder, we migrated our deployment to Webpack.",L,k,he="Multiple shells per operating system",K,T,me="In the new release, you now have the ability to configure which shell to use in the terminal. On Linux and UNIX systems, bash, sh, ksh, zsh, csh, pwsh, tcsh, screen, tmux, dash and rbash are supported, while cmd and powershell are the available options on Windows. To select your preferred command processor, simply choose it from the menu in the Terminal pane of Spyder’s preferences and restart the IDE.",A,C,ue,j,S,Pe="This is a great feature because it allows the user to determine their shell interpreter among the ones that are installed in their systems. In this way, Spyder-Terminal can be configured with any of the existing shells as long as it is available on their machine.",R,P,Le="Theme support and new UI options",H,b,ke="Another big change in the new version is built-in support for all Spyder’s light and dark themes. When you change your Spyder theme or display options, the Terminal automatically adapt its UI, colors and fonts accordingly.",fe,E,$e,se,ee,qe="Building on the look and feel of the plugin, we also added configurable options for the terminal sounds and the cursor style. In this way, you can choose whether the terminal uses a bell sound and can select from one of three cursors.",Z,O,We,J,Q,Ue="Shortcut configuration",ve,ie,Je="Lastly, the shortcuts on the terminal are configurable within the keyboard shortcuts in Spyder 4. The terminal’s shortcuts for Copy, Paste, Clean and New terminal are now no longer hardcoded.",Ce,oe,Re,Se,le,Qe='We’re excited for you to try out Spyder-Terminal 0.3.0 and experiment with the new features available; we’d like to thank NumFOCUS and Quansight for providing the funding and support that made all this work possible. Check back soon for more Spyder updates, and until then, happy coding!';return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("img"),D=a(),v=o("h2"),v.textContent=we,q=a(),x=o("p"),x.textContent=ce,L=a(),k=o("h2"),k.textContent=he,K=a(),T=o("p"),T.innerHTML=me,A=a(),C=o("img"),j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("h2"),P.textContent=Le,H=a(),b=o("p"),b.textContent=ke,fe=a(),E=o("img"),se=a(),ee=o("p"),ee.textContent=qe,Z=a(),O=o("img"),J=a(),Q=o("h2"),Q.textContent=Ue,ve=a(),ie=o("p"),ie.innerHTML=Je,Ce=a(),oe=o("img"),Se=a(),le=o("p"),le.innerHTML=Qe,this.h()},l(_){n=l(_,"P",{"data-svelte-h":!0}),r(n)!=="svelte-aa2x2f"&&(n.innerHTML=f),p=s(_),d=l(_,"P",{"data-svelte-h":!0}),r(d)!=="svelte-cihbgh"&&(d.innerHTML=i),u=s(_),c=l(_,"IMG",{src:!0,alt:!0}),D=s(_),v=l(_,"H2",{class:!0,"data-svelte-h":!0}),r(v)!=="svelte-1hn7hbe"&&(v.textContent=we),q=s(_),x=l(_,"P",{"data-svelte-h":!0}),r(x)!=="svelte-7hqbeh"&&(x.textContent=ce),L=s(_),k=l(_,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-1npuvda"&&(k.textContent=he),K=s(_),T=l(_,"P",{"data-svelte-h":!0}),r(T)!=="svelte-qibysk"&&(T.innerHTML=me),A=s(_),C=l(_,"IMG",{src:!0,alt:!0}),j=s(_),S=l(_,"P",{"data-svelte-h":!0}),r(S)!=="svelte-np7xai"&&(S.textContent=Pe),R=s(_),P=l(_,"H2",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-go4upt"&&(P.textContent=Le),H=s(_),b=l(_,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1skopxh"&&(b.textContent=ke),fe=s(_),E=l(_,"IMG",{src:!0,alt:!0}),se=s(_),ee=l(_,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-1togysm"&&(ee.textContent=qe),Z=s(_),O=l(_,"IMG",{src:!0,alt:!0}),J=s(_),Q=l(_,"H2",{class:!0,"data-svelte-h":!0}),r(Q)!=="svelte-h3anlu"&&(Q.textContent=Ue),ve=s(_),ie=l(_,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-syy71z"&&(ie.innerHTML=Je),Ce=s(_),oe=l(_,"IMG",{src:!0,alt:!0}),Se=s(_),le=l(_,"P",{"data-svelte-h":!0}),r(le)!=="svelte-1vjlw91"&&(le.innerHTML=Qe),this.h()},h(){xe(c.src,de="terminal.png")||h(c,"src",de),h(c,"alt","Screenshot of the new spyder-terminal"),h(v,"class","section"),h(k,"class","section"),xe(C.src,ue="shells.png")||h(C,"src",ue),h(C,"alt","UNIX shell options for starting the terminal"),h(P,"class","section"),xe(E.src,$e="terminal-colors.gif")||h(E,"src",$e),h(E,"alt","Spyder-Terminal new themes"),xe(O.src,We="cursor-style.png")||h(O,"src",We),h(O,"alt","Cursor options for Spyder-Terminal"),h(Q,"class","section"),xe(oe.src,Re="shortcuts.png")||h(oe,"src",Re),h(oe,"alt","Configurable shortcuts for the Terminal inside Spyder 4")},m(_,M){t(_,n,M),t(_,p,M),t(_,d,M),t(_,u,M),t(_,c,M),t(_,D,M),t(_,v,M),t(_,q,M),t(_,x,M),t(_,L,M),t(_,k,M),t(_,K,M),t(_,T,M),t(_,A,M),t(_,C,M),t(_,j,M),t(_,S,M),t(_,R,M),t(_,P,M),t(_,H,M),t(_,b,M),t(_,fe,M),t(_,E,M),t(_,se,M),t(_,ee,M),t(_,Z,M),t(_,O,M),t(_,J,M),t(_,Q,M),t(_,ve,M),t(_,ie,M),t(_,Ce,M),t(_,oe,M),t(_,Se,M),t(_,le,M)},p:wt,d(_){_&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le))}}}function da(y){let n,f;const p=[y[0],Cn];let d={$$slots:{default:[ua]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let pa=class extends vt{constructor(n){super(),bt(this,n,ha,da,gt,{})}};const ca=Object.freeze(Object.defineProperty({__proto__:null,default:pa,metadata:Cn},Symbol.toStringTag,{value:"Module"}));function fa(y){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,i='Spyder 4 will be released very soon with lots of interesting new features that you’ll want to check out, reflecting years of effort by the team to improve the user experience. In this post, we will be talking about the improvements made to the Variable Explorer.',u,c,de="These include the brand new Object Explorer for inspecting arbitrary Python variables, full support for MultiIndex dataframes with multiple dimensions, and the ability to filter and search for variables by name and type, and much more.",D,v,we='It is important to mention that several of the above improvements were made possible through integrating the work of two other projects. Code from gtabview was used to implement the multi-dimensional Pandas indexes, while objbrowser was the foundation of the new Object Explorer.',q,x,ce="New viewer for arbitrary Python objects",L,k,he="For Spyder 4 we added a long-requested feature: full support for inspecting any kind of Python object through the Variable Explorer. For many years, Spyder has been able to view and edit a small subset of Python variables: NumPy arrays, Pandas DataFrames and Series, and builtin collections (lists, dictionaries and tuples). Other objects were displayed as dictionaries of their attributes, inspecting any of which required showing a new table. This made it rather cumbersome to use this functionality, and was the reason arbitrary Python objects were hidden by default from the Variable Explorer view.",K,T,me,A,C,ue='For the forthcoming Spyder release, we’ve integrated the excellent objbrowser project by Pepijn Kenter (@titusjan), which provides a tree-like view of Python objects, to offer a much simpler and more user-friendly way to inspect them.',j,S,Pe,R,P,Le=`As can be seen above, this viewer will also allow users to browse extra metadata about the inspected object, such as its documentation, source code and the file that holds it. -It is very important to note that this work was accomplished thanks to the generosity of Pepijn, who kindly changed the license of objbrowser to allow us to integrate it with Spyder. -To expose this new functionality, we decided to set the option to hide arbitrary Python objects in the Variable Explorer to disabled by default, and introduced a new one called Exclude callables and modules. With this enabled by default, Spyder will now display a much larger fraction of objects that can be inspected, while still excluding most “uninteresting” variables.`,H,b,ke,fe,E,$e="Finally, we added a context-menu action to open any object using the new Object Explorer even if they already have a builtin viewer (DataFrames, arrays, etc), allowing for deeper inspection of the inner workings of these datatypes.",se,ee,qe,Z,O,We="Multi-index support in the dataframe viewer",J,Q,Ue="One of the first features we added to the Variable Explorer in Spyder 4 was MultiIndex support in its DataFrame inspector, including for multi-level and multi-dimensional indices. Spyder 3 had basic support for such, but it was very rudimentary, making inspecting such DataFrames a less than user-friendly experience.",ve,ie,Je,Ce,oe,Re='For Spyder 4, we took advantage of the work done by Scott Hansen (@firecat53) and Yuri D’Elia (@wavexx) in their gtabview project, particularly its improved management of column and table headings, which allows the new version of Spyder to display the index shown above in a much nicer way.',Se,le,Qe,_,M,Ye="Fuzzy filtering of variables",V,Y,Xe=`Spyder 4 also includes the ability to filter the variables shown down to only those of interest. This employs fuzzy matching between the text entered in the search field and the name and type of all available variables. -To access this functionality, click the search icon in the Variable Explorer toolbar, or press Ctrl+F (Cmd-F on macOS) when the Variable Explorer has focus.`,X,te,et,De,ge,tt="To remove the current filter, simply click the search icon again, or press Esc or Ctrl+F (Cmd-F) while the Variable Explorer is focused.",Ge,ye,nt="Refresh while code is running",B,ne,ot='We added back the ability to refresh the Variable Explorer while code is running in the console. This feature was dropped in Spyder 3.2, when we removed the old and unmaintained Python console. However, this functionality will return in Spyder 4, thanks to the fantastic work done by Quentin Peter (@impact27) to completely re-architect the way Spyder talks to the Jupyter kernels that run the code in our IPython console, integrating support for Jupyter Comms.',Oe,Te,lt,Fe,_e,at="To trigger a refresh, simply click the reload button on the Variable Explorer toolbar, or press the shortcut Ctrl+R (Cmd-R) when it has focus.",F,ae,it="Full support for sets",U,re,dt="In Spyder 3, the Variable Explorer could only show builtin Python sets as arbitrary objects, making it very difficult for users to browse and interact with them. In Spyder 4, you can now view sets just like lists, as well as perform various operations on them.",Ke,Ee,rt,Ze,ze,st="UI enhancements and more",g,$,ht="Finally, beyond the headline features, we’ve added numerous smaller improvements to make the Variable Explorer easier and more efficient to use. These include support for custom index names, better and more efficient automatic resizing of column widths, support for displaying Pandas Indices, tooltips for truncated column headers, and more.",ut,Ne,pt='Spyder’s Variable Explorer is what many of you consider to be one of its standout features, so we can’t wait for you all to get your hands on the even better version in Spyder 4. Thanks again to Quansight, our generous community donors, and as always all of you! Spyder 4.0.0 final is planned to be released within approximately one more week, but if you’d like to test it out immediately, follow the instructions on our GitHub to install the pre-release version (which won’t touch your existing Spyder install or settings). As always, happy Spydering!';return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("p"),c.textContent=de,D=a(),v=o("p"),v.innerHTML=we,q=a(),x=o("h2"),x.textContent=ce,L=a(),k=o("p"),k.textContent=he,K=a(),T=o("img"),A=a(),C=o("p"),C.innerHTML=ue,j=a(),S=o("img"),R=a(),P=o("p"),P.innerHTML=Le,H=a(),b=o("img"),fe=a(),E=o("p"),E.textContent=$e,se=a(),ee=o("img"),Z=a(),O=o("h2"),O.textContent=We,J=a(),Q=o("p"),Q.textContent=Ue,ve=a(),ie=o("img"),Ce=a(),oe=o("p"),oe.innerHTML=Re,Se=a(),le=o("img"),_=a(),M=o("h2"),M.textContent=Ye,V=a(),Y=o("p"),Y.innerHTML=Xe,X=a(),te=o("img"),De=a(),ge=o("p"),ge.innerHTML=tt,Ge=a(),ye=o("h2"),ye.textContent=nt,B=a(),ne=o("p"),ne.innerHTML=ot,Oe=a(),Te=o("img"),Fe=a(),_e=o("p"),_e.innerHTML=at,F=a(),ae=o("h2"),ae.textContent=it,U=a(),re=o("p"),re.textContent=dt,Ke=a(),Ee=o("img"),Ze=a(),ze=o("h2"),ze.textContent=st,g=a(),$=o("p"),$.textContent=ht,ut=a(),Ne=o("p"),Ne.innerHTML=pt,this.h()},l(z){n=l(z,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1pjt8pm"&&(n.innerHTML=f),p=s(z),d=l(z,"P",{"data-svelte-h":!0}),r(d)!=="svelte-zhmrie"&&(d.innerHTML=i),u=s(z),c=l(z,"P",{"data-svelte-h":!0}),r(c)!=="svelte-lb2uj8"&&(c.textContent=de),D=s(z),v=l(z,"P",{"data-svelte-h":!0}),r(v)!=="svelte-5six4x"&&(v.innerHTML=we),q=s(z),x=l(z,"H2",{class:!0,"data-svelte-h":!0}),r(x)!=="svelte-ol1fod"&&(x.textContent=ce),L=s(z),k=l(z,"P",{"data-svelte-h":!0}),r(k)!=="svelte-1bmrtq0"&&(k.textContent=he),K=s(z),T=l(z,"IMG",{src:!0,alt:!0}),A=s(z),C=l(z,"P",{"data-svelte-h":!0}),r(C)!=="svelte-yih7m7"&&(C.innerHTML=ue),j=s(z),S=l(z,"IMG",{src:!0,alt:!0}),R=s(z),P=l(z,"P",{"data-svelte-h":!0}),r(P)!=="svelte-fqkl9c"&&(P.innerHTML=Le),H=s(z),b=l(z,"IMG",{src:!0,alt:!0}),fe=s(z),E=l(z,"P",{"data-svelte-h":!0}),r(E)!=="svelte-qhf1bg"&&(E.textContent=$e),se=s(z),ee=l(z,"IMG",{src:!0,alt:!0}),Z=s(z),O=l(z,"H2",{class:!0,"data-svelte-h":!0}),r(O)!=="svelte-11ey9cw"&&(O.textContent=We),J=s(z),Q=l(z,"P",{"data-svelte-h":!0}),r(Q)!=="svelte-ode07s"&&(Q.textContent=Ue),ve=s(z),ie=l(z,"IMG",{src:!0,alt:!0}),Ce=s(z),oe=l(z,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-wh7ow1"&&(oe.innerHTML=Re),Se=s(z),le=l(z,"IMG",{src:!0,alt:!0}),_=s(z),M=l(z,"H2",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-kawc40"&&(M.textContent=Ye),V=s(z),Y=l(z,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1odmreo"&&(Y.innerHTML=Xe),X=s(z),te=l(z,"IMG",{src:!0,alt:!0}),De=s(z),ge=l(z,"P",{"data-svelte-h":!0}),r(ge)!=="svelte-1ymg8ko"&&(ge.innerHTML=tt),Ge=s(z),ye=l(z,"H2",{class:!0,"data-svelte-h":!0}),r(ye)!=="svelte-yoz7vc"&&(ye.textContent=nt),B=s(z),ne=l(z,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1et6vii"&&(ne.innerHTML=ot),Oe=s(z),Te=l(z,"IMG",{src:!0,alt:!0}),Fe=s(z),_e=l(z,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-xrhmm5"&&(_e.innerHTML=at),F=s(z),ae=l(z,"H2",{class:!0,"data-svelte-h":!0}),r(ae)!=="svelte-6yqknk"&&(ae.textContent=it),U=s(z),re=l(z,"P",{"data-svelte-h":!0}),r(re)!=="svelte-1tntgzw"&&(re.textContent=dt),Ke=s(z),Ee=l(z,"IMG",{src:!0,alt:!0}),Ze=s(z),ze=l(z,"H2",{class:!0,"data-svelte-h":!0}),r(ze)!=="svelte-wy0pt7"&&(ze.textContent=st),g=s(z),$=l(z,"P",{"data-svelte-h":!0}),r($)!=="svelte-wc8yz6"&&($.textContent=ht),ut=s(z),Ne=l(z,"P",{"data-svelte-h":!0}),r(Ne)!=="svelte-v5m03a"&&(Ne.innerHTML=pt),this.h()},h(){h(x,"class","section"),xe(T.src,me="python-viewer.png")||h(T,"src",me),h(T,"alt","Python Viewer"),xe(S.src,Pe="python-viewer-metadata.png")||h(S,"src",Pe),h(S,"alt","Python Viewer Metadata"),xe(b.src,ke="exclude-callables-modules.png")||h(b,"src",ke),h(b,"alt","Exclude callables modules"),xe(ee.src,qe="view-object-explorer.png")||h(ee,"src",qe),h(ee,"alt","View object explorer"),h(O,"class","section"),xe(ie.src,Je="multi-index-support.png")||h(ie,"src",Je),h(ie,"alt","Multi-index support"),xe(le.src,Qe="table-headings.png")||h(le,"src",Qe),h(le,"alt","Table headings"),h(M,"class","section"),xe(te.src,et="filter-variables.png")||h(te,"src",et),h(te,"alt","Filter variables"),h(ye,"class","section"),xe(Te.src,lt="refresh.png")||h(Te,"src",lt),h(Te,"alt","Refresh"),h(ae,"class","section"),xe(Ee.src,rt="set-support.png")||h(Ee,"src",rt),h(Ee,"alt","Screenshot of Spyder Variable Explorer UI, showing a Python set displayed in a native viewer"),h(ze,"class","section")},m(z,pe){t(z,n,pe),t(z,p,pe),t(z,d,pe),t(z,u,pe),t(z,c,pe),t(z,D,pe),t(z,v,pe),t(z,q,pe),t(z,x,pe),t(z,L,pe),t(z,k,pe),t(z,K,pe),t(z,T,pe),t(z,A,pe),t(z,C,pe),t(z,j,pe),t(z,S,pe),t(z,R,pe),t(z,P,pe),t(z,H,pe),t(z,b,pe),t(z,fe,pe),t(z,E,pe),t(z,se,pe),t(z,ee,pe),t(z,Z,pe),t(z,O,pe),t(z,J,pe),t(z,Q,pe),t(z,ve,pe),t(z,ie,pe),t(z,Ce,pe),t(z,oe,pe),t(z,Se,pe),t(z,le,pe),t(z,_,pe),t(z,M,pe),t(z,V,pe),t(z,Y,pe),t(z,X,pe),t(z,te,pe),t(z,De,pe),t(z,ge,pe),t(z,Ge,pe),t(z,ye,pe),t(z,B,pe),t(z,ne,pe),t(z,Oe,pe),t(z,Te,pe),t(z,Fe,pe),t(z,_e,pe),t(z,F,pe),t(z,ae,pe),t(z,U,pe),t(z,re,pe),t(z,Ke,pe),t(z,Ee,pe),t(z,Ze,pe),t(z,ze,pe),t(z,g,pe),t(z,$,pe),t(z,ut,pe),t(z,Ne,pe)},p:wt,d(z){z&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae),e(U),e(re),e(Ke),e(Ee),e(Ze),e(ze),e(g),e($),e(ut),e(Ne))}}}function ma(y){let n,f;const p=[y[0],Sn];let d={$$slots:{default:[fa]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let wa=class extends vt{constructor(n){super(),bt(this,n,ya,ma,gt,{})}};const ga=Object.freeze(Object.defineProperty({__proto__:null,default:wa,metadata:Sn},Symbol.toStringTag,{value:"Module"}));function va(y){let n,f='This blogpost was originally published on the Quansight Labs website',p,d,i=`TDK-Micronas is sponsoring Spyder development efforts through Quansight Labs. -This will enable the development of some features that have been requested by -our users, as well as new features that will help TDK develop custom Spyder -plugins in order to complement their Automatic Test Equipment (ATE’s) in the -development of their Application Specific Integrated Circuits (ASIC’s).`,u,c,de=`At this point it may be useful to clarify the relationship the role of -Quansight Labs in Spyder’s development and the relationship with TDK. To quote -Ralf Gommers (director of Quansight Labs):`,D,v,we=`

    “We’re an R&D lab for open source development of core technologies around data -science and scientific computing in Python. And focused on growing communities -around those technologies. That’s how I see it for Spyder as well: Quansight -Labs enables developers to be employed to work on Spyder, and helps with -connecting them to developers of other projects in similar situations. Labs -should be an enabler to let the Spyder project, its community and individual -developers grow. And Labs provides mechanisms to attract and coordinate -funding. Of course the project is still independent. If there are other -funding sources, e.g. donations from individuals to Spyder via OpenCollective, -all the better.”

    `,q,x,ce="Multiple Projects aka Workspaces",L,k,he=`In its current state Spyder can only handle one active project at a time. -Although in the past we had basic support for workspaces, it was never a fully -functional feature, so to ease development and simplify the user experience, -we decided to remove it in the 3.x series.`,K,T,me=`For TDK-Micronas, as well as for a large part of the Spyder user base, the use -of multiple simultaneous projects is a common pattern, so this enhancement -will:`,A,C,ue=`
  • Move from a single to a multiple active projects concept
  • Change the name Project Explorer to WorkSpace Explorer.
  • Copying from one project to another is done in the ‘Explorer’ by means of -context menus.
  • `,j,S,Pe=`It is worth mentioning that projects are considered an “advanced feature”, -so it will not be forced on users that just want to get some work done. -Projects usage is, and will remain, an optional feature.`,R,P,Le="Project Types",H,b,ke=`Since the revamp of Spyder Projects with the 3.x series, the new dialog hinted -at the possibility of creating different types of projects. Currently Spyder -provides an “empty project” project type.`,fe,E,$e,se,ee,qe="This feature will:",Z,O,We=`
  • Expand the (current) Project Explorer API to handle Project Types.
  • Define and implement the minimal aspects that should be extensible by a -Project Type
  • `,J,Q,Ue="File Associations",ve,ie,Je=`Spyder currently supports opening files on the Project and File Explorer -using the (default) Operating System defined applications. We will enhance -this by adding Global file associations as part of the Preferences -and Project Specific associations as part of the Project Preferences. -This will give users more power to select the tool or set of tools that they -prefer to use for specific projects and tasks directly on the File and Project -Explorer pane.`,Ce,oe,Re="URL Awareness",Se,le,Qe=`Working with projects requires access to documentation, located within the -computer as other files or links located over the internet. We will now -include integration for URI detection within the editor so users can -Ctrl+Click on these items. This will work similarly as module -inspection works, but generalized to external and internal links.`,_,M,Ye="Git version control enhancements",V,Y,Xe=`The revision system of choice by our user base, including TDK, is Git. -The purpose of this enhancement is to enable basic Git integration from -within the File and Project Explorer and to extend the current plugin -API so context menus can be customized with specific Git features and -commands.`,X,te,et=`Initial work has already started to display Git relevant information -on the status bar`,De,ge,tt,Ge,ye,nt="Git status is now displayed in the status bar (on the left)",B,ne,ot="Editor alternative views",Oe,Te,lt=`There are many circumstances where a user would like to edit a file that might -be rendered using a parsing tool into another type of view. One example of -this is Markdown, the markup language in which this blog post is written and -that can be rendered to HTML. At the moment the only way to achieve this within -Spyder is via the use of a dedicated plugin that would create a new type of -Pane. An example of such a plugin is spyder-reports -(See image below and the Reports pane). The reason why plugins are developed -this way is because the Editor Plugin on Spyder can only contain Code Editor -widgets, which prevents us and other developers to use the Editor to hold -these alternate views of a given file.`,Fe,_e,at,F,ae,it=`The new alternative views feature will remove this limitation and enable the -inclusion of generic widgets (views) of different types of files and provide -an API for plugin extensions.`,U,re,dt="Closing Remarks",Ke,Ee,rt=`I would like to thank TDK-Micronas and Quansight for the opportunity to -work in open source development on an awesome product such as Spyder.`,Ze,ze,st=`I would also like to thank the users, -contributors -and core developers for helping -make Spyder an awesome tool!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.textContent=i,u=a(),c=o("p"),c.textContent=de,D=a(),v=o("blockquote"),v.innerHTML=we,q=a(),x=o("h2"),x.textContent=ce,L=a(),k=o("p"),k.textContent=he,K=a(),T=o("p"),T.textContent=me,A=a(),C=o("ul"),C.innerHTML=ue,j=a(),S=o("p"),S.textContent=Pe,R=a(),P=o("h2"),P.textContent=Le,H=a(),b=o("p"),b.textContent=ke,fe=a(),E=o("img"),se=a(),ee=o("p"),ee.textContent=qe,Z=a(),O=o("ul"),O.innerHTML=We,J=a(),Q=o("h2"),Q.textContent=Ue,ve=a(),ie=o("p"),ie.innerHTML=Je,Ce=a(),oe=o("h2"),oe.textContent=Re,Se=a(),le=o("p"),le.innerHTML=Qe,_=a(),M=o("h2"),M.textContent=Ye,V=a(),Y=o("p"),Y.textContent=Xe,X=a(),te=o("p"),te.textContent=et,De=a(),ge=o("img"),Ge=a(),ye=o("small"),ye.textContent=nt,B=a(),ne=o("h2"),ne.textContent=ot,Oe=a(),Te=o("p"),Te.innerHTML=lt,Fe=a(),_e=o("img"),F=a(),ae=o("p"),ae.textContent=it,U=a(),re=o("h2"),re.textContent=dt,Ke=a(),Ee=o("p"),Ee.textContent=rt,Ze=a(),ze=o("p"),ze.innerHTML=st,this.h()},l(g){n=l(g,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1wz2w3n"&&(n.innerHTML=f),p=s(g),d=l(g,"P",{"data-svelte-h":!0}),r(d)!=="svelte-89nr4s"&&(d.textContent=i),u=s(g),c=l(g,"P",{"data-svelte-h":!0}),r(c)!=="svelte-hirzgk"&&(c.textContent=de),D=s(g),v=l(g,"BLOCKQUOTE",{"data-svelte-h":!0}),r(v)!=="svelte-194ra0z"&&(v.innerHTML=we),q=s(g),x=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(x)!=="svelte-39xyj3"&&(x.textContent=ce),L=s(g),k=l(g,"P",{"data-svelte-h":!0}),r(k)!=="svelte-vy7895"&&(k.textContent=he),K=s(g),T=l(g,"P",{"data-svelte-h":!0}),r(T)!=="svelte-7p7tjc"&&(T.textContent=me),A=s(g),C=l(g,"UL",{"data-svelte-h":!0}),r(C)!=="svelte-1w77dxh"&&(C.innerHTML=ue),j=s(g),S=l(g,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1dm11il"&&(S.textContent=Pe),R=s(g),P=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-tffyri"&&(P.textContent=Le),H=s(g),b=l(g,"P",{"data-svelte-h":!0}),r(b)!=="svelte-d46gag"&&(b.textContent=ke),fe=s(g),E=l(g,"IMG",{src:!0,alt:!0}),se=s(g),ee=l(g,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-1jp4yz4"&&(ee.textContent=qe),Z=s(g),O=l(g,"UL",{"data-svelte-h":!0}),r(O)!=="svelte-bodz6j"&&(O.innerHTML=We),J=s(g),Q=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(Q)!=="svelte-a5agc"&&(Q.textContent=Ue),ve=s(g),ie=l(g,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-r42ead"&&(ie.innerHTML=Je),Ce=s(g),oe=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(oe)!=="svelte-1wpheau"&&(oe.textContent=Re),Se=s(g),le=l(g,"P",{"data-svelte-h":!0}),r(le)!=="svelte-pnkj4r"&&(le.innerHTML=Qe),_=s(g),M=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-c0fzzy"&&(M.textContent=Ye),V=s(g),Y=l(g,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1vxpn4r"&&(Y.textContent=Xe),X=s(g),te=l(g,"P",{"data-svelte-h":!0}),r(te)!=="svelte-11f51nv"&&(te.textContent=et),De=s(g),ge=l(g,"IMG",{src:!0,alt:!0}),Ge=s(g),ye=l(g,"SMALL",{"data-svelte-h":!0}),r(ye)!=="svelte-1d84hxu"&&(ye.textContent=nt),B=s(g),ne=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(ne)!=="svelte-121xd8m"&&(ne.textContent=ot),Oe=s(g),Te=l(g,"P",{"data-svelte-h":!0}),r(Te)!=="svelte-1w1g9e1"&&(Te.innerHTML=lt),Fe=s(g),_e=l(g,"IMG",{src:!0,alt:!0}),F=s(g),ae=l(g,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-zs1sj3"&&(ae.textContent=it),U=s(g),re=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(re)!=="svelte-19du5tw"&&(re.textContent=dt),Ke=s(g),Ee=l(g,"P",{"data-svelte-h":!0}),r(Ee)!=="svelte-1xw2w4l"&&(Ee.textContent=rt),Ze=s(g),ze=l(g,"P",{"data-svelte-h":!0}),r(ze)!=="svelte-19xo1zm"&&(ze.innerHTML=st),this.h()},h(){h(x,"class","section"),h(P,"class","section"),xe(E.src,$e="spyder-project-creation.png")||h(E,"src",$e),h(E,"alt","Project creation"),h(Q,"class","section"),h(oe,"class","section"),h(M,"class","section"),xe(ge.src,tt="spyder-git-status.png")||h(ge,"src",tt),h(ge,"alt","Status bar git"),h(ne,"class","section"),xe(_e.src,at="spyder-reports.png")||h(_e,"src",at),h(_e,"alt","Spyder Reports"),h(re,"class","section")},m(g,$){t(g,n,$),t(g,p,$),t(g,d,$),t(g,u,$),t(g,c,$),t(g,D,$),t(g,v,$),t(g,q,$),t(g,x,$),t(g,L,$),t(g,k,$),t(g,K,$),t(g,T,$),t(g,A,$),t(g,C,$),t(g,j,$),t(g,S,$),t(g,R,$),t(g,P,$),t(g,H,$),t(g,b,$),t(g,fe,$),t(g,E,$),t(g,se,$),t(g,ee,$),t(g,Z,$),t(g,O,$),t(g,J,$),t(g,Q,$),t(g,ve,$),t(g,ie,$),t(g,Ce,$),t(g,oe,$),t(g,Se,$),t(g,le,$),t(g,_,$),t(g,M,$),t(g,V,$),t(g,Y,$),t(g,X,$),t(g,te,$),t(g,De,$),t(g,ge,$),t(g,Ge,$),t(g,ye,$),t(g,B,$),t(g,ne,$),t(g,Oe,$),t(g,Te,$),t(g,Fe,$),t(g,_e,$),t(g,F,$),t(g,ae,$),t(g,U,$),t(g,re,$),t(g,Ke,$),t(g,Ee,$),t(g,Ze,$),t(g,ze,$)},p:wt,d(g){g&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O),e(J),e(Q),e(ve),e(ie),e(Ce),e(oe),e(Se),e(le),e(_),e(M),e(V),e(Y),e(X),e(te),e(De),e(ge),e(Ge),e(ye),e(B),e(ne),e(Oe),e(Te),e(Fe),e(_e),e(F),e(ae),e(U),e(re),e(Ke),e(Ee),e(Ze),e(ze))}}}function ba(y){let n,f;const p=[y[0],Tn];let d={$$slots:{default:[va]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let ka=class extends vt{constructor(n){super(),bt(this,n,xa,ba,gt,{})}};const _a=Object.freeze(Object.defineProperty({__proto__:null,default:ka,metadata:Tn},Symbol.toStringTag,{value:"Module"}));function Ca(y){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,i=`I joined the Spyder team almost two years ago, and I never thought I was going to end up working on docs. -Six months ago I started a project with CAM Gerlach and Carlos Cordoba to improve Spyder’s documentation. -At first, I didn’t actually understand how important docs are for software, especially for open source projects. -However, during all this time I’ve learned how documentation has a huge impact on the open-source community and I’ve been thankful to have been able to do this. -But, from the beginning, I asked myself “why am I the ‘right person’ for this?”`,u,c,de=`Improving Spyder’s documentation started as part of a NumFOCUS Small Development Grant awarded at the end of last year. -The goal of the project was not only to update the documentation for Spyder 4, but also to make it more user-friendly, so users can understand Spyder’s key concepts and get started with it more easily.`,D,v,we="One of the main ideas for this project was to create a series of short video tutorials, explaining the basic functionality of Spyder and its most important panes, allowing users to learn how to use Spyder faster and easier.",q,x,ce="Carlos Cordoba, our lead maintainer, thought I was the perfect person for this project because of my “good communication and organization skills”, my “clear and fluent English” (his words) and my previous experience at video editing and recording, which I actually gained by recording singing videos during my “YouTuber” phase.",L,k,he=`I’ve always been interested in education and worked as a tutor for several years learning different tools, gaining experience on how to teach and questioning the effectiveness of current educational methods. -This was the first reason why I got interested in this project. -For me, documentation is just a fancy way of saying “educating people on using software”. -The challenge here was not recording and editing the videos (which was actually a pretty arduous task), or planning the content for them; the real challenge was to make an impact in such a way that users could find documentation actually useful.`,K,T,me=`When users start to use a new IDE, or any new software, they usually refer to its documentation, which sometimes doesn’t give enough tools for them to start from zero. -This was, then, the whole purpose of the tutorial videos. -Spyder’s documentation was already very complete in terms of explaining all the features and cool things you can do with each of its panes. -However, if I’m a completely new user and I don’t even know how to open it, where do I start?`,A,C,ue=`I planned these videos as a series of progressive steps that can get users from zero experience to actually working with Spyder. -Hence, I divided the videos into three sections, “First Steps with Spyder”, “Working with Spyder”, and “Building Projects with Spyder”. -Each section builds on the one before in a way that they are clear enough so that users can find their way through Spyder without knowing anything about it.`,j,S,Pe=`The “First Steps with Spyder” section, live now on our YouTube channel, has three videos that provide a starting point for new users before they even open Spyder for the first time. -The first tutorial covers different ways of opening Spyder, the basics of using its interface and an introduction to its four main panes, along with a quick look at the others so that users can get familiar with how Spyder is organized.`,R,P,Le=`In the second video, users can learn the basics of using Spyder’s four main panes. -The goal is that after this video, users are able to open and edit a file in the Editor, run a script and find the output in Spyder’s IPython Console and execute basic Python commands. -They should be able to interact with the Variable Explorer to browse and edit the objects in the console, and use the Help pane to get documentation in two different ways.`,H,b,ke=`The third video is meant to show users how to customize Spyder’s interface to start working with it in the way they feel more comfortable according to their preferences. -It teaches users how to change the font and the theme of Spyder and rearrange its panes to display only the ones that they want such that it is easier for them to work.`,fe,E,$e=`After these three videos, I learned that one of the most important things for writing documentation, more than having a lot of experience with the software, is empathy. -Usually being a developer makes it hard to put yourself in the position of a user and understand exactly what a user needs. -Now, I realize that this is what actually makes me the “perfect person” for the project. -As a junior developer, without as much experience with Spyder, I was able to think more like new users and develop content in a way that they feel closer to us developers. -In the end, as Melissa said in her blog post, I learned writing documentation is also a way of building community.`,se,ee,qe="I hope these videos are really useful, and I look forward to continue finding ways of making the open source community better.",Z,O,We="Happy Spydering!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("p"),v.textContent=we,q=a(),x=o("p"),x.textContent=ce,L=a(),k=o("p"),k.textContent=he,K=a(),T=o("p"),T.textContent=me,A=a(),C=o("p"),C.textContent=ue,j=a(),S=o("p"),S.innerHTML=Pe,R=a(),P=o("p"),P.innerHTML=Le,H=a(),b=o("p"),b.innerHTML=ke,fe=a(),E=o("p"),E.innerHTML=$e,se=a(),ee=o("p"),ee.textContent=qe,Z=a(),O=o("p"),O.textContent=We},l(J){n=l(J,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1c3xat3"&&(n.innerHTML=f),p=s(J),d=l(J,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1ekmroj"&&(d.innerHTML=i),u=s(J),c=l(J,"P",{"data-svelte-h":!0}),r(c)!=="svelte-3uobbg"&&(c.innerHTML=de),D=s(J),v=l(J,"P",{"data-svelte-h":!0}),r(v)!=="svelte-1nsl4ig"&&(v.textContent=we),q=s(J),x=l(J,"P",{"data-svelte-h":!0}),r(x)!=="svelte-13wakb2"&&(x.textContent=ce),L=s(J),k=l(J,"P",{"data-svelte-h":!0}),r(k)!=="svelte-8i2tyt"&&(k.textContent=he),K=s(J),T=l(J,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1taoegn"&&(T.textContent=me),A=s(J),C=l(J,"P",{"data-svelte-h":!0}),r(C)!=="svelte-ovfvik"&&(C.textContent=ue),j=s(J),S=l(J,"P",{"data-svelte-h":!0}),r(S)!=="svelte-uwjnw4"&&(S.innerHTML=Pe),R=s(J),P=l(J,"P",{"data-svelte-h":!0}),r(P)!=="svelte-q2p4uz"&&(P.innerHTML=Le),H=s(J),b=l(J,"P",{"data-svelte-h":!0}),r(b)!=="svelte-4qc8rx"&&(b.innerHTML=ke),fe=s(J),E=l(J,"P",{"data-svelte-h":!0}),r(E)!=="svelte-ixkqq3"&&(E.innerHTML=$e),se=s(J),ee=l(J,"P",{"data-svelte-h":!0}),r(ee)!=="svelte-aq4wil"&&(ee.textContent=qe),Z=s(J),O=l(J,"P",{"data-svelte-h":!0}),r(O)!=="svelte-11fpu20"&&(O.textContent=We)},m(J,Q){t(J,n,Q),t(J,p,Q),t(J,d,Q),t(J,u,Q),t(J,c,Q),t(J,D,Q),t(J,v,Q),t(J,q,Q),t(J,x,Q),t(J,L,Q),t(J,k,Q),t(J,K,Q),t(J,T,Q),t(J,A,Q),t(J,C,Q),t(J,j,Q),t(J,S,Q),t(J,R,Q),t(J,P,Q),t(J,H,Q),t(J,b,Q),t(J,fe,Q),t(J,E,Q),t(J,se,Q),t(J,ee,Q),t(J,Z,Q),t(J,O,Q)},p:wt,d(J){J&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x),e(L),e(k),e(K),e(T),e(A),e(C),e(j),e(S),e(R),e(P),e(H),e(b),e(fe),e(E),e(se),e(ee),e(Z),e(O))}}}function Sa(y){let n,f;const p=[y[0],Pn];let d={$$slots:{default:[Ca]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Pa=class extends vt{constructor(n){super(),bt(this,n,Ta,Sa,gt,{})}};const Ma=Object.freeze(Object.defineProperty({__proto__:null,default:Pa,metadata:Pn},Symbol.toStringTag,{value:"Module"}));function Ha(y){let n,f=`Quansight, the company recently founded by NumPy, SciPy and Anaconda creator Travis Oliphant to help connect companies with open source communities built around data science and machine learning, just released Episode 1 of its live webcast series, and it was all about Spyder! -Spyder maintainer Carlos Córdoba, recently hired by Quansight and funded part-time to work on Spyder development as we announced a few weeks ago, was the featured guest on the show.`,p,d,i=`Carlos first shared his perspective on some of the key moments in Spyder’s nearly 10-year development history, from its original creation by Pierre Raybaut and Carlos’ initial involvement in the project to its more recent challenges and successes. -He also demonstrated basic usage of Spyder, as well as some of its standout features, in a live on-screen demo. -Carlos then went on to outline the current roadmap for Spyder 4 in the near future, and explained some of the key new features planned for it. -Finally, he took the time to answer a variety of Spyder-related questions asked live by viewers, ranging from specific current and planned Spyder features to suggestions on keeping a good work-life balance. -While technical difficulties (since identified and resolved) interrupted some of his commentary, particularly in the roadmap section, a full account of the latter will be published here shortly.`,u,c,de=`If you missed the webcast, Quansight recorded it and uploaded it to their new Youtube channel, so you can watch it on-demand right here if you’re curious about any of the above. -Give it a like if you enjoy it to show Quansight some love for helping support Spyder’s further development!`,D,v,we,q,x,ce=`We’ll have a new post on the release of Spyder 3.3.1 (and 3.3.0) in a few days time, plus articles on our new docs, Spyder 4 beta 1, and our full roadmap all in the next week or so; there’s plenty going on that you won’t want to miss. -Keep it right here to catch all that—and in the meantime, happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=i,u=a(),c=o("p"),c.innerHTML=de,D=a(),v=o("iframe"),q=a(),x=o("p"),x.textContent=ce,this.h()},l(L){n=l(L,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1ekiaxh"&&(n.innerHTML=f),p=s(L),d=l(L,"P",{"data-svelte-h":!0}),r(d)!=="svelte-4osmhr"&&(d.innerHTML=i),u=s(L),c=l(L,"P",{"data-svelte-h":!0}),r(c)!=="svelte-8641gl"&&(c.innerHTML=de),D=s(L),v=l(L,"IFRAME",{title:!0,width:!0,height:!0,src:!0,frameborder:!0,allow:!0}),jt(v).forEach(e),q=s(L),x=l(L,"P",{"data-svelte-h":!0}),r(x)!=="svelte-319fyz"&&(x.textContent=ce),this.h()},h(){h(v,"title","Episode 1"),h(v,"width","640"),h(v,"height","360"),xe(v.src,we="https://www.youtube-nocookie.com/embed/vtLdH4VbACA")||h(v,"src",we),h(v,"frameborder","0"),h(v,"allow","autoplay; encrypted-media"),v.allowFullscreen=!0},m(L,k){t(L,n,k),t(L,p,k),t(L,d,k),t(L,u,k),t(L,c,k),t(L,D,k),t(L,v,k),t(L,q,k),t(L,x,k)},p:wt,d(L){L&&(e(n),e(p),e(d),e(u),e(c),e(D),e(v),e(q),e(x))}}}function La(y){let n,f;const p=[y[0],Mn];let d={$$slots:{default:[Ha]},$$scope:{ctx:y}};for(let i=0;i{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}class ja extends vt{constructor(n){super(),bt(this,n,Ia,La,gt,{})}}const $a=Object.freeze(Object.defineProperty({__proto__:null,default:ja,metadata:Mn},Symbol.toStringTag,{value:"Module"})),Gn=y=>y!=null,js=async(y,n)=>{const p=Object.entries(Object.assign({"/src/routes/blog/STX-interview/+page.md":yo,"/src/routes/blog/cbi-installers/+page.md":xo,"/src/routes/blog/czi-grant/+page.md":To,"/src/routes/blog/ide-ux-bof-scipy-2024/+page.md":Io,"/src/routes/blog/installer-improvements/+page.md":zo,"/src/routes/blog/introducing-unittest-plugin/+page.md":Fo,"/src/routes/blog/introducing-watchlist-plugin/+page.md":Qo,"/src/routes/blog/release-qtconsole-440/+page.md":Zo,"/src/routes/blog/release-spyder-330/+page.md":nl,"/src/routes/blog/release-spyder-4/+page.md":il,"/src/routes/blog/release-spyder-4beta2/+page.md":pl,"/src/routes/blog/release-spyder-6.0.0/+page.md":wl,"/src/routes/blog/reusable-research-bof-scipy-2023-part-2/+page.md":kl,"/src/routes/blog/reusable-research-bof-scipy-2023/+page.md":Pl,"/src/routes/blog/spyder-6-remote-development/+page.md":jl,"/src/routes/blog/spyder-debugger/+page.md":Dl,"/src/routes/blog/spyder-files-improvements/+page.md":Wl,"/src/routes/blog/spyder-kite-funding/+page.md":Bl,"/src/routes/blog/spyder-roadmap-proposals-2022/+page.md":Yl,"/src/routes/blog/spyder-status-2018-past/+page.md":oa,"/src/routes/blog/spyder-status-2018-present/+page.md":ra,"/src/routes/blog/spyder-terminal-030/+page.md":ca,"/src/routes/blog/spyder-variable-explorer/+page.md":ga,"/src/routes/blog/tdk-micronas-partners-with-quansight-labs/+page.md":_a,"/src/routes/blog/tutorial-docs/+page.md":Ma,"/src/routes/blog/webcast-quansight-ep1/+page.md":$a})).map(([D,v])=>{const{metadata:we}=v,q=D.split("/");q.pop();const x=q.slice(-1).join("/");return{meta:we,path:x}}),d=za(p);if(!Gn(y)||!Gn(n))return d;const i=(y-1)*n,u=i+n,c=d.slice(i,u),de=Math.ceil(d.length/n);return{posts:c,pageNum:y,totalPages:de}};function qn(y){const n={year:"numeric",month:"long",day:"numeric"};return new Date(y).toLocaleDateString("en-US",n)}async function Aa(y,n){try{const f=await(n||fetch)(`/assets/authors/${y}/metadata.json`);if(!f.ok)throw new Error("Failed to load author metadata");const p=await f.json();return{src:`/assets/authors/${y}/${p.image}`,name:p.name}}catch(f){return console.error("Failed to load author metadata:",f),null}}async function Ea(y){return!y||!Array.isArray(y)?(console.error("Invalid authors data:",y),[]):await Promise.all(y.map(f=>Aa(f)))}const za=y=>y.sort((n,f)=>new Date(f.meta.pub_date)-new Date(n.meta.pub_date)),$s=y=>Math.random().toString(24).replace(/[^a-z]+/g,""),Da=()=>{if(typeof window<"u"){const y=navigator.userAgent.toLowerCase(),n={mac:["mac"],windows:["win"],linux:["linux"]};for(const f in n)if(n[f].some(p=>y.includes(p)))return f}},Ga=(y,n)=>{let f=[{}],p="";return n==="windows"?p="for Windows 10+":n==="linux"?p="for Linux":n==="mac"&&(p="for macOS",f=[{highlight:!0,icon:`${n}`,text:`Download ${p} 14.0+ (M1)`,href:`${y}/download?os=${n}&arch=arm64`},{highlight:!0,icon:`${n}`,text:`Download ${p} 12.0+ (Intel)`,href:`${y}/download?os=${n}&arch=x64`}]),(n==="windows"||n==="linux")&&(f=[{highlight:!0,icon:`${n}`,text:`Download ${p}`,href:`${y}/download?os=${n}&arch=x64`}]),f};async function As(y){try{return(await Zn(()=>import("./index.D7Jwt5yH.js"),[],import.meta.url))[y]}catch(n){return console.error(`Failed to load icon: ${y}`,n),null}}const qa=localStorage.getItem("colourScheme")||"light",Oa=Hn(qa);Oa.subscribe(y=>{localStorage.setItem("colourScheme",y),console.log("Colour scheme set to",y)});function Fa(){const{subscribe:y,set:n,update:f}=Hn({title:"",description:"",keywords:"",author:"",url:"",image:"",site:""});return{subscribe:y,setMetadata:p=>n(p),reset:()=>n({title:"",description:"",keywords:"",author:"",url:"",image:"",site:""})}}const Fn=Fa(),Wa=Hn({loading:!0});setTimeout(()=>{const y=Da(),n=Ga(Bt,y);Wa.set({loading:!1,os:y,osButtons:n})},0);export{pa as $,As as A,$s as B,Ve as C,Ja as D,Va as E,bo as F,So as G,Lo as H,Eo as I,Oo as J,Ro as K,Ko as L,ro as M,tl as N,sl as O,mo as P,hl as Q,yl as R,Tl as S,xl as T,Il as U,zl as V,Fl as W,Ql as X,Zl as Y,na as Z,ia as _,es as a,wa as a0,ka as a1,Pa as a2,ja as a3,Xa as b,Ka as c,no as d,Za as e,js as f,St as g,$n as h,Da as i,ao as j,Ya as k,Ea as l,Fn as m,qn as n,lo as o,Oa as p,ts as q,as as r,Yt as s,Xn as t,ss as u,eo as v,os as w,Wa as x,ls as y,ns as z}; diff --git a/_app/immutable/chunks/32.L6pbTd52.js b/_app/immutable/chunks/32.L6pbTd52.js new file mode 100644 index 0000000..2bed975 --- /dev/null +++ b/_app/immutable/chunks/32.L6pbTd52.js @@ -0,0 +1,580 @@ +import{r as Un,s as gt,n as wt,c as On,A as Nn,B as Rn,C as Qn,D as Bn,o as Vn,h as Te,b as Ae,I as Be}from"./scheduler.DK_yUdRf.js";import{l as mt,n as yt,S as vt,i as bt,e as o,A as $n,E as Jn,c as l,d as e,y as h,h as ct,g as t,u as xt,s as a,t as Xt,v as kt,f as i,a as jt,b as en,w as _t,j as tn,x as Ct,z as Kn,F as r,B as Zt,H as Rt,q as Qt}from"./index.BH5W4qoH.js";import{p as Zn}from"./stores.BhPy-k-g.js";import{b as Bt,w as Ln}from"./entry.B3JBGiH6.js";import{_ as Yn}from"./preload-helper.C1FmrZbK.js";function An(m){return(m==null?void 0:m.length)!==void 0?m:Array.from(m)}function ei(m,n){mt(m,1,1,()=>{n.delete(m.key)})}function ti(m,n,f,p,d,s,u,c,de,q,b,ge){let F=m.length,k=s.length,fe=F;const I={};for(;fe--;)I[m[fe].key]=fe;const _=[],he=new Map,X=new Map,P=[];for(fe=k;fe--;){const ue=ge(d,s,fe),$=f(ue);let T=u.get($);T?P.push(()=>T.p(ue,n)):(T=q($,ue),T.c()),he.set($,_[fe]=T),$ in I&&X.set($,Math.abs(fe-I[$]))}const we=new Set,D=new Set;function S(ue){yt(ue,1),ue.m(c,b),u.set(ue.key,ue),b=ue.first,k--}for(;F&&k;){const ue=_[k-1],$=m[F-1],T=ue.key,Pe=$.key;ue===$?(b=ue.first,F--,k--):he.has(Pe)?!u.has(T)||we.has(T)?S(ue):D.has(Pe)?F--:X.get(T)>X.get(Pe)?(D.add(T),S(ue)):(we.add(Pe),F--):(de($,u),F--)}for(;F--;){const ue=m[F];he.has(ue.key)||de(ue,u)}for(;k;)S(_[k-1]);return Un(P),_}function St(m,n){const f={},p={},d={$$scope:1};let s=m.length;for(;s--;){const u=m[s],c=n[s];if(c){for(const de in u)de in c||(p[de]=1);for(const de in c)d[de]||(f[de]=c[de],d[de]=1);m[s]=c}else for(const de in u)d[de]=1}for(const u in p)u in f||(f[u]=void 0);return f}function Ve(m){return typeof m=="object"&&m!==null?m:{}}const Xn="https://www.spyder-ide.org/",Yt=Xn,eo="Spyder",to="The Python IDE that scientists and data analysts deserve",no="Designed by the community, for the community",ni="Spyder Website Contributors",oo="Get the ease of use of Jupyter along with many advanced features found in PyCharm and VSCode in a single programming environment",oi=`${Yt}assets/media/website_screenshot.png`,li=["Python","IDE","Spyder","Matplotlib","iPython","Jupyter","Science","Data-Science","Data-Analytics","Programming"],ai="Welcome to Spyder's Blog",ii=oo,In="blog",lo="og",ao=`${Yt}assets/media/blog_screenshot.png`,si=[[{text:"Download",href:`${Bt}/download/`,target:"_self"},{text:"About",href:`${Bt}/about/`,target:"_self"},{text:"Blog",href:`${Bt}/${In}/`,target:"_self"},{text:"Docs",href:"https://docs.spyder-ide.org/",target:"_blank"}]],io={github:"https://github.com/spyder-ide/spyder",twitter:"https://twitter.com/spyder_ide",facebook:"https://www.facebook.com/SpyderIDE/",mastodon:"https://fosstodon.org/@Spyder",instagram:"https://instagram.com/spyderide",rss:`${Bt}/blog/feed.xml`},ri={title:to,description:no},ui={dark:`${Bt}/assets/media/screenshot_dark.webp`,light:`${Bt}/assets/media/screenshot_light.webp`},di={highlight:!1,icon:"github",text:"Checkout on GitHub",href:"https://github.com/spyder-ide/spyder/"},hi={windows:{x64:{name:"Windows 10+",link:"https://github.com/spyder-ide/spyder/releases/latest/download/Spyder-Windows-x86_64.exe"}},linux:{x64:{name:"Linux",link:"https://github.com/spyder-ide/spyder/releases/latest/download/Spyder-Linux-x86_64.sh"}},mac:{arm64:{name:"macOS 14.0+ (M1)",link:"https://github.com/spyder-ide/spyder/releases/latest/download/Spyder-macOS-arm64.pkg"},x64:{name:"macOS 12.0+ (Intel)",link:"https://github.com/spyder-ide/spyder/releases/latest/download/Spyder-macOS-x86_64.pkg"}}},pi="Connect with us on";function En(m){let n;return{c(){n=o("link"),this.h()},l(f){n=l(f,"LINK",{rel:!0,href:!0}),this.h()},h(){h(n,"rel","stylesheet"),h(n,"href",Bt+"/assets/vendor/prism/prism-nord.css")},m(f,p){t(f,n,p)},d(f){f&&e(n)}}}function so(m){let n,f,p,d,s,u,c,de,q,b,ge,F,k,fe,I,_,he,X,P,we,D,S,ue,$,T,Pe,N,M,Me,L,x,Ce,me;document.title=n=m[1].title;let E=m[0]&&En();return{c(){f=o("meta"),d=o("meta"),u=o("meta"),de=o("link"),q=o("link"),b=o("meta"),ge=o("meta"),F=o("meta"),fe=o("meta"),_=o("meta"),X=o("meta"),we=o("meta"),D=o("meta"),S=o("meta"),ue=o("meta"),$=o("meta"),T=o("meta"),N=o("meta"),Me=o("meta"),x=o("meta"),E&&E.c(),me=$n(),this.h()},l(Ie){const re=Jn("svelte-ez8xnx",document.head);f=l(re,"META",{name:!0,content:!0}),d=l(re,"META",{name:!0,content:!0}),u=l(re,"META",{name:!0,content:!0}),de=l(re,"LINK",{rel:!0,href:!0}),q=l(re,"LINK",{rel:!0,type:!0,title:!0,href:!0}),b=l(re,"META",{property:!0,content:!0}),ge=l(re,"META",{property:!0,content:!0}),F=l(re,"META",{property:!0,content:!0}),fe=l(re,"META",{property:!0,content:!0}),_=l(re,"META",{property:!0,content:!0}),X=l(re,"META",{property:!0,content:!0}),we=l(re,"META",{property:!0,content:!0}),D=l(re,"META",{property:!0,content:!0}),S=l(re,"META",{name:!0,content:!0}),ue=l(re,"META",{name:!0,content:!0}),$=l(re,"META",{name:!0,content:!0}),T=l(re,"META",{name:!0,content:!0}),N=l(re,"META",{name:!0,content:!0}),Me=l(re,"META",{name:!0,content:!0}),x=l(re,"META",{name:!0,content:!0}),E&&E.l(re),me=$n(),re.forEach(e),this.h()},h(){h(f,"name","description"),h(f,"content",p=m[1].description),h(d,"name","keywords"),h(d,"content",s=m[1].keywords),h(u,"name","author"),h(u,"content",c=m[1].author),h(de,"rel","canonical"),h(de,"href",m[3]),h(q,"rel","alternate"),h(q,"type","application/rss+xml"),h(q,"title","Spyder's Blog"),h(q,"href",Yt+In+"/feed.xml"),h(b,"property","og:type"),h(b,"content","website"),h(ge,"property","og:url"),h(ge,"content",m[3]),h(F,"property","og:title"),h(F,"content",k=m[1].title),h(fe,"property","og:description"),h(fe,"content",I=m[1].description),h(_,"property","og:image"),h(_,"content",he=m[1].image),h(X,"property","og:image:secure_url"),h(X,"content",P=m[1].image),h(we,"property","og:locale"),h(we,"content","en_US"),h(D,"property","og:site_name"),h(D,"content","Spyder IDE"),h(S,"name","twitter:card"),h(S,"content","summary_large_image"),h(ue,"name","twitter:site"),h(ue,"content",m[2]),h($,"name","twitter:creator"),h($,"content",m[2]),h(T,"name","twitter:title"),h(T,"content",Pe=m[1].title),h(N,"name","twitter:description"),h(N,"content",M=m[1].description),h(Me,"name","twitter:image"),h(Me,"content",L=m[1].image),h(x,"name","twitter:image:alt"),h(x,"content",Ce=m[1].title)},m(Ie,re){ct(document.head,f),ct(document.head,d),ct(document.head,u),ct(document.head,de),ct(document.head,q),ct(document.head,b),ct(document.head,ge),ct(document.head,F),ct(document.head,fe),ct(document.head,_),ct(document.head,X),ct(document.head,we),ct(document.head,D),ct(document.head,S),ct(document.head,ue),ct(document.head,$),ct(document.head,T),ct(document.head,N),ct(document.head,Me),ct(document.head,x),E&&E.m(document.head,null),ct(document.head,me)},p(Ie,[re]){re&2&&n!==(n=Ie[1].title)&&(document.title=n),re&2&&p!==(p=Ie[1].description)&&h(f,"content",p),re&2&&s!==(s=Ie[1].keywords)&&h(d,"content",s),re&2&&c!==(c=Ie[1].author)&&h(u,"content",c),re&2&&k!==(k=Ie[1].title)&&h(F,"content",k),re&2&&I!==(I=Ie[1].description)&&h(fe,"content",I),re&2&&he!==(he=Ie[1].image)&&h(_,"content",he),re&2&&P!==(P=Ie[1].image)&&h(X,"content",P),re&2&&Pe!==(Pe=Ie[1].title)&&h(T,"content",Pe),re&2&&M!==(M=Ie[1].description)&&h(N,"content",M),re&2&&L!==(L=Ie[1].image)&&h(Me,"content",L),re&2&&Ce!==(Ce=Ie[1].title)&&h(x,"content",Ce),Ie[0]?E||(E=En(),E.c(),E.m(me.parentNode,me)):E&&(E.d(1),E=null)},i:wt,o:wt,d(Ie){e(f),e(d),e(u),e(de),e(q),e(b),e(ge),e(F),e(fe),e(_),e(X),e(we),e(D),e(S),e(ue),e($),e(T),e(N),e(Me),e(x),E&&E.d(Ie),e(me)}}}function ro(m,n,f){let p;On(m,Wn,c=>f(1,p=c));const d=`@${io.twitter.split("/").pop()}`,s=p.url.replace(/\/+$/,"");let{prism:u=!1}=n;return m.$$set=c=>{"prism"in c&&f(0,u=c.prism)},[u,p,d,s]}class uo extends vt{constructor(n){super(),bt(this,n,ro,so,gt,{prism:0})}}function zn(m,n,f){const p=m.slice();return p[2]=n[f],p}function Dn(m){let n,f,p;return{c(){n=o("img"),this.h()},l(d){n=l(d,"IMG",{class:!0,src:!0,alt:!0}),this.h()},h(){h(n,"class","w-24 h-24 rounded-full object-cover"),Te(n.src,f=m[2].src)||h(n,"src",f),h(n,"alt",p=m[2].name)},m(d,s){t(d,n,s)},p(d,s){s&8&&!Te(n.src,f=d[2].src)&&h(n,"src",f),s&8&&p!==(p=d[2].name)&&h(n,"alt",p)},d(d){d&&e(n)}}}function Gn(m){let n,f,p,d=m[2].name+"",s,u,c=m[2].src&&Dn(m);return{c(){n=o("div"),c&&c.c(),f=a(),p=o("div"),s=Xt(d),u=a(),this.h()},l(de){n=l(de,"DIV",{class:!0});var q=jt(n);c&&c.l(q),f=i(q),p=l(q,"DIV",{class:!0});var b=jt(p);s=en(b,d),b.forEach(e),u=i(q),q.forEach(e),this.h()},h(){h(p,"class","font-light text-center w-36"),h(n,"class","flex flex-col items-center gap-2")},m(de,q){t(de,n,q),c&&c.m(n,null),ct(n,f),ct(n,p),ct(p,s),ct(n,u)},p(de,q){de[2].src?c?c.p(de,q):(c=Dn(de),c.c(),c.m(n,f)):c&&(c.d(1),c=null),q&8&&d!==(d=de[2].name+"")&&tn(s,d)},d(de){de&&e(n),c&&c.d()}}}function ho(m){let n,f,p,d,s,u,c,de,q=Fn(m[1])+"",b,ge,F,k,fe,I,_;n=new uo({props:{prism:!0}});let he=An(m[3]),X=[];for(let D=0;Df(9,p=he));let{$$slots:d={},$$scope:s}=n,{data:u}=n,{form:c}=n,{title:de}=n,{pub_date:q}=n,{author:b}=n,{tags:ge}=n,{category:F}=n,{summary:k}=n,fe=[];const I=p.url.pathname.replace(`/${In}`,"").replaceAll("/",""),_=`${Yt}assets/${lo}/${I}.png`;return Vn(async()=>{const he=Array.isArray(b)?b:b?[b]:[];f(3,fe=await Oa(he))}),m.$$set=he=>{"data"in he&&f(4,u=he.data),"form"in he&&f(5,c=he.form),"title"in he&&f(0,de=he.title),"pub_date"in he&&f(1,q=he.pub_date),"author"in he&&f(2,b=he.author),"tags"in he&&f(6,ge=he.tags),"category"in he&&f(7,F=he.category),"summary"in he&&f(8,k=he.summary),"$$scope"in he&&f(10,s=he.$$scope)},m.$$.update=()=>{m.$$.dirty&973&&Wn.setMetadata({title:`${eo} | ${de}`,description:k,keywords:`${ge}, ${F}`,author:fe.map(he=>he.name).join(", ")||b||"",url:p.url.href,image:_||ao})},[de,q,b,fe,u,c,ge,F,k,p,s,d]}class Tt extends vt{constructor(n){super(),bt(this,n,po,ho,gt,{data:4,form:5,title:0,pub_date:1,author:2,tags:6,category:7,summary:8})}}function co(m){let n,f=`STX Next, one of Europe’s largest Python development companies, has shared with us how Spyder has been a powerful tool for them when performing data analysis. +It is a pleasure for us on the Spyder team to work every day to improve the workflow of developers, scientists, engineers and data analysts. +We are very glad to receive and share a STX Next testimonial about Spyder, along with an interview with one of their developers, Michael Wiśniewski, who has found Spyder very useful in his job.`,p,d,s,u,c,de="What Michael Wiśniewski says about Spyder",q,b,ge=`In an era of a continuously growing demand for analysis of vast amounts of data, we are facing increasingly complex tasks to perform. +Sure, we are not alone—there are many great tools designed for scientists and data analysts. +We have NumPy, SciPy, Matplotlib, Pandas, and others. +But, wouldn’t it be nice to have one extra tool that could combine all the required packages into one compact working environment? Asking this question is precisely how my journey with Spyder began.`,F,k,fe=`In my opinion, Spyder is the go-to-solution that helps to speed up the data analysis processes. +For me, the biggest strength of this IDE is that it has all the benefits of Matlab/RStudio and makes them available to the Pythonista community. +It provides us with an easy-to-organize workspace that accommodates code, visualizations and shell in just one window. +Besides, the pane called variable explorer allows direct access to all data placed in the memory.`,I,_,he=`Another cool feature is the tool’s integration with Jupyter notebooks. +Just open and browse different notebooks without thinking about server-side and file paths. +Want to run a single line of code or quickly check a chart update? IPython is on board and ready by default.`,X,P,we="Michael Wiśniewski’s interview",D,S,ue,$,T,Pe=`I’m Michael Wiśniewski and I’ve been working at STX Next as a full-stack developer for over a year. +During this time, I was involved in various projects from many different areas—from typical web applications where I used Python and JavaScript to implementing ML solutions for image recognition on the nVidia Jetson platform. +After hours, my colleagues and I run a machine learning community of practice. Today, I’d like to share my thoughts on using Spyder.`,N,M,Me="How long have you been using Spyder?",L,x,Ce="I discovered Spyder around a year ago, at the time it was transitioning from version 3 to the current one.",me,E,Ie="How many people in your company use Spyder?",re,Z,qe=`In my department, three of my colleagues use Spyder on a daily basis. +Some of them use it for commercial projects, while others use it for personal research. +The number is growing, since most people try Spyder out after their first contact with it.`,ee,G,We="What kind of projects have you done using Spyder?",Y,O,Ue=`I’ve found applications for Spyder in many different areas. +One time, I used it for a project that relied on machine learning algorithms to assess risk based on documents provided by a user. +Since Spyder aggregates out-of-the-box the most popular scientific Python packages, it was used during the whole development process, from data pre-processing and visualization to assessment of the final solution.`,ve,se,Qe=`Another time, Spyder proved to be very helpful in a project involving the analysis of ancient religious texts. +The task was to create a script that would check file integrity and the correctness of the texts themselves. +Because of the large size of the data sets, the script had to be efficient and able to handle a lot of edge cases. +A built-in ipdb debugger and script profiler (together with the Spyder-memory-profiler plugin) was very helpful in achieving this goal.`,ke,le,Ne=`To me, this IDE is also a great tool for conducting workshops. +The ability to discuss algorithms while visualizing their results in a separate plot panel, without the need to switch windows, greatly facilitates presentations.`,_e,ae,Re="What are the Spyder features that you like the most?",C,H,Ze=`One of my personal favorites is the Variable Explorer and its integration withJupyter notebooks through the Spyder-notebook plugin. +I also greatly appreciate the way that plugin automatically handles Jupyter server management.`,K,J,Ye="Integration with Kite is also a great feature that makes it easier to use dozens of packages without the need to memorize all their methods and dependencies.",te,ne,Xe="I also highly enjoy the ability to manage Spyder’s window layouts, especially when using large/many displays.",ze,ye,et="How does Spyder make your workflow better?",De,ce,tt=`The possibility to work on code, track its performance, debug it, and analyze visualized data at the same time is invaluable. +It saves time and helps me to stay focused longer.`,V,oe,ot=`The great thing about Spyder is that it allows you to compare several solutions side by side. +We can easily test several sets of given parameter values and examine how that affects a given function by observing charts.`,Fe,be,lt=`Interactive window tools often simplify and speed up code analysis. +For example, checking class inheritance via the new object explorer is clearer and immediately gives more information than when doing it through the editor.`,Oe,xe,at="What features would you like to see in the future in Spyder?",W,ie,it=`Possibly further integration with Git services would be a good idea. +Personally, I like to use Git directly from the Spyder-terminal plugin together with the Gitk repository browser. +However, many users prefer to have some features like comparing file versions, conflict solving, and auto update changes to the repository built into the IDE.`,v,j,dt="Closing remarks",Ke,Ee,rt=`We would like to thank Michael Wiśniewski, Milosz Galganek and all the STX Next team for sharing their experiences with Spyder. +It is very important for us to provide a scientific tool that can make a positive impact on the amazing work our users are doing, and Michael’s testimony gives us great insight on how Spyder is making a difference in the real world and how to make it better for the future.`,nt,Ge,st=`If you have your own stories about how Spyder is helping you with a cool programming project, conduct critical scientific research, or use data to improve your community, we’d love to feature it here! +Feel free to reach out to us on Github, Gitter, Twitter, Facebook or our other platforms linked below if you’re interested. +We’re looking forward to hearing about what Spyder means to you! Happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("img"),u=a(),c=o("h2"),c.textContent=de,q=a(),b=o("p"),b.textContent=ge,F=a(),k=o("p"),k.textContent=fe,I=a(),_=o("p"),_.textContent=he,X=a(),P=o("h2"),P.textContent=we,D=a(),S=o("img"),$=a(),T=o("p"),T.innerHTML=Pe,N=a(),M=o("h3"),M.innerHTML=Me,L=a(),x=o("p"),x.textContent=Ce,me=a(),E=o("h3"),E.innerHTML=Ie,re=a(),Z=o("p"),Z.textContent=qe,ee=a(),G=o("h3"),G.innerHTML=We,Y=a(),O=o("p"),O.innerHTML=Ue,ve=a(),se=o("p"),se.textContent=Qe,ke=a(),le=o("p"),le.textContent=Ne,_e=a(),ae=o("h3"),ae.innerHTML=Re,C=a(),H=o("p"),H.textContent=Ze,K=a(),J=o("p"),J.textContent=Ye,te=a(),ne=o("p"),ne.textContent=Xe,ze=a(),ye=o("h3"),ye.innerHTML=et,De=a(),ce=o("p"),ce.textContent=tt,V=a(),oe=o("p"),oe.textContent=ot,Fe=a(),be=o("p"),be.textContent=lt,Oe=a(),xe=o("h3"),xe.innerHTML=at,W=a(),ie=o("p"),ie.textContent=it,v=a(),j=o("h2"),j.textContent=dt,Ke=a(),Ee=o("p"),Ee.textContent=rt,nt=a(),Ge=o("p"),Ge.innerHTML=st,this.h()},l(g){n=l(g,"P",{"data-svelte-h":!0}),r(n)!=="svelte-kews3d"&&(n.innerHTML=f),p=i(g),d=l(g,"IMG",{src:!0,alt:!0}),u=i(g),c=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-fds9bo"&&(c.textContent=de),q=i(g),b=l(g,"P",{"data-svelte-h":!0}),r(b)!=="svelte-tls944"&&(b.textContent=ge),F=i(g),k=l(g,"P",{"data-svelte-h":!0}),r(k)!=="svelte-11gdkg3"&&(k.textContent=fe),I=i(g),_=l(g,"P",{"data-svelte-h":!0}),r(_)!=="svelte-f7p1p0"&&(_.textContent=he),X=i(g),P=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-tyqqpr"&&(P.textContent=we),D=i(g),S=l(g,"IMG",{src:!0,alt:!0,style:!0}),$=i(g),T=l(g,"P",{"data-svelte-h":!0}),r(T)!=="svelte-r3tlcv"&&(T.innerHTML=Pe),N=i(g),M=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-1u0qnka"&&(M.innerHTML=Me),L=i(g),x=l(g,"P",{"data-svelte-h":!0}),r(x)!=="svelte-kb9g40"&&(x.textContent=Ce),me=i(g),E=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-3h0xdv"&&(E.innerHTML=Ie),re=i(g),Z=l(g,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-1ftru3t"&&(Z.textContent=qe),ee=i(g),G=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(G)!=="svelte-qx6ucj"&&(G.innerHTML=We),Y=i(g),O=l(g,"P",{"data-svelte-h":!0}),r(O)!=="svelte-fxaik2"&&(O.innerHTML=Ue),ve=i(g),se=l(g,"P",{"data-svelte-h":!0}),r(se)!=="svelte-1nrra0"&&(se.textContent=Qe),ke=i(g),le=l(g,"P",{"data-svelte-h":!0}),r(le)!=="svelte-zabeqe"&&(le.textContent=Ne),_e=i(g),ae=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(ae)!=="svelte-15n1h4"&&(ae.innerHTML=Re),C=i(g),H=l(g,"P",{"data-svelte-h":!0}),r(H)!=="svelte-18chqp3"&&(H.textContent=Ze),K=i(g),J=l(g,"P",{"data-svelte-h":!0}),r(J)!=="svelte-1govvtq"&&(J.textContent=Ye),te=i(g),ne=l(g,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1gpnatq"&&(ne.textContent=Xe),ze=i(g),ye=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(ye)!=="svelte-t88324"&&(ye.innerHTML=et),De=i(g),ce=l(g,"P",{"data-svelte-h":!0}),r(ce)!=="svelte-ql0rbr"&&(ce.textContent=tt),V=i(g),oe=l(g,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1g3s3gx"&&(oe.textContent=ot),Fe=i(g),be=l(g,"P",{"data-svelte-h":!0}),r(be)!=="svelte-xt4eh4"&&(be.textContent=lt),Oe=i(g),xe=l(g,"H3",{class:!0,"data-svelte-h":!0}),r(xe)!=="svelte-of4y7"&&(xe.innerHTML=at),W=i(g),ie=l(g,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-yme7yj"&&(ie.textContent=it),v=i(g),j=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(j)!=="svelte-1mvchr8"&&(j.textContent=dt),Ke=i(g),Ee=l(g,"P",{"data-svelte-h":!0}),r(Ee)!=="svelte-p7lgn8"&&(Ee.textContent=rt),nt=i(g),Ge=l(g,"P",{"data-svelte-h":!0}),r(Ge)!=="svelte-iukeoi"&&(Ge.innerHTML=st),this.h()},h(){Te(d.src,s="stxnext.jpg")||h(d,"src",s),h(d,"alt","The Company"),h(c,"class","section"),h(P,"class","section"),Te(S.src,ue="profile.png")||h(S,"src",ue),h(S,"alt","Michael Wiśniewski"),Zt(S,"margin-top","0.5em"),Zt(S,"width","200px"),Zt(S,"margin-right","1em"),Zt(S,"float","left"),h(M,"class","subsection"),h(E,"class","subsection"),h(G,"class","subsection"),h(ae,"class","subsection"),h(ye,"class","subsection"),h(xe,"class","subsection"),h(j,"class","section")},m(g,z){t(g,n,z),t(g,p,z),t(g,d,z),t(g,u,z),t(g,c,z),t(g,q,z),t(g,b,z),t(g,F,z),t(g,k,z),t(g,I,z),t(g,_,z),t(g,X,z),t(g,P,z),t(g,D,z),t(g,S,z),t(g,$,z),t(g,T,z),t(g,N,z),t(g,M,z),t(g,L,z),t(g,x,z),t(g,me,z),t(g,E,z),t(g,re,z),t(g,Z,z),t(g,ee,z),t(g,G,z),t(g,Y,z),t(g,O,z),t(g,ve,z),t(g,se,z),t(g,ke,z),t(g,le,z),t(g,_e,z),t(g,ae,z),t(g,C,z),t(g,H,z),t(g,K,z),t(g,J,z),t(g,te,z),t(g,ne,z),t(g,ze,z),t(g,ye,z),t(g,De,z),t(g,ce,z),t(g,V,z),t(g,oe,z),t(g,Fe,z),t(g,be,z),t(g,Oe,z),t(g,xe,z),t(g,W,z),t(g,ie,z),t(g,v,z),t(g,j,z),t(g,Ke,z),t(g,Ee,z),t(g,nt,z),t(g,Ge,z)},p:wt,d(g){g&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie),e(v),e(j),e(Ke),e(Ee),e(nt),e(Ge))}}}function fo(m){let n,f;const p=[m[0],nn];let d={$$slots:{default:[co]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let yo=class extends vt{constructor(n){super(),bt(this,n,mo,fo,gt,{})}};const wo=Object.freeze(Object.defineProperty({__proto__:null,default:yo,metadata:nn},Symbol.toStringTag,{value:"Module"}));function go(m){let n,f=`For the last several years, Spyder has offered standalone installers for Windows and macOS which isolate Spyder’s runtime environment from users’ development environments. +This provides a more stable user experience than traditional conda or pip installation methods. +However, these standalone installers did not allow implementing desirable features, such as automatic incremental updates or installing external Spyder plugins like Spyder-Notebook and Spyder-Unittest. +Additionally, these standalone applications were limited to Windows and macOS.`,p,d,s=`Our new installers will provide a more consistent experience for users across all platforms, including Linux, while maintaining the benefits of an isolated runtime environment for Spyder. +Additionally, they are fully compatible with incremental updates and external plugin management. +Look for future announcements about these and other features!`,u,c,de=`So, what will you see with these new installers? +If you are a Windows user, you will continue to have a graphical interface guiding you through the installation process, and will likely not notice any difference from the previous experience.`,q,b,ge,F,k,fe=`If you are a macOS user, you will now have a .pkg package installer instead of a .dmg disk image. +Rather than drag-and-drop the application to the Applications folder, the .pkg installer provides a graphical interface that will guide you through the installation process with more flexibility.`,I,_,he,X,P,we=`If you are a Linux user, you will have an interactive shell script guiding you through the installation process. +This ensures it is compatible with as many distributions and desktop environments as possible.`,D,S,ue,$,T,Pe=`In all cases, you will not need to have Anaconda installed, nor do you need an existing Python environment; in fact, you don’t even need a preexisting Python installation! +These installers are completely self-contained. +Spyder will continue to include popular packages such as NumPy, SciPy, Pandas and Matplotlib so you can start coding out-of-the-box. +However, you will still be able to use Spyder with your existing conda, venv, Python.org, and other Python installers and environments as before. +Furthermore, only Spyder and its critical dependencies will be updated on each new release, which will make getting the latest version a lean and frictionless process.`,N,M,Me="The Spyder team is really excited about these new installers and the new features they will make possible, and we hope you enjoy them too!";return{c(){n=o("p"),n.textContent=f,p=a(),d=o("p"),d.textContent=s,u=a(),c=o("p"),c.textContent=de,q=a(),b=o("img"),F=a(),k=o("p"),k.innerHTML=fe,I=a(),_=o("img"),X=a(),P=o("p"),P.textContent=we,D=a(),S=o("img"),$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("p"),M.textContent=Me,this.h()},l(L){n=l(L,"P",{"data-svelte-h":!0}),r(n)!=="svelte-17k8m9n"&&(n.textContent=f),p=i(L),d=l(L,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1xb2iod"&&(d.textContent=s),u=i(L),c=l(L,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1hp8xla"&&(c.textContent=de),q=i(L),b=l(L,"IMG",{src:!0,alt:!0}),F=i(L),k=l(L,"P",{"data-svelte-h":!0}),r(k)!=="svelte-1gj7hcv"&&(k.innerHTML=fe),I=i(L),_=l(L,"IMG",{src:!0,alt:!0}),X=i(L),P=l(L,"P",{"data-svelte-h":!0}),r(P)!=="svelte-1rk3wa0"&&(P.textContent=we),D=i(L),S=l(L,"IMG",{src:!0,alt:!0}),$=i(L),T=l(L,"P",{"data-svelte-h":!0}),r(T)!=="svelte-d1uzh2"&&(T.textContent=Pe),N=i(L),M=l(L,"P",{"data-svelte-h":!0}),r(M)!=="svelte-6951fz"&&(M.textContent=Me),this.h()},h(){Te(b.src,ge="windows.png")||h(b,"src",ge),h(b,"alt","Windows installer"),Te(_.src,he="macos.png")||h(_,"src",he),h(_,"alt","macOS installer"),Te(S.src,ue="linux.png")||h(S,"src",ue),h(S,"alt","Linux installer")},m(L,x){t(L,n,x),t(L,p,x),t(L,d,x),t(L,u,x),t(L,c,x),t(L,q,x),t(L,b,x),t(L,F,x),t(L,k,x),t(L,I,x),t(L,_,x),t(L,X,x),t(L,P,x),t(L,D,x),t(L,S,x),t(L,$,x),t(L,T,x),t(L,N,x),t(L,M,x)},p:wt,d(L){L&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M))}}}function vo(m){let n,f;const p=[m[0],on];let d={$$slots:{default:[go]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let xo=class extends vt{constructor(n){super(),bt(this,n,bo,vo,gt,{})}};const ko=Object.freeze(Object.defineProperty({__proto__:null,default:xo,metadata:on},Symbol.toStringTag,{value:"Module"}));function _o(m){let n,f=`During the last few years, Spyder has positioned itself as a popular data science IDE by combining interactive computing and ease of use with robust programming tools. +However, limited remote development support compared to some other IDEs has hindered adoption, as many users would like to work with data and code on high performance computing (HPC) clusters or cloud providers like AWS, GCP or DigitalOcean while developing on their personal computers. Adding such features would open up many new research possibilities by enabling the scientific community to tackle data and compute-intensive programming tasks from the ease and efficiency of their local development environments. Thanks to a two-year grant from the Chan Zuckerberg Initiative, we will be now able to address this shortcoming.`,p,d,s=`Right now, users have two main options to work remotely using a local IDE (aside from a purely web browser-based approach, which is sometimes not available or desirable): +They can either edit and execute their files in a terminal, which is not user-friendly; or start their IDE on the server and display it locally, which is typically slow, resource-intensive and difficult to set up. Furthermore, scientists typically find it difficult to sync remote files to the local machine and version control their code on the remote one, so remote changes are often lost, out of sync or difficult to integrate with code developed locally.`,u,c,de=`To address this situation, we will add and enhance support for local Spyder installations to run code and sync files on remote servers and clusters. +The first step in that direction is to enhance the existing remote code execution features in Spyder, as the current workflow is error-prone and quite cumbersome. +It requires users to install the Spyder-Kernels package on the remote machine, manually start a kernel on it and provide the kernel connection file to the local machine.`,q,b,ge,F,k,fe="Since Spyder does not currently have a way to identify and store state changes, users currently have to repeat this costly setup process if there are any configuration modifications on the remote machine. Our plan is to fully automate this procedure so that Spyder can start and connect to a remote kernel automatically, with the user only needing to provide their SSH credentials and specify the Python environment they want to use.",I,_,he='After that is implemented, we will add support to create and manage remote Python environments, explore the remote filesystem in the Files pane, and edit remote files in the Editor. This will make most of the core Spyder functionality work when developing code remotely. In addition, users will be able to easily start system shells connected to the server once we implement that capability in Spyder-Terminal. This will allow the remote execution of any operating system-level command or program, such as Git commit and push instructions.',X,P,we='Finally, we want to announce that we’re hiring for this project! We are looking for a Python developer with solid networking knowledge to help us implement the backend infrastructure that will power the features described above. This is a part time position to work as a contractor through NumFOCUS; it does not require experience with PyQt (although some would be beneficial) and it lasts until the end of the year, with the possibility to renew the contract for the next. Interested? Contact me to talk more about it!',D,S,ue="We hope you will be as thrilled as we are by this fantastic news, and are looking forward to sharing more with you on this project in the near future!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.textContent=s,u=a(),c=o("p"),c.textContent=de,q=a(),b=o("img"),F=a(),k=o("p"),k.textContent=fe,I=a(),_=o("p"),_.innerHTML=he,X=a(),P=o("p"),P.innerHTML=we,D=a(),S=o("p"),S.textContent=ue,this.h()},l($){n=l($,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1g1hb0u"&&(n.innerHTML=f),p=i($),d=l($,"P",{"data-svelte-h":!0}),r(d)!=="svelte-17bxxnw"&&(d.textContent=s),u=i($),c=l($,"P",{"data-svelte-h":!0}),r(c)!=="svelte-5icbhl"&&(c.textContent=de),q=i($),b=l($,"IMG",{src:!0,alt:!0}),F=i($),k=l($,"P",{"data-svelte-h":!0}),r(k)!=="svelte-11hbk73"&&(k.textContent=fe),I=i($),_=l($,"P",{"data-svelte-h":!0}),r(_)!=="svelte-16qirh4"&&(_.innerHTML=he),X=i($),P=l($,"P",{"data-svelte-h":!0}),r(P)!=="svelte-dehezw"&&(P.innerHTML=we),D=i($),S=l($,"P",{"data-svelte-h":!0}),r(S)!=="svelte-17tyvcv"&&(S.textContent=ue),this.h()},h(){Te(b.src,ge="remote-kernel-connection.png")||h(b,"src",ge),h(b,"alt","Dialog to create a connection to a remote kernel")},m($,T){t($,n,T),t($,p,T),t($,d,T),t($,u,T),t($,c,T),t($,q,T),t($,b,T),t($,F,T),t($,k,T),t($,I,T),t($,_,T),t($,X,T),t($,P,T),t($,D,T),t($,S,T)},p:wt,d($){$&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S))}}}function Co(m){let n,f;const p=[m[0],ln];let d={$$slots:{default:[_o]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let To=class extends vt{constructor(n){super(),bt(this,n,So,Co,gt,{})}};const Po=Object.freeze(Object.defineProperty({__proto__:null,default:To,metadata:ln},Symbol.toStringTag,{value:"Module"}));function Mo(m){let n,f,p,d,s=`The Spyder team hosted a Birds of a Feather (BoF) session, What do you want to see from your scientific IDE?, at SciPy 2024. +The focus was on users’ experiences, both positive and negative, with IDEs and other scientific interfaces, and how their developers (like us) can make them better for everyone. +We along with the community recorded collaborative notes from the meeting, which you’re welcome to check out for the full details! +Here, we’ll focus on summarizing the points raised at the session and our insights from them.`,u,c,de=`Around 40 people attended, comprising a diverse mix between interface/IDE developers, users and external stakeholders. +In a brief, informal survey of the room, many hands went up when asked how many people used VSCode, and about as many for Jupyter. Perhaps a half dozen to a dozen identified as Spyder users, and a handful mentioned other IDEs and platforms, such as RStudio, PyCharm and Emacs.`,q,b,ge=`In addition to myself, attending the session we had Pierre Raybaut, the original creator of Spyder (who also gave a great talk on Spyder’s history and his current work), as well as another former Spyder developer. +What’s more, to our delight there were also multiple representatives from both Posit/RStudio and Jupyter, perhaps the two other best known and most used interfaces aimed specifically at scientists and engineers. +We were hoping to have the discussion focus more broadly on many different IDEs and tools and to have leaders from other communities present to give their input as well, and it certainly did not disappoint.`,F,k,fe="Generative AI in scientific research",I,_,he="Unsurprisingly given its recent surge in popularity in the programming world, generative AI, the challenges it faces and how and whether IDEs should offer it was a popular topic of discussion.",X,P,we=`Participants empathized that scientific coding is different from other forms of programming, and that the “Copilots of the world” may not help with the former. +Indeed, they would not necessarily be expected to assist with properly designing valid digital experiments, correctly implementing appropriate scientific algorithms, ensuring the analysis techniques used are valid for the data, and choosing appropriate metrics and statistics to interpret the results. +Rather, unless both specifically trained and high performing in these tasks, they may lull newer students or even veteran PIs into a false sense of security in code that ultimately outputs subtly invalid results, feeding the present reproducibility crisis.`,D,S,ue=`Attendees also commented that LLMs, particularly general-purpose examples like ChatGPT, generated code that breaks “a lot” when actually used. +This has also been the author’s experience, particularly with systems not specialized in actually generating correct, best-practice code, and is also supported by research in the literature. +In response to the question one participant posed to the room, as to whether there are any LLMs that work well out of the box for scientific programming, only silence was the answer.`,$,T,Pe=`However, it was also mentioned that specialized systems can be quite helpful, with a particularly high amount of interest in GitHub Copilot. +We mentioned that we are currently working with GitHub and others about a potential optional integration in Spyder, specialized for scientific tasks.`,N,M,Me=`One participant shared that their large scientific organization was very reticent to use Jupyter AI because it was effectively a blackbox, and they needed to be able to show where their code comes from. +They expressed the desire for an AI that generates citations, to help address this issue. +Responding to their question of whether others were interested in the same, attendees stated that they’d still need to go and verify the generated citation, and were unsure it would save them much time overall. +Another participant added that more so than citations for code, the most important thing AI would help with is tests that verify that the code does what it is supposed to do. +Others agreed, saying that AI tend to do much better iterating on existing code than writing brand new code, and recommended that people try asking LLMs to write tests for existing code and examining the results. +They also found that AIs tend to do much better on code that has proper variable names and literate structure, which is certainly a benefit to everyone but very much not always found in scientific scripts.`,L,x,Ce="Overall, attitudes in the room toward LLMs and generative AI varied quite a bit, but there was a general consensus that while scientists were open to considering the technology as an aid, it had to be reasonably correct and verifiable, which is a rather difficult challenge for the current AI state of the art.",me,E,Ie="Interactive computation with diverse data types",re,Z,qe="Another common theme was a desire for scientific IDEs to allow users to visualize and interact with more of the diverse array of data types and structures used in scientific computation.",ee,G,We=`One participant in the geospatial field mentioned that interactivity with these data is limited with IDEs, and that they generally like notebooks but there are workflows where an IDE would be nice. +THey also expressed a desire for IDEs having native support for interactive map displays like in QGIS or ArcGIS rather than just static Matplolib images, which would make for more rapid prototyping.`,Y,O,Ue=`Another attendee shared their focus on using dataframes and other rich data structures backed by a database instead of instead of just plain CSVs, asking if IDEs can add a “database browser” instead of just a way to view a single Pandas table. +They described how their data lives in databases, possibly remote or in the cloud, rather than flat files on their filesystem, and have made this the norm at their institution. +Their solution supports any database type that pandas does, with the simplest interface to it, so it feels like a CSV file, and would like IDEs to support that workflow. +In response, an audience member following on Slack mentioned that Ibis covers a lot of territory for exploring tabular data in many different data storage backends, and this might be a path to database exploration in IDEs.`,ve,se,Qe=`Other participants shared their challenges when debugging large datasets, saying this led to slow stepping through the code (of around 30 seconds per step) when a very large variable needs to be refetched at every step. +This, they related, resulted from a lack of a facility to do “lazy data loading” in Python; everything needs a wrapper. +They’d like to see a streaming wrapper plugin that data types can implement lazy loading in, which could be then used in all IDEs and notebooks. +In response, other attendees mentioned that the main challenge here was creating a way to indicate to consumers that data is expensive to generate a repr, which is where the costs really come in.`,ke,le,Ne=`Finally, a PyCharm user shared how the xarray/pandas data types and their extension systems and data accessors were all opaque to that IDE’s autocomplete, at least without further tagging or augmentation in the IDE or the code. +They expressed that to address this, IDEs should be better aware of extensions such as these. +Others, including ourselves, mentioned in response that using customizable LSP servers can help make editors better aware of extensible syntaxes like this, which is indeed what Spyder and other IDEs do (and the Spyder team maintains the de-facto standard pluggable Python implementation of).`,_e,ae,Re="While user needs here varied, there was a clear theme that users greatly value being able to interactively view, edit and analyze a diverse array of data types right within their IDE, as Spyder continues to particularly focus on.",C,H,Ze="Desktop vs web-based IDEs",K,J,Ye="A popular point of discussion was the merits of desktop versus web-based interfaces and IDEs for science research, which saw some mixed opinions on the topic.",te,ne,Xe=`Posing the question directly, we asked people to share their opinions on a web-based vs. desktop applications, and on a true desktop programs versus those just with a webview as a UI. +One participant stated that a web browser can help them be effective for collaboration, but may not be as useful for single-user situations as a native application would be. +Another had concerns with the usability of Zoom screen sharing, as sharing a desktop application just shared that application, while sharing a web-based IDE shared the user’s entire web browser. +A third suggested vscode.dev, which runs in a browser and which can be self-hosted, but stated that Python support is not “fully on par” with the desktop version. +A final point discussed was the possibility of running desktop IDEs inside a web-based container to improve security and ease of deployment, particularly using Python’s new WASM support.`,ze,ye,et=`On a related note, an attendee shared that they support a small statistics group, and their biggest challenge is helping students learn scientific computing. +They have a rather “rugged individualist culture”, and feel they need to learn how to share knowledge with others, asking the audience how they could accomplish that with IDEs. +This prompted others to relate how, where they work, platforms for accessing data require a lot of authentication. +This entails using JupyterHub as their default IDE/platform, with very little flexibility in the matter. +They would like a platform for other IDEs to be able to connect to a shared JupyterHub environment, which is exactly what we are working on for Spyder 6.1 and beyond.`,De,ce,tt="GPU compute integration",V,oe,ot=`One fairly specific topic that got a disproportionate amount of attention was incorporating better support for GPU computing (e.g. CUDA) within IDEs and interfaces, thanks to Nvidia representatives in the room posing the initial question. +They stated that Nvidia was “getting serious” about Python and CUDA, and they would love to “hear people’s gripes about developing GPU apps in Python, what tooling you use and what problems you face and how do you debug them”. +They also asked for people’s experiences working in Python together with native code (C++).`,Fe,be,lt=`Responding first to the question on native code, one participant described how they had to compile a Fortran module and import it from Python. +They just used f2py and the workflow was already in there and worked: they’d change the native code, recompile and rinse and repeat. +However, they said it would be nice to offer a workflow to shorten that development loop. +It was mentioned that this was particularly a problem with two separate codebases, where changes in one can affect the other, which is difficult to conceptualize and work with the coupling between them. +The Nvidia representatives then asked them how they would like to have a debugger with the ability to step into their code from Python to Fortran but still able to inspect your variables on the Python side, to which they replied “Sounds awesome!“.`,Oe,xe,at=`Another attendee supervises a postdoc using a bunch of A100 GPUs, and asked the postdoc how he knew he was getting the most performance out of it. +The postdoc’s reply, which the attendee found rather telling, was that “PyTorch [just] runs”: it was painful enough for them to just get it running. so they were not particularly interested in spending even more time optimizing it further. +The participant now has new students doing JAX and expect the same thing to happen, since diving into hardware level optimization is something that students really won’t do and can be very intimidating. +They have students who don’t know how to use the 4 CPUs in their laptop, much less the GPUs in a supercomputer center. +When asked what they feel is the main problem causing this, such as documentation or tooling, the researcher replied it was courage on the student’s part to actually “go down there” and dig into the low-level code. +The postdoc clearly likes the platform and bought 40 new A100s, and is fine with the platform abstracting that for him. +However, the attendee expressed concern that this poses a real sociological challenge to get students used to using—much less optimizing—GPUs.`,W,ie,it=`Finally, it was asked what IDEs could do to make GPU workflows more convenient. +In reply, participants suggested better integration with NVSMI or an integrated dashboard of GPU usage, which would allow users to see that, for instance, a particular kernel crunching data is too big to use the full potential of the GPU. +The Nvidia folks mentioned that they do have a profiling tool that could potentially address some of those concerns, gives visibility on GPU utilization, bottlenecks and efficiency, and for interested folks to follow up with them directly. +In response to people asking about support for such tools in a VSCode extension, they shared that these tools have their own UI but could explore IDE integration. +They mentioned that tooling in Python tends to be “pretty thin” as users often don’t go looking for tools and use the ones that are there, whereas their profiler can be really intimidating and throws a lot of information at such users, potentially putting them off.`,v,j,dt=`All told, there was a surprising amount of interest and discussion around this once-niche topic, signaling that GPU computing has become something much closer to a mainstream need in the scientific space. +Thus, while the discussion is of course of most interest to GPU companies like Nvidia, it suggests an IDE plugin to support this profiling tooling and other GPU integration features might be of significant benefit to the wider user community.`,Ke,Ee,rt="Spyder feedback",nt,Ge,st=`While most of the discussion focused on topics applicable to broader categories of IDEs, there were a few specific bits of Spyder feedback. +In particular, attendees praised Spyder’s plotting functionality, though some expressed a preference for the non-default mode of displaying plots in separate windows over the Plots pane. +Others mentioned that the one killer feature for them that it was missing was multi-line editing, a common request over the years and something we plan to work on for forthcoming Spyder versions, along with support for collaborative editing.`,g,z,ht=`A particularly salient comment was one of the attendees’ request that “We need RStudio for Python”, with another replying that Spyder fills most of that gap. +Perhaps the main RStudio feature not built in is Quarto/RMarkdown, though we are currently exploring the possibility of helping develop a plugin supporting that. +Other comments, such as a desire for GitHub Copilot, better data exploration and visualization capabilities, and support for connecting to remote JupyterHub instances, are also features we already offer or are developing or exploring.`,ut,Je,pt="Next steps",U,pe,ft=`Overall, the broader learnings gained here for IDE and interface developers were perhaps less in the detailed specifics of each comment, but rather the common themes users focused the most on. +Perhaps the least surprising was interest in generative AI, suggesting that IDE developers should continue to explore integration possibilities, but keeping a critical eye while doing so. +By contrast, the most surprising was the extensive discussion about GPU computing and how IDEs and tools can help with that, which seems to indicate that IDE plugins for assisting in this regard might be valuable.`,y,w,je=`Another area of user emphasis was the importance of interactive data exploration for a variety of formats and structures. +While a subset of such could be built into an IDE (as we have with Spyder’s Variable Explorer), given the diversity of scientific data types across fields this suggests the need for a more pluggable/extensible approach to variable exploration. +Finally, the consensus was unresolved on desktop versus web-based IDEs, though participants did identify a need for a common framework to connect local IDEs to remote platforms like JupyterHub. +To that end, we’re working to provide those facilities in Spyder 6.1, and could eventually be developed into such an common interface.`,Pt,Mt,$t=`Thanks to everyone for attending and sharing such great ideas and insights, and we look forward to continuing to learn from the community and hear more in the future. +And until then, as always, happy Spydering!`;return{c(){n=o("img"),p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.textContent=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("h2"),k.textContent=fe,I=a(),_=o("p"),_.textContent=he,X=a(),P=o("p"),P.textContent=we,D=a(),S=o("p"),S.textContent=ue,$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("p"),M.textContent=Me,L=a(),x=o("p"),x.textContent=Ce,me=a(),E=o("h2"),E.textContent=Ie,re=a(),Z=o("p"),Z.textContent=qe,ee=a(),G=o("p"),G.textContent=We,Y=a(),O=o("p"),O.textContent=Ue,ve=a(),se=o("p"),se.innerHTML=Qe,ke=a(),le=o("p"),le.innerHTML=Ne,_e=a(),ae=o("p"),ae.textContent=Re,C=a(),H=o("h2"),H.textContent=Ze,K=a(),J=o("p"),J.textContent=Ye,te=a(),ne=o("p"),ne.innerHTML=Xe,ze=a(),ye=o("p"),ye.textContent=et,De=a(),ce=o("h2"),ce.textContent=tt,V=a(),oe=o("p"),oe.textContent=ot,Fe=a(),be=o("p"),be.innerHTML=lt,Oe=a(),xe=o("p"),xe.textContent=at,W=a(),ie=o("p"),ie.textContent=it,v=a(),j=o("p"),j.textContent=dt,Ke=a(),Ee=o("h2"),Ee.textContent=rt,nt=a(),Ge=o("p"),Ge.textContent=st,g=a(),z=o("p"),z.textContent=ht,ut=a(),Je=o("h2"),Je.textContent=pt,U=a(),pe=o("p"),pe.textContent=ft,y=a(),w=o("p"),w.textContent=je,Pt=a(),Mt=o("p"),Mt.textContent=$t,this.h()},l(R){n=l(R,"IMG",{src:!0,alt:!0}),p=i(R),d=l(R,"P",{"data-svelte-h":!0}),r(d)!=="svelte-lu0ydx"&&(d.innerHTML=s),u=i(R),c=l(R,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1bc3olv"&&(c.textContent=de),q=i(R),b=l(R,"P",{"data-svelte-h":!0}),r(b)!=="svelte-3dovr9"&&(b.innerHTML=ge),F=i(R),k=l(R,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-eielu3"&&(k.textContent=fe),I=i(R),_=l(R,"P",{"data-svelte-h":!0}),r(_)!=="svelte-n8xz0g"&&(_.textContent=he),X=i(R),P=l(R,"P",{"data-svelte-h":!0}),r(P)!=="svelte-16hm2os"&&(P.textContent=we),D=i(R),S=l(R,"P",{"data-svelte-h":!0}),r(S)!=="svelte-blg16k"&&(S.textContent=ue),$=i(R),T=l(R,"P",{"data-svelte-h":!0}),r(T)!=="svelte-akno4u"&&(T.textContent=Pe),N=i(R),M=l(R,"P",{"data-svelte-h":!0}),r(M)!=="svelte-1uh015v"&&(M.textContent=Me),L=i(R),x=l(R,"P",{"data-svelte-h":!0}),r(x)!=="svelte-5pud6u"&&(x.textContent=Ce),me=i(R),E=l(R,"H2",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-rw6uso"&&(E.textContent=Ie),re=i(R),Z=l(R,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-ivcgfv"&&(Z.textContent=qe),ee=i(R),G=l(R,"P",{"data-svelte-h":!0}),r(G)!=="svelte-159wy01"&&(G.textContent=We),Y=i(R),O=l(R,"P",{"data-svelte-h":!0}),r(O)!=="svelte-1vmnk07"&&(O.textContent=Ue),ve=i(R),se=l(R,"P",{"data-svelte-h":!0}),r(se)!=="svelte-142f6na"&&(se.innerHTML=Qe),ke=i(R),le=l(R,"P",{"data-svelte-h":!0}),r(le)!=="svelte-inh8qo"&&(le.innerHTML=Ne),_e=i(R),ae=l(R,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-19ni7j5"&&(ae.textContent=Re),C=i(R),H=l(R,"H2",{class:!0,"data-svelte-h":!0}),r(H)!=="svelte-137rydu"&&(H.textContent=Ze),K=i(R),J=l(R,"P",{"data-svelte-h":!0}),r(J)!=="svelte-1jpx7cl"&&(J.textContent=Ye),te=i(R),ne=l(R,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1c4v8vo"&&(ne.innerHTML=Xe),ze=i(R),ye=l(R,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-i91zzh"&&(ye.textContent=et),De=i(R),ce=l(R,"H2",{class:!0,"data-svelte-h":!0}),r(ce)!=="svelte-1x703ch"&&(ce.textContent=tt),V=i(R),oe=l(R,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1onr3au"&&(oe.textContent=ot),Fe=i(R),be=l(R,"P",{"data-svelte-h":!0}),r(be)!=="svelte-f22fkw"&&(be.innerHTML=lt),Oe=i(R),xe=l(R,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-g7zuo6"&&(xe.textContent=at),W=i(R),ie=l(R,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-1hk25dq"&&(ie.textContent=it),v=i(R),j=l(R,"P",{"data-svelte-h":!0}),r(j)!=="svelte-y1j6uc"&&(j.textContent=dt),Ke=i(R),Ee=l(R,"H2",{class:!0,"data-svelte-h":!0}),r(Ee)!=="svelte-zsclc2"&&(Ee.textContent=rt),nt=i(R),Ge=l(R,"P",{"data-svelte-h":!0}),r(Ge)!=="svelte-19n26lb"&&(Ge.textContent=st),g=i(R),z=l(R,"P",{"data-svelte-h":!0}),r(z)!=="svelte-1u8ft65"&&(z.textContent=ht),ut=i(R),Je=l(R,"H2",{class:!0,"data-svelte-h":!0}),r(Je)!=="svelte-18hazx0"&&(Je.textContent=pt),U=i(R),pe=l(R,"P",{"data-svelte-h":!0}),r(pe)!=="svelte-dqx381"&&(pe.textContent=ft),y=i(R),w=l(R,"P",{"data-svelte-h":!0}),r(w)!=="svelte-10mksgn"&&(w.textContent=je),Pt=i(R),Mt=l(R,"P",{"data-svelte-h":!0}),r(Mt)!=="svelte-1etodbu"&&(Mt.textContent=$t),this.h()},h(){Te(n.src,f="scipy-2024-bof-ide-ui-ux.jpg")||h(n,"src",f),h(n,"alt","Photo of the Spyder BoF, showing a room full of attendees engaging with a moderator"),h(k,"class","section"),h(E,"class","section"),h(H,"class","section"),h(ce,"class","section"),h(Ee,"class","section"),h(Je,"class","section")},m(R,$e){t(R,n,$e),t(R,p,$e),t(R,d,$e),t(R,u,$e),t(R,c,$e),t(R,q,$e),t(R,b,$e),t(R,F,$e),t(R,k,$e),t(R,I,$e),t(R,_,$e),t(R,X,$e),t(R,P,$e),t(R,D,$e),t(R,S,$e),t(R,$,$e),t(R,T,$e),t(R,N,$e),t(R,M,$e),t(R,L,$e),t(R,x,$e),t(R,me,$e),t(R,E,$e),t(R,re,$e),t(R,Z,$e),t(R,ee,$e),t(R,G,$e),t(R,Y,$e),t(R,O,$e),t(R,ve,$e),t(R,se,$e),t(R,ke,$e),t(R,le,$e),t(R,_e,$e),t(R,ae,$e),t(R,C,$e),t(R,H,$e),t(R,K,$e),t(R,J,$e),t(R,te,$e),t(R,ne,$e),t(R,ze,$e),t(R,ye,$e),t(R,De,$e),t(R,ce,$e),t(R,V,$e),t(R,oe,$e),t(R,Fe,$e),t(R,be,$e),t(R,Oe,$e),t(R,xe,$e),t(R,W,$e),t(R,ie,$e),t(R,v,$e),t(R,j,$e),t(R,Ke,$e),t(R,Ee,$e),t(R,nt,$e),t(R,Ge,$e),t(R,g,$e),t(R,z,$e),t(R,ut,$e),t(R,Je,$e),t(R,U,$e),t(R,pe,$e),t(R,y,$e),t(R,w,$e),t(R,Pt,$e),t(R,Mt,$e)},p:wt,d(R){R&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie),e(v),e(j),e(Ke),e(Ee),e(nt),e(Ge),e(g),e(z),e(ut),e(Je),e(U),e(pe),e(y),e(w),e(Pt),e(Mt))}}}function Ho(m){let n,f;const p=[m[0],an];let d={$$slots:{default:[Mo]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Io=class extends vt{constructor(n){super(),bt(this,n,Lo,Ho,gt,{})}};const jo=Object.freeze(Object.defineProperty({__proto__:null,default:Io,metadata:an},Symbol.toStringTag,{value:"Module"}));function $o(m){let n,f='Juan Sebastian Bautista, C.A.M. Gerlach and Carlos Cordoba also contributed to this post.',p,d,s=`Spyder 5.4.0 was released recently, featuring some major enhancements to its Windows and macOS standalone installers. +You’ll now get more detailed feedback when new versions are available, and you can download and start the update to them from right within Spyder, instead of having to install them manually. +In this post, we’ll go over how these new update features work and how you can start using them!`,u,c,de='Before proceeding, we want to acknowledge that this work was made possible by a Small Development Grant awarded to Spyder by NumFOCUS, which has enabled us to hire a new developer (Juan Sebastian Bautista Rojas) to be in charge of all the implementation details.',q,b,ge=`Before these improvements, Spyder already had a mechanism to detect more recent versions, but that functionality was very simple. +There was a pop-up dialog warning that a new version was available, but users had to follow a link to manually download the installer and then run it themselves:`,F,k,fe,I,_,he="Once you upgrade to Spyder 5.4.0 or above, you’ll get this message on future Spyder updates:",X,P,we,D,S,ue="Spyder will now be able to automatically download and install a new version for you, much like many other popular applications.",$,T,Pe="After clicking “Yes” on that dialog, Spyder will display another with the status and percent completion of the download.",N,M,Me,L,x,Ce="If it is closed, the download will continue in the background, with its progress shown in a new status bar widget.",me,E,Ie,re,Z,qe="After the download completes, Spyder will ask if you want to update immediately, cancel the update or defer it to when you close Spyder, to avoid interrupting your current workflow.",ee,G,We,Y,O,Ue=`If you chose to update immediately, or once you close Spyder if you deferred the update, our installer will be started automatically. +On Windows, the installer has a series of automated prompts to close the current instance, uninstall the previous version and finally install the new one:`,ve,se,Qe,ke,le,Ne="On macOS, Spyder will automatically mount the new version’s DMG, so you can simply drag and drop it in the Applications folder",_e,ae,Re,C,H,Ze="We hope these improvements will make updating to future Spyder versions smoother and more straightforward, so we can bring you new features and enhancements more easily in the future!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("p"),b.textContent=ge,F=a(),k=o("img"),I=a(),_=o("p"),_.textContent=he,X=a(),P=o("img"),D=a(),S=o("p"),S.textContent=ue,$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("img"),L=a(),x=o("p"),x.textContent=Ce,me=a(),E=o("img"),re=a(),Z=o("p"),Z.textContent=qe,ee=a(),G=o("img"),Y=a(),O=o("p"),O.textContent=Ue,ve=a(),se=o("img"),ke=a(),le=o("p"),le.textContent=Ne,_e=a(),ae=o("img"),C=a(),H=o("p"),H.textContent=Ze,this.h()},l(K){n=l(K,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1ftrv0b"&&(n.innerHTML=f),p=i(K),d=l(K,"P",{"data-svelte-h":!0}),r(d)!=="svelte-17vnzk9"&&(d.innerHTML=s),u=i(K),c=l(K,"P",{"data-svelte-h":!0}),r(c)!=="svelte-ioyfa7"&&(c.innerHTML=de),q=i(K),b=l(K,"P",{"data-svelte-h":!0}),r(b)!=="svelte-16nh17h"&&(b.textContent=ge),F=i(K),k=l(K,"IMG",{src:!0,alt:!0}),I=i(K),_=l(K,"P",{"data-svelte-h":!0}),r(_)!=="svelte-v1njoz"&&(_.textContent=he),X=i(K),P=l(K,"IMG",{src:!0,alt:!0}),D=i(K),S=l(K,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1vp66pc"&&(S.textContent=ue),$=i(K),T=l(K,"P",{"data-svelte-h":!0}),r(T)!=="svelte-ibvyz7"&&(T.textContent=Pe),N=i(K),M=l(K,"IMG",{src:!0,alt:!0}),L=i(K),x=l(K,"P",{"data-svelte-h":!0}),r(x)!=="svelte-poq8kp"&&(x.textContent=Ce),me=i(K),E=l(K,"IMG",{src:!0,alt:!0}),re=i(K),Z=l(K,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-12d0ric"&&(Z.textContent=qe),ee=i(K),G=l(K,"IMG",{src:!0,alt:!0}),Y=i(K),O=l(K,"P",{"data-svelte-h":!0}),r(O)!=="svelte-pnhb8r"&&(O.textContent=Ue),ve=i(K),se=l(K,"IMG",{src:!0,alt:!0}),ke=i(K),le=l(K,"P",{"data-svelte-h":!0}),r(le)!=="svelte-7cjgq9"&&(le.textContent=Ne),_e=i(K),ae=l(K,"IMG",{src:!0,alt:!0}),C=i(K),H=l(K,"P",{"data-svelte-h":!0}),r(H)!=="svelte-1443q5a"&&(H.textContent=Ze),this.h()},h(){Te(k.src,fe="update-available-old.png")||h(k,"src",fe),h(k,"alt","Update available dialog from Spyder version 5.3.3 to 5.4.0 - Old update available dialog"),Te(P.src,we="update-available-new.png")||h(P,"src",we),h(P,"alt","Update available dialog from Spyder version 5.4.0 to 5.4.1 - New update available dialog"),Te(M.src,Me="download-status.png")||h(M,"src",Me),h(M,"alt","Dialog downloading Spyder 5.4.1 installer"),Te(E.src,Ie="downloading-update.gif")||h(E,"src",Ie),h(E,"alt","User clicking the update status in the taskbar to monitor the download status"),Te(G.src,We="starting-update.gif")||h(G,"src",We),h(G,"alt","Options available to run installer, run installer after Spyder closes or not run it at all"),Te(se.src,Qe="installation-flow.png")||h(se,"src",Qe),h(se,"alt","Series of screenshots of installation steps, with arrows between: Yes/no dialog to close spyder, confirm close dialog, uninstall old version dialog, uninstalling status and finally installation wizard"),Te(ae.src,Re="macos-dmg.png")||h(ae,"src",Re),h(ae,"alt","macOS new version's DMG mounted with a drag and drop dialog to move new Spyder version into the Application folder")},m(K,J){t(K,n,J),t(K,p,J),t(K,d,J),t(K,u,J),t(K,c,J),t(K,q,J),t(K,b,J),t(K,F,J),t(K,k,J),t(K,I,J),t(K,_,J),t(K,X,J),t(K,P,J),t(K,D,J),t(K,S,J),t(K,$,J),t(K,T,J),t(K,N,J),t(K,M,J),t(K,L,J),t(K,x,J),t(K,me,J),t(K,E,J),t(K,re,J),t(K,Z,J),t(K,ee,J),t(K,G,J),t(K,Y,J),t(K,O,J),t(K,ve,J),t(K,se,J),t(K,ke,J),t(K,le,J),t(K,_e,J),t(K,ae,J),t(K,C,J),t(K,H,J)},p:wt,d(K){K&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H))}}}function Ao(m){let n,f;const p=[m[0],sn];let d={$$slots:{default:[$o]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let zo=class extends vt{constructor(n){super(),bt(this,n,Eo,Ao,gt,{})}};const Do=Object.freeze(Object.defineProperty({__proto__:null,default:zo,metadata:sn},Symbol.toStringTag,{value:"Module"}));function Go(m){let n,f='Automatic testing can increase the quality of your code. This is especially true of dynamic languages like Python, where a typo may only be noticed when that particular code path is executed. The new Spyder unittest plugin lets you run tests and view the results, all within the IDE. Here, I’ll demonstrate what it can do by way of a real-world example.',p,d,s='There are numerous unit testing frameworks available for Python, of which the plugin supports several of the most prominent. However, I’m using my favorite here, pytest. I prefer to write the tests in a separate file from the code, so that’s what I’ll do here.',u,c,de="Installing the plugin",q,b,ge="If you use the Anaconda distribution (as we recommend), then you can install the Spyder unittest plugin with the command",F,k,fe,I='conda install -c spyder-ide spyder-unittest',_,he,X="This will also grab all its mandatory dependencies (including Spyder itself if necessary). The -c option instructs conda to use the custom channel spyder-ide run by the Spyder developers, since the plugin isn’t part of the default channel.",P,we,D="Since we will be using the pytest framework, you also need to install it:",S,ue,$,T='conda install pytest',Pe,N,M="We’ll be running Python 3.6.4, Spyder 3.2.6, spyder-unittest 0.3.0 and pytest 3.3.2 for this example.",Me,L,x="Creating a project",Ce,me,E="I’ll be using separate files for the tests and the code to be tested, so let’s start by creating a project which will contain these files. In the Projects menu, click on New Project .... Enter a name for the project (in my example, prime_example), and under Location, select the directory in which to store it. Click Create.",Ie,re,Z,qe,ee,G="Writing code to be tested",We,Y,O="Create a Python file primes.py with the following function, which checks whether a number is prime:",Ue,ve,se,Qe=`def is_prime(number): + """Return True if `number` is prime.""" + for element in range(2, number): + if number % element == 0: + return False + return True`,ke,le,Ne='This example is taken from the blog post Improve Your Python: Understanding Unit Testing by Jeff Knupp.',_e,ae,Re="Writing the tests",C,H,Ze="To test our is_prime function, we will write two tests: one to check that 5 is considered a prime, and one to ensure 4 is not. They can be implemented as follows:",K,J,Ye,te=`from primes import is_prime + +def test_five_is_prime(): + assert is_prime(5) == True + +def test_four_is_not_prime(): + assert is_prime(4) == False`,ne,Xe,ze="One of the cool things about pytest is that it can find the tests automatically, so you don’t need to mark them in any way. By default pytest uses a naming convention: all functions starting with test_ in files starting with test_ are considered test functions. We’ll save the code in the file test_primes.py which follows this naming convention.",ye,et,De="In Spyder, the project now looks as follows:",ce,tt,V,oe,ot,Fe="Running the tests",be,lt,Oe="Now comes the fun part, where we actually get to use the plugin. In the Run menu, select Run unit tests. If you do not see this menu item, then the plugin is not installed; refer to the installation instructions above.",xe,at,W="A window appears in which to configure the test run. One of the advantages of using a project is that it is automatically selected as the directory in which to find tests (another advantage is that Spyder will remember the testing configuration). So the only thing we need to do is select the test framework, which is pytest.",ie,it,v,j,dt,Ke="Press the OK button to run the tests, and lo and behold, the results appear in a new pane called “Unit testing”:",Ee,rt,nt,Ge,st,g="As you can see, both tests pass. This means that our function correctly identifies 5 as prime and 4 as not prime.",z,ht,ut="A failing test",Je,pt,U="Unfortunately, our function is_prime has a bug. The number 1 is not considered a prime, but is_prime(1) in fact returns True. Therefore, to test for this, we add the following code to test_primes.py:",pe,ft,y,w=`def test_one_is_not_prime(): + assert is_prime(1) == False`,je,Pt,Mt="Now, run the tests again by clicking on Run unit tests in the Run menu. Spyder remembers the configuration so you are not asked for it again. This time, the results are:",$t,R,$e,Gt,Ht,Et="Our new test fails. The details clarify that is_prime(1) returns True, while the assert in the test function claims that it should return False.",qt,Lt,At="Where to go from here",Ft,It,zt="With this demonstration under your belt, you should be able to write tests for your code and run them with the plugin. For example, try fixing the bug so that 1 is correctly identified as non-prime, and run the tests again to check verify it.",Q,Se,Dt='Spyder-unittest supports not only the pytest framework, but also the nose framework and the unittest module in the Python standard library. It is still fairly new (as its version number suggests), so I look forward to your comments. Please send your ideas, bug reports and pull requests to the spyder-unittest repo on Github.',Vt,Ot,Wt="Happy Spydering with automatic tests!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("h2"),c.textContent=de,q=a(),b=o("p"),b.textContent=ge,F=a(),k=o("pre"),fe=new Rt(!1),_=a(),he=o("p"),he.innerHTML=X,P=a(),we=o("p"),we.innerHTML=D,S=a(),ue=o("pre"),$=new Rt(!1),Pe=a(),N=o("p"),N.innerHTML=M,Me=a(),L=o("h2"),L.textContent=x,Ce=a(),me=o("p"),me.innerHTML=E,Ie=a(),re=o("img"),qe=a(),ee=o("h2"),ee.textContent=G,We=a(),Y=o("p"),Y.innerHTML=O,Ue=a(),ve=o("pre"),se=new Rt(!1),ke=a(),le=o("p"),le.innerHTML=Ne,_e=a(),ae=o("h2"),ae.textContent=Re,C=a(),H=o("p"),H.innerHTML=Ze,K=a(),J=o("pre"),Ye=new Rt(!1),ne=a(),Xe=o("p"),Xe.innerHTML=ze,ye=a(),et=o("p"),et.textContent=De,ce=a(),tt=o("img"),oe=a(),ot=o("h2"),ot.textContent=Fe,be=a(),lt=o("p"),lt.innerHTML=Oe,xe=a(),at=o("p"),at.innerHTML=W,ie=a(),it=o("img"),j=a(),dt=o("p"),dt.innerHTML=Ke,Ee=a(),rt=o("img"),Ge=a(),st=o("p"),st.innerHTML=g,z=a(),ht=o("h2"),ht.textContent=ut,Je=a(),pt=o("p"),pt.innerHTML=U,pe=a(),ft=o("pre"),y=new Rt(!1),je=a(),Pt=o("p"),Pt.innerHTML=Mt,$t=a(),R=o("img"),Gt=a(),Ht=o("p"),Ht.innerHTML=Et,qt=a(),Lt=o("h2"),Lt.textContent=At,Ft=a(),It=o("p"),It.innerHTML=zt,Q=a(),Se=o("p"),Se.innerHTML=Dt,Vt=a(),Ot=o("p"),Ot.textContent=Wt,this.h()},l(B){n=l(B,"P",{"data-svelte-h":!0}),r(n)!=="svelte-10px6oi"&&(n.innerHTML=f),p=i(B),d=l(B,"P",{"data-svelte-h":!0}),r(d)!=="svelte-k0bcfd"&&(d.innerHTML=s),u=i(B),c=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-kfy64d"&&(c.textContent=de),q=i(B),b=l(B,"P",{"data-svelte-h":!0}),r(b)!=="svelte-16t9tw8"&&(b.textContent=ge),F=i(B),k=l(B,"PRE",{class:!0});var He=jt(k);fe=Qt(He,!1),He.forEach(e),_=i(B),he=l(B,"P",{"data-svelte-h":!0}),r(he)!=="svelte-njy31v"&&(he.innerHTML=X),P=i(B),we=l(B,"P",{"data-svelte-h":!0}),r(we)!=="svelte-1sexflf"&&(we.innerHTML=D),S=i(B),ue=l(B,"PRE",{class:!0});var Ut=jt(ue);$=Qt(Ut,!1),Ut.forEach(e),Pe=i(B),N=l(B,"P",{"data-svelte-h":!0}),r(N)!=="svelte-1xrf77s"&&(N.innerHTML=M),Me=i(B),L=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(L)!=="svelte-txs3l7"&&(L.textContent=x),Ce=i(B),me=l(B,"P",{"data-svelte-h":!0}),r(me)!=="svelte-1245yxu"&&(me.innerHTML=E),Ie=i(B),re=l(B,"IMG",{src:!0,alt:!0}),qe=i(B),ee=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(ee)!=="svelte-1v4ahdm"&&(ee.textContent=G),We=i(B),Y=l(B,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1xjia97"&&(Y.innerHTML=O),Ue=i(B),ve=l(B,"PRE",{class:!0});var Kt=jt(ve);se=Qt(Kt,!1),Kt.forEach(e),ke=i(B),le=l(B,"P",{"data-svelte-h":!0}),r(le)!=="svelte-16e9nmo"&&(le.innerHTML=Ne),_e=i(B),ae=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(ae)!=="svelte-16ooc6o"&&(ae.textContent=Re),C=i(B),H=l(B,"P",{"data-svelte-h":!0}),r(H)!=="svelte-f8jn7"&&(H.innerHTML=Ze),K=i(B),J=l(B,"PRE",{class:!0});var Jt=jt(J);Ye=Qt(Jt,!1),Jt.forEach(e),ne=i(B),Xe=l(B,"P",{"data-svelte-h":!0}),r(Xe)!=="svelte-eb8p40"&&(Xe.innerHTML=ze),ye=i(B),et=l(B,"P",{"data-svelte-h":!0}),r(et)!=="svelte-1yiixpi"&&(et.textContent=De),ce=i(B),tt=l(B,"IMG",{src:!0,alt:!0}),oe=i(B),ot=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(ot)!=="svelte-1h4aoe5"&&(ot.textContent=Fe),be=i(B),lt=l(B,"P",{"data-svelte-h":!0}),r(lt)!=="svelte-23q0zs"&&(lt.innerHTML=Oe),xe=i(B),at=l(B,"P",{"data-svelte-h":!0}),r(at)!=="svelte-109famq"&&(at.innerHTML=W),ie=i(B),it=l(B,"IMG",{src:!0,alt:!0}),j=i(B),dt=l(B,"P",{"data-svelte-h":!0}),r(dt)!=="svelte-ksdppo"&&(dt.innerHTML=Ke),Ee=i(B),rt=l(B,"IMG",{src:!0,alt:!0}),Ge=i(B),st=l(B,"P",{"data-svelte-h":!0}),r(st)!=="svelte-j36jai"&&(st.innerHTML=g),z=i(B),ht=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(ht)!=="svelte-btgw7r"&&(ht.textContent=ut),Je=i(B),pt=l(B,"P",{"data-svelte-h":!0}),r(pt)!=="svelte-16ntxvs"&&(pt.innerHTML=U),pe=i(B),ft=l(B,"PRE",{class:!0});var Nt=jt(ft);y=Qt(Nt,!1),Nt.forEach(e),je=i(B),Pt=l(B,"P",{"data-svelte-h":!0}),r(Pt)!=="svelte-uptah"&&(Pt.innerHTML=Mt),$t=i(B),R=l(B,"IMG",{src:!0,alt:!0}),Gt=i(B),Ht=l(B,"P",{"data-svelte-h":!0}),r(Ht)!=="svelte-15ajb52"&&(Ht.innerHTML=Et),qt=i(B),Lt=l(B,"H2",{class:!0,"data-svelte-h":!0}),r(Lt)!=="svelte-1u9atu6"&&(Lt.textContent=At),Ft=i(B),It=l(B,"P",{"data-svelte-h":!0}),r(It)!=="svelte-rz1utf"&&(It.innerHTML=zt),Q=i(B),Se=l(B,"P",{"data-svelte-h":!0}),r(Se)!=="svelte-1e7smp0"&&(Se.innerHTML=Dt),Vt=i(B),Ot=l(B,"P",{"data-svelte-h":!0}),r(Ot)!=="svelte-uewclk"&&(Ot.textContent=Wt),this.h()},h(){h(c,"class","section"),fe.a=null,h(k,"class","language-bash"),$.a=null,h(ue,"class","language-bash"),h(L,"class","section"),Te(re.src,Z="new-project.png")||h(re,"src",Z),h(re,"alt","'Create new project' window"),h(ee,"class","section"),se.a=null,h(ve,"class","language-python"),h(ae,"class","section"),Ye.a=null,h(J,"class","language-python"),Te(tt.src,V="code.png")||h(tt,"src",V),h(tt,"alt","Spyder window with code"),h(ot,"class","section"),Te(it.src,v="test-config.png")||h(it,"src",v),h(it,"alt","'Configure tests' window"),Te(rt.src,nt="test-results.png")||h(rt,"src",nt),h(rt,"alt","Test results in Spyder windows"),h(ht,"class","section"),y.a=null,h(ft,"class","language-python"),Te(R.src,$e="test-results2.png")||h(R,"src",$e),h(R,"alt","Test results in Spyder windows"),h(Lt,"class","section")},m(B,He){t(B,n,He),t(B,p,He),t(B,d,He),t(B,u,He),t(B,c,He),t(B,q,He),t(B,b,He),t(B,F,He),t(B,k,He),fe.m(I,k),t(B,_,He),t(B,he,He),t(B,P,He),t(B,we,He),t(B,S,He),t(B,ue,He),$.m(T,ue),t(B,Pe,He),t(B,N,He),t(B,Me,He),t(B,L,He),t(B,Ce,He),t(B,me,He),t(B,Ie,He),t(B,re,He),t(B,qe,He),t(B,ee,He),t(B,We,He),t(B,Y,He),t(B,Ue,He),t(B,ve,He),se.m(Qe,ve),t(B,ke,He),t(B,le,He),t(B,_e,He),t(B,ae,He),t(B,C,He),t(B,H,He),t(B,K,He),t(B,J,He),Ye.m(te,J),t(B,ne,He),t(B,Xe,He),t(B,ye,He),t(B,et,He),t(B,ce,He),t(B,tt,He),t(B,oe,He),t(B,ot,He),t(B,be,He),t(B,lt,He),t(B,xe,He),t(B,at,He),t(B,ie,He),t(B,it,He),t(B,j,He),t(B,dt,He),t(B,Ee,He),t(B,rt,He),t(B,Ge,He),t(B,st,He),t(B,z,He),t(B,ht,He),t(B,Je,He),t(B,pt,He),t(B,pe,He),t(B,ft,He),y.m(w,ft),t(B,je,He),t(B,Pt,He),t(B,$t,He),t(B,R,He),t(B,Gt,He),t(B,Ht,He),t(B,qt,He),t(B,Lt,He),t(B,Ft,He),t(B,It,He),t(B,Q,He),t(B,Se,He),t(B,Vt,He),t(B,Ot,He)},p:wt,d(B){B&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(_),e(he),e(P),e(we),e(S),e(ue),e(Pe),e(N),e(Me),e(L),e(Ce),e(me),e(Ie),e(re),e(qe),e(ee),e(We),e(Y),e(Ue),e(ve),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(ne),e(Xe),e(ye),e(et),e(ce),e(tt),e(oe),e(ot),e(be),e(lt),e(xe),e(at),e(ie),e(it),e(j),e(dt),e(Ee),e(rt),e(Ge),e(st),e(z),e(ht),e(Je),e(pt),e(pe),e(ft),e(je),e(Pt),e($t),e(R),e(Gt),e(Ht),e(qt),e(Lt),e(Ft),e(It),e(Q),e(Se),e(Vt),e(Ot))}}}function qo(m){let n,f;const p=[m[0],rn];let d={$$slots:{default:[Go]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Oo=class extends vt{constructor(n){super(),bt(this,n,Fo,qo,gt,{})}};const Wo=Object.freeze(Object.defineProperty({__proto__:null,default:Oo,metadata:rn},Symbol.toStringTag,{value:"Module"}));function Uo(m){let n,f=`Spyder’s Variable Explorer is a great tool which aids the development and debugging of Python code by displaying all variables from the current scope. +One thing the Variable Explorer is missing is the ability to display the value of arbitrary, user-definable expressions while debugging. +For example, it might be useful to see the value of a specific attribute of an object, or the value of an array at some index. +Such a feature is known as a “watchlist” or “watches” in other Integrated Development Environments (IDEs). +This blog post introduces the Watchlist plugin developed for Spyder.`,p,d,s="Features",u,c,de=`The watchlist consists of a user-definable list of expressions. +They are evaluated after each debugger step, and the result of the evaluation is displayed as a string. +This means that value = str(eval(expression)) is performed behind the scenes, and the result is shown in the plugin. +The watchlist is a very powerful tool, but this comes at a cost: Any side effect of an expression will affect the execution environment.`,q,b,ge=`Expressions can be added, removed and modified at any time. +The value of an invalid expression is shown as <exception name>. +You can hover the mouse over the value to show the full exception message in a tooltip. +Values which have changed with the most recent debugger step are shown with a bold font, so you can recognise them more easily.`,F,k,fe="A picture is worth a thousand words, as they say, so here is a whole screencast of the Watchlist plugin in action:",I,_,he=` + Sorry, your browser doesn’t support HTML5 video. Download the MP4 file`,X,P,we="Installation and going forwards",D,S,ue="For conda or pip-installed Spyder, the plugin can be installed by running the following with your Spyder environment activated:",$,T,Pe,N='pip install spyder-watchlist',M,Me,L='Feel free to send your ideas, bug reports and pull requests to the spyder-watchlist repository on GitHub.';return{c(){n=o("p"),n.textContent=f,p=a(),d=o("h2"),d.textContent=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("p"),k.textContent=fe,I=a(),_=o("video"),_.innerHTML=he,X=a(),P=o("h2"),P.textContent=we,D=a(),S=o("p"),S.innerHTML=ue,$=a(),T=o("pre"),Pe=new Rt(!1),M=a(),Me=o("p"),Me.innerHTML=L,this.h()},l(x){n=l(x,"P",{"data-svelte-h":!0}),r(n)!=="svelte-do3eua"&&(n.textContent=f),p=i(x),d=l(x,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-6uqxh"&&(d.textContent=s),u=i(x),c=l(x,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1tlqj16"&&(c.innerHTML=de),q=i(x),b=l(x,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1jwwz49"&&(b.innerHTML=ge),F=i(x),k=l(x,"P",{"data-svelte-h":!0}),r(k)!=="svelte-pztoku"&&(k.textContent=fe),I=i(x),_=l(x,"VIDEO",{"data-svelte-h":!0}),r(_)!=="svelte-18vyys8"&&(_.innerHTML=he),X=i(x),P=l(x,"H2",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-1ujtgcf"&&(P.textContent=we),D=i(x),S=l(x,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1fx19nf"&&(S.innerHTML=ue),$=i(x),T=l(x,"PRE",{class:!0});var Ce=jt(T);Pe=Qt(Ce,!1),Ce.forEach(e),M=i(x),Me=l(x,"P",{"data-svelte-h":!0}),r(Me)!=="svelte-1sbgnrp"&&(Me.innerHTML=L),this.h()},h(){h(d,"class","section"),_.controls=!0,h(P,"class","section"),Pe.a=null,h(T,"class","language-bash")},m(x,Ce){t(x,n,Ce),t(x,p,Ce),t(x,d,Ce),t(x,u,Ce),t(x,c,Ce),t(x,q,Ce),t(x,b,Ce),t(x,F,Ce),t(x,k,Ce),t(x,I,Ce),t(x,_,Ce),t(x,X,Ce),t(x,P,Ce),t(x,D,Ce),t(x,S,Ce),t(x,$,Ce),t(x,T,Ce),Pe.m(N,T),t(x,M,Ce),t(x,Me,Ce)},p:wt,d(x){x&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(M),e(Me))}}}function No(m){let n,f;const p=[m[0],un];let d={$$slots:{default:[Uo]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Qo=class extends vt{constructor(n){super(),bt(this,n,Ro,No,gt,{})}};const Bo=Object.freeze(Object.defineProperty({__proto__:null,default:Qo,metadata:un},Symbol.toStringTag,{value:"Module"}));function Vo(m){let n,f=`We’re excited to announce a significant update to QtConsole—the package that powers Spyder’s IPython Console interface—which the Spyder team maintains in collaboration with Project Jupyter. +Two of the biggest changes—user-selectable syntax highlighting themes, and enhanced external editor/IDE integration—are already built right into Spyder, so they’ll likely be of more interest if you use QtConsole standalone or with another editor/IDE. +However, most of the other changes should prove quite useful within Spyder as well, and many were in fact suggested and even implemented by users of our IDE. +Particular highlights include a block indent/unindent feature, Select-All (Ctrl-Shift-A) being made cell-specific, Ctrl-Backspace and Ctrl-Delete behaving more intelligently across whitespace and line boundaries, Ctrl-D allowing you to easily exit ipdb, input() and the like, and numerous smaller enhancements and bug fixes. +If you’d like to learn more about what’s new, please check out our article over on the Jupyter blog, where we go over the major changes in more detail, with plenty of screenshots and GIFs to illustrate each feature and how to use it.`,p,d,s,u,c,de=`To update to the newest version with your existing Spyder install, open an Anaconda Prompt (Windows), Terminal (macOS) or command line (Linux), activate the conda environment or virtualenv/venv of the Spyder install you are using, and run conda update qtconsole (or pip install --upgrade qtconsole, if not using Anaconda). +If you’d like to try QtConsole out separate from Spyder or integrate it in with your own editor or IDE, it is also available as a standalone GUI by running jupyter qtconsole from the Python environment where it or Spyder is installed.`,q,b,ge=`If you have any questions, problems or feedback, we’d love to hear from you. Report issues, request features or participate in QtConsole’s development at its Github site, and check out its documentation for help using it. +For the latest Spyder news, releases, previews and tips, you can follow our Facebook and Twitter, and help support the development on Spyder and its sister projects like QtConsole on OpenCollective.`,F,k,fe=`Our new documentation and Spyder 4 beta 1 have been fully live for some time now; given the dramatic scale of the changes in both, their respective blog posts are still in the works. +We’ll also have an upcoming article on our official Spyder 4 feature roadmap and more, and Spyder 3.3.2 is due out soon, so keep in right here for your Spyder fix! +Until then, happy Spydering and enjoy QtConsole 4.4!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("img"),u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("p"),k.textContent=fe,this.h()},l(I){n=l(I,"P",{"data-svelte-h":!0}),r(n)!=="svelte-tpudl9"&&(n.innerHTML=f),p=i(I),d=l(I,"IMG",{src:!0,alt:!0}),u=i(I),c=l(I,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1mdc2k8"&&(c.innerHTML=de),q=i(I),b=l(I,"P",{"data-svelte-h":!0}),r(b)!=="svelte-stzk5x"&&(b.innerHTML=ge),F=i(I),k=l(I,"P",{"data-svelte-h":!0}),r(k)!=="svelte-18gepk8"&&(k.textContent=fe),this.h()},h(){Te(d.src,s="qtconsole-syntax-highlighting.png")||h(d,"src",s),h(d,"alt","Screenshot of the QtConsole main window, with a new syntax highlighting theme applied")},m(I,_){t(I,n,_),t(I,p,_),t(I,d,_),t(I,u,_),t(I,c,_),t(I,q,_),t(I,b,_),t(I,F,_),t(I,k,_)},p:wt,d(I){I&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k))}}}function Jo(m){let n,f;const p=[m[0],dn];let d={$$slots:{default:[Vo]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Zo=class extends vt{constructor(n){super(),bt(this,n,Ko,Jo,gt,{})}};const Yo=Object.freeze(Object.defineProperty({__proto__:null,default:Zo,metadata:dn},Symbol.toStringTag,{value:"Module"}));function Xo(m){let n,f=`We’re pleased to release the next significant update in the stable Spyder 3 line, 3.3.0, along with its follow-on bugfix point release, 3.3.1, which is now live on PyPI and conda. +As always, you can update with conda update spyder in the Anaconda Prompt/Terminal/command line (on Windows/macOS/Linux, respectively) if on Anaconda (recommended), or pip update spyder otherwise. +If you run into any trouble, please carefully read our new installation documentation and consult our Troubleshooting Guide, which contains straightforward solutions to the vast majority of install-related issues users have reported.`,p,d,s=`As a new minor version (3.3), it makes several substantial changes to Spyder’s underpinnings that deserve some explanation, particularly the newly modular and portable console system that’s now separated into its own spyder-kernels package, opening up several new options for users running Spyder in different environments. +There’s also a brand-new error reporting process, new options in the IPython console, usability and performance improvements for the Variable Explorer, multiple new and changed dependency requirements and more, so there’s plenty to go over. +Finally, we’d like to briefly share a few final notes on this release and the latest on our plans going forward.`,u,c,de="Modular, flexible Console architecture",q,b,ge=`The biggest single change with version 3.3.0/3.3.1 is a major overhaul of how IPython Consoles are started and managed in Spyder. +More precisely, we’ve moved all the kernel-related code from the Spyder core into a new modular package, spyder-kernels, available on the same distribution channels as Spyder itself (and installed automatically when updating to >=3.3.0). +While the most dramatic differences are under the hood, there’s plenty for everyone to like (and a few things to be aware of).`,F,k,fe=`Most importantly, for our everyday users, this makes Spyder much more flexible and powerful when working with multiple Python environments. +With the changes, Spyder itself does not need to be present in every environment you’d like to launch a kernel in; you can install the full IDE in whatever manner you prefer, and then set it to run code and consoles in any Anaconda environment, virtualenv/venv, or even a totally separate Python installation, so long as it has spyder-kernels package available. +Just set the path under Tools -> Preferences -> Python interpreter -> Use the following Python interpreter to the desired Python executable, and any new Console you open will start in the selected environment. +Check out our new wiki page on using environments with Spyder, for more details and tips on the subject, and keep an eye out for the further improvements coming in Spyder 4, which will greatly simplify the process and include full GUI-based project, package and environment management functionality built right in.`,I,_,he,X,P,we=`Furthermore, the new package allows you to independently launch a kernel from anywhere (on your local computer, or a remote machine, server or even supercomputing cluster), connect to it with Spyder, and use it just like a “natively” started one. +After installing spyder-kernels on the host environment, you can start one with python -m spyder_kernels.console, and then enter the kernel’s 4-digit ID (and SSH connection details, if a remote machine) in the Spyder Connect to an existing kernel dialog under the IPython Console pane context- or “gear”-menu). +For more information on the process, see the Connecting to a Console section in our new documentation.`,D,S,ue,$,T,Pe=`Best of all, no matter how or where a kernel is started, every console now supports the full suite of Spyder’s features, including completion, the Variable Explorer, interactive Help and more, unlike before. +You can even mix and match internal, external and remote kernels in different environments, all in the same Spyder session, by either changing the Python interpreter preferences setting between starting a console, or starting and connecting to multiple consoles externally—or both! +Finally, for those of us (and those of you!) who help develop Spyder, the changes also make it easier to maintain and improve the code, and opens the door to one of the biggest features coming in Spyder 4: a new, full-featured debugging kernel that many of you have been asking for.`,N,M,Me=`The one key thing to remember: make sure you install the appropriate version of spyder-kernels for your version of Spyder. For most users, that will be spyder-kernels 0.x (currently 0.2.6) to match Spyder 3 on our stable 3.x branch; if testing a Spyder 4 beta or Github clone of the master branch, you’ll want the latest 1.x version of spyder-kernels (currently 1.1.0). +To install the correct build, you can use the following conda command,`,L,x,Ce,me='conda install spyder-kernels=<0 or 1>.*',E,Ie,re="or with pip,",Z,qe,ee,G='pip install spyder-kernels==<0 or 1>.*',We,Y,O=`replacing <0 or 1> with the major version number (0 or 1) to match your Spyder version. +Further details specific to installing a development build can be found in our Contributing Guide or our install documentation.`,Ue,ve,se="New IPython Console completion and plotting features",Qe,ke,le,Ne,_e,ae=`Spyder’s IPython Consoles can now use an advanced jedi-based completion engine that, similar to the Editor, analyzes your code without actually having to run it first. +This allows for advanced completion functionality on objects not yet assigned to a variable, similar to the existing “greedy” completion option, but without the need for dynamic evaluation. +It can be slow if working with very large Pandas DataFrames so it is disabled by default, but you can activate it under Tools -> Preferences -> IPython console -> Advanced Settings -> Jedi completion. +The descriptive text for the “greedy” completion option (also off by default) was also clarified, particularly to explain an IPython bug (not present in the jedi completer) with the feature and a consequent workaround.`,Re,C,H,Ze,K,J=`We’ve also added a new plotting setting, Use a tight layout for inline plots, for the Inline Matplotlib graphics backend. +The default behavior (as in previous Spyder versions) sets bbox_inches to "tight" in Matplotlib calls when drawing to the inline backend. +However, if you prefer your own bbox_inches argument be respected even when plots are rendered in the Console, you can now do so by unchecking this option under Tools -> Preferences -> IPython console -> Graphics -> Inline backend.`,Ye,te,ne,Xe,ze,ye="Better Variable Explorer usability and performance",et,De,ce=`We’ve made several changes and optimizations to greatly improve performance and efficiency in the Variable Explorer, to make it much faster and use less memory when opening and editing large objects. +In particular, we’ve fixed several major memory leaks when saving edited objects and closing the Variable Explorer dialogs through better length validation and garbage collection, and now skip the whole saving process entirely if the object was not modified (or cannot be modified). +We’ve also changed the names and functions of the Cancel and Ok buttons in Variable Explorer dialogs to be easier to understand and use. +They now feature a Close button which exits the dialog without saving any edits to the object’s contents, and a Save and Close button—automatically enabled once modifications are made—that commits the changes back to the kernel.`,tt,V,oe,ot,Fe,be="Streamlined error reporting experience",lt,Oe,xe=`While we hope you never need to use it, Spyder 3.3.0 includes a brand-new error handling backend that can submit bug reports directly through the Github API. +Based off Colin Duquesnoy’s excellent QCrash framework, this is a major improvement in speed, functionality, reliability and user convenience over the old approach (essentially just opening a link in a web browser). +Just as before, we won’t send anything without your explicit consent, you need a Github account (or create one for free), and you can view and edit the report on Github at any time.`,at,W,ie,it,v,j=`You will need to enter your Github credentials the first time you submit a report. +For this, you can create an app token which only grants the very limited permissions needed to create a public issue report, can be easily revoked and re-created, and works with two-factor authentication (which you should be using); however, if you have not yet enabled 2FA, it also offers the option to enter your Github username and password. +Either way, Spyder can securely remember your login using the keyring package, so you only have to do this once on any given machine (if you select the “remember” option).`,dt,Ke,Ee,rt,nt,Ge=`The dialog itself has also been made more functional and user-friendly, designed to help encourage high-quality, useful reports, and with more accessible, descriptive text. +The reports themselves also contain more useful data about the problem, and there is now a --safe-mode command-line option for Spyder to start in a clean, temporary config directly, so you can test to see if the problem reoccurs without the hassle of a spyder --reset, and play around with other settings without impacting your main configuration. Finally, we’ve fixed over 40 bugs in this release and further improved our documentation and troubleshooting material, so hopefully you’ll see this less often.`,st,g,z="Cleaner under the hood and more",ht,ut,Je=`Alongside the aforementioned internal changes, we’ve also made a number of other under-the-hood changes to clean out old cruft and improve maintainability, readability and performance of our codebase. +In particular, we’ve officially dropped support for Python 3.3, PyQt4, and PyQt5 under 5.5, all versions which have been end-of-life for years, and (aside from PyQt4) have minimal or no remaining Spyder users. +Furthermore, dropping PyQt4 in particular allows us to avoid or resolve a number of unfixable bugs specific to that version that have been causing problems for users, and opens the door to easier development in the future. +Finally, we moved our legacy documentation (and its many associated images) from the main Spyder codebase to its own repo, executed a major overhaul to greatly modernize and expand the text, images, style, and presentation, and now deploy them onto their own subdomain of our site, all of which we will discuss in a separate post coming soon.`,pt,U,pe="Even more fixes and refinements with Spyder 3.3.1",ft,y,w=`As a quick follow-on to the 3.3.0 release, Spyder 3.3.1 fixed a handful of bugs and minor issues with the new functionality and cleaned up several other existing ones, as well made a number of lower-level maintenance and development-oriented changes—over two dozen in all. +Furthermore, several user-visible enhancements made it into the release, primary aimed at improving usability. +To make it easier for users to manage multiple environments, the selection UI under Preferences > Python interpreter > Use the following Python interpreter remembers the executables you’ve previously selected and allows quick switching between them.`,je,Pt,Mt,$t,R,$e=`In the Console, mundane ipdb commands are automatically filtered from the history, and the Editor now supports syntax highlighting for the new numeric literal syntax introduced in Python 3.6. +Spyder’s tutorial has been re-written for modern Spyder as well as to be clearer and more understandable, and overhauled for better and more consistent formatting and visuals with the rest of our documentation. +Finally, our update checker now consults the Anaconda defaults channel rather than PyPI to determine if an update is available, so it doesn’t bug the majority of our users on Anaconda until they can actually acquire the package.`,Gt,Ht,Et="What to know and what’s next",qt,Lt,At=`If you have any questions, problems or feedback, we’d love to hear from you (just make sure you read our documentation, Troubleshooting Guide and the other previously-mentioned resources first)! +For general questions or install issues that aren’t addressed by the above, our Google Group and Gitter live chat are a good place to ask, while our Github is the place to report bugs, request features, or help develop Spyder itself (though make sure to search our issues list to ensure it hasn’t already been submitted). +Finally, you can follow our Facebook and Twitter for the latest Spyder news, releases, previews and tips, and help support Spyder development on OpenCollective.`,Ft,It,zt=`There’s plenty to look forward to in the coming days, with the official release of our all-new documentation (that’s already live now), Spyder 4 beta 1 having just been released on PyPI, conda-forge and our own spyder-ide channel (with a blog post coming soon), an upcoming article on our official Spyder 4 feature roadmap and more, so stay tuned! +In the meantime, happy Spydering and enjoy the new 3.3.1!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("h2"),c.textContent=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("p"),k.innerHTML=fe,I=a(),_=o("img"),X=a(),P=o("p"),P.innerHTML=we,D=a(),S=o("img"),$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("p"),M.innerHTML=Me,L=a(),x=o("pre"),Ce=new Rt(!1),E=a(),Ie=o("p"),Ie.innerHTML=re,Z=a(),qe=o("pre"),ee=new Rt(!1),We=a(),Y=o("p"),Y.innerHTML=O,Ue=a(),ve=o("h2"),ve.textContent=se,Qe=a(),ke=o("img"),Ne=a(),_e=o("p"),_e.innerHTML=ae,Re=a(),C=o("img"),Ze=a(),K=o("p"),K.innerHTML=J,Ye=a(),te=o("img"),Xe=a(),ze=o("h2"),ze.textContent=ye,et=a(),De=o("p"),De.innerHTML=ce,tt=a(),V=o("img"),ot=a(),Fe=o("h2"),Fe.textContent=be,lt=a(),Oe=o("p"),Oe.innerHTML=xe,at=a(),W=o("img"),it=a(),v=o("p"),v.innerHTML=j,dt=a(),Ke=o("img"),rt=a(),nt=o("p"),nt.innerHTML=Ge,st=a(),g=o("h2"),g.textContent=z,ht=a(),ut=o("p"),ut.innerHTML=Je,pt=a(),U=o("h2"),U.textContent=pe,ft=a(),y=o("p"),y.innerHTML=w,je=a(),Pt=o("img"),$t=a(),R=o("p"),R.innerHTML=$e,Gt=a(),Ht=o("h2"),Ht.textContent=Et,qt=a(),Lt=o("p"),Lt.innerHTML=At,Ft=a(),It=o("p"),It.innerHTML=zt,this.h()},l(Q){n=l(Q,"P",{"data-svelte-h":!0}),r(n)!=="svelte-mg9z24"&&(n.innerHTML=f),p=i(Q),d=l(Q,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1ykc4ml"&&(d.innerHTML=s),u=i(Q),c=l(Q,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-1wmevih"&&(c.textContent=de),q=i(Q),b=l(Q,"P",{"data-svelte-h":!0}),r(b)!=="svelte-4zemt9"&&(b.innerHTML=ge),F=i(Q),k=l(Q,"P",{"data-svelte-h":!0}),r(k)!=="svelte-nnkqp3"&&(k.innerHTML=fe),I=i(Q),_=l(Q,"IMG",{src:!0,alt:!0}),X=i(Q),P=l(Q,"P",{"data-svelte-h":!0}),r(P)!=="svelte-19rgc6"&&(P.innerHTML=we),D=i(Q),S=l(Q,"IMG",{src:!0,alt:!0}),$=i(Q),T=l(Q,"P",{"data-svelte-h":!0}),r(T)!=="svelte-szwtzd"&&(T.textContent=Pe),N=i(Q),M=l(Q,"P",{"data-svelte-h":!0}),r(M)!=="svelte-1g7rkrc"&&(M.innerHTML=Me),L=i(Q),x=l(Q,"PRE",{class:!0});var Se=jt(x);Ce=Qt(Se,!1),Se.forEach(e),E=i(Q),Ie=l(Q,"P",{"data-svelte-h":!0}),r(Ie)!=="svelte-152yfdn"&&(Ie.innerHTML=re),Z=i(Q),qe=l(Q,"PRE",{class:!0});var Dt=jt(qe);ee=Qt(Dt,!1),Dt.forEach(e),We=i(Q),Y=l(Q,"P",{"data-svelte-h":!0}),r(Y)!=="svelte-1gxhmsj"&&(Y.innerHTML=O),Ue=i(Q),ve=l(Q,"H2",{class:!0,"data-svelte-h":!0}),r(ve)!=="svelte-1fdwxup"&&(ve.textContent=se),Qe=i(Q),ke=l(Q,"IMG",{src:!0,alt:!0}),Ne=i(Q),_e=l(Q,"P",{"data-svelte-h":!0}),r(_e)!=="svelte-1xagtyr"&&(_e.innerHTML=ae),Re=i(Q),C=l(Q,"IMG",{src:!0,alt:!0}),Ze=i(Q),K=l(Q,"P",{"data-svelte-h":!0}),r(K)!=="svelte-2p22vt"&&(K.innerHTML=J),Ye=i(Q),te=l(Q,"IMG",{src:!0,alt:!0}),Xe=i(Q),ze=l(Q,"H2",{class:!0,"data-svelte-h":!0}),r(ze)!=="svelte-ik1l0a"&&(ze.textContent=ye),et=i(Q),De=l(Q,"P",{"data-svelte-h":!0}),r(De)!=="svelte-at3942"&&(De.innerHTML=ce),tt=i(Q),V=l(Q,"IMG",{src:!0,alt:!0}),ot=i(Q),Fe=l(Q,"H2",{class:!0,"data-svelte-h":!0}),r(Fe)!=="svelte-1pxsziw"&&(Fe.textContent=be),lt=i(Q),Oe=l(Q,"P",{"data-svelte-h":!0}),r(Oe)!=="svelte-y6otfj"&&(Oe.innerHTML=xe),at=i(Q),W=l(Q,"IMG",{src:!0,alt:!0}),it=i(Q),v=l(Q,"P",{"data-svelte-h":!0}),r(v)!=="svelte-2g04g9"&&(v.innerHTML=j),dt=i(Q),Ke=l(Q,"IMG",{src:!0,alt:!0}),rt=i(Q),nt=l(Q,"P",{"data-svelte-h":!0}),r(nt)!=="svelte-nkjzz9"&&(nt.innerHTML=Ge),st=i(Q),g=l(Q,"H2",{class:!0,"data-svelte-h":!0}),r(g)!=="svelte-1ola6uf"&&(g.textContent=z),ht=i(Q),ut=l(Q,"P",{"data-svelte-h":!0}),r(ut)!=="svelte-16df67"&&(ut.innerHTML=Je),pt=i(Q),U=l(Q,"H2",{class:!0,"data-svelte-h":!0}),r(U)!=="svelte-i2ag27"&&(U.textContent=pe),ft=i(Q),y=l(Q,"P",{"data-svelte-h":!0}),r(y)!=="svelte-18tidt1"&&(y.innerHTML=w),je=i(Q),Pt=l(Q,"IMG",{src:!0,alt:!0}),$t=i(Q),R=l(Q,"P",{"data-svelte-h":!0}),r(R)!=="svelte-26y4pa"&&(R.innerHTML=$e),Gt=i(Q),Ht=l(Q,"H2",{class:!0,"data-svelte-h":!0}),r(Ht)!=="svelte-e0owd2"&&(Ht.textContent=Et),qt=i(Q),Lt=l(Q,"P",{"data-svelte-h":!0}),r(Lt)!=="svelte-1a467wt"&&(Lt.innerHTML=At),Ft=i(Q),It=l(Q,"P",{"data-svelte-h":!0}),r(It)!=="svelte-18p7ian"&&(It.innerHTML=zt),this.h()},h(){h(c,"class","section"),Te(_.src,he="spyder-prefs-python.png")||h(_,"src",he),h(_,"alt","Python interpreter pane of the Spyder preferences dialog, with the 'Use the following Python interpreter' option highlighted"),Te(S.src,ue="spyder-remote-kernel.png")||h(S,"src",ue),h(S,"alt","A remote kernel running in a system console alongside Spyder's connect to kernel dialog"),Ce.a=null,h(x,"class","language-bash"),ee.a=null,h(qe,"class","language-bash"),h(ve,"class","section"),Te(ke.src,le="jedi-greedy-completion-prefs.png")||h(ke,"src",le),h(ke,"alt","Advanced tab of the IPython console pane of Spyder's preferences, with the new Jedi completion section highlighted"),Te(C.src,H="tight-layout-preferences.png")||h(C,"src",H),h(C,"alt","Graphics tab of the IPython console pane of Spyder's preferences, with the new 'Use a tight layout for inline plots' option highlighted"),Te(te.src,ne="plot-comparison.png")||h(te,"src",ne),h(te,"alt","Comparison of inline plots in Spyder's IPython Console with and without the 'tight layout' option set"),h(ze,"class","section"),Te(V.src,oe="variable-explorer-ux.png")||h(V,"src",oe),h(V,"alt","A Variable Explorer DataFrame editor dialog, showing the new 'Close' and 'Save and Close' buttons"),h(Fe,"class","section"),Te(W.src,ie="new-authent-dialog-both.png")||h(W,"src",ie),h(W,"alt","The new authentication dialogs for submitting a Github report, with a username/password and a token option"),Te(Ke.src,Ee="new-error-dialog-full.png")||h(Ke,"src",Ee),h(Ke,"alt","The new error reporting interface, with a title field, more descriptive text, and a polished UI"),h(g,"class","section"),h(U,"class","section"),Te(Pt.src,Mt="interpreter-selection-ux.png")||h(Pt,"src",Mt),h(Pt,"alt","Python interpreter pane of Spyder's preferences, showing the new environment selection UI"),h(Ht,"class","section")},m(Q,Se){t(Q,n,Se),t(Q,p,Se),t(Q,d,Se),t(Q,u,Se),t(Q,c,Se),t(Q,q,Se),t(Q,b,Se),t(Q,F,Se),t(Q,k,Se),t(Q,I,Se),t(Q,_,Se),t(Q,X,Se),t(Q,P,Se),t(Q,D,Se),t(Q,S,Se),t(Q,$,Se),t(Q,T,Se),t(Q,N,Se),t(Q,M,Se),t(Q,L,Se),t(Q,x,Se),Ce.m(me,x),t(Q,E,Se),t(Q,Ie,Se),t(Q,Z,Se),t(Q,qe,Se),ee.m(G,qe),t(Q,We,Se),t(Q,Y,Se),t(Q,Ue,Se),t(Q,ve,Se),t(Q,Qe,Se),t(Q,ke,Se),t(Q,Ne,Se),t(Q,_e,Se),t(Q,Re,Se),t(Q,C,Se),t(Q,Ze,Se),t(Q,K,Se),t(Q,Ye,Se),t(Q,te,Se),t(Q,Xe,Se),t(Q,ze,Se),t(Q,et,Se),t(Q,De,Se),t(Q,tt,Se),t(Q,V,Se),t(Q,ot,Se),t(Q,Fe,Se),t(Q,lt,Se),t(Q,Oe,Se),t(Q,at,Se),t(Q,W,Se),t(Q,it,Se),t(Q,v,Se),t(Q,dt,Se),t(Q,Ke,Se),t(Q,rt,Se),t(Q,nt,Se),t(Q,st,Se),t(Q,g,Se),t(Q,ht,Se),t(Q,ut,Se),t(Q,pt,Se),t(Q,U,Se),t(Q,ft,Se),t(Q,y,Se),t(Q,je,Se),t(Q,Pt,Se),t(Q,$t,Se),t(Q,R,Se),t(Q,Gt,Se),t(Q,Ht,Se),t(Q,qt,Se),t(Q,Lt,Se),t(Q,Ft,Se),t(Q,It,Se)},p:wt,d(Q){Q&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(E),e(Ie),e(Z),e(qe),e(We),e(Y),e(Ue),e(ve),e(Qe),e(ke),e(Ne),e(_e),e(Re),e(C),e(Ze),e(K),e(Ye),e(te),e(Xe),e(ze),e(et),e(De),e(tt),e(V),e(ot),e(Fe),e(lt),e(Oe),e(at),e(W),e(it),e(v),e(dt),e(Ke),e(rt),e(nt),e(st),e(g),e(ht),e(ut),e(pt),e(U),e(ft),e(y),e(je),e(Pt),e($t),e(R),e(Gt),e(Ht),e(qt),e(Lt),e(Ft),e(It))}}}function el(m){let n,f;const p=[m[0],hn];let d={$$slots:{default:[Xo]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let nl=class extends vt{constructor(n){super(),bt(this,n,tl,el,gt,{})}};const ol=Object.freeze(Object.defineProperty({__proto__:null,default:nl,metadata:hn},Symbol.toStringTag,{value:"Module"}));function ll(m){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,s=`After more than three years in development and more than 5000 commits from 60 authors around the world, Spyder 4 finally saw the light on December 5, 2019! +I decided to wait until now to write a blogpost about it because shortly after the initial release, we found several critical performance issues and some regressions with respect to Spyder 3, most of which are fixed now in version 4.1.3, released on May 8th 2020.`,u,c,de=`This new release comes with a lengthy list of user-requested features aimed at providing an enhanced development experience at the level of top general-purpose editors and IDEs, while strengthening Spyder’s specialized focus on scientific programming in Python. +The interested reader can take a look at some of them in previous blog posts, and in detail in our Changelog. +However, this post is not meant to describe those improvements, but to acknowledge all people that contributed to making Spyder 4 possible.`,q,b,ge=`Spyder 4 is the first version developed with financial support from multiple companies and organizations, as well as donations by the international user community. +However, as a project, we couldn’t have been able to reach the level of maturity needed to receive and handle that support without the pivotal opportunities Travis Oliphant, former CEO of Anaconda and current leader of Quansight, gave me to work in Scientific Python. +Thanks to him, I became part of Anaconda Inc. in 2015; I was able to hire a small small team to improve Spyder within Anaconda in late 2016; and I was hired by Quansight to work solely on Spyder in 2018. +As with other projects in our ecosystem, such as Bokeh, Dask and Numba, Spyder benefited immensely from Travis’ trust in the role these efforts and ours could play in the future. +He certainly believed in the vision their maintainers worked so hard to make a reality, even if their beginnings were humble and their chances of survival uncertain. +Therefore, my first big acknowledgment is to Travis: thanks for giving us a chance!`,F,k,fe=`I also want to thank our community for its continued support. +As I’ve witnessed during my years as Spyder’s lead developer, many newbies and veterans alike keep choosing Spyder as their primary tool for scientific programming in Python. +It’s really you, the members of this fantastic community, which keep Spyder relevant in a highly competitive field by using and contributing back to it. +Furthermore, when the future looked grim, after my team and I were let go from Anaconda at the end of 2017 (not by Travis’ decision), a lot of users came to our rescue by making donations through our Open Collective page. +That, and a NumFOCUS development grant we received the next year, filled us with confidence and allowed us to continue with Spyder’s development in 2018, even after losing part of our team in the process.`,I,_,he=`Last year it was also a pleasant surprise to learn that several companies were interested in seeing Spyder prosper and thrive. +Through Quansight Labs and its Community Work Order concept, we were able to sign contracts with two of them: TDK-Micronas and Kite. +Their support was critical to finish Spyder 4 because it allowed me to hire most of my old Anaconda team back, plus two new additions, to work full-time on the project. +Therefore, I can’t thank them enough for showing up just at the right time!`,X,P,we=`And finally, even when I am often seen as the public face of Spyder, due to my presence in our issue tracker and Stack Overflow, it’s really the Spyder team that is in charge of implementing new features and fixing most bugs. +So my last round of acknowledgments goes to them. +I was fortunate enough to convince some of the most talented Colombian software developers to work for the project, and to attract the interest of several other equally accomplished developers from around the world. +All of them did a hell of a job in this release!`,D,S,ue=`Jean-Sébastien Gosselin contributed our new Plots pane in its entirety; Quentin Peter did a complete re-architecting of our IPython console, which enabled numerous improvements to our debugger; Jitse Niesen added auto-saving functionality to our editor; Brian Olsen contributed the initial implementation of the runcell command; and CAM Gerlach made significant improvements to our documentation. +Gonzalo Peña-Castellanos helped us to greatly improve the user experience of code completion and linting in the editor, implemented most of the enhancements to the Files pane, and refactored and improved our configuration system; Edgar Margffoy single-handedly created a client to support the same protocol used by VSCode to provide completion and linting for lots of programming languages, added code snippet completions and vastly improved code folding in the editor; Daniel Althviz developed the necessary infrastructure to install and use Kite smoothly within Spyder, and added the new object viewer to the Variable Explorer. +Finally, our junior developers, Stephannie Jimenez and Juanita Gomez, although still finding their way around our complex codebase, managed to make important contributions, such as improving the icons we use per file type in Files (Juanita), and allowing users to run code in an external system terminal on macOS (Stephannie).`,$,T,Pe=`I hope you all enjoy the results of this massive effort! +And happy Spydering!!!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("p"),k.innerHTML=fe,I=a(),_=o("p"),_.innerHTML=he,X=a(),P=o("p"),P.innerHTML=we,D=a(),S=o("p"),S.innerHTML=ue,$=a(),T=o("p"),T.textContent=Pe},l(N){n=l(N,"P",{"data-svelte-h":!0}),r(n)!=="svelte-9f6r3h"&&(n.innerHTML=f),p=i(N),d=l(N,"P",{"data-svelte-h":!0}),r(d)!=="svelte-118umf4"&&(d.innerHTML=s),u=i(N),c=l(N,"P",{"data-svelte-h":!0}),r(c)!=="svelte-19d7044"&&(c.innerHTML=de),q=i(N),b=l(N,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1t3rmts"&&(b.innerHTML=ge),F=i(N),k=l(N,"P",{"data-svelte-h":!0}),r(k)!=="svelte-q3u02e"&&(k.innerHTML=fe),I=i(N),_=l(N,"P",{"data-svelte-h":!0}),r(_)!=="svelte-ma1pu9"&&(_.innerHTML=he),X=i(N),P=l(N,"P",{"data-svelte-h":!0}),r(P)!=="svelte-epmo9k"&&(P.innerHTML=we),D=i(N),S=l(N,"P",{"data-svelte-h":!0}),r(S)!=="svelte-wwph68"&&(S.innerHTML=ue),$=i(N),T=l(N,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1nf22io"&&(T.textContent=Pe)},m(N,M){t(N,n,M),t(N,p,M),t(N,d,M),t(N,u,M),t(N,c,M),t(N,q,M),t(N,b,M),t(N,F,M),t(N,k,M),t(N,I,M),t(N,_,M),t(N,X,M),t(N,P,M),t(N,D,M),t(N,S,M),t(N,$,M),t(N,T,M)},p:wt,d(N){N&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T))}}}function al(m){let n,f;const p=[m[0],pn];let d={$$slots:{default:[ll]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let sl=class extends vt{constructor(n){super(),bt(this,n,il,al,gt,{})}};const rl=Object.freeze(Object.defineProperty({__proto__:null,default:sl,metadata:pn},Symbol.toStringTag,{value:"Module"}));function ul(m){let n,f='This blogpost was originally published on the Quansight Labs website',p,d,s=`It has been almost two months since I joined Quansight in April, to start +working on Spyder maintenance and +development. So far, it has been a very exciting and rewarding journey under +the guidance of long time Spyder maintainer +Carlos Córdoba. +This is the first of a series of blog posts we will be writing to showcase +updates on the development of Spyder, new planned features and news on the +road to Spyder 4.0 and beyond.`,u,c,de=`First off, I would like to give a warm welcome to +Edgar Margffoy, +who recently joined Quansight and will be working with the Spyder team to +take its development even further. Edgar has been a core Spyder developer +for more than two years now, and we are very excited to have his (almost) +full-time commitment to the project.`,q,b,ge="Spyder 4.0 Beta 2 released!",F,k,fe=`Since August 2018, when the first beta of the 4.x series was released, the +Spyder development team has been working hard on our next release. +Over the past year, we’ve implemented the long awaited full-interface dark theme; +overhauled our entire code completion and linting architecture to use the +Language Server Protocol, +opening the door to supporting many other languages in the future; +added a new Plots pane to view and manage the figures generated by your code; +and numerous other feature enhancements, bug fixes and internal improvements.`,I,_,he="Dark theme",X,P,we=`A full-interface dark theme has been a +long awaited feature, +and is enabled by default in Spyder 4. You can still select the +light theme under Preferences > Appearance by either choosing a light-background +syntax-highlighting scheme, or changing Interface theme to Light.`,D,S,ue,$,T,Pe="Pretty, right :-) ?",N,M,Me=`This enhancement was made possible by the work of +Colin Duquesnoy, +Daniel Pizzeta +and their QDarkStyle +package. The Spyder team is now actively collaborating with Colin and Daniel +to pursue the release of QDarkStyle 3.x, which will be using Spyder’s +QtSASS +package to harness the power of SASS/SCSS and allow users to fully customize +the theme dynamically.`,L,x,Ce="Language Server Protocol architecture",me,E,Ie=`The Language Server Protocol (LSP) was created by Microsoft for Visual Studio Code to standardize how +development tools (e.g. editors and IDEs) communicate with +servers that provide code completion, linting and related facilities for +different programming languages. With LSP, as +they describe it:`,re,Z,qe=`

    A single Language Server can be reused in multiple development tools, +which in turn can support multiple languages with minimal effort. +LSP is a win for both language providers and tooling vendors!

    `,ee,G,We=`As of Spyder 4 Beta 2, Spyder is now one of those tools! +We developed our own client to communicate with any server that implements +LSP v3.0 through a transport layer that uses ZeroMQ sockets. Code completion, +help generation, calltips, and real-time code/style analysis were rewritten to take advantage of this +architecture, and hover hints and docstring style analysis were added. +Further LSP features, such as workspace functionality and on the fly completion, will come in future betas.`,Y,O,Ue,ve,se,Qe=`Our current support is geared towards Python, using the great +Python-Language-Server +package. This has allowed us to provide fine-grained configurability for +Pycodestyle and +Pydocstyle options, and in future +betas we’ll also add the ability to use and configure code formatters like +YAPF and autopep8.`,ke,le,Ne,_e,ae,Re=`We support configuring LSP servers for additional, non-Python programming languages. +In the future, we hope to include out-of-the-box LSP integration for +some of the most popular languages in the scientific computing space, +including Fortran, Julia and C/C++.`,C,H,Ze,K,J,Ye="Plots pane",te,ne,Xe=`Similar to RStudio and other data science IDEs, +Spyder now includes a Plots pane, allowing you to browse all figures created during a +session. Beyond just viewing plots, you can also zoom, save/export, copy and remove +them.`,ze,ye,et,De,ce,tt="But wait, there’s more!",V,oe,ot=`There are numerous additional features we’ve added in the previous 10 +months! These include:`,Fe,be,lt=`
  • Autosave and File Recovery in the editor, so Spyder can restore your +unsaved files in case it crashes or something else goes wrong.
  • Dedicated Sympy, Cython and Pylab consoles, making it +very simple to quickly explore and create code for these libraries.
  • OS level window pane undocking, allowing you to easily +organize panes across different monitors.
  • Support for multi-indexes +in our Dataframe viewer, making working with complex datasets much easier.
  • `,Oe,xe,at=`We will describe all of these additional enhancements in greater detail in +future blog posts.`,W,ie,it="You can help!",v,j,dt=`If would like to help us test this beta release and try out the new features it offers, +you can! You can install it with conda (if using Anaconda/Miniconda, as we recommend), +or with pip; we suggest doing so in a new Conda env or virtualenv/venv +so you can easily switch between your existing Spyder install and the Spyder 4 beta. +For example, to do so with conda, enter the following at the Terminal/Anaconda prompt:`,Ke,Ee,rt,nt=`$ conda create --channel spyder-ide --name spyder-beta spyder=4.0.0b2 +$ conda activate spyder-beta +$ spyder`,Ge,st,g=`This is a safe process because Spyder now uses a different configuration +directory for its development versions, so you can easily switch between our stable +and beta releases without worrying about one affecting the other.`,z,ht,ut=`If you find any bugs, you can report them on our +issue tracker; +make sure to search for your error message or behavior before making a new one.`,Je,pt,U="Closing remarks",pe,ft,y=`I would like to thank Quansight for the opportunity of working in open source +development on an awesome project like Spyder. I am also grateful to our +users, contributors +and core developers for helping +making Spyder amazing!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("h1"),b.textContent=ge,F=a(),k=o("p"),k.innerHTML=fe,I=a(),_=o("h2"),_.textContent=he,X=a(),P=o("p"),P.innerHTML=we,D=a(),S=o("img"),$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("p"),M.innerHTML=Me,L=a(),x=o("h2"),x.textContent=Ce,me=a(),E=o("p"),E.innerHTML=Ie,re=a(),Z=o("blockquote"),Z.innerHTML=qe,ee=a(),G=o("p"),G.textContent=We,Y=a(),O=o("img"),ve=a(),se=o("p"),se.innerHTML=Qe,ke=a(),le=o("img"),_e=a(),ae=o("p"),ae.textContent=Re,C=a(),H=o("img"),K=a(),J=o("h2"),J.textContent=Ye,te=a(),ne=o("p"),ne.innerHTML=Xe,ze=a(),ye=o("img"),De=a(),ce=o("h2"),ce.textContent=tt,V=a(),oe=o("p"),oe.textContent=ot,Fe=a(),be=o("ul"),be.innerHTML=lt,Oe=a(),xe=o("p"),xe.textContent=at,W=a(),ie=o("h2"),ie.textContent=it,v=a(),j=o("p"),j.innerHTML=dt,Ke=a(),Ee=o("pre"),rt=new Rt(!1),Ge=a(),st=o("p"),st.textContent=g,z=a(),ht=o("p"),ht.innerHTML=ut,Je=a(),pt=o("h2"),pt.textContent=U,pe=a(),ft=o("p"),ft.innerHTML=y,this.h()},l(w){n=l(w,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1wz2w3n"&&(n.innerHTML=f),p=i(w),d=l(w,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1eabgyx"&&(d.innerHTML=s),u=i(w),c=l(w,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1ihfkr1"&&(c.innerHTML=de),q=i(w),b=l(w,"H1",{"data-svelte-h":!0}),r(b)!=="svelte-7kmlv3"&&(b.textContent=ge),F=i(w),k=l(w,"P",{"data-svelte-h":!0}),r(k)!=="svelte-4cvjwe"&&(k.innerHTML=fe),I=i(w),_=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(_)!=="svelte-1a2hh4r"&&(_.textContent=he),X=i(w),P=l(w,"P",{"data-svelte-h":!0}),r(P)!=="svelte-gf6243"&&(P.innerHTML=we),D=i(w),S=l(w,"IMG",{src:!0,alt:!0}),$=i(w),T=l(w,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1yijxxv"&&(T.textContent=Pe),N=i(w),M=l(w,"P",{"data-svelte-h":!0}),r(M)!=="svelte-q9vdms"&&(M.innerHTML=Me),L=i(w),x=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(x)!=="svelte-11mywl0"&&(x.textContent=Ce),me=i(w),E=l(w,"P",{"data-svelte-h":!0}),r(E)!=="svelte-1bk4269"&&(E.innerHTML=Ie),re=i(w),Z=l(w,"BLOCKQUOTE",{"data-svelte-h":!0}),r(Z)!=="svelte-1j0l5ju"&&(Z.innerHTML=qe),ee=i(w),G=l(w,"P",{"data-svelte-h":!0}),r(G)!=="svelte-awzqvi"&&(G.textContent=We),Y=i(w),O=l(w,"IMG",{src:!0,alt:!0}),ve=i(w),se=l(w,"P",{"data-svelte-h":!0}),r(se)!=="svelte-1cdnc4"&&(se.innerHTML=Qe),ke=i(w),le=l(w,"IMG",{src:!0,alt:!0}),_e=i(w),ae=l(w,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-1yzljlb"&&(ae.textContent=Re),C=i(w),H=l(w,"IMG",{src:!0,alt:!0}),K=i(w),J=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(J)!=="svelte-1jbtxpk"&&(J.textContent=Ye),te=i(w),ne=l(w,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-r6n6cd"&&(ne.innerHTML=Xe),ze=i(w),ye=l(w,"IMG",{src:!0,alt:!0}),De=i(w),ce=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(ce)!=="svelte-66qyz8"&&(ce.textContent=tt),V=i(w),oe=l(w,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-11dz64v"&&(oe.textContent=ot),Fe=i(w),be=l(w,"UL",{"data-svelte-h":!0}),r(be)!=="svelte-1u30ia1"&&(be.innerHTML=lt),Oe=i(w),xe=l(w,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-r8brsp"&&(xe.textContent=at),W=i(w),ie=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(ie)!=="svelte-vp73cb"&&(ie.textContent=it),v=i(w),j=l(w,"P",{"data-svelte-h":!0}),r(j)!=="svelte-ye9ycf"&&(j.innerHTML=dt),Ke=i(w),Ee=l(w,"PRE",{class:!0});var je=jt(Ee);rt=Qt(je,!1),je.forEach(e),Ge=i(w),st=l(w,"P",{"data-svelte-h":!0}),r(st)!=="svelte-1w248v4"&&(st.textContent=g),z=i(w),ht=l(w,"P",{"data-svelte-h":!0}),r(ht)!=="svelte-1mi7edq"&&(ht.innerHTML=ut),Je=i(w),pt=l(w,"H2",{class:!0,"data-svelte-h":!0}),r(pt)!=="svelte-1mvchr8"&&(pt.textContent=U),pe=i(w),ft=l(w,"P",{"data-svelte-h":!0}),r(ft)!=="svelte-19r1btb"&&(ft.innerHTML=y),this.h()},h(){h(_,"class","section"),Te(S.src,ue="spyder-qdarkstyle.png")||h(S,"src",ue),h(S,"alt","Screenshot of the Spyder main window with default panes, with the dark theme applied across the entire interface"),h(x,"class","section"),Te(O.src,Ue="spyder-hover-hint-calltip.png")||h(O,"src",Ue),h(O,"alt","Hover hint and calltips"),Te(le.src,Ne="spyder-doc-prefs.png")||h(le,"src",Ne),h(le,"alt","Docstring style preferences"),Te(H.src,Ze="spyder-preferences-lsp.png")||h(H,"src",Ze),h(H,"alt","Spyder Completion and Linting preferences pane, showing example PyLS servers configured for Go and Julia"),h(J,"class","section"),Te(ye.src,et="spyder-plots.png")||h(ye,"src",et),h(ye,"alt","Spyder main window, showing a figure displayed in the plots pane"),h(ce,"class","section"),h(ie,"class","section"),rt.a=null,h(Ee,"class","language-bash"),h(pt,"class","section")},m(w,je){t(w,n,je),t(w,p,je),t(w,d,je),t(w,u,je),t(w,c,je),t(w,q,je),t(w,b,je),t(w,F,je),t(w,k,je),t(w,I,je),t(w,_,je),t(w,X,je),t(w,P,je),t(w,D,je),t(w,S,je),t(w,$,je),t(w,T,je),t(w,N,je),t(w,M,je),t(w,L,je),t(w,x,je),t(w,me,je),t(w,E,je),t(w,re,je),t(w,Z,je),t(w,ee,je),t(w,G,je),t(w,Y,je),t(w,O,je),t(w,ve,je),t(w,se,je),t(w,ke,je),t(w,le,je),t(w,_e,je),t(w,ae,je),t(w,C,je),t(w,H,je),t(w,K,je),t(w,J,je),t(w,te,je),t(w,ne,je),t(w,ze,je),t(w,ye,je),t(w,De,je),t(w,ce,je),t(w,V,je),t(w,oe,je),t(w,Fe,je),t(w,be,je),t(w,Oe,je),t(w,xe,je),t(w,W,je),t(w,ie,je),t(w,v,je),t(w,j,je),t(w,Ke,je),t(w,Ee,je),rt.m(nt,Ee),t(w,Ge,je),t(w,st,je),t(w,z,je),t(w,ht,je),t(w,Je,je),t(w,pt,je),t(w,pe,je),t(w,ft,je)},p:wt,d(w){w&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie),e(v),e(j),e(Ke),e(Ee),e(Ge),e(st),e(z),e(ht),e(Je),e(pt),e(pe),e(ft))}}}function dl(m){let n,f;const p=[m[0],cn];let d={$$slots:{default:[ul]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let pl=class extends vt{constructor(n){super(),bt(this,n,hl,dl,gt,{})}};const cl=Object.freeze(Object.defineProperty({__proto__:null,default:pl,metadata:cn},Symbol.toStringTag,{value:"Module"}));function fl(m){let n,f=`After two years in development and more than 2600 commits from over two dozen authors around the world, Spyder 6.0.0 had its stable release on September 3, 2024! +Now that 6.0.1 is out and the dust has settled, we’d like to formally announce the release here, summarize the major changes, thank those who’ve contributed to it, and introduce a series of posts highlighting its biggest new features and improvements.`,p,d,s=`You can download the latest installer on our website (recommended), or you can also install this version via a variety of other methods, including Conda and Conda distributions, Pip, WinPython, OS and distro package managers, from source and GitHub and more. +We can’t wait for you to try Spyder 6.0 if you haven’t already, and to find out more about what we’re excited about, read on!`,u,c,de="Highlights and new features",q,b,ge=`This new release comes with a lengthy list of user-requested features that improve both Spyder’s interactive computing facilities and its software development capabilities, along with many UI and usability enhancements. +Additionally, it completes the migration process to the new plugin API introduced in Spyder 5 and adds further new features for Spyder plugin developers, allowing them to build even more powerful extensions for our beloved IDE. +Overall, over two dozen contributors made more than 2600 commits and contributed 312 pull requests closing 137 unique issues, adding or modifying approximately 200 000 lines of code across 900 files. +We’re excited that in less than a month and a half since being published, just our new standalone installers for Spyder 6.0.0 and 6.0.1 have been downloaded over 350 000 times across Windows, Mac and Linux!`,F,k,fe=`We’ll have followup blogs by each of our team members highlighting the biggest improvements, including among others our new remote development architecture, UI/UX improvements, updated plugins, and a new website, docs site and translations, in addition to Ryan’s existing post on the Conda-based installers/updaters. +Keep an eye out for those in the coming weeks!`,I,_,he='In the meantime, here’s a summary of what’s new in the Spyder 6 release! Check out the Spyder 6 Changelog for a complete list of new features, UI improvements, bug fixes, API changes and more.',X,P,we="Major new features",D,S,ue='
  • Initial support for connecting to remote workstations, cloud desktops, computing clusters and other severs via SSH, allowing automatically installing and starting a kernel and running code remotely (part of our CZI grant)
  • Conda-based installers for Windows, macOS and Linux, with more convenient and robust updates, newer Python versions and opening the door to many future features
  • A Debugger pane to explore the stack frame of the current debugging session, centralizing debugger functionality in one place, and including a new button to enter the debugger during the current execution
  • ',$,T,Pe="Global enhancements",N,M,Me="
  • Add ability to manage external plugins (e.g. Spyder-Notebook) in Preferences > Plugins
  • The interface font used by the application is now configurable
  • Support accepting Chinese, Japanese and Korean input on Linux
  • Show intro message for panes that don’t display content at startup
  • Experimental support for Qt 6 and increase minimum version to Qt 5.15
  • ",L,x,Ce="Editor and files",me,E,Ie="
  • Quick switcher (Ctrl/Cmd-P) can now browse and open files present in the current project
  • Allow files to be opened in the Editor by pasting their path in the Working Directory toolbar item
  • Allow copying the absolute and relative paths of the current file in the Editor tab context menu
  • Improve performance in Projects when checking for filesystem changes
  • ",re,Z,qe="IPython Console",ee,G,We="
  • New submenu to start a new console in any registered Conda or Pyenv environment in one click
  • Kernel restarts are now much faster
  • Environment variables declared in ~/.bashrc or ~/.zhrc are now passed to the console
  • ",Y,O,Ue="Variable Explorer",ve,se,Qe="
  • New refresh button for viewer windows to update the variables within them (at last!)
  • All real number data types are now supported in the DataFrame viewer
  • Add back ability to load HDF5 and Dicom files (removed in Spyder 5)
  • Improve how options are displayed and handled in the different viewers
  • New button to indicate when variables are being filtered
  • ",ke,le,Ne="Plots",_e,ae,Re="
  • Plots pane is now used to display figures generated by the Variable Explorer
  • Increase DPI of Matplotlib plots so they look better on high resolution screens
  • Respect Matplotlib user settings configured outside Spyder
  • Matplotlib backend and Python environment information now shown in the status bar
  • ",C,H,Ze="Major plugin changes",K,J,Ye="
  • Add a Debugger plugin to centralize all functionality related to debugging
  • Port the Editor to the new API introduced in Spyder 5, completing Spyder’s migration of internal panes to fully modular plugins
  • Generalize the Run plugin to support generic inputs and executors, allowing custom plugins to run specific files, cells and selections and display the results
  • Add a Switcher plugin for the files and symbols switcher
  • Add an External Terminal plugin to execute Python and Bash/Batch/PwSh files in a system terminal
  • Declare a proper API for the Projects plugin.
  • Move the former Breakpoints plugin’s functionality to the new Debugger plugin
  • ",te,ne,Xe="A special thanks from Spyder",ze,ye,et=`First and foremost, we’d like to thank YOU, our amazing Spyder users, for helping use, test, support, and contribute to Spyder! +Its because of you all, the members of this fantastic community, that we’re motivated and able to keep making Spyder better for everyone! +We’d like to especially thank the many folks who financially support Spyder development via charitable donations through our Open Collective page. +If you like Spyder and would like to see it keep moving forward and and becoming even better, we appreciate whatever you are able to give, financially or otherwise. +If every Wikipedia Spyder user gave $1 per year, we would be able to cover our entire annual budget several times over, so every little bit helps!`,De,ce,tt=`Next, we’d like to give a round of applause to our many dedicated contributors who made significant code contributions to this release: @AngelaRemolina, @Mte90, @dpturibio, @rear1019, @stevetracvc, @remisalmon, @sthibaul, @hmaarrfk, @jnsebgosselin, @rhkarls, @musicinmybrain, @isabela-pf, @habibmy, and @kevinsmia1939. +We also want to thank our translators, who make it possible to use Spyder in nearly a dozen different languages!`,V,oe,ot=`We’d also like to thank our other major fiscal sponsors, NumFOCUS and the Chan Zuckerberg Initiative! +NumFOCUS is a 501(c)3-registered charitable nonprofit that serves as the current home of the Spyder project along with the rest of the core PyData ecosystem. +We couldn’t have gotten where we are now without their help, as well as their Small Development Grants that helped fund a number of features in this release. +CZI has provided critical funding for Spyder 6, particularly the new remote development architecture, through a grant in Cycle 5 of its Essential Open Source Software for Science program.`,Fe,be,lt=`Finally, we’d like to extend personal thanks to our fellow current and former core developers and Spyder team members for their amazing efforts to make Spyder 6 possible! +In no particular order, and mentioning only the most prominent contribution of each person:`,Oe,xe,at='
  • Ryan Clary created and maintains our brand new Conda-based installers and much of their related features and infrastructure
  • Jitse Niesen updated and improved many of our plugins for Spyder 6, including Spyder-Notebook, Spyder-Unittest and Spyder-Line-Profiler
  • Quentin Peter created the new Debugger pane and improved the IPython Console and Spyder-Kernels
  • Daniel Althviz served as Release Manager throughout the Spyder 6 cycle, ported the Editor to our new API and mentored Juan Sebastian
  • Juan Sebastian Bautista made many UI/UX improvements to make Spyder’s interface more user-friendly
  • Hendrik Louzada created the backend for the whole remote development architecture
  • Edgar Margffoy and Stephannie Jimenez created a brand new, pluggable and configurable Run architecture for Spyder as well as several other major API/under the hood improvements
  • Andrés Montoya helped improve the UI/UX, design and theming of Spyder 6 and created this brand new website for the project
  • And of course, Carlos Cordoba lead the project throughout the Spyder 6 development process, both managing and supporting the team as well as making innumerable contributions of his own
  • ',W,ie,it="Three cheers for everyone who made Spyder 6 a reality!",v,j,dt="What’s next",Ke,Ee,rt=`Spyder 6.0 will continue to receive point release updates with bug fixes and minor improvements, but we’re already working on the next big release for Spyder, 6.1! +We currently are planning for it to be closer to a major release than a typical minor release, with a number of further new features and enhancements building directly on the groundwork introduced in Spyder 6.0. +Our plans and the specific features are likely to evolve as we get closer to release, so stay tuned to this blog and @Spyder_IDE on Twitter/X for updates. +However, some of the biggest new features we hope to bring you include:`,nt,Ge,st="
  • Major improvements to the remote development platform first introduced in 6.0, including the ability to easily open, manage and run remote files just as if you were working locally.
  • A new built-in package and environment manager that’ll let you create Conda environments (automatically linked to projects) and install packages right from the Spyder graphical interface, leveraging our existing Conda-based installers.
  • A graphical Spyder plugin browser, allowing you to find, install and manage external plugins with one click in a standalone-installed Spyder.
  • ",g,z,ht=`Want to start using Spyder 6 right now? +The easiest way is by downloading our own installers for Windows, macOS and Linux from our website. +You can also install it via a variety of other methods, such as Conda and Conda distributions, Pip, WinPython, OS and distro package managers and from source on GitHub.`,ut,Je,pt=`Keep in mind that if you use our standalone installers and want to install your own Python packages not included with Spyder, for now you’ll need to have another Python environment installed on your machine and select it in Spyder, if you don’t have one already configured. +We have an FAQ entry on how to install one that includes a short video tutorial and step by step instructions, as well as an entry on connecting an existing environment.`,U,pe,ft="We hope you all enjoy the new features and improvements in Spyder 6, and as as always, happy Spydering!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("h2"),c.textContent=de,q=a(),b=o("p"),b.textContent=ge,F=a(),k=o("p"),k.innerHTML=fe,I=a(),_=o("p"),_.innerHTML=he,X=a(),P=o("h3"),P.textContent=we,D=a(),S=o("ul"),S.innerHTML=ue,$=a(),T=o("h3"),T.textContent=Pe,N=a(),M=o("ul"),M.innerHTML=Me,L=a(),x=o("h3"),x.textContent=Ce,me=a(),E=o("ul"),E.innerHTML=Ie,re=a(),Z=o("h3"),Z.textContent=qe,ee=a(),G=o("ul"),G.innerHTML=We,Y=a(),O=o("h3"),O.textContent=Ue,ve=a(),se=o("ul"),se.innerHTML=Qe,ke=a(),le=o("h3"),le.textContent=Ne,_e=a(),ae=o("ul"),ae.innerHTML=Re,C=a(),H=o("h3"),H.textContent=Ze,K=a(),J=o("ul"),J.innerHTML=Ye,te=a(),ne=o("h2"),ne.textContent=Xe,ze=a(),ye=o("p"),ye.innerHTML=et,De=a(),ce=o("p"),ce.innerHTML=tt,V=a(),oe=o("p"),oe.innerHTML=ot,Fe=a(),be=o("p"),be.textContent=lt,Oe=a(),xe=o("ul"),xe.innerHTML=at,W=a(),ie=o("p"),ie.textContent=it,v=a(),j=o("h2"),j.textContent=dt,Ke=a(),Ee=o("p"),Ee.innerHTML=rt,nt=a(),Ge=o("ul"),Ge.innerHTML=st,g=a(),z=o("p"),z.innerHTML=ht,ut=a(),Je=o("p"),Je.innerHTML=pt,U=a(),pe=o("p"),pe.textContent=ft,this.h()},l(y){n=l(y,"P",{"data-svelte-h":!0}),r(n)!=="svelte-151irch"&&(n.innerHTML=f),p=i(y),d=l(y,"P",{"data-svelte-h":!0}),r(d)!=="svelte-4ecn6b"&&(d.innerHTML=s),u=i(y),c=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-1wslmct"&&(c.textContent=de),q=i(y),b=l(y,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1erhi7e"&&(b.textContent=ge),F=i(y),k=l(y,"P",{"data-svelte-h":!0}),r(k)!=="svelte-r82lif"&&(k.innerHTML=fe),I=i(y),_=l(y,"P",{"data-svelte-h":!0}),r(_)!=="svelte-1i5lqwh"&&(_.innerHTML=he),X=i(y),P=l(y,"H3",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-2xwfvo"&&(P.textContent=we),D=i(y),S=l(y,"UL",{"data-svelte-h":!0}),r(S)!=="svelte-bbcsac"&&(S.innerHTML=ue),$=i(y),T=l(y,"H3",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-2z3iiu"&&(T.textContent=Pe),N=i(y),M=l(y,"UL",{"data-svelte-h":!0}),r(M)!=="svelte-1rqlz28"&&(M.innerHTML=Me),L=i(y),x=l(y,"H3",{class:!0,"data-svelte-h":!0}),r(x)!=="svelte-92xjzf"&&(x.textContent=Ce),me=i(y),E=l(y,"UL",{"data-svelte-h":!0}),r(E)!=="svelte-1oz08qb"&&(E.innerHTML=Ie),re=i(y),Z=l(y,"H3",{class:!0,"data-svelte-h":!0}),r(Z)!=="svelte-175wkxw"&&(Z.textContent=qe),ee=i(y),G=l(y,"UL",{"data-svelte-h":!0}),r(G)!=="svelte-1pnxvbu"&&(G.innerHTML=We),Y=i(y),O=l(y,"H3",{class:!0,"data-svelte-h":!0}),r(O)!=="svelte-c4sqtv"&&(O.textContent=Ue),ve=i(y),se=l(y,"UL",{"data-svelte-h":!0}),r(se)!=="svelte-1jqhg91"&&(se.innerHTML=Qe),ke=i(y),le=l(y,"H3",{class:!0,"data-svelte-h":!0}),r(le)!=="svelte-1xary64"&&(le.textContent=Ne),_e=i(y),ae=l(y,"UL",{"data-svelte-h":!0}),r(ae)!=="svelte-13w56qc"&&(ae.innerHTML=Re),C=i(y),H=l(y,"H3",{class:!0,"data-svelte-h":!0}),r(H)!=="svelte-9tgovd"&&(H.textContent=Ze),K=i(y),J=l(y,"UL",{"data-svelte-h":!0}),r(J)!=="svelte-r84eif"&&(J.innerHTML=Ye),te=i(y),ne=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(ne)!=="svelte-qd82uy"&&(ne.textContent=Xe),ze=i(y),ye=l(y,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-zqdykh"&&(ye.innerHTML=et),De=i(y),ce=l(y,"P",{"data-svelte-h":!0}),r(ce)!=="svelte-nmc92n"&&(ce.innerHTML=tt),V=i(y),oe=l(y,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1oj010m"&&(oe.innerHTML=ot),Fe=i(y),be=l(y,"P",{"data-svelte-h":!0}),r(be)!=="svelte-wiipsy"&&(be.textContent=lt),Oe=i(y),xe=l(y,"UL",{"data-svelte-h":!0}),r(xe)!=="svelte-30evor"&&(xe.innerHTML=at),W=i(y),ie=l(y,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-ai0350"&&(ie.textContent=it),v=i(y),j=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(j)!=="svelte-rht9sr"&&(j.textContent=dt),Ke=i(y),Ee=l(y,"P",{"data-svelte-h":!0}),r(Ee)!=="svelte-1ezsxu0"&&(Ee.innerHTML=rt),nt=i(y),Ge=l(y,"UL",{"data-svelte-h":!0}),r(Ge)!=="svelte-i2sf6t"&&(Ge.innerHTML=st),g=i(y),z=l(y,"P",{"data-svelte-h":!0}),r(z)!=="svelte-1u0ihyj"&&(z.innerHTML=ht),ut=i(y),Je=l(y,"P",{"data-svelte-h":!0}),r(Je)!=="svelte-rbnnby"&&(Je.innerHTML=pt),U=i(y),pe=l(y,"P",{"data-svelte-h":!0}),r(pe)!=="svelte-2mvmj3"&&(pe.textContent=ft),this.h()},h(){h(c,"class","section"),h(P,"class","subsection"),h(T,"class","subsection"),h(x,"class","subsection"),h(Z,"class","subsection"),h(O,"class","subsection"),h(le,"class","subsection"),h(H,"class","subsection"),h(ne,"class","section"),h(j,"class","section")},m(y,w){t(y,n,w),t(y,p,w),t(y,d,w),t(y,u,w),t(y,c,w),t(y,q,w),t(y,b,w),t(y,F,w),t(y,k,w),t(y,I,w),t(y,_,w),t(y,X,w),t(y,P,w),t(y,D,w),t(y,S,w),t(y,$,w),t(y,T,w),t(y,N,w),t(y,M,w),t(y,L,w),t(y,x,w),t(y,me,w),t(y,E,w),t(y,re,w),t(y,Z,w),t(y,ee,w),t(y,G,w),t(y,Y,w),t(y,O,w),t(y,ve,w),t(y,se,w),t(y,ke,w),t(y,le,w),t(y,_e,w),t(y,ae,w),t(y,C,w),t(y,H,w),t(y,K,w),t(y,J,w),t(y,te,w),t(y,ne,w),t(y,ze,w),t(y,ye,w),t(y,De,w),t(y,ce,w),t(y,V,w),t(y,oe,w),t(y,Fe,w),t(y,be,w),t(y,Oe,w),t(y,xe,w),t(y,W,w),t(y,ie,w),t(y,v,w),t(y,j,w),t(y,Ke,w),t(y,Ee,w),t(y,nt,w),t(y,Ge,w),t(y,g,w),t(y,z,w),t(y,ut,w),t(y,Je,w),t(y,U,w),t(y,pe,w)},p:wt,d(y){y&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie),e(v),e(j),e(Ke),e(Ee),e(nt),e(Ge),e(g),e(z),e(ut),e(Je),e(U),e(pe))}}}function ml(m){let n,f;const p=[m[0],fn];let d={$$slots:{default:[fl]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let wl=class extends vt{constructor(n){super(),bt(this,n,yl,ml,gt,{})}};const gl=Object.freeze(Object.defineProperty({__proto__:null,default:wl,metadata:fn},Symbol.toStringTag,{value:"Module"}));function vl(m){let n,f=`The Spyder team and collaborators hosted a Birds of a Feather (BoF) session at SciPy 2023, focused on moving beyond just scripts and notebooks toward truly reproducible, reusable research. +In Part 1 of this two-part series, we went over our motivation and goals for the session and the challenges that attendees brought up. +Now, we’ll review the tips, strategies, tools and platforms (including Spyder!) that participants shared as ways to address these obstacles. +We’d again like to thank Juanita Gomez for helping organize the BoF, Hari for his hard work compiling a summary of the outcomes, and everyone for attending and sharing such great ideas and insights!`,p,d,s="Making notebooks more reusable",u,c,de=`As far as reproducibility is concerned, it was brought up that it can be difficult to easily compare outputs between notebooks created by different researchers. +In response, one participant mentioned that VSCode recently made an improvement to the notebook diff viewers to more easily show just the code changes. +However, users stressed that it was critical to be able to diff the actual notebook output, not just its contents, and expressed a desire for a tool to cover that aspect.`,q,b,ge=`In response to these concerns, others responded that notebooks should not be considered a unit of reproducible research, which should instead be a complete software project, including notebooks or scripts, an environment/requirements file and a record of commands to run there. +They recommended the 8-levels of Reproducibility and Conda Project to help guide and implement this.`,F,k,fe=`Additionally, attendees recommended Papermill, describing it as a very useful tool for parameterizing and executing notebooks programmatically. +Others suggested Devcontainers, to allow collaborating with a lab group or team in a shared environment and seeing everything on their screen, as well as Live Share in VSCode.`,I,_,he=`Participants also expressed frustration that despite notebooks being intended to make programming more literate, this often does not happen in practice. +Beginners like the interactivity in notebooks because they don’t know how to use more advanced programming tools, but they don’t always take advantage of their readability features. +To address this, attendees stressed the importance of getting users accustomed to best practices that can also be helpful for reproducibility. +A participant mentioned a nbflake8 tool to lint notebooks, though it could not be easily found online, and others wished for a Ruff implementation (which at the time of this writing is now complete).`,X,P,we="Migrating notebooks to modules",D,S,ue=`As one participant put it, “I love notebooks, and also love modules, and love the flow of code from notebooks into modules once it approaches that point.” +They went on to describe modules as a key unit of documented, tested code, but which doesn’t mean a lot on its own, whereas combined with a notebook, it gives them context and meaning. +For communities that may be afraid of modules, the participant recommended trying to make creating and transitioning to them easier, so users have fully importable, reusable Python code. +For students, notebooks often turn into a fancy scratch pad or script file, and once they get stuff that works, they can move that stuff out into modules, and then the notebooks start to morph into examples and the history of what the work was about that can be interpreted by other researchers.`,$,T,Pe=`Other attendees chimed in with similar stories, with a NIST researcher mentioning this is an area they’d been working on for 10 years, with their approach being putting the stuff they want to be modular in a regular Python module, and then have a Jupyter notebook that shows an example using the code, such as in their IPRPy project. +To aid this process, participants suggested tools like the Autodocstring extension in VSCode and the docstring generator built into Spyder’s editor as great ways to reduce the friction for students when writing documentation, as they just add the triple quotes and the IDE generates a pre-filled docstring for them.`,N,M,Me=`An important reproducibility and reusability tool many cited for this was nbdev, which can allow users to develop their code and let it grow, and then eventually export the parts as modules at the end. +According to attendees, its documentation mostly talks about everything as packages, but it can also be used for individual notebooks and modules. +Some participants were initially hesitant to show it to their students since they’re early Python programmers, but it was actually quite easy for them, only requiring as little as one line of code at the end. +(Unfortunately as of this writing, it seems ndbdev development has stalled due to its expected commercial opportunities not materializing.) +Others asked for more documentation resources for this, since they were still learning Python themselves and would like to learn more about this and teach it to their students. +In addition to this very blog post and guide, one attendee brought up that they did a tutorial on that topic at SciPy, adding that the documentation is pretty intimidating but it would be great to have something more focused on smaller-scale usage.`,L,x,Ce=`As additional approaches, attendees mentioned they have their students use Jupytext, which helps the student to convert notebooks to Python files that can be committed to a Git repository. +This allows the code to be committed as a Python file, while allowing Jupyter to open it as a notebook and continue working on it. +Others brought up nb-convert, a command line tool that can convert notebooks to many different formats including a Python script, which is integrated into IDEs like Spyder, and that there is also a similar VSCode feature.`,me,E,Ie="Enabling reusable Python packages",re,Z,qe=`When it comes to overall workflow, all agreed that going from a script or notebook to a reusable, installable Python package could be a major challenge, especially for students and non-programmers. +Attendees from NASA mentioned that for their projects everything has to be documented, and one of the things they’ve struggled with was converting a notebook to the type of report NASA is typically looking for. +Others described their workflow being as simple and “old school” as writing a aaa_readme.txt file where they record a diary of what they were doing on that project so if they have a break working on it, they can go back to those notes and remind themselves.`,ee,G,We=`To help address this, participants recommended a “really cool” tool called “Show Your Work” that comes out of the astrophysics community, which is primarily aimed at producing a paper at the end but also a Python package, and includes all the steps that show users’ work along the way. +It is built around a tool called Snakemake, which then sets up a template for both the Python package and the paper. +Additionally, attendees described it as having a “really helpful” guide for getting started and ensuring all of a user’s projects have the same structure. +It was brought up that Azel Donath, maintainer of Gammapy and speaker at SciPy 2023, published their Gammapy paper by using this tool.`,Y,O,Ue=`As a followup, participants asked how this differed from Quarto, to which the response was that Quarto is much more general, whereas Show Your Work was specifically built to allow users to produce a PDF in LaTeX at the end. +Others mentioned Duecredit, a related tool for citing open source authors which looks at code and finds the authors (via Git commits) that wrote it.`,ve,se,Qe=`Additionally, users expressed particular appreciation for the Cookiecutter template that Henry Schreiner III has for packaging. +They mentioned that a lot of their workflows are just messing around with their data, and having something like a package structure from the get go helps make it easier to not miss things. +As a followup, a nuclear engineer mentioned they often have two week projects leveraging Jupyter at their center, with a cookiecutter template that has Sphinx, and a directory structure, and metadata that looks familiar and has everything set up by default. +They described how this particularly helps ensure that different colleagues and team members are on the same page with doing things. +Finally, others suggested the data-driven Cookiecutter template, which provides an ordered structure for where things go, what they are named and how they are run.`,ke,le,Ne="Next steps",_e,ae,Re=`Now that we’ve gathered a wealth of community feedback, ideas and resources, we’re currently working to further translate these insights into an actionable guide (or series of such) on a community platform, to make it easier for everyone to apply them. +Keep an eye out for that, and until then, happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("h2"),d.textContent=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("p"),k.innerHTML=fe,I=a(),_=o("p"),_.innerHTML=he,X=a(),P=o("h2"),P.textContent=we,D=a(),S=o("p"),S.textContent=ue,$=a(),T=o("p"),T.innerHTML=Pe,N=a(),M=o("p"),M.innerHTML=Me,L=a(),x=o("p"),x.innerHTML=Ce,me=a(),E=o("h2"),E.textContent=Ie,re=a(),Z=o("p"),Z.innerHTML=qe,ee=a(),G=o("p"),G.innerHTML=We,Y=a(),O=o("p"),O.innerHTML=Ue,ve=a(),se=o("p"),se.innerHTML=Qe,ke=a(),le=o("h2"),le.textContent=Ne,_e=a(),ae=o("p"),ae.textContent=Re,this.h()},l(C){n=l(C,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1rsron7"&&(n.innerHTML=f),p=i(C),d=l(C,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-1oivyqz"&&(d.textContent=s),u=i(C),c=l(C,"P",{"data-svelte-h":!0}),r(c)!=="svelte-usjxwz"&&(c.innerHTML=de),q=i(C),b=l(C,"P",{"data-svelte-h":!0}),r(b)!=="svelte-hx5j5j"&&(b.innerHTML=ge),F=i(C),k=l(C,"P",{"data-svelte-h":!0}),r(k)!=="svelte-1089bxp"&&(k.innerHTML=fe),I=i(C),_=l(C,"P",{"data-svelte-h":!0}),r(_)!=="svelte-1ms9red"&&(_.innerHTML=he),X=i(C),P=l(C,"H2",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-paakq"&&(P.textContent=we),D=i(C),S=l(C,"P",{"data-svelte-h":!0}),r(S)!=="svelte-173yon5"&&(S.textContent=ue),$=i(C),T=l(C,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1799m22"&&(T.innerHTML=Pe),N=i(C),M=l(C,"P",{"data-svelte-h":!0}),r(M)!=="svelte-1upcstj"&&(M.innerHTML=Me),L=i(C),x=l(C,"P",{"data-svelte-h":!0}),r(x)!=="svelte-1x1q5a2"&&(x.innerHTML=Ce),me=i(C),E=l(C,"H2",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-18hhit8"&&(E.textContent=Ie),re=i(C),Z=l(C,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-m81akp"&&(Z.innerHTML=qe),ee=i(C),G=l(C,"P",{"data-svelte-h":!0}),r(G)!=="svelte-eee2gu"&&(G.innerHTML=We),Y=i(C),O=l(C,"P",{"data-svelte-h":!0}),r(O)!=="svelte-185l8gx"&&(O.innerHTML=Ue),ve=i(C),se=l(C,"P",{"data-svelte-h":!0}),r(se)!=="svelte-1y8nhb4"&&(se.innerHTML=Qe),ke=i(C),le=l(C,"H2",{class:!0,"data-svelte-h":!0}),r(le)!=="svelte-18hazx0"&&(le.textContent=Ne),_e=i(C),ae=l(C,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-w2m65z"&&(ae.textContent=Re),this.h()},h(){h(d,"class","section"),h(P,"class","section"),h(E,"class","section"),h(le,"class","section")},m(C,H){t(C,n,H),t(C,p,H),t(C,d,H),t(C,u,H),t(C,c,H),t(C,q,H),t(C,b,H),t(C,F,H),t(C,k,H),t(C,I,H),t(C,_,H),t(C,X,H),t(C,P,H),t(C,D,H),t(C,S,H),t(C,$,H),t(C,T,H),t(C,N,H),t(C,M,H),t(C,L,H),t(C,x,H),t(C,me,H),t(C,E,H),t(C,re,H),t(C,Z,H),t(C,ee,H),t(C,G,H),t(C,Y,H),t(C,O,H),t(C,ve,H),t(C,se,H),t(C,ke,H),t(C,le,H),t(C,_e,H),t(C,ae,H)},p:wt,d(C){C&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae))}}}function bl(m){let n,f;const p=[m[0],mn];let d={$$slots:{default:[vl]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let kl=class extends vt{constructor(n){super(),bt(this,n,xl,bl,gt,{})}};const _l=Object.freeze(Object.defineProperty({__proto__:null,default:kl,metadata:mn},Symbol.toStringTag,{value:"Module"}));function Cl(m){let n,f=`The Spyder team and collaborators hosted a Birds of a Feather (BoF) session at SciPy 2023, focused on moving beyond just scripts and notebooks toward truly reproducible, reusable research. +Here, we’ll recap the motivation and goals of the BoF and share the common challenges that participants brought up with notebooks and moving toward reproducible, reusable research. +In our next post, we’ll follow up with some of the tips, tools, platforms and strategies attendees brought up as ways to address them, including using Spyder! +We’d like to thank Juanita Gomez for helping organize the BoF, Hari for his hard work compiling a summary of the outcomes, and everyone for attending and sharing such great ideas and insights!`,p,d,s="The trouble with notebooks",u,c,de=`The overwhelming majority of current scientific code is siloed away into one-off scripts and notebooks, where the only real mechanism for reusing and building upon them is good old copy and paste. +In order to keep “building upon the shoulders of giants”, we need to achieve not only reproducibility of individual results but also true reusability of research methods, that can be shared, built upon, and deployed by researchers across the world.`,q,b,ge="In particular, scripts and notebooks are not typically very reproducible or reusable, as users generally cannot easily import them, specify dependencies, extend them or use them for another project (without copy/paste and managing multiple code versions by hand). Additionally, for notebooks specifically, authors and readers alike cannot easily track them in Git (with clean diffs), lint, type check, test or format them with standard Python tools, or interoperate with most other non-notebook-specific ecosystems.",F,k,fe=`To address these pressing issues, the Spyder team and interested community members convened a Birds of a Feather (BoF) session, “Beyond Notebooks: From reproducible to reusable research”, at the SciPy 2023 conference in Austin, TX, where we invited attendees to share their tools and workflows for reusable science, and explored how we can encourage users to expand beyond the current notebook-centric monoculture and toward more holistic, modular and interoperable approaches to conducting research and developing scientific code. +The goal was to not only share and discuss ideas and insights on the topic among BoF participants, which numbered over ≈50 interested community members, but also to help inform future guides and resources on this topic, to be hosted on central platforms like the Scientific Python organization, as is currently in progress.`,I,_,he="Goals and themes",X,P,we="The BoF was motivated by the following key questions:",D,S,ue="
  • What is reusable research and why is it important?
  • What tools and techniques do people have to share for effective reusable research?
  • How can we integrate reusable research into existing workflows?
  • How do we teach students and researchers about reusable research, and encourage them to practice it?
  • ",$,T,Pe="While the resulting community ideas and insights centered around three related themes:",N,M,Me="
  • How can we make existing notebooks more readable, reproducible and reusable?
  • How can notebooks be progressively migrated to Python modules for basic reusability?
  • How can the community simplify and advocate the process of creating fully reusable Python packages?
  • ",L,x,Ce="Common challenges",me,E,Ie=`Participants commented that students mostly get introduced to notebooks through classes in contexts that are very different from how they would use them for their research, and they don’t have a good resource for that to hand to them if they have a question or are confused about that. +Others responded that they think that should be part of the curriculum, questioning why are people learning machine learning using Jupyter notebooks without actually learning how to use Jupyter notebooks themselves, and that many folks don’t come from a traditional computer science background and may not know about all these tools.`,re,Z,qe='It was also remarked that some feel the fact that students are only exposed to notebooks really makes them not necessarily want to reach for other tools even when they would be more appropriate down the line, which participants suggested addressing by encouraging students to use IDEs like Spyder and JupyterLab that offer many features for reusability and reproducibility, but while also allowing them to take advantage of notebooks.',ee,G,We=`In particular, one former Spyder developer commented that they feel that we should show students how to use tools like debugging and make it easier for them to do that, but give them the choice whether they want to use those tools, and that the right approach is not necessarily telling them what tool to use, but having documentation and exposure to those tools so students can pick the best option for them. +Others remarked in response that we do want to give students options, though many might not need a full debugger.`,Y,O,Ue=`One library worker mentioned that they often only have an hour to introduce users to Python, and use Google Collab notebooks because it makes it a lot easier for students to get started with Python over having to download and install an IDE, but then students tend to be familiar with that tool and continue to use it. +Another participant mentioned they are a big fan of using videos to help reach students over reading the documentation, as they feel students are much more likely to watch them.`,ve,se,Qe="The discussion shifted to tools in larger organizations, with a participant commenting “It’s one thing when it’s students, but how do you do that when it’s your whole organizational culture that needs to change?” One participant responded saying she’s a student herself, and no one ever really talked to her about IDEs and explained what they were and why you’d want to use one, remarking that it’s important for teachers to actually train them to use the proper tools, but they have no idea when it comes to coworkers using these things.",ke,le,Ne=`Another participant suggested “nerd sniping” as an effective way to handle that in larger organizations, which involves figuring out what is the biggest pain point for the team, usually something that should be automated, and then getting them to follow better practices by showing them how these tools can fix that problem. +Others agreed that it’s really about awareness, and if you show someone a cool tool most people will make the decision to adopt them on their own, but there will always be some who might not want that.`,_e,ae,Re="Finally, it was brought up that students might have familiarity with Python or R, but Git is a completely different animal and is quite challenging to factor that into education; people like writers would really benefit from Git but it’s really hard to get them to use it, and people might not be aware of how inefficient the workflows they use are, because that’s all they know.",C,H,Ze="Next up",K,J,Ye=`Now that we’ve surfaced the reproducibility and reusability challenges that participants brought up at the BoF, check out our next blog post, where we share all the helpful tips, cool tools, awesome platforms and useful strategies attendees suggested to help address them. +Until then, happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("h2"),d.textContent=s,u=a(),c=o("p"),c.textContent=de,q=a(),b=o("p"),b.textContent=ge,F=a(),k=o("p"),k.innerHTML=fe,I=a(),_=o("h2"),_.textContent=he,X=a(),P=o("p"),P.textContent=we,D=a(),S=o("ul"),S.innerHTML=ue,$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("ul"),M.innerHTML=Me,L=a(),x=o("h2"),x.textContent=Ce,me=a(),E=o("p"),E.textContent=Ie,re=a(),Z=o("p"),Z.innerHTML=qe,ee=a(),G=o("p"),G.textContent=We,Y=a(),O=o("p"),O.innerHTML=Ue,ve=a(),se=o("p"),se.textContent=Qe,ke=a(),le=o("p"),le.textContent=Ne,_e=a(),ae=o("p"),ae.textContent=Re,C=a(),H=o("h2"),H.textContent=Ze,K=a(),J=o("p"),J.innerHTML=Ye,this.h()},l(te){n=l(te,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1ph6npe"&&(n.innerHTML=f),p=i(te),d=l(te,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-1yzon88"&&(d.textContent=s),u=i(te),c=l(te,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1tnobeu"&&(c.textContent=de),q=i(te),b=l(te,"P",{"data-svelte-h":!0}),r(b)!=="svelte-hnmsep"&&(b.textContent=ge),F=i(te),k=l(te,"P",{"data-svelte-h":!0}),r(k)!=="svelte-165q07j"&&(k.innerHTML=fe),I=i(te),_=l(te,"H2",{class:!0,"data-svelte-h":!0}),r(_)!=="svelte-32889v"&&(_.textContent=he),X=i(te),P=l(te,"P",{"data-svelte-h":!0}),r(P)!=="svelte-17px8a5"&&(P.textContent=we),D=i(te),S=l(te,"UL",{"data-svelte-h":!0}),r(S)!=="svelte-vf89vd"&&(S.innerHTML=ue),$=i(te),T=l(te,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1bfog1w"&&(T.textContent=Pe),N=i(te),M=l(te,"UL",{"data-svelte-h":!0}),r(M)!=="svelte-1oppegz"&&(M.innerHTML=Me),L=i(te),x=l(te,"H2",{class:!0,"data-svelte-h":!0}),r(x)!=="svelte-1uxg9mh"&&(x.textContent=Ce),me=i(te),E=l(te,"P",{"data-svelte-h":!0}),r(E)!=="svelte-spy2hy"&&(E.textContent=Ie),re=i(te),Z=l(te,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-10m97u6"&&(Z.innerHTML=qe),ee=i(te),G=l(te,"P",{"data-svelte-h":!0}),r(G)!=="svelte-47otnf"&&(G.textContent=We),Y=i(te),O=l(te,"P",{"data-svelte-h":!0}),r(O)!=="svelte-1uq8h27"&&(O.innerHTML=Ue),ve=i(te),se=l(te,"P",{"data-svelte-h":!0}),r(se)!=="svelte-1am33iv"&&(se.textContent=Qe),ke=i(te),le=l(te,"P",{"data-svelte-h":!0}),r(le)!=="svelte-jbmlzp"&&(le.textContent=Ne),_e=i(te),ae=l(te,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-qfjoan"&&(ae.textContent=Re),C=i(te),H=l(te,"H2",{class:!0,"data-svelte-h":!0}),r(H)!=="svelte-1yo5tes"&&(H.textContent=Ze),K=i(te),J=l(te,"P",{"data-svelte-h":!0}),r(J)!=="svelte-11j93d7"&&(J.innerHTML=Ye),this.h()},h(){h(d,"class","section"),h(_,"class","section"),h(x,"class","section"),h(H,"class","section")},m(te,ne){t(te,n,ne),t(te,p,ne),t(te,d,ne),t(te,u,ne),t(te,c,ne),t(te,q,ne),t(te,b,ne),t(te,F,ne),t(te,k,ne),t(te,I,ne),t(te,_,ne),t(te,X,ne),t(te,P,ne),t(te,D,ne),t(te,S,ne),t(te,$,ne),t(te,T,ne),t(te,N,ne),t(te,M,ne),t(te,L,ne),t(te,x,ne),t(te,me,ne),t(te,E,ne),t(te,re,ne),t(te,Z,ne),t(te,ee,ne),t(te,G,ne),t(te,Y,ne),t(te,O,ne),t(te,ve,ne),t(te,se,ne),t(te,ke,ne),t(te,le,ne),t(te,_e,ne),t(te,ae,ne),t(te,C,ne),t(te,H,ne),t(te,K,ne),t(te,J,ne)},p:wt,d(te){te&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J))}}}function Sl(m){let n,f;const p=[m[0],yn];let d={$$slots:{default:[Cl]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Pl=class extends vt{constructor(n){super(),bt(this,n,Tl,Sl,gt,{})}};const Ml=Object.freeze(Object.defineProperty({__proto__:null,default:Pl,metadata:yn},Symbol.toStringTag,{value:"Module"}));function Hl(m){let n,f=`Daniel Althviz is one of our longest-tenured Spyder developers, having started working on the project near the end of 2016. +Now eight years later, he’s the project’s co-maintainer and its our release manager, responsible for the many steps required to release Spyder across all our various platforms. +On top of that, he is also the lead maintainer of two of the most important libraries on which Spyder, and a lot of other scientific software, depends: the QtPy GUI abstraction layer and the QtAwesome icon font framework.`,p,d,s=`In 2023, Spyder received a Chan Zuckerberg Initiative Essential Open Source Software for Science Cycle 5 grant, number 384 to support a new remote development architecture and features in Spyder and related development. +This has helped us fund Daniel’s work on many of his contributions to Spyder 6 connected to that!`,u,c,de=`Thanks to all his experience and responsibilities, Daniel has put in a lot of work toward Spyder 6’s development. +Read on to hear the highlights!

    `,q,b,ge='The Spyder Contributions page on GitHub, showing a graph of all contributions over time, and Daniel highlighted as the number two contributor between Feb 1 2023 and the present, after lead maintainer Carlos Cordoba
    Daniel has the second-most contributions to the core Spyder repository since Feb 2023
    ',F,k,fe="Spyder Editor migration to new plugin API",I,_,he=`We introduced a brand new plugin API with Spyder 5, and as part of that refactored most of Spyder’s panes and many other of its internal components to be plugins that use it, rather than tightly coupled with Spyder itself. +That both makes Spyder much more modular and easier to maintain, and gives external plugins all the same power and flexibility that internal panes and components have! +However, the one major exception to that in Spyder 5 was the Editor, which hadn’t been migrated due to the high level of complexity and the further new features that would need to be added to the plugin API.`,X,P,we=`Migrating the Editor to the modular API was the final piece of the puzzle to make Spyder a fully pluggable application, avoid having to maintain two duplicate APIs and enhance interoperability with other plugins, such as those being developed for remote development in Spyder 6. +Specifically, it was a prerequisite for implementing remote editing capabilities, which will arrive in Spyder 6.2. +Therefore, we prioritized finishing this migration for Spyder 6, with Daniel completing the work originally started by Gonzalo Peña-Castellanos, Edgar Margffoy and Stephannie Jimenez.`,D,S,ue=`Given the size of the task, Daniel split it into a number of steps, each corresponding to a GitHub Pull Request. +First, he split the CodeEditor, the main widget for editing code, into a component in charge of code completion and linting, and another one in charge of editing. +This helped separate those concerns and improve improve overall modularity and maintainability. +Then, he refactored the EditorStack code, the widget in charge of displaying multiple tabbed CodeEditor views, to facilitate the migration. +Finally, he migrated the Editor itself to the new API in two steps: an initial migration, and a followup cleanup. +This last step alone took six months of hard work, but it will help to address a lot of technical debt accumulated throughout the years.`,$,T,Pe="Remote development architecture quality testing",N,M,Me='The Spyder remote kernel status dialog showing a successful connection, next to the IPython Console showing a kernel error
    Daniel helped find and solve remote development issues like this one
    ',L,x,Ce=`Once the Editor migration was moving along, Daniel helped review, test and QA the new remote development architecture. +As part of that, he also developed a number of fixes and improvements to address the issues he found. +For instance, he implemented several UI/UX improvements for the graphical components used to create a remote connection, based on the issues he found.`,me,E,Ie=`Furthermore, during his checks of remote connections working on Windows, he discovered several errors with running async code, which he helped fix. +Finally, he also encountered problems when trying to tunnel ports through SSH, which he also contributed to solving. +This all helped make our remote development architecture much more stable and usable. +To learn more about Spyder’s new remote development architecture, check out Hendrik’s blog post!.`,re,Z,qe="Spyder test suite overhaul",ee,G,We=`To enhance testing of Spyder 6 and its new components, Daniel helped make the Spyder test suite faster and more robust. +The core team was witnessing constant errors and delays when running automated tests in continuous integration systems, which made it necessary for Daniel invest several weeks to fix that so that the Spyder 6 development process was smoother. +Therefore, Daniel’s work improved this situation, as well as making the tests more efficient overall.`,Y,O,Ue="Review work and project management",ve,se,Qe='Spyder's file switcher dialog, with a path box to enter a file name above a list of matching files and their properties
    Spyder's File Switcher, with the improvements from Daniel and Angela's work
    ',ke,le,Ne=`Much of Daniel’s responsibilities involve reviewing, mentoring and assisting with the work of other developers, an important role in any project. +Daniel helped Ryan Clary, the developer who created our new Conda-based installers for Spyder 6, test and validate the installers and their update process for each release in the year-long process of stabilizing them, as well as finding and reporting many bugs on Windows.`,_e,ae,Re=`Daniel also reviewed and assisted with Angela Remolina’s work on major improvements to Spyder’s File/Symbol Switcher. +Angela, an intern who worked on Spyder over several months, migrated the File/Symbol switcher to a plugin, so it is modular and accessible to other plugins. +As part of this project, she also added the initial support in the switcher for lightning-fast, fzf-accelerated searching of all files in the current project.`,C,H,Ze=`Finally, Daniel performed an in-depth review of the numerous UI/UX enhancements for Spyder 6 developed by Juan-Sebastian Bautista, whom Daniel has mentored and managed for the past two years. +This work has made Spyder much easier and more intuitive to use, including for users with accessibility needs. +Thanks to Daniel’s mentorship, Juan-Sebastian looks to continue his work with Spyder into the future.`,K,J,Ye="Spyder release management",te,ne,Xe='Spyder release page, showing a list of version numbers and their corresponding information and files
    Daniel has released dozens of recent Spyder versions
    ',ze,ye,et="Since February 1, 2023, thanks to the CZI grant funding mentioned before, Daniel has also been active as Spyder’s Release Manager, taking on the substantial task of handling the many critical steps required to produce stable packages for the many platforms we support, including:",De,ce,tt='
  • PyPI (pip)
  • Conda-Forge (Conda)
  • Spyder installers, and the
  • GitHub releases.
  • ',V,oe,ot=`Since then, he has served as Release Manager for one minor and eight bugfix releases for Spyder 5 (from 5.4.3 to 5.5.6), and eight pre-releases, one major release and three bugfix releases for Spyder 6 (from 6.0 alpha2 to 6.0.3). +Without his work, our users wouldn’t have been able to benefit from all the developmental and stable releases that we’ve had, especially for Spyder 6!`,Fe,be,lt="What’s next?",Oe,xe,at=`In the immediate future, Daniel will continue his critical role as the Release Manager for Spyder, ensuring users keep seeing regular updates for Spyder 6. +Additionally, he’ll further his partnership with Juan-Sebastian, this time focused on maintaining Spyder 6.0 and fixing any further bugs that are found. +He’ll also work on improving Jupyter QtConsole, the frontend that Spyder (in the IPython Console) and other users and applications employ to provide a rich, interactive graphical interface to local and remote kernels. +Finally, he’ll help implement the frontend interface to remote file systems as part of our remote development work, allowing users to manipulate remote files and directories just like those locally!`,W,ie,it="We’re looking forward to seeing the fruits of all that work, and as always, happy Spydering!🕸️";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("figure"),b.innerHTML=ge,F=a(),k=o("h2"),k.textContent=fe,I=a(),_=o("p"),_.textContent=he,X=a(),P=o("p"),P.innerHTML=we,D=a(),S=o("p"),S.innerHTML=ue,$=a(),T=o("h2"),T.textContent=Pe,N=a(),M=o("figure"),M.innerHTML=Me,L=a(),x=o("p"),x.innerHTML=Ce,me=a(),E=o("p"),E.innerHTML=Ie,re=a(),Z=o("h2"),Z.textContent=qe,ee=a(),G=o("p"),G.innerHTML=We,Y=a(),O=o("h2"),O.textContent=Ue,ve=a(),se=o("figure"),se.innerHTML=Qe,ke=a(),le=o("p"),le.innerHTML=Ne,_e=a(),ae=o("p"),ae.innerHTML=Re,C=a(),H=o("p"),H.innerHTML=Ze,K=a(),J=o("h2"),J.textContent=Ye,te=a(),ne=o("figure"),ne.innerHTML=Xe,ze=a(),ye=o("p"),ye.textContent=et,De=a(),ce=o("ul"),ce.innerHTML=tt,V=a(),oe=o("p"),oe.textContent=ot,Fe=a(),be=o("h2"),be.textContent=lt,Oe=a(),xe=o("p"),xe.innerHTML=at,W=a(),ie=o("p"),ie.textContent=it,this.h()},l(v){n=l(v,"P",{"data-svelte-h":!0}),r(n)!=="svelte-n8mapo"&&(n.innerHTML=f),p=i(v),d=l(v,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1h8c2l8"&&(d.innerHTML=s),u=i(v),c=l(v,"P",{"data-svelte-h":!0}),r(c)!=="svelte-141vgth"&&(c.innerHTML=de),q=i(v),b=l(v,"FIGURE",{class:!0,"data-svelte-h":!0}),r(b)!=="svelte-1hhnlb"&&(b.innerHTML=ge),F=i(v),k=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-7imtdi"&&(k.textContent=fe),I=i(v),_=l(v,"P",{"data-svelte-h":!0}),r(_)!=="svelte-4k25ck"&&(_.textContent=he),X=i(v),P=l(v,"P",{"data-svelte-h":!0}),r(P)!=="svelte-nvq5vx"&&(P.innerHTML=we),D=i(v),S=l(v,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1i9mpkt"&&(S.innerHTML=ue),$=i(v),T=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-6f5vnr"&&(T.textContent=Pe),N=i(v),M=l(v,"FIGURE",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-92d43r"&&(M.innerHTML=Me),L=i(v),x=l(v,"P",{"data-svelte-h":!0}),r(x)!=="svelte-1r8hvrf"&&(x.innerHTML=Ce),me=i(v),E=l(v,"P",{"data-svelte-h":!0}),r(E)!=="svelte-7vqww8"&&(E.innerHTML=Ie),re=i(v),Z=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(Z)!=="svelte-wy6p5j"&&(Z.textContent=qe),ee=i(v),G=l(v,"P",{"data-svelte-h":!0}),r(G)!=="svelte-123f6qv"&&(G.innerHTML=We),Y=i(v),O=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(O)!=="svelte-7iqjvy"&&(O.textContent=Ue),ve=i(v),se=l(v,"FIGURE",{class:!0,"data-svelte-h":!0}),r(se)!=="svelte-c0mdyr"&&(se.innerHTML=Qe),ke=i(v),le=l(v,"P",{"data-svelte-h":!0}),r(le)!=="svelte-bogred"&&(le.innerHTML=Ne),_e=i(v),ae=l(v,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-t6bhid"&&(ae.innerHTML=Re),C=i(v),H=l(v,"P",{"data-svelte-h":!0}),r(H)!=="svelte-1jqk0r2"&&(H.innerHTML=Ze),K=i(v),J=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(J)!=="svelte-1m26wyb"&&(J.textContent=Ye),te=i(v),ne=l(v,"FIGURE",{class:!0,"data-svelte-h":!0}),r(ne)!=="svelte-1g54acf"&&(ne.innerHTML=Xe),ze=i(v),ye=l(v,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-15qwg61"&&(ye.textContent=et),De=i(v),ce=l(v,"UL",{"data-svelte-h":!0}),r(ce)!=="svelte-1gauh8l"&&(ce.innerHTML=tt),V=i(v),oe=l(v,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1d3k975"&&(oe.textContent=ot),Fe=i(v),be=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(be)!=="svelte-1iticpq"&&(be.textContent=lt),Oe=i(v),xe=l(v,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-ed7033"&&(xe.innerHTML=at),W=i(v),ie=l(v,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-dg11l8"&&(ie.textContent=it),this.h()},h(){h(b,"class","figure"),h(k,"class","section"),h(T,"class","section"),h(M,"class","figure"),h(Z,"class","section"),h(O,"class","section"),h(se,"class","figure"),h(J,"class","section"),h(ne,"class","figure"),h(be,"class","section")},m(v,j){t(v,n,j),t(v,p,j),t(v,d,j),t(v,u,j),t(v,c,j),t(v,q,j),t(v,b,j),t(v,F,j),t(v,k,j),t(v,I,j),t(v,_,j),t(v,X,j),t(v,P,j),t(v,D,j),t(v,S,j),t(v,$,j),t(v,T,j),t(v,N,j),t(v,M,j),t(v,L,j),t(v,x,j),t(v,me,j),t(v,E,j),t(v,re,j),t(v,Z,j),t(v,ee,j),t(v,G,j),t(v,Y,j),t(v,O,j),t(v,ve,j),t(v,se,j),t(v,ke,j),t(v,le,j),t(v,_e,j),t(v,ae,j),t(v,C,j),t(v,H,j),t(v,K,j),t(v,J,j),t(v,te,j),t(v,ne,j),t(v,ze,j),t(v,ye,j),t(v,De,j),t(v,ce,j),t(v,V,j),t(v,oe,j),t(v,Fe,j),t(v,be,j),t(v,Oe,j),t(v,xe,j),t(v,W,j),t(v,ie,j)},p:wt,d(v){v&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie))}}}function Ll(m){let n,f;const p=[m[0],wn];let d={$$slots:{default:[Hl]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let jl=class extends vt{constructor(n){super(),bt(this,n,Il,Ll,gt,{})}};const $l=Object.freeze(Object.defineProperty({__proto__:null,default:jl,metadata:wn},Symbol.toStringTag,{value:"Module"}));function Al(m){let n,f,p,d,s=`The foundations of Spyder’s new remote development architecture are available now in Spyder 6.0, with more features to come in 6.1 and beyond! +The goal is to make it easy for you to host your files, data and computations on remote desktops, clusters, servers and the cloud while being able to use Spyder locally.`,u,c,de=`Spyder 6.0 features a new remote connection manager that allows you to connect to any machine with a SSH server, no prior installation or configuration needed, and automatically set up and use a remote Python environment on the host. +It also features graphical status checking and reporting, host configuration management, and more. +In addition, it brings a new Consoles submenu allowing you to connect to any remote host and launch a console with one click. +You can also stop code execution as well as restart remote kernels from within Spyder.`,q,b,ge='',F,k,fe=`We’re excited to have our newest core developer, Hendrik Louzada, share with you his insights and perspectives on Spyder 6’s new remote development architecture he helped implement! +Join us as Hendrik shares how he got started with Spyder and the project, how the new achetecture is implemented under the hood, what challenges he faced and what he learned from them, and what’s next for Spyder 6.1.0!`,I,_,he="How’d you find out about Spyder and why’d you join the project?",X,P,we=`I first started to work on Spyder around three years ago, developing a series of plugins to control remote magnetic resonance equipment (such as MRI machines) directly in the IDE. +As part of that project, I made several upstream contributions to Spyder itself to improve the Language Server Protocol support (LSP, the architecture that powers Spyder’s code completion, introspection, analysis and formatting).`,D,S,ue=`In 2023, Spyder received a Chan Zuckerberg Initiative Essential Open Source Software for Science Cycle 5 grant to implement a new remote development architecture and features in Spyder to allow users to develop and run code in remote servers and cloud machines. +After a six-month search by Spyder lead maintainer Carlos Cordoba to find the right candidate to engineer the backend and network architecture for this project, he found me, so I joined the core development team near the end of 2023.

    `,$,T,Pe='New remote connection manager dialog in Spyder listing the configurable settings for a new remote host
    Spyder's new remote connection manager lists the configurable SSH settings for creating a remote host
    ',N,M,Me="How is the new remote development platform implemented?",L,x,Ce=`The backend, spyder-remote-services, uses Jupyter Server and the JupyterHub API, since Spyder already leverages the Jupyter architecture to manage kernels and run code. +We decided to use SSH to communicate with the remote machine, since it’s secure and widely used for this purpose.`,me,E,Ie=`That project is managed through an internal Spyder plugin, Remote Client, which uses the Jupyter API to manage remote Spyder kernels and connect them to Spyder. +The Remote Client frontend and backend were developed as an interface for Spyder to connect and manage the Jupyter Server installed on the remote machine. +The plugin connects to the machine, installs the server, and creates SSH tunnels for the exposed server and extra APIs implemented by spyder-remote-services. +Once that’s complete, Spyder will be able to automatically create remote IPython Consoles on behalf of users. +Furthermore, you can now stop remote computations and restart remote kernels, which was not possible before.

    `,re,Z,qe='Spyder consoles menu listing remote as well as local Python environments to open
    Spyder's Consoles menu now has a new submenu allowing one-click launch of consoles on remote hosts
    ',ee,G,We="What challenges did you face and how’d you overcome them?",Y,O,Ue=`There are a number of Python libraries that implement the SSH protocol, but most of them use the underlying SSH client and server installed by the operating system. +Unfortunately, the Windows SSH client has a serious issue that prevents tunnels from working correctly, so I needed to find an implementation that uses the underlying SSH libraries directly instead. +After investigating a number of options, the AsyncSSH project was the only one that both meets that requirement and is also robust and well maintained. +Hence, I implemented tunneling using that library in the pull request spyder-ide/spyder#22223.`,ve,se,Qe=`However, there was still an important problem with AsyncSSH: Spyder uses the Qt framework’s event loop for its graphical user interface, which is not async-enabled. +Therefore, I had to write an async API that was flexible enough to be able to call several async functions in a specific event loop, allow for loops to be run concurrently (to avoid blocking the main Qt event loop and causing Spyder’s GUI to freeze), and be thread-safe so it can be called from any Qt thread.`,ke,le,Ne=`To cover all those requirements, I created the @AsyncDispatcher decorator function, which starts a thread to run an async loop if needed, schedules the async function in a specific loop, and returns a future object with the async function’s result. +That result is emitted in a Qt signal which is then used by Spyder synchronously to perform other tasks (e.g. check if the server is running).

    `,_e,ae,Re='Spyder remote connection manager, showing a successfully connected host
    The new remote connection manager shows detailed connection and status information for remote hosts
    ',C,H,Ze="What have you learned so far?",K,J,Ye=`Working on an open source project has provided me with the opportunity to witness how my contributions directly impact users in real time. +Seeing my work being utilized and appreciated by the Spyder community is very rewarding and motivates me to strive for excellence and dedication. +Additionally, observing individuals dedicated to improving Spyder for many years with a common goal to help the scientific community, and without focusing primarily on profit, is incredibly inspiring.`,te,ne,Xe=`This project has taught me the importance of adaptability and perseverance. +There were moments with problems too hard to understand by myself, but with the team’s support I was able to push through those obstacles, making me more confident and resilient.`,ze,ye,et=`I’m very grateful for the opportunity to work on Spyder with such a dedicated and supportive team. +I am excited to apply the lessons learned as we move into the next phases of this project!`,De,ce,tt="What’s next for the project?",V,oe,ot=`Our plans for the next feature version, Spyder 6.1.0, include adding the necessary APIs to spyder-remote-services so it can manipulate the remote file system. +This will allow you to view, copy, move and delete remote files and directories right from Spyder’s Files pane. +Users will also be able to create and manage local and remote Python environments, so they can work in different scientific and programming projects remotely at the same time.`,Fe,be,lt=`Finally, we plan to enable connecting to an already running JupyterHub instance, for situations where the user’s organization already has one set up that they want to work with using Spyder. +The changes required will be relatively straightforward since instead of talking to our own server for remote development, users will communicate with the existing JupyterHub instead.`,Oe,xe,at=`We can’t wait to bring these features to you in our next feature version, coming in the first half of next year, and see all the cool things you all end up doing with them. +And until then, as always—Happy Spydering!🕸️`;return{c(){n=o("img"),p=a(),d=o("p"),d.textContent=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("video"),b.innerHTML=ge,F=a(),k=o("p"),k.textContent=fe,I=a(),_=o("h2"),_.textContent=he,X=a(),P=o("p"),P.textContent=we,D=a(),S=o("p"),S.innerHTML=ue,$=a(),T=o("figure"),T.innerHTML=Pe,N=a(),M=o("h2"),M.textContent=Me,L=a(),x=o("p"),x.innerHTML=Ce,me=a(),E=o("p"),E.innerHTML=Ie,re=a(),Z=o("figure"),Z.innerHTML=qe,ee=a(),G=o("h2"),G.textContent=We,Y=a(),O=o("p"),O.innerHTML=Ue,ve=a(),se=o("p"),se.textContent=Qe,ke=a(),le=o("p"),le.innerHTML=Ne,_e=a(),ae=o("figure"),ae.innerHTML=Re,C=a(),H=o("h2"),H.textContent=Ze,K=a(),J=o("p"),J.textContent=Ye,te=a(),ne=o("p"),ne.textContent=Xe,ze=a(),ye=o("p"),ye.textContent=et,De=a(),ce=o("h2"),ce.textContent=tt,V=a(),oe=o("p"),oe.innerHTML=ot,Fe=a(),be=o("p"),be.textContent=lt,Oe=a(),xe=o("p"),xe.textContent=at,this.h()},l(W){n=l(W,"IMG",{src:!0,alt:!0}),p=i(W),d=l(W,"P",{"data-svelte-h":!0}),r(d)!=="svelte-b1qyrp"&&(d.textContent=s),u=i(W),c=l(W,"P",{"data-svelte-h":!0}),r(c)!=="svelte-14j8h23"&&(c.innerHTML=de),q=i(W),b=l(W,"VIDEO",{"data-svelte-h":!0}),r(b)!=="svelte-1l2htvy"&&(b.innerHTML=ge),F=i(W),k=l(W,"P",{"data-svelte-h":!0}),r(k)!=="svelte-13vsu2c"&&(k.textContent=fe),I=i(W),_=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(_)!=="svelte-1g4eozn"&&(_.textContent=he),X=i(W),P=l(W,"P",{"data-svelte-h":!0}),r(P)!=="svelte-ezm7r3"&&(P.textContent=we),D=i(W),S=l(W,"P",{"data-svelte-h":!0}),r(S)!=="svelte-1b7dejq"&&(S.innerHTML=ue),$=i(W),T=l(W,"FIGURE",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-1hgpcve"&&(T.innerHTML=Pe),N=i(W),M=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-1ie5u8o"&&(M.textContent=Me),L=i(W),x=l(W,"P",{"data-svelte-h":!0}),r(x)!=="svelte-106ovnw"&&(x.innerHTML=Ce),me=i(W),E=l(W,"P",{"data-svelte-h":!0}),r(E)!=="svelte-5fi4rr"&&(E.innerHTML=Ie),re=i(W),Z=l(W,"FIGURE",{class:!0,"data-svelte-h":!0}),r(Z)!=="svelte-1pvwzu8"&&(Z.innerHTML=qe),ee=i(W),G=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(G)!=="svelte-bgd1cn"&&(G.textContent=We),Y=i(W),O=l(W,"P",{"data-svelte-h":!0}),r(O)!=="svelte-1jav5ek"&&(O.innerHTML=Ue),ve=i(W),se=l(W,"P",{"data-svelte-h":!0}),r(se)!=="svelte-6id8ty"&&(se.textContent=Qe),ke=i(W),le=l(W,"P",{"data-svelte-h":!0}),r(le)!=="svelte-1egmtyc"&&(le.innerHTML=Ne),_e=i(W),ae=l(W,"FIGURE",{class:!0,"data-svelte-h":!0}),r(ae)!=="svelte-c1x2i6"&&(ae.innerHTML=Re),C=i(W),H=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(H)!=="svelte-1ff6hdi"&&(H.textContent=Ze),K=i(W),J=l(W,"P",{"data-svelte-h":!0}),r(J)!=="svelte-1gwmnw1"&&(J.textContent=Ye),te=i(W),ne=l(W,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1q7io5m"&&(ne.textContent=Xe),ze=i(W),ye=l(W,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-x3t62t"&&(ye.textContent=et),De=i(W),ce=l(W,"H2",{class:!0,"data-svelte-h":!0}),r(ce)!=="svelte-15v4oah"&&(ce.textContent=tt),V=i(W),oe=l(W,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-yridht"&&(oe.innerHTML=ot),Fe=i(W),be=l(W,"P",{"data-svelte-h":!0}),r(be)!=="svelte-1aixe2x"&&(be.textContent=lt),Oe=i(W),xe=l(W,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-bnizfq"&&(xe.textContent=at),this.h()},h(){Te(n.src,f="hero.png")||h(n,"src",f),h(n,"alt","Graphic with the Spyder icon connected to a network, with the words Easy Remote Execution is available now"),b.controls=!0,h(_,"class","section"),h(T,"class","figure"),h(M,"class","section"),h(Z,"class","figure"),h(G,"class","section"),h(ae,"class","figure"),h(H,"class","section"),h(ce,"class","section")},m(W,ie){t(W,n,ie),t(W,p,ie),t(W,d,ie),t(W,u,ie),t(W,c,ie),t(W,q,ie),t(W,b,ie),t(W,F,ie),t(W,k,ie),t(W,I,ie),t(W,_,ie),t(W,X,ie),t(W,P,ie),t(W,D,ie),t(W,S,ie),t(W,$,ie),t(W,T,ie),t(W,N,ie),t(W,M,ie),t(W,L,ie),t(W,x,ie),t(W,me,ie),t(W,E,ie),t(W,re,ie),t(W,Z,ie),t(W,ee,ie),t(W,G,ie),t(W,Y,ie),t(W,O,ie),t(W,ve,ie),t(W,se,ie),t(W,ke,ie),t(W,le,ie),t(W,_e,ie),t(W,ae,ie),t(W,C,ie),t(W,H,ie),t(W,K,ie),t(W,J,ie),t(W,te,ie),t(W,ne,ie),t(W,ze,ie),t(W,ye,ie),t(W,De,ie),t(W,ce,ie),t(W,V,ie),t(W,oe,ie),t(W,Fe,ie),t(W,be,ie),t(W,Oe,ie),t(W,xe,ie)},p:wt,d(W){W&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe))}}}function El(m){let n,f;const p=[m[0],gn];let d={$$slots:{default:[Al]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Dl=class extends vt{constructor(n){super(),bt(this,n,zl,El,gt,{})}};const Gl=Object.freeze(Object.defineProperty({__proto__:null,default:Dl,metadata:gn},Symbol.toStringTag,{value:"Module"}));function ql(m){let n,f='IPython is a great improvement over the standard Python interpreter, bringing many enhancements such as autocompletion and “magic” commands. When debugging, however, many of these features become inaccessible. With Spyder, we aim to bring back these capabilities and more for a truly premium debugging experience! (And believe me, I use this debugger a lot, and not only because I write code that might contain bugs :p).',p,d,s="In this post, I will describe the debugger improvements we’ve already made in Spyder 4, as well as those that are already implemented or under review for Spyder 4.2 and beyond.",u,c,de="Make the debugger more like IPython",q,b,ge=`IPython improves on the stock Python interpreter by adding syntax highlighting, completion, and history. +We have done the same for the debugger!`,F,k,fe,I,_,he="The output is prettier (and easier to read) than plain black text, as it was in Spyder 3!",X,P,we=`Code completion and history for the debugger use the same functionality as the IPython console, so you should not notice any difference in behaviour. +Just press Tab to trigger autocomplete suggestions, and use the up and down arrows to recall previous commands.`,D,S,ue,$,T,Pe="This can result useful if you don’t know every library’s documentation by heart!",N,M,Me="Another improvement that we added is the ability to write multiline statements.",L,x,Ce,me,E,Ie="This is better than getting SyntaxError: unexpected EOF while parsing, as was the case in Spyder 3.",re,Z,qe=`Finally, IPython has a lot of nice magic functions you can take advantage of. +I personally often use %matplotlib to switch between the qt5 and inline plotting backends, and %timeit to check how fast a given snippet of code is. +Now, these can be used in the debugger as well!`,ee,G,We,Y,O,Ue="Core improvements",ve,se,Qe=`When debugging code, a lot of time can be lost stepping through other Python packages. +To avoid that, enable the new Ignore Python libraries while debugging option in Spyder’s preferences under IPython Console > Debugger > Debug. +This will skip all the built-in and third-party Python modules and help you focus on your own code.`,ke,le,Ne,_e,ae,Re=`Another pain point for me is the mix of Pdb commands and Python statements when using the interactive prompt. +While debugging a script with a variable named step, for example, typing step in the Pdb prompt will not display the value of step, but will instead step through the code. +To avoid this, the Spyder 4.2 debugger will give precedence to Python expressions over Pdb commands; prefixing an expression with an exclamation mark will explicitly run it as a Pdb command. +This matches how the IPython Console handles clashes between magic functions and Python expressions, and contrasts with the previous behavior, where Pdb commands took precedence. +You can toggle this under IPython Console > Debugger > Debug in Spyder’s preferences.`,C,H,Ze,K,J,Ye="Here, you can see I can have a variable named step, and use it just as I would in the IPython console!",te,ne,Xe=`While debugging, the context changes constantly, which can be annoying if you need to use a certain module in each frame. +To address this, Spyder 4.2 will allow you to execute a snippet of code before any Pdb command. +I personally use import matplotlib.pyplot as plt so I can use Matplotlib anywhere with no extra commands! +You’ll be able to set this up for yourself under Preferences > IPython Console > Debugger > Run code while debugging.`,ze,ye,et,De,ce,tt="Matplotlib support",V,oe,ot=`Speaking of using Matplotlib, two improvements will make your plotting life much easier while in the debugger. +First, if you use the inline backend, the Process execute events while debugging option in Preferences > IPython console > Debugger (on by defaults) enables plotting after each command.`,Fe,be,lt,Oe,xe,at=`If you would rather use an interactive backend, Spyder 4.2 will allow you to do that too! +The event loop will be running while waiting for a Pdb input, which will bring Matplotlib figures to life!`,W,ie,it,v,j,dt="For example, interactive figures are great to zoom and pan.",Ke,Ee,rt="Spyder Editor integration",nt,Ge,st=`By clicking next to the line number in the Editor, you can set a breakpoint to stop the debugger upon reaching that line. +With a Shift-click, you can set a conditional breakpoint that will only pause execution if an expression you write evaluates to True. +This is very useful if you are debugging a loop and want to go to a specific iteration, for example! +While debugging, the Editor will show you the line on which execution is stopped. +If you move around in the Editor, you can always go back to the current line by using the Pdb (w)here command.`,g,z,ht,ut,Je,pt=`Here, you can see the Spyder debugger is stopped at the breakpoint on line 385, which is highlighted. +The next line has a conditional breakpoint.`,U,pe,ft="Other Spyder panes",y,w,je=`Several other Spyder panes are useful while debugging. +Breakpoints gives you a list of all the breakpoints you have set throughout your code.`,Pt,Mt,$t,R,$e,Gt="The Variable Explorer pane allows you to browse and modify the local namespace wherever the debugger is stopped.",Ht,Et,qt,Lt,At,Ft="The future",It,zt,Q=`I’m excited for the new Frames Explorer pane, which is currently almost ready for Spyder 5. +Usually while debugging, it can be hard to tell from where the current function was invoked, and one must often step up a long chain of calls to figure it out. +With the Frames Explorer, you have direct access to all the relevant call information, and you can jump around the stack easily!`,Se,Dt,Vt,Ot,Wt,B="I can see where the current function was called from!",He,Ut,Kt=`The next challenge I will be tackling is to enable the debugger to stop in threads. +This is a bit difficult to implement because if two threads reach a breakpoint at the same time, only one of them can take control of the shell, leading to skipped breakpoints. +This might be okay, but I’m still figuring that out.`,Jt,Nt,jn="Try out the new improvements in the Spyder debugger and let us know if they make your debugging easier!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.textContent=s,u=a(),c=o("h2"),c.textContent=de,q=a(),b=o("p"),b.textContent=ge,F=a(),k=o("img"),I=a(),_=o("p"),_.textContent=he,X=a(),P=o("p"),P.innerHTML=we,D=a(),S=o("img"),$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("p"),M.textContent=Me,L=a(),x=o("img"),me=a(),E=o("p"),E.innerHTML=Ie,re=a(),Z=o("p"),Z.innerHTML=qe,ee=a(),G=o("img"),Y=a(),O=o("h2"),O.textContent=Ue,ve=a(),se=o("p"),se.innerHTML=Qe,ke=a(),le=o("img"),_e=a(),ae=o("p"),ae.innerHTML=Re,C=a(),H=o("img"),K=a(),J=o("p"),J.innerHTML=Ye,te=a(),ne=o("p"),ne.innerHTML=Xe,ze=a(),ye=o("img"),De=a(),ce=o("h2"),ce.textContent=tt,V=a(),oe=o("p"),oe.innerHTML=ot,Fe=a(),be=o("img"),Oe=a(),xe=o("p"),xe.textContent=at,W=a(),ie=o("img"),v=a(),j=o("p"),j.textContent=dt,Ke=a(),Ee=o("h2"),Ee.textContent=rt,nt=a(),Ge=o("p"),Ge.innerHTML=st,g=a(),z=o("img"),ut=a(),Je=o("p"),Je.textContent=pt,U=a(),pe=o("h2"),pe.textContent=ft,y=a(),w=o("p"),w.textContent=je,Pt=a(),Mt=o("img"),R=a(),$e=o("p"),$e.textContent=Gt,Ht=a(),Et=o("img"),Lt=a(),At=o("h2"),At.textContent=Ft,It=a(),zt=o("p"),zt.textContent=Q,Se=a(),Dt=o("img"),Ot=a(),Wt=o("p"),Wt.textContent=B,He=a(),Ut=o("p"),Ut.textContent=Kt,Jt=a(),Nt=o("p"),Nt.textContent=jn,this.h()},l(A){n=l(A,"P",{"data-svelte-h":!0}),r(n)!=="svelte-eq6djb"&&(n.innerHTML=f),p=i(A),d=l(A,"P",{"data-svelte-h":!0}),r(d)!=="svelte-14iqtkk"&&(d.textContent=s),u=i(A),c=l(A,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-1hhjgz9"&&(c.textContent=de),q=i(A),b=l(A,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1kytrz5"&&(b.textContent=ge),F=i(A),k=l(A,"IMG",{src:!0,alt:!0}),I=i(A),_=l(A,"P",{"data-svelte-h":!0}),r(_)!=="svelte-17zug5m"&&(_.textContent=he),X=i(A),P=l(A,"P",{"data-svelte-h":!0}),r(P)!=="svelte-y5a8wy"&&(P.innerHTML=we),D=i(A),S=l(A,"IMG",{src:!0,alt:!0}),$=i(A),T=l(A,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1mhhocy"&&(T.textContent=Pe),N=i(A),M=l(A,"P",{"data-svelte-h":!0}),r(M)!=="svelte-u84fw"&&(M.textContent=Me),L=i(A),x=l(A,"IMG",{src:!0,alt:!0}),me=i(A),E=l(A,"P",{"data-svelte-h":!0}),r(E)!=="svelte-hcqh6c"&&(E.innerHTML=Ie),re=i(A),Z=l(A,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-xkeuem"&&(Z.innerHTML=qe),ee=i(A),G=l(A,"IMG",{src:!0,alt:!0}),Y=i(A),O=l(A,"H2",{class:!0,"data-svelte-h":!0}),r(O)!=="svelte-1glm3mm"&&(O.textContent=Ue),ve=i(A),se=l(A,"P",{"data-svelte-h":!0}),r(se)!=="svelte-1wye7ed"&&(se.innerHTML=Qe),ke=i(A),le=l(A,"IMG",{src:!0,alt:!0}),_e=i(A),ae=l(A,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-1jix07i"&&(ae.innerHTML=Re),C=i(A),H=l(A,"IMG",{src:!0,alt:!0}),K=i(A),J=l(A,"P",{"data-svelte-h":!0}),r(J)!=="svelte-1ycdd4o"&&(J.innerHTML=Ye),te=i(A),ne=l(A,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1bo8rlr"&&(ne.innerHTML=Xe),ze=i(A),ye=l(A,"IMG",{src:!0,alt:!0}),De=i(A),ce=l(A,"H2",{class:!0,"data-svelte-h":!0}),r(ce)!=="svelte-iagrp5"&&(ce.textContent=tt),V=i(A),oe=l(A,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1y3or5c"&&(oe.innerHTML=ot),Fe=i(A),be=l(A,"IMG",{src:!0,alt:!0}),Oe=i(A),xe=l(A,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-za37fn"&&(xe.textContent=at),W=i(A),ie=l(A,"IMG",{src:!0,alt:!0}),v=i(A),j=l(A,"P",{"data-svelte-h":!0}),r(j)!=="svelte-1ue0ftz"&&(j.textContent=dt),Ke=i(A),Ee=l(A,"H2",{class:!0,"data-svelte-h":!0}),r(Ee)!=="svelte-1tog8pa"&&(Ee.textContent=rt),nt=i(A),Ge=l(A,"P",{"data-svelte-h":!0}),r(Ge)!=="svelte-164gu6o"&&(Ge.innerHTML=st),g=i(A),z=l(A,"IMG",{src:!0,alt:!0}),ut=i(A),Je=l(A,"P",{"data-svelte-h":!0}),r(Je)!=="svelte-1qwhc92"&&(Je.textContent=pt),U=i(A),pe=l(A,"H2",{class:!0,"data-svelte-h":!0}),r(pe)!=="svelte-1x5u0ly"&&(pe.textContent=ft),y=i(A),w=l(A,"P",{"data-svelte-h":!0}),r(w)!=="svelte-9vkyuo"&&(w.textContent=je),Pt=i(A),Mt=l(A,"IMG",{src:!0,alt:!0}),R=i(A),$e=l(A,"P",{"data-svelte-h":!0}),r($e)!=="svelte-10y0bh"&&($e.textContent=Gt),Ht=i(A),Et=l(A,"IMG",{src:!0,alt:!0}),Lt=i(A),At=l(A,"H2",{class:!0,"data-svelte-h":!0}),r(At)!=="svelte-1wpdo9o"&&(At.textContent=Ft),It=i(A),zt=l(A,"P",{"data-svelte-h":!0}),r(zt)!=="svelte-12unpsb"&&(zt.textContent=Q),Se=i(A),Dt=l(A,"IMG",{src:!0,alt:!0}),Ot=i(A),Wt=l(A,"P",{"data-svelte-h":!0}),r(Wt)!=="svelte-146oq1y"&&(Wt.textContent=B),He=i(A),Ut=l(A,"P",{"data-svelte-h":!0}),r(Ut)!=="svelte-e80c8v"&&(Ut.textContent=Kt),Jt=i(A),Nt=l(A,"P",{"data-svelte-h":!0}),r(Nt)!=="svelte-193jkga"&&(Nt.textContent=jn),this.h()},h(){h(c,"class","section"),Te(k.src,fe="debugger-ipdb.png")||h(k,"src",fe),h(k,"alt","Debugger ipdb"),Te(S.src,ue="debugger-autocomplete.png")||h(S,"src",ue),h(S,"alt","Debugger-autocomplete"),Te(x.src,Ce="debugger-multiline.png")||h(x,"src",Ce),h(x,"alt","Debugger-multiline"),Te(G.src,We="debugger-timeit.png")||h(G,"src",We),h(G,"alt","Debugger timeit"),h(O,"class","section"),Te(le.src,Ne="debugger-preferences.png")||h(le,"src",Ne),h(le,"alt","Debugger preferences"),Te(H.src,Ze="debugger-step.png")||h(H,"src",Ze),h(H,"alt","Debugger"),Te(ye.src,et="debugger-modules.png")||h(ye,"src",et),h(ye,"alt","Debugger modules"),h(ce,"class","section"),Te(be.src,lt="debugger-plots.png")||h(be,"src",lt),h(be,"alt","Debugger plots"),Te(ie.src,it="debugger-interactive-plots.png")||h(ie,"src",it),h(ie,"alt","Debugger interactive plots"),h(Ee,"class","section"),Te(z.src,ht="editor-breakpoints.png")||h(z,"src",ht),h(z,"alt","Editor breakpoints"),h(pe,"class","section"),Te(Mt.src,$t="debugger-breakpoint.png")||h(Mt,"src",$t),h(Mt,"alt","Debugger breakpoint"),Te(Et.src,qt="variable-explorer.png")||h(Et,"src",qt),h(Et,"alt","Variable Explorer"),h(At,"class","section"),Te(Dt.src,Vt="frames-explorer.png")||h(Dt,"src",Vt),h(Dt,"alt","Frames Explorer")},m(A,Le){t(A,n,Le),t(A,p,Le),t(A,d,Le),t(A,u,Le),t(A,c,Le),t(A,q,Le),t(A,b,Le),t(A,F,Le),t(A,k,Le),t(A,I,Le),t(A,_,Le),t(A,X,Le),t(A,P,Le),t(A,D,Le),t(A,S,Le),t(A,$,Le),t(A,T,Le),t(A,N,Le),t(A,M,Le),t(A,L,Le),t(A,x,Le),t(A,me,Le),t(A,E,Le),t(A,re,Le),t(A,Z,Le),t(A,ee,Le),t(A,G,Le),t(A,Y,Le),t(A,O,Le),t(A,ve,Le),t(A,se,Le),t(A,ke,Le),t(A,le,Le),t(A,_e,Le),t(A,ae,Le),t(A,C,Le),t(A,H,Le),t(A,K,Le),t(A,J,Le),t(A,te,Le),t(A,ne,Le),t(A,ze,Le),t(A,ye,Le),t(A,De,Le),t(A,ce,Le),t(A,V,Le),t(A,oe,Le),t(A,Fe,Le),t(A,be,Le),t(A,Oe,Le),t(A,xe,Le),t(A,W,Le),t(A,ie,Le),t(A,v,Le),t(A,j,Le),t(A,Ke,Le),t(A,Ee,Le),t(A,nt,Le),t(A,Ge,Le),t(A,g,Le),t(A,z,Le),t(A,ut,Le),t(A,Je,Le),t(A,U,Le),t(A,pe,Le),t(A,y,Le),t(A,w,Le),t(A,Pt,Le),t(A,Mt,Le),t(A,R,Le),t(A,$e,Le),t(A,Ht,Le),t(A,Et,Le),t(A,Lt,Le),t(A,At,Le),t(A,It,Le),t(A,zt,Le),t(A,Se,Le),t(A,Dt,Le),t(A,Ot,Le),t(A,Wt,Le),t(A,He,Le),t(A,Ut,Le),t(A,Jt,Le),t(A,Nt,Le)},p:wt,d(A){A&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie),e(v),e(j),e(Ke),e(Ee),e(nt),e(Ge),e(g),e(z),e(ut),e(Je),e(U),e(pe),e(y),e(w),e(Pt),e(Mt),e(R),e($e),e(Ht),e(Et),e(Lt),e(At),e(It),e(zt),e(Se),e(Dt),e(Ot),e(Wt),e(He),e(Ut),e(Jt),e(Nt))}}}function Fl(m){let n,f;const p=[m[0],vn];let d={$$slots:{default:[ql]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Wl=class extends vt{constructor(n){super(),bt(this,n,Ol,Fl,gt,{})}};const Ul=Object.freeze(Object.defineProperty({__proto__:null,default:Wl,metadata:vn},Symbol.toStringTag,{value:"Module"}));function Nl(m){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,s='Version 4.0 of Spyder is almost ready! It has been in the making for well over two years, and it contains lots of interesting new features. We will focus on the Files pane in this post, where we’ve made several improvements to the interface and file management tools.',u,c,de="Simplified interface",q,b,ge="In order to simplify the Files pane’s interface, the columns corresponding to size and kind are hidden by default. To change which columns are shown, use the top-right pane menu or right-click the header directly.",F,k,fe,I,_,he,X,P,we="Custom file associations",D,S,ue="First, we added the ability to associate different external applications with specific file extensions they can open. Under the File associations tab of the Files preferences pane, you can add file types and set the external program used to open each of them by default.",$,T,Pe,N,M,Me="Once you’ve set this up, files will automatically launch in the associated application when opened from the Files pane in Spyder. Additionally, when you right-click a file you will find an Open with... option that will show the application associated with this extension.",L,x,Ce,me,E,Ie="Single click open option",re,Z,qe="We’ve added a new option to open files and directories with a single-click instead of a double-click, to suit different user preferences. To enable this option, go to the General tab of the Files preferences pane and check the option Single click to open files. With this setting, only a single click is needed to open a file in the Files pane either externally or in Spyder.",ee,G,We,Y,O,Ue="Bear in mind that changing this configuration option will also affect the behaviour of the Project Explorer pane.",ve,se,Qe="Open files externally",ke,le,Ne="We added the option to open files with the operating system’s default program for the file type to the Files pane’s context menu. To use this feature, right-click any file in the Files pane and click Open externally",_e,ae,Re,C,H,Ze=`Moreover, it is now possible to select more than one file on which to perform a context menu action, thanks to the Files pane’s new multi-select functionality. For this, press Ctrl (Cmd on macOS) or Shift while clicking on the files to select, just as you would in your operating system’s file manager (Windows Explorer, macOS Finder, etc). As you’d expect, Ctrl (Cmd) selects individual files one by one, while Shift selects all the files between the one you click and the one previously selected. +Once you’ve selected multiple files, it is now possible to execute many of the actions available in the context menu on all the selected files, including delete, rename, move, copy and open externally.`,K,J,Ye,te,ne,Xe="Absolute and relative path handling",ze,ye,et="Spyder 4 now allows you to easily copy the absolute or relative paths of one or more files in the Files pane and pasting them as well-formatted text anywhere else in Spyder. Just right-clicking any file or files in the Files or Project panes and select the desired option.",De,ce,tt,V,oe,ot="Beyond just copying a single path, when pasting more than one Spyder will intelligently format it into a comma-separated collection of quoted strings, one path per line, that can be pasted directly into a list with no additional formatting needed.",Fe,be,lt,Oe,xe,at="The Copy Absolute Path option gets us the complete path of each selected file, starting from the drive root.",W,ie,it,v,j,dt="Alternatively, Copy Relative Path gets us the path of the file relative to the current working (displayed in the top right of the Spyder window).",Ke,Ee,rt,nt,Ge,st="File type icons",g,z,ht="Finally, files in the Files pane are now displayed with icons depending on their type. There are custom icons for the source files of a variety of common programming languages including C C++, C Sharp, Java, Python, R, and Swift; for media types like JPEG, MP3, and M4A; and for other common extensions such as .txt and .tex. This allows you to identify file types with just a glance and select the appropriate application accordingly.",ut,Je,pt,U,pe,ft='With these new features and UI options in Spyder’s Files pane, we hope you will enjoy the improved file management experience coming in Spyder 4! We would like to thank Quansight, our donors, and most of all our dedicated users and contributors from around the world for making these features possible. The final version will be released very soon, but if you’d like to try it out now and share your feedback, follow the instructions on our Github. Happy Spydering!';return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("h2"),c.textContent=de,q=a(),b=o("p"),b.textContent=ge,F=a(),k=o("img"),I=a(),_=o("img"),X=a(),P=o("h2"),P.textContent=we,D=a(),S=o("p"),S.textContent=ue,$=a(),T=o("img"),N=a(),M=o("p"),M.innerHTML=Me,L=a(),x=o("img"),me=a(),E=o("h2"),E.textContent=Ie,re=a(),Z=o("p"),Z.innerHTML=qe,ee=a(),G=o("img"),Y=a(),O=o("p"),O.textContent=Ue,ve=a(),se=o("h2"),se.textContent=Qe,ke=a(),le=o("p"),le.innerHTML=Ne,_e=a(),ae=o("img"),C=a(),H=o("p"),H.innerHTML=Ze,K=a(),J=o("img"),te=a(),ne=o("h2"),ne.textContent=Xe,ze=a(),ye=o("p"),ye.innerHTML=et,De=a(),ce=o("img"),V=a(),oe=o("p"),oe.textContent=ot,Fe=a(),be=o("img"),Oe=a(),xe=o("p"),xe.innerHTML=at,W=a(),ie=o("img"),v=a(),j=o("p"),j.innerHTML=dt,Ke=a(),Ee=o("img"),nt=a(),Ge=o("h2"),Ge.textContent=st,g=a(),z=o("p"),z.innerHTML=ht,ut=a(),Je=o("img"),U=a(),pe=o("p"),pe.innerHTML=ft,this.h()},l(y){n=l(y,"P",{"data-svelte-h":!0}),r(n)!=="svelte-azjo9p"&&(n.innerHTML=f),p=i(y),d=l(y,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1vzrev8"&&(d.innerHTML=s),u=i(y),c=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-64n2sn"&&(c.textContent=de),q=i(y),b=l(y,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1qns2hr"&&(b.textContent=ge),F=i(y),k=l(y,"IMG",{src:!0,alt:!0}),I=i(y),_=l(y,"IMG",{src:!0,alt:!0}),X=i(y),P=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-bw5n4z"&&(P.textContent=we),D=i(y),S=l(y,"P",{"data-svelte-h":!0}),r(S)!=="svelte-qnj996"&&(S.textContent=ue),$=i(y),T=l(y,"IMG",{src:!0,alt:!0}),N=i(y),M=l(y,"P",{"data-svelte-h":!0}),r(M)!=="svelte-sbs8mx"&&(M.innerHTML=Me),L=i(y),x=l(y,"IMG",{src:!0,alt:!0}),me=i(y),E=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-r9kw23"&&(E.textContent=Ie),re=i(y),Z=l(y,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-1slqqwg"&&(Z.innerHTML=qe),ee=i(y),G=l(y,"IMG",{src:!0,alt:!0}),Y=i(y),O=l(y,"P",{"data-svelte-h":!0}),r(O)!=="svelte-7e0gg6"&&(O.textContent=Ue),ve=i(y),se=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(se)!=="svelte-897z0l"&&(se.textContent=Qe),ke=i(y),le=l(y,"P",{"data-svelte-h":!0}),r(le)!=="svelte-14zm4mn"&&(le.innerHTML=Ne),_e=i(y),ae=l(y,"IMG",{src:!0,alt:!0}),C=i(y),H=l(y,"P",{"data-svelte-h":!0}),r(H)!=="svelte-bhjge1"&&(H.innerHTML=Ze),K=i(y),J=l(y,"IMG",{src:!0,alt:!0}),te=i(y),ne=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(ne)!=="svelte-1em1ffi"&&(ne.textContent=Xe),ze=i(y),ye=l(y,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-1vpx8f9"&&(ye.innerHTML=et),De=i(y),ce=l(y,"IMG",{src:!0,alt:!0}),V=i(y),oe=l(y,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-12somj2"&&(oe.textContent=ot),Fe=i(y),be=l(y,"IMG",{src:!0,alt:!0}),Oe=i(y),xe=l(y,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-1ngtco8"&&(xe.innerHTML=at),W=i(y),ie=l(y,"IMG",{src:!0,alt:!0}),v=i(y),j=l(y,"P",{"data-svelte-h":!0}),r(j)!=="svelte-d0kivk"&&(j.innerHTML=dt),Ke=i(y),Ee=l(y,"IMG",{src:!0,alt:!0}),nt=i(y),Ge=l(y,"H2",{class:!0,"data-svelte-h":!0}),r(Ge)!=="svelte-1pwpvz6"&&(Ge.textContent=st),g=i(y),z=l(y,"P",{"data-svelte-h":!0}),r(z)!=="svelte-uw20bn"&&(z.innerHTML=ht),ut=i(y),Je=l(y,"IMG",{src:!0,alt:!0}),U=i(y),pe=l(y,"P",{"data-svelte-h":!0}),r(pe)!=="svelte-z72452"&&(pe.innerHTML=ft),this.h()},h(){h(c,"class","section"),Te(k.src,fe="pane-menu.png")||h(k,"src",fe),h(k,"alt","Pane Menu"),Te(_.src,he="header-menu.png")||h(_,"src",he),h(_,"alt","Header Menu"),h(P,"class","section"),Te(T.src,Pe="file-associations.png")||h(T,"src",Pe),h(T,"alt","File associations"),Te(x.src,Ce="open-with.png")||h(x,"src",Ce),h(x,"alt","Open With"),h(E,"class","section"),Te(G.src,We="single-click.png")||h(G,"src",We),h(G,"alt","Single click"),h(se,"class","section"),Te(ae.src,Re="open-externally.png")||h(ae,"src",Re),h(ae,"alt","Open Externally"),Te(J.src,Ye="select-files.png")||h(J,"src",Ye),h(J,"alt","Select Files"),h(ne,"class","section"),Te(ce.src,tt="copy-path.png")||h(ce,"src",tt),h(ce,"alt","Copy Path"),Te(be.src,lt="multiple-paths.png")||h(be,"src",lt),h(be,"alt","Multiple Paths"),Te(ie.src,it="absolute-path.png")||h(ie,"src",it),h(ie,"alt","Absolute Path"),Te(Ee.src,rt="relative-path.png")||h(Ee,"src",rt),h(Ee,"alt","Relative Path"),h(Ge,"class","section"),Te(Je.src,pt="file-extensions.png")||h(Je,"src",pt),h(Je,"alt","File Extensions")},m(y,w){t(y,n,w),t(y,p,w),t(y,d,w),t(y,u,w),t(y,c,w),t(y,q,w),t(y,b,w),t(y,F,w),t(y,k,w),t(y,I,w),t(y,_,w),t(y,X,w),t(y,P,w),t(y,D,w),t(y,S,w),t(y,$,w),t(y,T,w),t(y,N,w),t(y,M,w),t(y,L,w),t(y,x,w),t(y,me,w),t(y,E,w),t(y,re,w),t(y,Z,w),t(y,ee,w),t(y,G,w),t(y,Y,w),t(y,O,w),t(y,ve,w),t(y,se,w),t(y,ke,w),t(y,le,w),t(y,_e,w),t(y,ae,w),t(y,C,w),t(y,H,w),t(y,K,w),t(y,J,w),t(y,te,w),t(y,ne,w),t(y,ze,w),t(y,ye,w),t(y,De,w),t(y,ce,w),t(y,V,w),t(y,oe,w),t(y,Fe,w),t(y,be,w),t(y,Oe,w),t(y,xe,w),t(y,W,w),t(y,ie,w),t(y,v,w),t(y,j,w),t(y,Ke,w),t(y,Ee,w),t(y,nt,w),t(y,Ge,w),t(y,g,w),t(y,z,w),t(y,ut,w),t(y,Je,w),t(y,U,w),t(y,pe,w)},p:wt,d(y){y&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie),e(v),e(j),e(Ke),e(Ee),e(nt),e(Ge),e(g),e(z),e(ut),e(Je),e(U),e(pe))}}}function Rl(m){let n,f;const p=[m[0],bn];let d={$$slots:{default:[Nl]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Bl=class extends vt{constructor(n){super(),bt(this,n,Ql,Rl,gt,{})}};const Vl=Object.freeze(Object.defineProperty({__proto__:null,default:Bl,metadata:bn},Symbol.toStringTag,{value:"Module"}));function Jl(m){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,s='Note: Kite is sponsoring the work discussed in this blog post, and in addition supports Spyder 4.0 development through a Quansight Labs Community Work Order.',u,c,de='As part of our next release, we are proud to announce an additional completion client for Spyder, Kite. Kite is a novel completion client that uses Machine Learning techniques to find and predict the best autocompletion for a given text. Additionally, it collects improved documentation for compiled packages, e.g. Matplotlib, NumPy and SciPy, that cannot be obtained easily by using traditional code analysis packages such as Jedi. Although Kite is not open source like Spyder, you can download it without charge at the Kite website.',q,b,ge,F,k,fe="By incorporating Kite into Spyder, we will improve and provide the ultimate autocompletion and signature retrieval experience for most of the scientific Python stack and beyond. For instance, let’s take a look at the following PyTorch completion. While the Language Server Protocol server would not complete some of the functions, e.g. torch.linspace, Kite is able to return it successfully:",I,_,he,X,P,we="Another benefit of using Kite is that of personalized completions, due to incremental ML analysis performed by the analysis engine, which keeps track of the keypresses and text writing style, alongside common usage patterns, this way users will get a personalized experience that improves over time.",D,S,ue="We are working in collaboration with the Kite team to improve our autocompletion experience for the upcoming 4.0 release of Spyder. We plan to have all Kite features tested and ready to be used; that includes adding on-the-fly completions and code snippets for autocompletions.",$,T,Pe="To start using Kite, you just need to install the Kite client from their web page. They offer client packages for Windows, Linux and MacOS that are easy to install. Once Kite is installed on the system, Spyder is able to detect it and start the Kite client automatically.",N,M,Me='Our new Kite client will work alongside the new Language Server Protocol and the usual fallback tokenizer for files that cannot be analyzed by either the LSP or Kite. Thus, Spyder will be able to provide an optimal autocompletion experience for Python and other languages. Besides that, it is possible to define the priority between different completion plugins to show a completion source result first over the other completion plugins.',L,x,Ce="Last but not least, as part of this novel client, we are introducing a new completion API that enables to write third-party completion clients for Spyder that require integration with the code editor and project manager. We offer calls to perform autocompletion, hover requests, signature hints, among others without any hassle. By leveraging this API, it should be possible to add completions and documentation suitable for domain-specific applications developed using Spyder.",me,E,Ie="The function calls and constants of the new completion API will be added to the Spyder documentation and should be available in the next release of Spyder. Additionally, we will provide code snippets support for both LSP and Kite for the next release - please stay tuned!",re,Z,qe="We, the Spyder development team, hope that these new improvements accelerate your productivity, and we invite you to beta-test them to improve them even more. As always, we are open to your questions, issue reports and contributions on all of our communication channels and our Github repository.";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("img"),F=a(),k=o("p"),k.innerHTML=fe,I=a(),_=o("img"),X=a(),P=o("p"),P.textContent=we,D=a(),S=o("p"),S.textContent=ue,$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("p"),M.innerHTML=Me,L=a(),x=o("p"),x.textContent=Ce,me=a(),E=o("p"),E.textContent=Ie,re=a(),Z=o("p"),Z.textContent=qe,this.h()},l(ee){n=l(ee,"P",{"data-svelte-h":!0}),r(n)!=="svelte-eotn7j"&&(n.innerHTML=f),p=i(ee),d=l(ee,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1pywkh7"&&(d.innerHTML=s),u=i(ee),c=l(ee,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1fbgn4i"&&(c.innerHTML=de),q=i(ee),b=l(ee,"IMG",{src:!0,alt:!0}),F=i(ee),k=l(ee,"P",{"data-svelte-h":!0}),r(k)!=="svelte-y2k5fd"&&(k.innerHTML=fe),I=i(ee),_=l(ee,"IMG",{src:!0,alt:!0}),X=i(ee),P=l(ee,"P",{"data-svelte-h":!0}),r(P)!=="svelte-1pqgtfu"&&(P.textContent=we),D=i(ee),S=l(ee,"P",{"data-svelte-h":!0}),r(S)!=="svelte-f9uqef"&&(S.textContent=ue),$=i(ee),T=l(ee,"P",{"data-svelte-h":!0}),r(T)!=="svelte-lthd3c"&&(T.textContent=Pe),N=i(ee),M=l(ee,"P",{"data-svelte-h":!0}),r(M)!=="svelte-1rbdp3d"&&(M.innerHTML=Me),L=i(ee),x=l(ee,"P",{"data-svelte-h":!0}),r(x)!=="svelte-1jtibkh"&&(x.textContent=Ce),me=i(ee),E=l(ee,"P",{"data-svelte-h":!0}),r(E)!=="svelte-1duftot"&&(E.textContent=Ie),re=i(ee),Z=l(ee,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-6g4d07"&&(Z.textContent=qe),this.h()},h(){Te(b.src,ge="spyder-kite-hover.png")||h(b,"src",ge),h(b,"alt","Completions with Kite"),Te(_.src,he="spyder-kite-completions.gif")||h(_,"src",he),h(_,"alt","Completions with Kite")},m(ee,G){t(ee,n,G),t(ee,p,G),t(ee,d,G),t(ee,u,G),t(ee,c,G),t(ee,q,G),t(ee,b,G),t(ee,F,G),t(ee,k,G),t(ee,I,G),t(ee,_,G),t(ee,X,G),t(ee,P,G),t(ee,D,G),t(ee,S,G),t(ee,$,G),t(ee,T,G),t(ee,N,G),t(ee,M,G),t(ee,L,G),t(ee,x,G),t(ee,me,G),t(ee,E,G),t(ee,re,G),t(ee,Z,G)},p:wt,d(ee){ee&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z))}}}function Kl(m){let n,f;const p=[m[0],xn];let d={$$slots:{default:[Jl]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Yl=class extends vt{constructor(n){super(),bt(this,n,Zl,Kl,gt,{})}};const Xl=Object.freeze(Object.defineProperty({__proto__:null,default:Yl,metadata:xn},Symbol.toStringTag,{value:"Module"}));function ea(m){let n,f=`For the last couple of months, the Spyder team has been working on defining a new roadmap and submitting grant proposals to fund more features and improvements. +We are pleased to announce our roadmap for the rest of 2022, and that two proposals were funded!`,p,d,s="The roadmap",u,c,de=`Considering the importance of sharing a clear perspective of where the Spyder project is going and where we will be focusing our efforts over the coming months, the team has created an initial roadmap for the rest of 2022. +We prioritized the highlighted features and enhancements based on input from issues, face-to-face and virtual discussions, Stack Overflow, social media and other feedback, to try to best capture the interests of our users and community.`,q,b,ge="The proposals",F,k,fe=`To help make our roadmap achievable, we wrote and submitted proposals to several different venues and organizations in the last couple of months. +While we have yet to hear back from some of them, two have already been funded!`,I,_,he=`The first was for the Google Season of Docs (GSoD) 2022). +This grant will be focused mainly on improving and updating our user documentation for Spyder 5’s Editor features. +It also will help enhance our developer documentation and add tutorials and detailed information covering our new plugin API. +For more details, check out the Spyder wiki page for the proposal.`,X,P,we=`The second proposal accepted was a Small Development Grant from NumFOCUS. +For this grant, we will be working on improving the installation experience for Windows users by making the standalone installers auto-updatable and providing a simpler way to install custom packages not bundled with the installers. +With this grant, we were able to hire a new developer—Juan Sebastian Bautista, a recent graduate in systems and computing engineering from Universidad de los Andes in Bogotá, Colombia—who will implement these features over the next six months. +For more details, see the Spyder wiki page for the proposal.`,D,S,ue="Next steps",$,T,Pe=`We will be focusing our efforts as a project on moving forward with the accepted proposals and submitting new ones. +On top of that, we will gather more feedback about what volunteers, users and the community at large want to see for Spyder 6, and share the progress of the proposals in the relaunched Spyder Community calls.`,N,M,Me="We would like to thank NumFOCUS and Google Season of Docs for granting us the funds to be able to work on these projects and making our roadmap possible!";return{c(){n=o("p"),n.textContent=f,p=a(),d=o("h2"),d.textContent=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("h2"),b.textContent=ge,F=a(),k=o("p"),k.textContent=fe,I=a(),_=o("p"),_.innerHTML=he,X=a(),P=o("p"),P.innerHTML=we,D=a(),S=o("h2"),S.textContent=ue,$=a(),T=o("p"),T.innerHTML=Pe,N=a(),M=o("p"),M.textContent=Me,this.h()},l(L){n=l(L,"P",{"data-svelte-h":!0}),r(n)!=="svelte-176zl42"&&(n.textContent=f),p=i(L),d=l(L,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-4fbp7v"&&(d.textContent=s),u=i(L),c=l(L,"P",{"data-svelte-h":!0}),r(c)!=="svelte-z5sir4"&&(c.innerHTML=de),q=i(L),b=l(L,"H2",{class:!0,"data-svelte-h":!0}),r(b)!=="svelte-go9hhu"&&(b.textContent=ge),F=i(L),k=l(L,"P",{"data-svelte-h":!0}),r(k)!=="svelte-1v42iy0"&&(k.textContent=fe),I=i(L),_=l(L,"P",{"data-svelte-h":!0}),r(_)!=="svelte-blo2qp"&&(_.innerHTML=he),X=i(L),P=l(L,"P",{"data-svelte-h":!0}),r(P)!=="svelte-3yzhgt"&&(P.innerHTML=we),D=i(L),S=l(L,"H2",{class:!0,"data-svelte-h":!0}),r(S)!=="svelte-18hazx0"&&(S.textContent=ue),$=i(L),T=l(L,"P",{"data-svelte-h":!0}),r(T)!=="svelte-ryn14r"&&(T.innerHTML=Pe),N=i(L),M=l(L,"P",{"data-svelte-h":!0}),r(M)!=="svelte-tw6p7q"&&(M.textContent=Me),this.h()},h(){h(d,"class","section"),h(b,"class","section"),h(S,"class","section")},m(L,x){t(L,n,x),t(L,p,x),t(L,d,x),t(L,u,x),t(L,c,x),t(L,q,x),t(L,b,x),t(L,F,x),t(L,k,x),t(L,I,x),t(L,_,x),t(L,X,x),t(L,P,x),t(L,D,x),t(L,S,x),t(L,$,x),t(L,T,x),t(L,N,x),t(L,M,x)},p:wt,d(L){L&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M))}}}function ta(m){let n,f;const p=[m[0],kn];let d={$$slots:{default:[ea]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let oa=class extends vt{constructor(n){super(),bt(this,n,na,ta,gt,{})}};const la=Object.freeze(Object.defineProperty({__proto__:null,default:oa,metadata:kn},Symbol.toStringTag,{value:"Module"}));function aa(m){let n,f=`As we approach some major development milestones, now is as good a time as ever to share with you some perspective on where we’ve been, what’s happening now, and where we’re going in the world of Spyder. +In this post, part one of a three part series, we’ll take a look back over the past six months at some of the key events, accomplishments and challenges for Spyder and its community, and how that all leads up to where we are now.`,p,d,s=`Stay tuned right here, since part two will share several exciting announcements that affect the project (in a good way, we promise!) and its immediate future. +Even better, part three will formally announce the next Spyder 3 release and—what I’m sure you are all looking forward to—the plan for the first official Spyder 4 beta, plus our schedule and feature roadmap for Spyder 4 and beyond!`,u,c,de="A Call Answered",q,b,ge=`Starting off, as we announced back in mid-November, our funding from Anaconda, Inc was discontinued, leaving Spyder without formal institutional financial support. +As Spyder was, is and always will be a community-developed and supported IDE, this was far from a mortal blow to the project, but it did impact the pace and breadth of development. +Developer effort previously spent on our Spyder plugins, like spyder-notebook, spyder-reports, and spyder-terminal, among others, was refocused on the Spyder core, and the development and release of Spyder 4 was put mostly on hold. +To help make up for the loss of funding, we appealed to the community for support, asking users who found Spyder valuable to back our project on OpenCollective, in order to accelerate development and fund more features for Spyder 4.`,F,k,fe,I,_,he=`To our unending gratitude, you responded! In the few months since then, we’ve gone from zero to a budget of well over $4500 per year and rising at an increasing pace, thanks to the continuing contributions of over 80 (and counting!) individual and institutional backers. +We also had several new core team members and community contributors pitch in to help carry the load, and we’ve got some more great news in the very next post on the funding front. +While we’ve got a ways to go to match the level of funding we’ve received under Anaconda, your support has helped make possible several of the new features we’ve planned for Spyder 4, and allow us to commit to releasing it much sooner than we would be able to otherwise. +Your generous donations go directly toward funding the Spyder community’s most-requested new and improved features for Spyder 4, so keep them coming! +Stay tuned; we are considering rolling out new donation tiers and rewards at some point soon so you won’t want to miss that.`,X,P,we="Development by the Numbers",D,S,ue=`On the development side of the project, while our overall pace is modestly lower than its peak under our Anaconda funding, we’ve been quite active fixing bugs and adding new features and enhancements over the past six months. +By the numbers, since mid-November, we’ve pushed approximately 1200 commits to master (Spyder 4), comprising over 37 000 lines added and 16 000 removed, and 900 commits to 3.x (Spyder 3), with over 16 500 additions and 10 000 deletions. +Users have opened over 1375 issues (bugs, feature requests and other feedback), of which we’ve managed to resolve more than 1330, or nearly 97%.`,$,T,Pe,N,M,Me=`Further, over 250 pull requests from almost two dozen unique contributors, some old, some new, have been submitted since that time—fixing bugs, adding new or enhanced functionality, or making other improvements—of which 226 have been merged to the main Spyder codebase. +This work has coalesced into four separate official releases during that period, with another only days away. +Finally, we’ve recently blown past the 3000 Github stars milestone a few weeks ago (we’re now at more than 3200), with almost 700 unique forks to date.`,L,x,Ce="Key Spyder Improvements",me,E,Ie=`All those numbers are nice, but what matters most are the tangible improvements that you all get to use every day in your favorite IDE. +Over those same past six months, alongside hundreds of bugfixes and minor enhancements, we’ve made multiple significant improvements to the Spyder 3 Editor, IPython Console, Variable Explorer, and Find in Files tool, along with a number of others under the hood and to the application as a whole. +Even better, the majority of these were suggested by you, our users, and some of you even pitched in to help implement them.`,re,Z,qe=`Especially since you will probably be spending most of your time in it, we added a several new commands and functions to the Editor that will hopefully make your life easier, each with corresponding customizable shortcuts for easier access. +You can now insert a new line below the current one regardless of the cursor’s current position with Ctrl-Shift-Enter, and you can now use Shift-Delete to cut selected text, and Shift-Insert to paste it. +Ctrl-PageUp, Ctrl-PageDown, and Ctrl-Tab shortcuts are all now fully configurable. +Finally, you can now easily Tab from the Find to the Replace box when open, and better yet your Find text is automatically copied to the Replace box to make modifications easier.`,ee,G,We=`Second only to the Editor in terms of them most critical Spyder components, the IPython Console also got a lot of love in recent releases. +We’ve made several improvements to significantly improve the startup time, and added an optional feature to show the elapsed time each kernel has been running. +You can now remove all user-defined variables with a GUI command, and changes in imported modules now take effect instantly and automatically in the console, without even a re-import needed. +Cloudpickle is now used to serialize objects from the Console to the Variable Explorer, greatly improving the latter’s capabilities (as discussed below). +Finally, Cython files are now automatically run in dedicated Cython consoles, and you can now use the edit magic command from the Console to open any file right inside Spyder’s Editor.`,Y,O,Ue,ve,se,Qe=`The Variable Explorer, which many of you cite as Spyder’s “killer feature”, has greatly improved as well. +Most notably, thanks to the aforementioned cloudpickle change, you now have access to rich, deep exploration of nearly any object, builtin or custom, and can traverse, view, and when possible even edit complex hierarchies of nested types with ease. +The Variable Explorer now fully supports Timedelta objects, both built-in and Pandas variants, allowing you to easily view and edit them just like datetime and Timestamp. +It also now uses a “pretty”, more human-readable format for dates, times, timedeltas and the like, and also now supports displaying a much wider range of Numpy array types. +As a quality of life change, it has much better handling of immutable types, like tuples, clearly showing they can’t be edited upfront and avoiding bothersome errors when trying to do so.`,ke,le,Ne=`Rounding out the major changes, the Find in Files tool now allows you to remove items from the Search In list by hovering over them and pressing Delete, and there’s also a new option to clear all recent directories. +Under the hood, we’ve made PyQt5 a dependency for easier, one-command installation and added many more tests and better project infrastructure to help catch errors. +To make things easier on you if something does go wrong, we’ve greatly improved the error reporting system, the UI/UX and the explanatory text to be more up to date, informative, and user friendly.`,_e,ae,Re,C,H,Ze=`All of the mentioned additions are included in the latest released version of Spyder, 3.2.8, which you can update to with conda update spyder (if using Anaconda), with your package manager/distribution (if installed that way) or with pip update spyder (otherwise). +Even more are already implemented for our next release, due out in a week’s time, and we’ll have a preview of what to expect right here on the blog even sooner.`,K,J,Ye="Affiliated Project Progress",te,ne,Xe=`Outside the core Spyder IDE, while most plugins have been paused until the Spyder 4 release, work on other affiliated projects has continued. The new spyder-unittest plugin has seen particularly active development, and lead developer and Spyder team member Jitse Niesen recently published a tutorial on its use. +Since November, it has gotten improved pytest support with realtime test results and click-to-open, better UI/UX, a robust communications backend (ZeroMQ), and numerous bug fixes and minor improvements. +QtPy, another affiliated project which Spyder uses as its Qt GUI abstraction layer, has had three releases including one major, with new Qt classes, early support for PySide2, better performance, and a number of bugfixes.`,ze,ye,et,De,ce,tt=`Other projects under the Spyder umbrella are also making major progress. The pywinpty pseudo-terminal library has seen six official releases (three major), with a new rich high level interface to create and track processes, new process wrappers, Python 2.7 support, major performance, stability and security improvements, and many bug fixes. +Most importantly, we are proud to report that since this January Jupyter Notebook (in 5.3.0) and JupyterLab have both adopted it to create and manage system terminals on Windows! +The qtsass SASS to Qt stylesheet compiler has a new maintainer, with development including new dev infrastructure, refactoring work, a PyPI release, and new features, with more on the way. +Finally, our loghub automatic changelog generator has seen significant internal and external developer interest, as well as three releases, bug fixes, additional examples, and the ability to group issues and PRs together if desired. +The common thread between all five of these projects has been a substantially increased development pace in recent weeks, so expect to see even more good news soon if that trend continues.`,V,oe,ot="Beyond the Code",Fe,be,lt=`The team has made progress on a number of fronts outside core program development. +We’ve been joined by several new team members from around the world, who have each contributed new skillsets to the project. +Further, we’ve created, developed and deployed a brand new, modern and responsive website and blog, to provide an accessible, central source for Spyder news and information for both newcomers and old hands alike, as you might have noticed :)`,Oe,xe,at=`Our new, comprehensive Troubleshooting Guide and FAQ will help users easily resolve common issues without having to wait for a response from us, and we’ve revised and improved our Github issue tracking workflow to do an even better job at quickly responding to users’ needs. +On top of that, our Readme, contributing guide, install docs, and developer wiki have all been thoroughly overhauled to make them more up to date, informative and accessible. +Finally, we’ve deepened our relationship with NumFOCUS, integrating us more closely with the broader PyData community, as well as leading to some exciting news…but that will have to wait for our next post!`,W,ie,it="Until then, thanks for all you do for us and the community, and happy Spydering!";return{c(){n=o("p"),n.textContent=f,p=a(),d=o("p"),d.textContent=s,u=a(),c=o("h2"),c.textContent=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("img"),I=a(),_=o("p"),_.textContent=he,X=a(),P=o("h2"),P.textContent=we,D=a(),S=o("p"),S.innerHTML=ue,$=a(),T=o("img"),N=a(),M=o("p"),M.textContent=Me,L=a(),x=o("h2"),x.textContent=Ce,me=a(),E=o("p"),E.textContent=Ie,re=a(),Z=o("p"),Z.innerHTML=qe,ee=a(),G=o("p"),G.innerHTML=We,Y=a(),O=o("img"),ve=a(),se=o("p"),se.innerHTML=Qe,ke=a(),le=o("p"),le.innerHTML=Ne,_e=a(),ae=o("img"),C=a(),H=o("p"),H.innerHTML=Ze,K=a(),J=o("h2"),J.textContent=Ye,te=a(),ne=o("p"),ne.innerHTML=Xe,ze=a(),ye=o("img"),De=a(),ce=o("p"),ce.innerHTML=tt,V=a(),oe=o("h2"),oe.textContent=ot,Fe=a(),be=o("p"),be.textContent=lt,Oe=a(),xe=o("p"),xe.innerHTML=at,W=a(),ie=o("p"),ie.textContent=it,this.h()},l(v){n=l(v,"P",{"data-svelte-h":!0}),r(n)!=="svelte-pz772z"&&(n.textContent=f),p=i(v),d=l(v,"P",{"data-svelte-h":!0}),r(d)!=="svelte-181muck"&&(d.textContent=s),u=i(v),c=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(c)!=="svelte-1725v2a"&&(c.textContent=de),q=i(v),b=l(v,"P",{"data-svelte-h":!0}),r(b)!=="svelte-c9xudx"&&(b.innerHTML=ge),F=i(v),k=l(v,"IMG",{src:!0,alt:!0}),I=i(v),_=l(v,"P",{"data-svelte-h":!0}),r(_)!=="svelte-47g8gm"&&(_.textContent=he),X=i(v),P=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(P)!=="svelte-1iyzcs1"&&(P.textContent=we),D=i(v),S=l(v,"P",{"data-svelte-h":!0}),r(S)!=="svelte-8k5uw4"&&(S.innerHTML=ue),$=i(v),T=l(v,"IMG",{src:!0,alt:!0}),N=i(v),M=l(v,"P",{"data-svelte-h":!0}),r(M)!=="svelte-ryx303"&&(M.textContent=Me),L=i(v),x=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(x)!=="svelte-phh6l5"&&(x.textContent=Ce),me=i(v),E=l(v,"P",{"data-svelte-h":!0}),r(E)!=="svelte-raeu8r"&&(E.textContent=Ie),re=i(v),Z=l(v,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-1pzgygh"&&(Z.innerHTML=qe),ee=i(v),G=l(v,"P",{"data-svelte-h":!0}),r(G)!=="svelte-mdkheq"&&(G.innerHTML=We),Y=i(v),O=l(v,"IMG",{src:!0,alt:!0}),ve=i(v),se=l(v,"P",{"data-svelte-h":!0}),r(se)!=="svelte-179t22p"&&(se.innerHTML=Qe),ke=i(v),le=l(v,"P",{"data-svelte-h":!0}),r(le)!=="svelte-1i3k1yp"&&(le.innerHTML=Ne),_e=i(v),ae=l(v,"IMG",{src:!0,alt:!0}),C=i(v),H=l(v,"P",{"data-svelte-h":!0}),r(H)!=="svelte-599c63"&&(H.innerHTML=Ze),K=i(v),J=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(J)!=="svelte-19sfrxz"&&(J.textContent=Ye),te=i(v),ne=l(v,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1wt5kgk"&&(ne.innerHTML=Xe),ze=i(v),ye=l(v,"IMG",{src:!0,alt:!0}),De=i(v),ce=l(v,"P",{"data-svelte-h":!0}),r(ce)!=="svelte-159zybe"&&(ce.innerHTML=tt),V=i(v),oe=l(v,"H2",{class:!0,"data-svelte-h":!0}),r(oe)!=="svelte-1o8ccqd"&&(oe.textContent=ot),Fe=i(v),be=l(v,"P",{"data-svelte-h":!0}),r(be)!=="svelte-1m7652o"&&(be.textContent=lt),Oe=i(v),xe=l(v,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-4w5n7c"&&(xe.innerHTML=at),W=i(v),ie=l(v,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-ia2mbp"&&(ie.textContent=it),this.h()},h(){h(c,"class","section"),Te(k.src,fe="spyder_opencollective.png")||h(k,"src",fe),h(k,"alt","Spyder OpenCollective, showing many donations and backers"),h(P,"class","section"),Te(T.src,Pe="github_commit_history.png")||h(T,"src",Pe),h(T,"alt","Github commit timeseries for Spyder, with high activity over the past few years"),h(x,"class","section"),Te(O.src,Ue="varexp_array_display.png")||h(O,"src",Ue),h(O,"alt","Variable Explorer, with a variety of array types displayed"),Te(ae.src,Re="error_report_dialog.png")||h(ae,"src",Re),h(ae,"alt","New Spyder error report dialog, with more helpful UI text"),h(J,"class","section"),Te(ye.src,et="spyder_unittest.png")||h(ye,"src",et),h(ye,"alt","Spyder-unittest dialog, displaying test results"),h(oe,"class","section")},m(v,j){t(v,n,j),t(v,p,j),t(v,d,j),t(v,u,j),t(v,c,j),t(v,q,j),t(v,b,j),t(v,F,j),t(v,k,j),t(v,I,j),t(v,_,j),t(v,X,j),t(v,P,j),t(v,D,j),t(v,S,j),t(v,$,j),t(v,T,j),t(v,N,j),t(v,M,j),t(v,L,j),t(v,x,j),t(v,me,j),t(v,E,j),t(v,re,j),t(v,Z,j),t(v,ee,j),t(v,G,j),t(v,Y,j),t(v,O,j),t(v,ve,j),t(v,se,j),t(v,ke,j),t(v,le,j),t(v,_e,j),t(v,ae,j),t(v,C,j),t(v,H,j),t(v,K,j),t(v,J,j),t(v,te,j),t(v,ne,j),t(v,ze,j),t(v,ye,j),t(v,De,j),t(v,ce,j),t(v,V,j),t(v,oe,j),t(v,Fe,j),t(v,be,j),t(v,Oe,j),t(v,xe,j),t(v,W,j),t(v,ie,j)},p:wt,d(v){v&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie))}}}function ia(m){let n,f;const p=[m[0],_n];let d={$$slots:{default:[aa]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let ra=class extends vt{constructor(n){super(),bt(this,n,sa,ia,gt,{})}};const ua=Object.freeze(Object.defineProperty({__proto__:null,default:ra,metadata:_n},Symbol.toStringTag,{value:"Module"}));function da(m){let n,f=`After sharing some major milestones, development progress, and other tidbits from the past six months in Part 1 of this series (check that one out first if you haven’t already), we now have some amazing news to share with you all here in Part 2, along with other status updates. +That’s not all, though—Part 3 will look ahead toward Spyder 4 and beyond, unveiling and explaining our full roadmap and going over the future possibilities even further afield.`,p,d,s="Spyder Wins NumFOCUS Development Grant",u,c,de=`First up, we’re thrilled to announce a major part of what’s making that plan possible (along with your support, of course!). +This May, Spyder was awarded a $3000 development grant from NumFOCUS, an organization promoting better science through open code, to help with finishing Spyder 4! +NumFOCUS is a nonprofit dedicated to supporting key scientific computing projects; promoting sustainability in the open source ecosystem; educating the next generation of scientists, engineers, developers and data analysts through their flagship PyData program; and enabling and inspiring the next generation through their grants, scholarships and fellowships, diversity and inclusion program, and involvement in the Google Summer of Code.`,q,b,ge=`We applied for the funding back in March of this year, along with many other scientific Python projects, and were one of the fortunate projects selected after the review process. +The award runs from May through this November, and will enable multiple betas with new features to be released throughout 2018, with the first feature-complete release candidate of Spyder 4 planned by the year’s end (we’ll have more detail on all that in Part 3). +Check out our bio and the other projects that were funded over on the NumFOCUS announcement, and make sure to thank and support them if you get the chance.`,F,k,fe="Quansight Hires Spyder Maintainer; Helps Fund Development",I,_,he=`Equally exciting, Spyder’s maintainer, Carlos Cordoba, was recently hired by Quansight, the brand-new company headed by scientific Python luminary Travis Oliphant! +The father of much of the modern PyData ecosystem including NumPy, SciPy and Numba, Travis has been instrumental in the dramatic growth of open-source data analysis with Python through founding or helping lead Enthought, Continuum/Anaconda, NumFOCUS, and more. +Quansight, Travis’ newest venture, focuses on scaling up the PyData ecosystem to solve even larger and more integrated problems, connecting companies with the open-source tools that can benefit their business, and helping build a more robust ecosystem for open-source scientific development.`,X,P,we=`As part of that mission, Carlos was hired through at least the end of 2018 to help make several open-source projects more sustainable in the long run, and I’m sure you all will be happy to hear that one of them will be our very own Spyder! +After previously helping support the project over at Anaconda, Travis and Quansight will fund Carlos to work part-time on Spyder development, helping the project continue to grow and evolve, and keeping Spyder 4 moving along at a faster pace. +Congratulations Carlos, and thanks to Travis and Quansight!`,D,S,ue=`Aside from those two, we also have several other potential long-term funding opportunities in the pipeline. +Stay tuned to hear more about those in the coming months.`,$,T,Pe="Spyder 3.3.0 Ready to Go",N,M,Me=`Meanwhile, on the development side of things, we’ve just finished the rollout of the next update in the stable Spyder 3 line, 3.3.0, and will have a full post shortly going over the changes and enhancements in detail. +In brief, it has some significant under the hood revisions, cleaning house of some old end of life dependencies and legacy support (Python 3.3 and PyQt4 below 5.5), and separates the IPython Console kernel code into a new spyder-kernels package to make it easier for you to work with different Python environments and remote sessions, and easier for us to add exciting new features down the road. +Additionally, it adds new preferences options for console plotting and autocompletion, improves the usability and performance of Variable Explorer object viewers, includes a new, fully automated error reporting feature to make submitting reports faster, easier and more helpful, and contains a number of other minor improvements and usability enhancements, along with numerous bug fixes.`,L,x,Ce,me,E,Ie="Spyder 4 Public Beta 1 on Deck",re,Z,qe=`We’ll also be releasing the first public beta of Spyder 4 in the very near future, to allow users and developers to get their hands on the next generation of the IDE and start using and testing it as soon as possible. +There are far too many significant new features to list here, and they are more than worthy of their own full-length post, as there are many substantial changes to the Editor, Console, Variable Explorer, File Explorer, Outline Explorer, API and more.`,ee,G,We,Y,O,Ue=`Some of the major highlights in the Editor include code folding, indentation guides, multiple line length indicators, a live class/method/function panel (a la Visual Studio), many more shortcut commands, better comment/uncomment, and more. +The IPython Console gains the ability to start specialized Pylab, SymPy, and Cython consoles, and the Variable Explorer gets MultiIndex support, now natively handles all Pandas indexers, and can display sets in a dedicated GUI editor. +Meanwhile, the File Explorer now has multi-select functionality and can open any file with the user’s OS-configured external default program, while the outline explorer can now group items by cell, and in multiple levels. +Finally, Spyder 4 exposes a public API for external plugins, offers more language translations, features several global UI improvements and has numerous under the hood and refactoring changes, and countless other enhancements big and small. +It’s the future of Spyder, so if you’d like to get a taste of the cutting edge, we’d love for you to try it when it drops and let us know what you think!`,ve,se,Qe="Spyder Documentation, Reborn",ke,le,Ne=`Aside from Spyder 3 and 4, we’ve got another big ticket item for you all in the next few days: our brand new docs! +We’ve been working on a major overhaul of our documentation, which will saw its first official release with Spyder 3.3.0. +Our old docs were hosted on PyPI/PythonHosted and, with the freezing of that service, couldn’t be updated. +Therefore, we’ve now moved to maintain them in a new dedicated repo, build, deploy and host them ourselves with Sphinx, doctr and Github Pages on a subdomain of our new site making them more convenient, responsive and accessible.`,_e,ae,Re,C,H,Ze=`Furthermore, we’ve taken the opportunity to perform a comprehensive overhaul from top to bottom, dramatically improving their usefulness to users. +We’ve greatly expanded many pages and sections and adding new ones, updated outdated references, performed an exhaustive copyedit over nearly every line of the text, developed and implemented a consistent style guide, transitioned to a modern theme with our own custom CSS extensions, added or replaced many dozens of high-resolution screenshots, modified the source code and infrastructure to be easier to develop, build and maintain, and much more. +Even better, you can expect even more improvements in the coming months, as we further expand them toward the standard you’d expect for a feature-rich, multifaceted application like Spyder. +If you find an issue with them, see a section that could use expansion or improvement or even just have general actionable feedback feel free to open an issue or send us a pull request on our new repo. +We’ll have more information about what’s new and our future plans when we officially release them shortly.`,K,J,Ye="More News and Notes",te,ne,Xe="Finally, we want to make sure you all can stay better informed of Spyder-related happenings going forward, as well as get the chance to interact directly with the Spyder team.",ze,ye,et=`We’re planning on much more frequent announcements, status reports, news, and tutorials right here on our blog, as well as more timely updates on our social media, including our Facebook page and Twitter account. +Make sure to subscribe/follow if you’d like to stay up to date or want to get in touch; we only post important happenings, so we won’t inundate your feeds with trivialities. +You can also reach us on our Google Groups discussion board, our Gitter live chat, or post a comment right here below this post.`,De,ce,tt=`Thanks again for all you do to make Spyder possible, and keep a look out for the next post in this series on the future of Spyder, along with our three major releases (3.3.0, 4.0b1, and the new docs) over the next few weeks. +Happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("h2"),d.textContent=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("h2"),k.textContent=fe,I=a(),_=o("p"),_.innerHTML=he,X=a(),P=o("p"),P.textContent=we,D=a(),S=o("p"),S.textContent=ue,$=a(),T=o("h2"),T.textContent=Pe,N=a(),M=o("p"),M.innerHTML=Me,L=a(),x=o("img"),me=a(),E=o("h2"),E.textContent=Ie,re=a(),Z=o("p"),Z.textContent=qe,ee=a(),G=o("img"),Y=a(),O=o("p"),O.innerHTML=Ue,ve=a(),se=o("h2"),se.textContent=Qe,ke=a(),le=o("p"),le.innerHTML=Ne,_e=a(),ae=o("img"),C=a(),H=o("p"),H.innerHTML=Ze,K=a(),J=o("h2"),J.textContent=Ye,te=a(),ne=o("p"),ne.textContent=Xe,ze=a(),ye=o("p"),ye.innerHTML=et,De=a(),ce=o("p"),ce.textContent=tt,this.h()},l(V){n=l(V,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1hxqb5i"&&(n.innerHTML=f),p=i(V),d=l(V,"H2",{class:!0,"data-svelte-h":!0}),r(d)!=="svelte-19bcwx5"&&(d.textContent=s),u=i(V),c=l(V,"P",{"data-svelte-h":!0}),r(c)!=="svelte-1vujq9i"&&(c.innerHTML=de),q=i(V),b=l(V,"P",{"data-svelte-h":!0}),r(b)!=="svelte-12ox8lz"&&(b.innerHTML=ge),F=i(V),k=l(V,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-1nbjcvl"&&(k.textContent=fe),I=i(V),_=l(V,"P",{"data-svelte-h":!0}),r(_)!=="svelte-100rehe"&&(_.innerHTML=he),X=i(V),P=l(V,"P",{"data-svelte-h":!0}),r(P)!=="svelte-gxtm8m"&&(P.textContent=we),D=i(V),S=l(V,"P",{"data-svelte-h":!0}),r(S)!=="svelte-12rmlke"&&(S.textContent=ue),$=i(V),T=l(V,"H2",{class:!0,"data-svelte-h":!0}),r(T)!=="svelte-1r0pzr9"&&(T.textContent=Pe),N=i(V),M=l(V,"P",{"data-svelte-h":!0}),r(M)!=="svelte-aswwh3"&&(M.innerHTML=Me),L=i(V),x=l(V,"IMG",{src:!0,alt:!0}),me=i(V),E=l(V,"H2",{class:!0,"data-svelte-h":!0}),r(E)!=="svelte-1n46y8r"&&(E.textContent=Ie),re=i(V),Z=l(V,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-1vjcv3q"&&(Z.textContent=qe),ee=i(V),G=l(V,"IMG",{src:!0,alt:!0}),Y=i(V),O=l(V,"P",{"data-svelte-h":!0}),r(O)!=="svelte-14d4ii3"&&(O.innerHTML=Ue),ve=i(V),se=l(V,"H2",{class:!0,"data-svelte-h":!0}),r(se)!=="svelte-14w6993"&&(se.textContent=Qe),ke=i(V),le=l(V,"P",{"data-svelte-h":!0}),r(le)!=="svelte-n233qz"&&(le.innerHTML=Ne),_e=i(V),ae=l(V,"IMG",{src:!0,alt:!0}),C=i(V),H=l(V,"P",{"data-svelte-h":!0}),r(H)!=="svelte-15wekgt"&&(H.innerHTML=Ze),K=i(V),J=l(V,"H2",{class:!0,"data-svelte-h":!0}),r(J)!=="svelte-1bc20bm"&&(J.textContent=Ye),te=i(V),ne=l(V,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-1xq67kh"&&(ne.textContent=Xe),ze=i(V),ye=l(V,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-1o5j99t"&&(ye.innerHTML=et),De=i(V),ce=l(V,"P",{"data-svelte-h":!0}),r(ce)!=="svelte-1mo5pro"&&(ce.textContent=tt),this.h()},h(){h(d,"class","section"),h(k,"class","section"),h(T,"class","section"),Te(x.src,Ce="spyder-remote-kernel.png")||h(x,"src",Ce),h(x,"alt","A remote kernel running in a system console alongside Spyder's connect to kernel dialog"),h(E,"class","section"),Te(G.src,We="spyder-4b1-preview-editor.png")||h(G,"src",We),h(G,"alt","Preview of the new Spyder 4 Editor, showing several of the mentioned features"),h(se,"class","section"),Te(ae.src,Re="spyder-docs-preview.png")||h(ae,"src",Re),h(ae,"alt","Preview of new Spyder documentation website, displaying a modern theme/layout and better screenshots"),h(J,"class","section")},m(V,oe){t(V,n,oe),t(V,p,oe),t(V,d,oe),t(V,u,oe),t(V,c,oe),t(V,q,oe),t(V,b,oe),t(V,F,oe),t(V,k,oe),t(V,I,oe),t(V,_,oe),t(V,X,oe),t(V,P,oe),t(V,D,oe),t(V,S,oe),t(V,$,oe),t(V,T,oe),t(V,N,oe),t(V,M,oe),t(V,L,oe),t(V,x,oe),t(V,me,oe),t(V,E,oe),t(V,re,oe),t(V,Z,oe),t(V,ee,oe),t(V,G,oe),t(V,Y,oe),t(V,O,oe),t(V,ve,oe),t(V,se,oe),t(V,ke,oe),t(V,le,oe),t(V,_e,oe),t(V,ae,oe),t(V,C,oe),t(V,H,oe),t(V,K,oe),t(V,J,oe),t(V,te,oe),t(V,ne,oe),t(V,ze,oe),t(V,ye,oe),t(V,De,oe),t(V,ce,oe)},p:wt,d(V){V&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce))}}}function ha(m){let n,f;const p=[m[0],Cn];let d={$$slots:{default:[da]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let ca=class extends vt{constructor(n){super(),bt(this,n,pa,ha,gt,{})}};const fa=Object.freeze(Object.defineProperty({__proto__:null,default:ca,metadata:Cn},Symbol.toStringTag,{value:"Module"}));function ma(m){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,s='The Spyder-Terminal project is revitalized! The new 0.3.0 version adds numerous features that improve the user experience, and enhances compatibility with the latest Spyder 4 release, in part thanks to the improvements made in the xterm.js project.',u,c,de,q,b,ge="Upgrade to ES6/JSX syntax",F,k,fe="First, we were able to update all the old JavaScript files to use ES6/JSX syntax and the tests for the client terminal. This change simplified the code base and maintenance and allows us to easily extend the project to new functionalities that the xterm.js API offers. In order to compile this code and run it inside Spyder, we migrated our deployment to Webpack.",I,_,he="Multiple shells per operating system",X,P,we="In the new release, you now have the ability to configure which shell to use in the terminal. On Linux and UNIX systems, bash, sh, ksh, zsh, csh, pwsh, tcsh, screen, tmux, dash and rbash are supported, while cmd and powershell are the available options on Windows. To select your preferred command processor, simply choose it from the menu in the Terminal pane of Spyder’s preferences and restart the IDE.",D,S,ue,$,T,Pe="This is a great feature because it allows the user to determine their shell interpreter among the ones that are installed in their systems. In this way, Spyder-Terminal can be configured with any of the existing shells as long as it is available on their machine.",N,M,Me="Theme support and new UI options",L,x,Ce="Another big change in the new version is built-in support for all Spyder’s light and dark themes. When you change your Spyder theme or display options, the Terminal automatically adapt its UI, colors and fonts accordingly.",me,E,Ie,re,Z,qe="Building on the look and feel of the plugin, we also added configurable options for the terminal sounds and the cursor style. In this way, you can choose whether the terminal uses a bell sound and can select from one of three cursors.",ee,G,We,Y,O,Ue="Shortcut configuration",ve,se,Qe="Lastly, the shortcuts on the terminal are configurable within the keyboard shortcuts in Spyder 4. The terminal’s shortcuts for Copy, Paste, Clean and New terminal are now no longer hardcoded.",ke,le,Ne,_e,ae,Re='We’re excited for you to try out Spyder-Terminal 0.3.0 and experiment with the new features available; we’d like to thank NumFOCUS and Quansight for providing the funding and support that made all this work possible. Check back soon for more Spyder updates, and until then, happy coding!';return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("img"),q=a(),b=o("h2"),b.textContent=ge,F=a(),k=o("p"),k.textContent=fe,I=a(),_=o("h2"),_.textContent=he,X=a(),P=o("p"),P.innerHTML=we,D=a(),S=o("img"),$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("h2"),M.textContent=Me,L=a(),x=o("p"),x.textContent=Ce,me=a(),E=o("img"),re=a(),Z=o("p"),Z.textContent=qe,ee=a(),G=o("img"),Y=a(),O=o("h2"),O.textContent=Ue,ve=a(),se=o("p"),se.innerHTML=Qe,ke=a(),le=o("img"),_e=a(),ae=o("p"),ae.innerHTML=Re,this.h()},l(C){n=l(C,"P",{"data-svelte-h":!0}),r(n)!=="svelte-aa2x2f"&&(n.innerHTML=f),p=i(C),d=l(C,"P",{"data-svelte-h":!0}),r(d)!=="svelte-cihbgh"&&(d.innerHTML=s),u=i(C),c=l(C,"IMG",{src:!0,alt:!0}),q=i(C),b=l(C,"H2",{class:!0,"data-svelte-h":!0}),r(b)!=="svelte-1hn7hbe"&&(b.textContent=ge),F=i(C),k=l(C,"P",{"data-svelte-h":!0}),r(k)!=="svelte-7hqbeh"&&(k.textContent=fe),I=i(C),_=l(C,"H2",{class:!0,"data-svelte-h":!0}),r(_)!=="svelte-1npuvda"&&(_.textContent=he),X=i(C),P=l(C,"P",{"data-svelte-h":!0}),r(P)!=="svelte-qibysk"&&(P.innerHTML=we),D=i(C),S=l(C,"IMG",{src:!0,alt:!0}),$=i(C),T=l(C,"P",{"data-svelte-h":!0}),r(T)!=="svelte-np7xai"&&(T.textContent=Pe),N=i(C),M=l(C,"H2",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-go4upt"&&(M.textContent=Me),L=i(C),x=l(C,"P",{"data-svelte-h":!0}),r(x)!=="svelte-1skopxh"&&(x.textContent=Ce),me=i(C),E=l(C,"IMG",{src:!0,alt:!0}),re=i(C),Z=l(C,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-1togysm"&&(Z.textContent=qe),ee=i(C),G=l(C,"IMG",{src:!0,alt:!0}),Y=i(C),O=l(C,"H2",{class:!0,"data-svelte-h":!0}),r(O)!=="svelte-h3anlu"&&(O.textContent=Ue),ve=i(C),se=l(C,"P",{"data-svelte-h":!0}),r(se)!=="svelte-syy71z"&&(se.innerHTML=Qe),ke=i(C),le=l(C,"IMG",{src:!0,alt:!0}),_e=i(C),ae=l(C,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-1vjlw91"&&(ae.innerHTML=Re),this.h()},h(){Te(c.src,de="terminal.png")||h(c,"src",de),h(c,"alt","Screenshot of the new spyder-terminal"),h(b,"class","section"),h(_,"class","section"),Te(S.src,ue="shells.png")||h(S,"src",ue),h(S,"alt","UNIX shell options for starting the terminal"),h(M,"class","section"),Te(E.src,Ie="terminal-colors.gif")||h(E,"src",Ie),h(E,"alt","Spyder-Terminal new themes"),Te(G.src,We="cursor-style.png")||h(G,"src",We),h(G,"alt","Cursor options for Spyder-Terminal"),h(O,"class","section"),Te(le.src,Ne="shortcuts.png")||h(le,"src",Ne),h(le,"alt","Configurable shortcuts for the Terminal inside Spyder 4")},m(C,H){t(C,n,H),t(C,p,H),t(C,d,H),t(C,u,H),t(C,c,H),t(C,q,H),t(C,b,H),t(C,F,H),t(C,k,H),t(C,I,H),t(C,_,H),t(C,X,H),t(C,P,H),t(C,D,H),t(C,S,H),t(C,$,H),t(C,T,H),t(C,N,H),t(C,M,H),t(C,L,H),t(C,x,H),t(C,me,H),t(C,E,H),t(C,re,H),t(C,Z,H),t(C,ee,H),t(C,G,H),t(C,Y,H),t(C,O,H),t(C,ve,H),t(C,se,H),t(C,ke,H),t(C,le,H),t(C,_e,H),t(C,ae,H)},p:wt,d(C){C&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae))}}}function ya(m){let n,f;const p=[m[0],Sn];let d={$$slots:{default:[ma]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let ga=class extends vt{constructor(n){super(),bt(this,n,wa,ya,gt,{})}};const va=Object.freeze(Object.defineProperty({__proto__:null,default:ga,metadata:Sn},Symbol.toStringTag,{value:"Module"}));function ba(m){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,s='Spyder 4 will be released very soon with lots of interesting new features that you’ll want to check out, reflecting years of effort by the team to improve the user experience. In this post, we will be talking about the improvements made to the Variable Explorer.',u,c,de="These include the brand new Object Explorer for inspecting arbitrary Python variables, full support for MultiIndex dataframes with multiple dimensions, and the ability to filter and search for variables by name and type, and much more.",q,b,ge='It is important to mention that several of the above improvements were made possible through integrating the work of two other projects. Code from gtabview was used to implement the multi-dimensional Pandas indexes, while objbrowser was the foundation of the new Object Explorer.',F,k,fe="New viewer for arbitrary Python objects",I,_,he="For Spyder 4 we added a long-requested feature: full support for inspecting any kind of Python object through the Variable Explorer. For many years, Spyder has been able to view and edit a small subset of Python variables: NumPy arrays, Pandas DataFrames and Series, and builtin collections (lists, dictionaries and tuples). Other objects were displayed as dictionaries of their attributes, inspecting any of which required showing a new table. This made it rather cumbersome to use this functionality, and was the reason arbitrary Python objects were hidden by default from the Variable Explorer view.",X,P,we,D,S,ue='For the forthcoming Spyder release, we’ve integrated the excellent objbrowser project by Pepijn Kenter (@titusjan), which provides a tree-like view of Python objects, to offer a much simpler and more user-friendly way to inspect them.',$,T,Pe,N,M,Me=`As can be seen above, this viewer will also allow users to browse extra metadata about the inspected object, such as its documentation, source code and the file that holds it. +It is very important to note that this work was accomplished thanks to the generosity of Pepijn, who kindly changed the license of objbrowser to allow us to integrate it with Spyder. +To expose this new functionality, we decided to set the option to hide arbitrary Python objects in the Variable Explorer to disabled by default, and introduced a new one called Exclude callables and modules. With this enabled by default, Spyder will now display a much larger fraction of objects that can be inspected, while still excluding most “uninteresting” variables.`,L,x,Ce,me,E,Ie="Finally, we added a context-menu action to open any object using the new Object Explorer even if they already have a builtin viewer (DataFrames, arrays, etc), allowing for deeper inspection of the inner workings of these datatypes.",re,Z,qe,ee,G,We="Multi-index support in the dataframe viewer",Y,O,Ue="One of the first features we added to the Variable Explorer in Spyder 4 was MultiIndex support in its DataFrame inspector, including for multi-level and multi-dimensional indices. Spyder 3 had basic support for such, but it was very rudimentary, making inspecting such DataFrames a less than user-friendly experience.",ve,se,Qe,ke,le,Ne='For Spyder 4, we took advantage of the work done by Scott Hansen (@firecat53) and Yuri D’Elia (@wavexx) in their gtabview project, particularly its improved management of column and table headings, which allows the new version of Spyder to display the index shown above in a much nicer way.',_e,ae,Re,C,H,Ze="Fuzzy filtering of variables",K,J,Ye=`Spyder 4 also includes the ability to filter the variables shown down to only those of interest. This employs fuzzy matching between the text entered in the search field and the name and type of all available variables. +To access this functionality, click the search icon in the Variable Explorer toolbar, or press Ctrl+F (Cmd-F on macOS) when the Variable Explorer has focus.`,te,ne,Xe,ze,ye,et="To remove the current filter, simply click the search icon again, or press Esc or Ctrl+F (Cmd-F) while the Variable Explorer is focused.",De,ce,tt="Refresh while code is running",V,oe,ot='We added back the ability to refresh the Variable Explorer while code is running in the console. This feature was dropped in Spyder 3.2, when we removed the old and unmaintained Python console. However, this functionality will return in Spyder 4, thanks to the fantastic work done by Quentin Peter (@impact27) to completely re-architect the way Spyder talks to the Jupyter kernels that run the code in our IPython console, integrating support for Jupyter Comms.',Fe,be,lt,Oe,xe,at="To trigger a refresh, simply click the reload button on the Variable Explorer toolbar, or press the shortcut Ctrl+R (Cmd-R) when it has focus.",W,ie,it="Full support for sets",v,j,dt="In Spyder 3, the Variable Explorer could only show builtin Python sets as arbitrary objects, making it very difficult for users to browse and interact with them. In Spyder 4, you can now view sets just like lists, as well as perform various operations on them.",Ke,Ee,rt,nt,Ge,st="UI enhancements and more",g,z,ht="Finally, beyond the headline features, we’ve added numerous smaller improvements to make the Variable Explorer easier and more efficient to use. These include support for custom index names, better and more efficient automatic resizing of column widths, support for displaying Pandas Indices, tooltips for truncated column headers, and more.",ut,Je,pt='Spyder’s Variable Explorer is what many of you consider to be one of its standout features, so we can’t wait for you all to get your hands on the even better version in Spyder 4. Thanks again to Quansight, our generous community donors, and as always all of you! Spyder 4.0.0 final is planned to be released within approximately one more week, but if you’d like to test it out immediately, follow the instructions on our GitHub to install the pre-release version (which won’t touch your existing Spyder install or settings). As always, happy Spydering!';return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.textContent=de,q=a(),b=o("p"),b.innerHTML=ge,F=a(),k=o("h2"),k.textContent=fe,I=a(),_=o("p"),_.textContent=he,X=a(),P=o("img"),D=a(),S=o("p"),S.innerHTML=ue,$=a(),T=o("img"),N=a(),M=o("p"),M.innerHTML=Me,L=a(),x=o("img"),me=a(),E=o("p"),E.textContent=Ie,re=a(),Z=o("img"),ee=a(),G=o("h2"),G.textContent=We,Y=a(),O=o("p"),O.textContent=Ue,ve=a(),se=o("img"),ke=a(),le=o("p"),le.innerHTML=Ne,_e=a(),ae=o("img"),C=a(),H=o("h2"),H.textContent=Ze,K=a(),J=o("p"),J.innerHTML=Ye,te=a(),ne=o("img"),ze=a(),ye=o("p"),ye.innerHTML=et,De=a(),ce=o("h2"),ce.textContent=tt,V=a(),oe=o("p"),oe.innerHTML=ot,Fe=a(),be=o("img"),Oe=a(),xe=o("p"),xe.innerHTML=at,W=a(),ie=o("h2"),ie.textContent=it,v=a(),j=o("p"),j.textContent=dt,Ke=a(),Ee=o("img"),nt=a(),Ge=o("h2"),Ge.textContent=st,g=a(),z=o("p"),z.textContent=ht,ut=a(),Je=o("p"),Je.innerHTML=pt,this.h()},l(U){n=l(U,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1pjt8pm"&&(n.innerHTML=f),p=i(U),d=l(U,"P",{"data-svelte-h":!0}),r(d)!=="svelte-zhmrie"&&(d.innerHTML=s),u=i(U),c=l(U,"P",{"data-svelte-h":!0}),r(c)!=="svelte-lb2uj8"&&(c.textContent=de),q=i(U),b=l(U,"P",{"data-svelte-h":!0}),r(b)!=="svelte-5six4x"&&(b.innerHTML=ge),F=i(U),k=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-ol1fod"&&(k.textContent=fe),I=i(U),_=l(U,"P",{"data-svelte-h":!0}),r(_)!=="svelte-1bmrtq0"&&(_.textContent=he),X=i(U),P=l(U,"IMG",{src:!0,alt:!0}),D=i(U),S=l(U,"P",{"data-svelte-h":!0}),r(S)!=="svelte-yih7m7"&&(S.innerHTML=ue),$=i(U),T=l(U,"IMG",{src:!0,alt:!0}),N=i(U),M=l(U,"P",{"data-svelte-h":!0}),r(M)!=="svelte-fqkl9c"&&(M.innerHTML=Me),L=i(U),x=l(U,"IMG",{src:!0,alt:!0}),me=i(U),E=l(U,"P",{"data-svelte-h":!0}),r(E)!=="svelte-qhf1bg"&&(E.textContent=Ie),re=i(U),Z=l(U,"IMG",{src:!0,alt:!0}),ee=i(U),G=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(G)!=="svelte-11ey9cw"&&(G.textContent=We),Y=i(U),O=l(U,"P",{"data-svelte-h":!0}),r(O)!=="svelte-ode07s"&&(O.textContent=Ue),ve=i(U),se=l(U,"IMG",{src:!0,alt:!0}),ke=i(U),le=l(U,"P",{"data-svelte-h":!0}),r(le)!=="svelte-wh7ow1"&&(le.innerHTML=Ne),_e=i(U),ae=l(U,"IMG",{src:!0,alt:!0}),C=i(U),H=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(H)!=="svelte-kawc40"&&(H.textContent=Ze),K=i(U),J=l(U,"P",{"data-svelte-h":!0}),r(J)!=="svelte-1odmreo"&&(J.innerHTML=Ye),te=i(U),ne=l(U,"IMG",{src:!0,alt:!0}),ze=i(U),ye=l(U,"P",{"data-svelte-h":!0}),r(ye)!=="svelte-1ymg8ko"&&(ye.innerHTML=et),De=i(U),ce=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(ce)!=="svelte-yoz7vc"&&(ce.textContent=tt),V=i(U),oe=l(U,"P",{"data-svelte-h":!0}),r(oe)!=="svelte-1et6vii"&&(oe.innerHTML=ot),Fe=i(U),be=l(U,"IMG",{src:!0,alt:!0}),Oe=i(U),xe=l(U,"P",{"data-svelte-h":!0}),r(xe)!=="svelte-xrhmm5"&&(xe.innerHTML=at),W=i(U),ie=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(ie)!=="svelte-6yqknk"&&(ie.textContent=it),v=i(U),j=l(U,"P",{"data-svelte-h":!0}),r(j)!=="svelte-1tntgzw"&&(j.textContent=dt),Ke=i(U),Ee=l(U,"IMG",{src:!0,alt:!0}),nt=i(U),Ge=l(U,"H2",{class:!0,"data-svelte-h":!0}),r(Ge)!=="svelte-wy0pt7"&&(Ge.textContent=st),g=i(U),z=l(U,"P",{"data-svelte-h":!0}),r(z)!=="svelte-wc8yz6"&&(z.textContent=ht),ut=i(U),Je=l(U,"P",{"data-svelte-h":!0}),r(Je)!=="svelte-v5m03a"&&(Je.innerHTML=pt),this.h()},h(){h(k,"class","section"),Te(P.src,we="python-viewer.png")||h(P,"src",we),h(P,"alt","Python Viewer"),Te(T.src,Pe="python-viewer-metadata.png")||h(T,"src",Pe),h(T,"alt","Python Viewer Metadata"),Te(x.src,Ce="exclude-callables-modules.png")||h(x,"src",Ce),h(x,"alt","Exclude callables modules"),Te(Z.src,qe="view-object-explorer.png")||h(Z,"src",qe),h(Z,"alt","View object explorer"),h(G,"class","section"),Te(se.src,Qe="multi-index-support.png")||h(se,"src",Qe),h(se,"alt","Multi-index support"),Te(ae.src,Re="table-headings.png")||h(ae,"src",Re),h(ae,"alt","Table headings"),h(H,"class","section"),Te(ne.src,Xe="filter-variables.png")||h(ne,"src",Xe),h(ne,"alt","Filter variables"),h(ce,"class","section"),Te(be.src,lt="refresh.png")||h(be,"src",lt),h(be,"alt","Refresh"),h(ie,"class","section"),Te(Ee.src,rt="set-support.png")||h(Ee,"src",rt),h(Ee,"alt","Screenshot of Spyder Variable Explorer UI, showing a Python set displayed in a native viewer"),h(Ge,"class","section")},m(U,pe){t(U,n,pe),t(U,p,pe),t(U,d,pe),t(U,u,pe),t(U,c,pe),t(U,q,pe),t(U,b,pe),t(U,F,pe),t(U,k,pe),t(U,I,pe),t(U,_,pe),t(U,X,pe),t(U,P,pe),t(U,D,pe),t(U,S,pe),t(U,$,pe),t(U,T,pe),t(U,N,pe),t(U,M,pe),t(U,L,pe),t(U,x,pe),t(U,me,pe),t(U,E,pe),t(U,re,pe),t(U,Z,pe),t(U,ee,pe),t(U,G,pe),t(U,Y,pe),t(U,O,pe),t(U,ve,pe),t(U,se,pe),t(U,ke,pe),t(U,le,pe),t(U,_e,pe),t(U,ae,pe),t(U,C,pe),t(U,H,pe),t(U,K,pe),t(U,J,pe),t(U,te,pe),t(U,ne,pe),t(U,ze,pe),t(U,ye,pe),t(U,De,pe),t(U,ce,pe),t(U,V,pe),t(U,oe,pe),t(U,Fe,pe),t(U,be,pe),t(U,Oe,pe),t(U,xe,pe),t(U,W,pe),t(U,ie,pe),t(U,v,pe),t(U,j,pe),t(U,Ke,pe),t(U,Ee,pe),t(U,nt,pe),t(U,Ge,pe),t(U,g,pe),t(U,z,pe),t(U,ut,pe),t(U,Je,pe)},p:wt,d(U){U&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie),e(v),e(j),e(Ke),e(Ee),e(nt),e(Ge),e(g),e(z),e(ut),e(Je))}}}function xa(m){let n,f;const p=[m[0],Tn];let d={$$slots:{default:[ba]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let _a=class extends vt{constructor(n){super(),bt(this,n,ka,xa,gt,{})}};const Ca=Object.freeze(Object.defineProperty({__proto__:null,default:_a,metadata:Tn},Symbol.toStringTag,{value:"Module"}));function Sa(m){let n,f='This blogpost was originally published on the Quansight Labs website',p,d,s=`TDK-Micronas is sponsoring Spyder development efforts through Quansight Labs. +This will enable the development of some features that have been requested by +our users, as well as new features that will help TDK develop custom Spyder +plugins in order to complement their Automatic Test Equipment (ATE’s) in the +development of their Application Specific Integrated Circuits (ASIC’s).`,u,c,de=`At this point it may be useful to clarify the relationship the role of +Quansight Labs in Spyder’s development and the relationship with TDK. To quote +Ralf Gommers (director of Quansight Labs):`,q,b,ge=`

    “We’re an R&D lab for open source development of core technologies around data +science and scientific computing in Python. And focused on growing communities +around those technologies. That’s how I see it for Spyder as well: Quansight +Labs enables developers to be employed to work on Spyder, and helps with +connecting them to developers of other projects in similar situations. Labs +should be an enabler to let the Spyder project, its community and individual +developers grow. And Labs provides mechanisms to attract and coordinate +funding. Of course the project is still independent. If there are other +funding sources, e.g. donations from individuals to Spyder via OpenCollective, +all the better.”

    `,F,k,fe="Multiple Projects aka Workspaces",I,_,he=`In its current state Spyder can only handle one active project at a time. +Although in the past we had basic support for workspaces, it was never a fully +functional feature, so to ease development and simplify the user experience, +we decided to remove it in the 3.x series.`,X,P,we=`For TDK-Micronas, as well as for a large part of the Spyder user base, the use +of multiple simultaneous projects is a common pattern, so this enhancement +will:`,D,S,ue=`
  • Move from a single to a multiple active projects concept
  • Change the name Project Explorer to WorkSpace Explorer.
  • Copying from one project to another is done in the ‘Explorer’ by means of +context menus.
  • `,$,T,Pe=`It is worth mentioning that projects are considered an “advanced feature”, +so it will not be forced on users that just want to get some work done. +Projects usage is, and will remain, an optional feature.`,N,M,Me="Project Types",L,x,Ce=`Since the revamp of Spyder Projects with the 3.x series, the new dialog hinted +at the possibility of creating different types of projects. Currently Spyder +provides an “empty project” project type.`,me,E,Ie,re,Z,qe="This feature will:",ee,G,We=`
  • Expand the (current) Project Explorer API to handle Project Types.
  • Define and implement the minimal aspects that should be extensible by a +Project Type
  • `,Y,O,Ue="File Associations",ve,se,Qe=`Spyder currently supports opening files on the Project and File Explorer +using the (default) Operating System defined applications. We will enhance +this by adding Global file associations as part of the Preferences +and Project Specific associations as part of the Project Preferences. +This will give users more power to select the tool or set of tools that they +prefer to use for specific projects and tasks directly on the File and Project +Explorer pane.`,ke,le,Ne="URL Awareness",_e,ae,Re=`Working with projects requires access to documentation, located within the +computer as other files or links located over the internet. We will now +include integration for URI detection within the editor so users can +Ctrl+Click on these items. This will work similarly as module +inspection works, but generalized to external and internal links.`,C,H,Ze="Git version control enhancements",K,J,Ye=`The revision system of choice by our user base, including TDK, is Git. +The purpose of this enhancement is to enable basic Git integration from +within the File and Project Explorer and to extend the current plugin +API so context menus can be customized with specific Git features and +commands.`,te,ne,Xe=`Initial work has already started to display Git relevant information +on the status bar`,ze,ye,et,De,ce,tt="Git status is now displayed in the status bar (on the left)",V,oe,ot="Editor alternative views",Fe,be,lt=`There are many circumstances where a user would like to edit a file that might +be rendered using a parsing tool into another type of view. One example of +this is Markdown, the markup language in which this blog post is written and +that can be rendered to HTML. At the moment the only way to achieve this within +Spyder is via the use of a dedicated plugin that would create a new type of +Pane. An example of such a plugin is spyder-reports +(See image below and the Reports pane). The reason why plugins are developed +this way is because the Editor Plugin on Spyder can only contain Code Editor +widgets, which prevents us and other developers to use the Editor to hold +these alternate views of a given file.`,Oe,xe,at,W,ie,it=`The new alternative views feature will remove this limitation and enable the +inclusion of generic widgets (views) of different types of files and provide +an API for plugin extensions.`,v,j,dt="Closing Remarks",Ke,Ee,rt=`I would like to thank TDK-Micronas and Quansight for the opportunity to +work in open source development on an awesome product such as Spyder.`,nt,Ge,st=`I would also like to thank the users, +contributors +and core developers for helping +make Spyder an awesome tool!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.textContent=s,u=a(),c=o("p"),c.textContent=de,q=a(),b=o("blockquote"),b.innerHTML=ge,F=a(),k=o("h2"),k.textContent=fe,I=a(),_=o("p"),_.textContent=he,X=a(),P=o("p"),P.textContent=we,D=a(),S=o("ul"),S.innerHTML=ue,$=a(),T=o("p"),T.textContent=Pe,N=a(),M=o("h2"),M.textContent=Me,L=a(),x=o("p"),x.textContent=Ce,me=a(),E=o("img"),re=a(),Z=o("p"),Z.textContent=qe,ee=a(),G=o("ul"),G.innerHTML=We,Y=a(),O=o("h2"),O.textContent=Ue,ve=a(),se=o("p"),se.innerHTML=Qe,ke=a(),le=o("h2"),le.textContent=Ne,_e=a(),ae=o("p"),ae.innerHTML=Re,C=a(),H=o("h2"),H.textContent=Ze,K=a(),J=o("p"),J.textContent=Ye,te=a(),ne=o("p"),ne.textContent=Xe,ze=a(),ye=o("img"),De=a(),ce=o("small"),ce.textContent=tt,V=a(),oe=o("h2"),oe.textContent=ot,Fe=a(),be=o("p"),be.innerHTML=lt,Oe=a(),xe=o("img"),W=a(),ie=o("p"),ie.textContent=it,v=a(),j=o("h2"),j.textContent=dt,Ke=a(),Ee=o("p"),Ee.textContent=rt,nt=a(),Ge=o("p"),Ge.innerHTML=st,this.h()},l(g){n=l(g,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1wz2w3n"&&(n.innerHTML=f),p=i(g),d=l(g,"P",{"data-svelte-h":!0}),r(d)!=="svelte-89nr4s"&&(d.textContent=s),u=i(g),c=l(g,"P",{"data-svelte-h":!0}),r(c)!=="svelte-hirzgk"&&(c.textContent=de),q=i(g),b=l(g,"BLOCKQUOTE",{"data-svelte-h":!0}),r(b)!=="svelte-194ra0z"&&(b.innerHTML=ge),F=i(g),k=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(k)!=="svelte-39xyj3"&&(k.textContent=fe),I=i(g),_=l(g,"P",{"data-svelte-h":!0}),r(_)!=="svelte-vy7895"&&(_.textContent=he),X=i(g),P=l(g,"P",{"data-svelte-h":!0}),r(P)!=="svelte-7p7tjc"&&(P.textContent=we),D=i(g),S=l(g,"UL",{"data-svelte-h":!0}),r(S)!=="svelte-1w77dxh"&&(S.innerHTML=ue),$=i(g),T=l(g,"P",{"data-svelte-h":!0}),r(T)!=="svelte-1dm11il"&&(T.textContent=Pe),N=i(g),M=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(M)!=="svelte-tffyri"&&(M.textContent=Me),L=i(g),x=l(g,"P",{"data-svelte-h":!0}),r(x)!=="svelte-d46gag"&&(x.textContent=Ce),me=i(g),E=l(g,"IMG",{src:!0,alt:!0}),re=i(g),Z=l(g,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-1jp4yz4"&&(Z.textContent=qe),ee=i(g),G=l(g,"UL",{"data-svelte-h":!0}),r(G)!=="svelte-bodz6j"&&(G.innerHTML=We),Y=i(g),O=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(O)!=="svelte-a5agc"&&(O.textContent=Ue),ve=i(g),se=l(g,"P",{"data-svelte-h":!0}),r(se)!=="svelte-r42ead"&&(se.innerHTML=Qe),ke=i(g),le=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(le)!=="svelte-1wpheau"&&(le.textContent=Ne),_e=i(g),ae=l(g,"P",{"data-svelte-h":!0}),r(ae)!=="svelte-pnkj4r"&&(ae.innerHTML=Re),C=i(g),H=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(H)!=="svelte-c0fzzy"&&(H.textContent=Ze),K=i(g),J=l(g,"P",{"data-svelte-h":!0}),r(J)!=="svelte-1vxpn4r"&&(J.textContent=Ye),te=i(g),ne=l(g,"P",{"data-svelte-h":!0}),r(ne)!=="svelte-11f51nv"&&(ne.textContent=Xe),ze=i(g),ye=l(g,"IMG",{src:!0,alt:!0}),De=i(g),ce=l(g,"SMALL",{"data-svelte-h":!0}),r(ce)!=="svelte-1d84hxu"&&(ce.textContent=tt),V=i(g),oe=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(oe)!=="svelte-121xd8m"&&(oe.textContent=ot),Fe=i(g),be=l(g,"P",{"data-svelte-h":!0}),r(be)!=="svelte-1w1g9e1"&&(be.innerHTML=lt),Oe=i(g),xe=l(g,"IMG",{src:!0,alt:!0}),W=i(g),ie=l(g,"P",{"data-svelte-h":!0}),r(ie)!=="svelte-zs1sj3"&&(ie.textContent=it),v=i(g),j=l(g,"H2",{class:!0,"data-svelte-h":!0}),r(j)!=="svelte-19du5tw"&&(j.textContent=dt),Ke=i(g),Ee=l(g,"P",{"data-svelte-h":!0}),r(Ee)!=="svelte-1xw2w4l"&&(Ee.textContent=rt),nt=i(g),Ge=l(g,"P",{"data-svelte-h":!0}),r(Ge)!=="svelte-19xo1zm"&&(Ge.innerHTML=st),this.h()},h(){h(k,"class","section"),h(M,"class","section"),Te(E.src,Ie="spyder-project-creation.png")||h(E,"src",Ie),h(E,"alt","Project creation"),h(O,"class","section"),h(le,"class","section"),h(H,"class","section"),Te(ye.src,et="spyder-git-status.png")||h(ye,"src",et),h(ye,"alt","Status bar git"),h(oe,"class","section"),Te(xe.src,at="spyder-reports.png")||h(xe,"src",at),h(xe,"alt","Spyder Reports"),h(j,"class","section")},m(g,z){t(g,n,z),t(g,p,z),t(g,d,z),t(g,u,z),t(g,c,z),t(g,q,z),t(g,b,z),t(g,F,z),t(g,k,z),t(g,I,z),t(g,_,z),t(g,X,z),t(g,P,z),t(g,D,z),t(g,S,z),t(g,$,z),t(g,T,z),t(g,N,z),t(g,M,z),t(g,L,z),t(g,x,z),t(g,me,z),t(g,E,z),t(g,re,z),t(g,Z,z),t(g,ee,z),t(g,G,z),t(g,Y,z),t(g,O,z),t(g,ve,z),t(g,se,z),t(g,ke,z),t(g,le,z),t(g,_e,z),t(g,ae,z),t(g,C,z),t(g,H,z),t(g,K,z),t(g,J,z),t(g,te,z),t(g,ne,z),t(g,ze,z),t(g,ye,z),t(g,De,z),t(g,ce,z),t(g,V,z),t(g,oe,z),t(g,Fe,z),t(g,be,z),t(g,Oe,z),t(g,xe,z),t(g,W,z),t(g,ie,z),t(g,v,z),t(g,j,z),t(g,Ke,z),t(g,Ee,z),t(g,nt,z),t(g,Ge,z)},p:wt,d(g){g&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G),e(Y),e(O),e(ve),e(se),e(ke),e(le),e(_e),e(ae),e(C),e(H),e(K),e(J),e(te),e(ne),e(ze),e(ye),e(De),e(ce),e(V),e(oe),e(Fe),e(be),e(Oe),e(xe),e(W),e(ie),e(v),e(j),e(Ke),e(Ee),e(nt),e(Ge))}}}function Ta(m){let n,f;const p=[m[0],Pn];let d={$$slots:{default:[Sa]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let Ma=class extends vt{constructor(n){super(),bt(this,n,Pa,Ta,gt,{})}};const Ha=Object.freeze(Object.defineProperty({__proto__:null,default:Ma,metadata:Pn},Symbol.toStringTag,{value:"Module"}));function La(m){let n,f='This blogpost was originally published on the Quansight Labs website.',p,d,s=`I joined the Spyder team almost two years ago, and I never thought I was going to end up working on docs. +Six months ago I started a project with CAM Gerlach and Carlos Cordoba to improve Spyder’s documentation. +At first, I didn’t actually understand how important docs are for software, especially for open source projects. +However, during all this time I’ve learned how documentation has a huge impact on the open-source community and I’ve been thankful to have been able to do this. +But, from the beginning, I asked myself “why am I the ‘right person’ for this?”`,u,c,de=`Improving Spyder’s documentation started as part of a NumFOCUS Small Development Grant awarded at the end of last year. +The goal of the project was not only to update the documentation for Spyder 4, but also to make it more user-friendly, so users can understand Spyder’s key concepts and get started with it more easily.`,q,b,ge="One of the main ideas for this project was to create a series of short video tutorials, explaining the basic functionality of Spyder and its most important panes, allowing users to learn how to use Spyder faster and easier.",F,k,fe="Carlos Cordoba, our lead maintainer, thought I was the perfect person for this project because of my “good communication and organization skills”, my “clear and fluent English” (his words) and my previous experience at video editing and recording, which I actually gained by recording singing videos during my “YouTuber” phase.",I,_,he=`I’ve always been interested in education and worked as a tutor for several years learning different tools, gaining experience on how to teach and questioning the effectiveness of current educational methods. +This was the first reason why I got interested in this project. +For me, documentation is just a fancy way of saying “educating people on using software”. +The challenge here was not recording and editing the videos (which was actually a pretty arduous task), or planning the content for them; the real challenge was to make an impact in such a way that users could find documentation actually useful.`,X,P,we=`When users start to use a new IDE, or any new software, they usually refer to its documentation, which sometimes doesn’t give enough tools for them to start from zero. +This was, then, the whole purpose of the tutorial videos. +Spyder’s documentation was already very complete in terms of explaining all the features and cool things you can do with each of its panes. +However, if I’m a completely new user and I don’t even know how to open it, where do I start?`,D,S,ue=`I planned these videos as a series of progressive steps that can get users from zero experience to actually working with Spyder. +Hence, I divided the videos into three sections, “First Steps with Spyder”, “Working with Spyder”, and “Building Projects with Spyder”. +Each section builds on the one before in a way that they are clear enough so that users can find their way through Spyder without knowing anything about it.`,$,T,Pe=`The “First Steps with Spyder” section, live now on our YouTube channel, has three videos that provide a starting point for new users before they even open Spyder for the first time. +The first tutorial covers different ways of opening Spyder, the basics of using its interface and an introduction to its four main panes, along with a quick look at the others so that users can get familiar with how Spyder is organized.`,N,M,Me=`In the second video, users can learn the basics of using Spyder’s four main panes. +The goal is that after this video, users are able to open and edit a file in the Editor, run a script and find the output in Spyder’s IPython Console and execute basic Python commands. +They should be able to interact with the Variable Explorer to browse and edit the objects in the console, and use the Help pane to get documentation in two different ways.`,L,x,Ce=`The third video is meant to show users how to customize Spyder’s interface to start working with it in the way they feel more comfortable according to their preferences. +It teaches users how to change the font and the theme of Spyder and rearrange its panes to display only the ones that they want such that it is easier for them to work.`,me,E,Ie=`After these three videos, I learned that one of the most important things for writing documentation, more than having a lot of experience with the software, is empathy. +Usually being a developer makes it hard to put yourself in the position of a user and understand exactly what a user needs. +Now, I realize that this is what actually makes me the “perfect person” for the project. +As a junior developer, without as much experience with Spyder, I was able to think more like new users and develop content in a way that they feel closer to us developers. +In the end, as Melissa said in her blog post, I learned writing documentation is also a way of building community.`,re,Z,qe="I hope these videos are really useful, and I look forward to continue finding ways of making the open source community better.",ee,G,We="Happy Spydering!";return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("p"),b.textContent=ge,F=a(),k=o("p"),k.textContent=fe,I=a(),_=o("p"),_.textContent=he,X=a(),P=o("p"),P.textContent=we,D=a(),S=o("p"),S.textContent=ue,$=a(),T=o("p"),T.innerHTML=Pe,N=a(),M=o("p"),M.innerHTML=Me,L=a(),x=o("p"),x.innerHTML=Ce,me=a(),E=o("p"),E.innerHTML=Ie,re=a(),Z=o("p"),Z.textContent=qe,ee=a(),G=o("p"),G.textContent=We},l(Y){n=l(Y,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1c3xat3"&&(n.innerHTML=f),p=i(Y),d=l(Y,"P",{"data-svelte-h":!0}),r(d)!=="svelte-1ekmroj"&&(d.innerHTML=s),u=i(Y),c=l(Y,"P",{"data-svelte-h":!0}),r(c)!=="svelte-3uobbg"&&(c.innerHTML=de),q=i(Y),b=l(Y,"P",{"data-svelte-h":!0}),r(b)!=="svelte-1nsl4ig"&&(b.textContent=ge),F=i(Y),k=l(Y,"P",{"data-svelte-h":!0}),r(k)!=="svelte-13wakb2"&&(k.textContent=fe),I=i(Y),_=l(Y,"P",{"data-svelte-h":!0}),r(_)!=="svelte-8i2tyt"&&(_.textContent=he),X=i(Y),P=l(Y,"P",{"data-svelte-h":!0}),r(P)!=="svelte-1taoegn"&&(P.textContent=we),D=i(Y),S=l(Y,"P",{"data-svelte-h":!0}),r(S)!=="svelte-ovfvik"&&(S.textContent=ue),$=i(Y),T=l(Y,"P",{"data-svelte-h":!0}),r(T)!=="svelte-uwjnw4"&&(T.innerHTML=Pe),N=i(Y),M=l(Y,"P",{"data-svelte-h":!0}),r(M)!=="svelte-q2p4uz"&&(M.innerHTML=Me),L=i(Y),x=l(Y,"P",{"data-svelte-h":!0}),r(x)!=="svelte-4qc8rx"&&(x.innerHTML=Ce),me=i(Y),E=l(Y,"P",{"data-svelte-h":!0}),r(E)!=="svelte-ixkqq3"&&(E.innerHTML=Ie),re=i(Y),Z=l(Y,"P",{"data-svelte-h":!0}),r(Z)!=="svelte-aq4wil"&&(Z.textContent=qe),ee=i(Y),G=l(Y,"P",{"data-svelte-h":!0}),r(G)!=="svelte-11fpu20"&&(G.textContent=We)},m(Y,O){t(Y,n,O),t(Y,p,O),t(Y,d,O),t(Y,u,O),t(Y,c,O),t(Y,q,O),t(Y,b,O),t(Y,F,O),t(Y,k,O),t(Y,I,O),t(Y,_,O),t(Y,X,O),t(Y,P,O),t(Y,D,O),t(Y,S,O),t(Y,$,O),t(Y,T,O),t(Y,N,O),t(Y,M,O),t(Y,L,O),t(Y,x,O),t(Y,me,O),t(Y,E,O),t(Y,re,O),t(Y,Z,O),t(Y,ee,O),t(Y,G,O)},p:wt,d(Y){Y&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k),e(I),e(_),e(X),e(P),e(D),e(S),e($),e(T),e(N),e(M),e(L),e(x),e(me),e(E),e(re),e(Z),e(ee),e(G))}}}function Ia(m){let n,f;const p=[m[0],Mn];let d={$$slots:{default:[La]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}let $a=class extends vt{constructor(n){super(),bt(this,n,ja,Ia,gt,{})}};const Aa=Object.freeze(Object.defineProperty({__proto__:null,default:$a,metadata:Mn},Symbol.toStringTag,{value:"Module"}));function Ea(m){let n,f=`Quansight, the company recently founded by NumPy, SciPy and Anaconda creator Travis Oliphant to help connect companies with open source communities built around data science and machine learning, just released Episode 1 of its live webcast series, and it was all about Spyder! +Spyder maintainer Carlos Córdoba, recently hired by Quansight and funded part-time to work on Spyder development as we announced a few weeks ago, was the featured guest on the show.`,p,d,s=`Carlos first shared his perspective on some of the key moments in Spyder’s nearly 10-year development history, from its original creation by Pierre Raybaut and Carlos’ initial involvement in the project to its more recent challenges and successes. +He also demonstrated basic usage of Spyder, as well as some of its standout features, in a live on-screen demo. +Carlos then went on to outline the current roadmap for Spyder 4 in the near future, and explained some of the key new features planned for it. +Finally, he took the time to answer a variety of Spyder-related questions asked live by viewers, ranging from specific current and planned Spyder features to suggestions on keeping a good work-life balance. +While technical difficulties (since identified and resolved) interrupted some of his commentary, particularly in the roadmap section, a full account of the latter will be published here shortly.`,u,c,de=`If you missed the webcast, Quansight recorded it and uploaded it to their new Youtube channel, so you can watch it on-demand right here if you’re curious about any of the above. +Give it a like if you enjoy it to show Quansight some love for helping support Spyder’s further development!`,q,b,ge,F,k,fe=`We’ll have a new post on the release of Spyder 3.3.1 (and 3.3.0) in a few days time, plus articles on our new docs, Spyder 4 beta 1, and our full roadmap all in the next week or so; there’s plenty going on that you won’t want to miss. +Keep it right here to catch all that—and in the meantime, happy Spydering!`;return{c(){n=o("p"),n.innerHTML=f,p=a(),d=o("p"),d.innerHTML=s,u=a(),c=o("p"),c.innerHTML=de,q=a(),b=o("iframe"),F=a(),k=o("p"),k.textContent=fe,this.h()},l(I){n=l(I,"P",{"data-svelte-h":!0}),r(n)!=="svelte-1ekiaxh"&&(n.innerHTML=f),p=i(I),d=l(I,"P",{"data-svelte-h":!0}),r(d)!=="svelte-4osmhr"&&(d.innerHTML=s),u=i(I),c=l(I,"P",{"data-svelte-h":!0}),r(c)!=="svelte-8641gl"&&(c.innerHTML=de),q=i(I),b=l(I,"IFRAME",{title:!0,width:!0,height:!0,src:!0,frameborder:!0,allow:!0}),jt(b).forEach(e),F=i(I),k=l(I,"P",{"data-svelte-h":!0}),r(k)!=="svelte-319fyz"&&(k.textContent=fe),this.h()},h(){h(b,"title","Episode 1"),h(b,"width","640"),h(b,"height","360"),Te(b.src,ge="https://www.youtube-nocookie.com/embed/vtLdH4VbACA")||h(b,"src",ge),h(b,"frameborder","0"),h(b,"allow","autoplay; encrypted-media"),b.allowFullscreen=!0},m(I,_){t(I,n,_),t(I,p,_),t(I,d,_),t(I,u,_),t(I,c,_),t(I,q,_),t(I,b,_),t(I,F,_),t(I,k,_)},p:wt,d(I){I&&(e(n),e(p),e(d),e(u),e(c),e(q),e(b),e(F),e(k))}}}function za(m){let n,f;const p=[m[0],Hn];let d={$$slots:{default:[Ea]},$$scope:{ctx:m}};for(let s=0;s{f(0,n=Ae(Ae({},n),Be(p)))},n=Be(n),[n]}class Ga extends vt{constructor(n){super(),bt(this,n,Da,za,gt,{})}}const qa=Object.freeze(Object.defineProperty({__proto__:null,default:Ga,metadata:Hn},Symbol.toStringTag,{value:"Module"})),qn=m=>m!=null,qi=async(m,n)=>{const p=Object.entries(Object.assign({"/src/routes/blog/STX-interview/+page.md":wo,"/src/routes/blog/cbi-installers/+page.md":ko,"/src/routes/blog/czi-grant/+page.md":Po,"/src/routes/blog/ide-ux-bof-scipy-2024/+page.md":jo,"/src/routes/blog/installer-improvements/+page.md":Do,"/src/routes/blog/introducing-unittest-plugin/+page.md":Wo,"/src/routes/blog/introducing-watchlist-plugin/+page.md":Bo,"/src/routes/blog/release-qtconsole-440/+page.md":Yo,"/src/routes/blog/release-spyder-330/+page.md":ol,"/src/routes/blog/release-spyder-4/+page.md":rl,"/src/routes/blog/release-spyder-4beta2/+page.md":cl,"/src/routes/blog/release-spyder-6.0.0/+page.md":gl,"/src/routes/blog/reusable-research-bof-scipy-2023-part-2/+page.md":_l,"/src/routes/blog/reusable-research-bof-scipy-2023/+page.md":Ml,"/src/routes/blog/spyder-6-daniel/+page.md":$l,"/src/routes/blog/spyder-6-remote-development/+page.md":Gl,"/src/routes/blog/spyder-debugger/+page.md":Ul,"/src/routes/blog/spyder-files-improvements/+page.md":Vl,"/src/routes/blog/spyder-kite-funding/+page.md":Xl,"/src/routes/blog/spyder-roadmap-proposals-2022/+page.md":la,"/src/routes/blog/spyder-status-2018-past/+page.md":ua,"/src/routes/blog/spyder-status-2018-present/+page.md":fa,"/src/routes/blog/spyder-terminal-030/+page.md":va,"/src/routes/blog/spyder-variable-explorer/+page.md":Ca,"/src/routes/blog/tdk-micronas-partners-with-quansight-labs/+page.md":Ha,"/src/routes/blog/tutorial-docs/+page.md":Aa,"/src/routes/blog/webcast-quansight-ep1/+page.md":qa})).map(([q,b])=>{const{metadata:ge}=b,F=q.split("/");F.pop();const k=F.slice(-1).join("/");return{meta:ge,path:k}}),d=Wa(p);if(!qn(m)||!qn(n))return d;const s=(m-1)*n,u=s+n,c=d.slice(s,u),de=Math.ceil(d.length/n);return{posts:c,pageNum:m,totalPages:de}};function Fn(m){const n={year:"numeric",month:"long",day:"numeric"};return new Date(m).toLocaleDateString("en-US",n)}async function Fa(m,n){try{const f=await(n||fetch)(`/assets/authors/${m}/metadata.json`);if(!f.ok)throw new Error("Failed to load author metadata");const p=await f.json();return{src:`/assets/authors/${m}/${p.image}`,name:p.name}}catch(f){return console.error("Failed to load author metadata:",f),null}}async function Oa(m){return!m||!Array.isArray(m)?(console.error("Invalid authors data:",m),[]):await Promise.all(m.map(f=>Fa(f)))}const Wa=m=>m.sort((n,f)=>new Date(f.meta.pub_date)-new Date(n.meta.pub_date)),Fi=m=>Math.random().toString(24).replace(/[^a-z]+/g,""),Ua=()=>{if(typeof window<"u"){const m=navigator.userAgent.toLowerCase(),n={mac:["mac"],windows:["win"],linux:["linux"]};for(const f in n)if(n[f].some(p=>m.includes(p)))return f}},Na=(m,n)=>{let f=[{}],p="";return n==="windows"?p="for Windows 10+":n==="linux"?p="for Linux":n==="mac"&&(p="for macOS",f=[{highlight:!0,icon:`${n}`,text:`Download ${p} 14.0+ (M1)`,href:`${m}/download?os=${n}&arch=arm64`},{highlight:!0,icon:`${n}`,text:`Download ${p} 12.0+ (Intel)`,href:`${m}/download?os=${n}&arch=x64`}]),(n==="windows"||n==="linux")&&(f=[{highlight:!0,icon:`${n}`,text:`Download ${p}`,href:`${m}/download?os=${n}&arch=x64`}]),f};async function Oi(m){try{return(await Yn(()=>import("./index.D7Jwt5yH.js"),[],import.meta.url))[m]}catch(n){return console.error(`Failed to load icon: ${m}`,n),null}}const Ra=localStorage.getItem("colourScheme")||"light",Qa=Ln(Ra);Qa.subscribe(m=>{localStorage.setItem("colourScheme",m),console.log("Colour scheme set to",m)});function Ba(){const{subscribe:m,set:n,update:f}=Ln({title:"",description:"",keywords:"",author:"",url:"",image:"",site:""});return{subscribe:m,setMetadata:p=>n(p),reset:()=>n({title:"",description:"",keywords:"",author:"",url:"",image:"",site:""})}}const Wn=Ba(),Va=Ln({loading:!0});setTimeout(()=>{const m=Ua(),n=Na(Bt,m);Va.set({loading:!1,os:m,osButtons:n})},0);export{ca as $,Oi as A,Fi as B,Ve as C,ti as D,ei as E,xo as F,To as G,Io as H,zo as I,Oo as J,Qo as K,Zo as L,uo as M,nl as N,sl as O,yo as P,pl as Q,wl as R,Pl as S,kl as T,jl as U,Dl as V,Wl as W,Bl as X,Yl as Y,oa as Z,ra as _,ii as a,ga as a0,_a as a1,Ma as a2,$a as a3,Ga as a4,ai as b,ni as c,oo as d,oi as e,qi as f,St as g,An as h,Ua as i,io as j,li as k,Oa as l,Wn as m,Fn as n,ao as o,Qa as p,si as q,hi as r,Yt as s,eo as t,pi as u,to as v,ui as w,Va as x,di as y,ri as z}; diff --git a/_app/immutable/chunks/Blog.CCBUvJ2X.js b/_app/immutable/chunks/Blog.BORsW5Py.js similarity index 97% rename from _app/immutable/chunks/Blog.CCBUvJ2X.js rename to _app/immutable/chunks/Blog.BORsW5Py.js index d4fa40e..25218c5 100644 --- a/_app/immutable/chunks/Blog.CCBUvJ2X.js +++ b/_app/immutable/chunks/Blog.BORsW5Py.js @@ -1 +1 @@ -import{s as fe,c as ge,n as G,h as Q}from"./scheduler.DK_yUdRf.js";import{S as ue,i as he,e as E,s as y,c as P,a as M,f as q,d as p,y as b,g as L,h as d,n as I,k as X,l as D,m as Y,u as S,v as T,w as H,x as z,t as V,b as $,j as R,z as O}from"./index.BH5W4qoH.js";import{h as Z,u as _e}from"./await_block.MuLFoa1l.js";import{M as de,b as U,j as pe,m as be,t as ve,d as ke,k as Ee,c as Pe,o as we,l as Me,h as B,s as x,n as ee}from"./31.DSOxMhdt.js";import{b as C}from"./entry.D3evG2He.js";import{p as Ne}from"./stores.BM3ezKuT.js";import{L as Ae}from"./Loader.BLQl2yzu.js";import{B as me}from"./Button.ChCyQFAf.js";function te(s){let e,l;return e=new me({props:{icon:"chevronLeft",href:C+"/"+s[2]+"/"+(s[0]-1),text:"Previous",iconPosition:"left",highlight:!0}}),{c(){S(e.$$.fragment)},l(t){T(e.$$.fragment,t)},m(t,a){H(e,t,a),l=!0},p(t,a){const r={};a&5&&(r.href=C+"/"+t[2]+"/"+(t[0]-1)),e.$set(r)},i(t){l||(I(e.$$.fragment,t),l=!0)},o(t){D(e.$$.fragment,t),l=!1},d(t){z(e,t)}}}function ae(s){let e,l;return e=new me({props:{icon:"chevronRight",href:C+"/"+s[2]+"/"+(s[0]+1),text:"Next",iconPosition:"right",highlight:!0}}),{c(){S(e.$$.fragment)},l(t){T(e.$$.fragment,t)},m(t,a){H(e,t,a),l=!0},p(t,a){const r={};a&5&&(r.href=C+"/"+t[2]+"/"+(t[0]+1)),e.$set(r)},i(t){l||(I(e.$$.fragment,t),l=!0)},o(t){D(e.$$.fragment,t),l=!1},d(t){z(e,t)}}}function Ie(s){let e,l,t,a=s[0]>1&&te(s),r=s[0]1?a?(a.p(n,o),o&1&&I(a,1)):(a=te(n),a.c(),I(a,1),a.m(e,l)):a&&(X(),D(a,1,1,()=>{a=null}),Y()),n[0]{r=null}),Y())},i(n){t||(I(a),I(r),t=!0)},o(n){D(a),D(r),t=!1},d(n){n&&p(e),a&&a.d(),r&&r.d()}}}function ye(s,e,l){let{pageNum:t}=e,{totalPages:a}=e,{route:r}=e;return s.$$set=n=>{"pageNum"in n&&l(0,t=n.pageNum),"totalPages"in n&&l(1,a=n.totalPages),"route"in n&&l(2,r=n.route)},[t,a,r]}class qe extends ue{constructor(e){super(),he(this,e,ye,Ie,fe,{pageNum:0,totalPages:1,route:2})}}function le(s,e,l){const t=s.slice();return t[8]=e[l],t}function re(s,e,l){const t=s.slice();return t[11]=e[l],t}function ne(s,e,l){const t=s.slice();return t[11]=e[l],t}function De(s){let e,l,t=s[16].message+"",a;return{c(){e=E("p"),l=V("Error loading posts: "),a=V(t)},l(r){e=P(r,"P",{});var n=M(e);l=$(n,"Error loading posts: "),a=$(n,t),n.forEach(p)},m(r,n){L(r,e,n),d(e,l),d(e,a)},p(r,n){n&4&&t!==(t=r[16].message+"")&&R(a,t)},i:G,o:G,d(r){r&&p(e)}}}function Le(s){let e,l,t,a,r=B(s[7]),n=[];for(let o=0;oo,i.anchor=null,m=!0},p(c,[g]){s=c,i.ctx=s,g&4&&h!==(h=s[2])&&Z(h,i)||_e(i,s,g)},i(c){m||(I(e.$$.fragment,c),I(i.block),m=!0)},o(c){D(e.$$.fragment,c);for(let g=0;g<3;g+=1){const _=i.blocks[g];D(_)}m=!1},d(c){c&&(p(l),p(t)),z(e,c),i.block.d(),i.token=null,i=null}}}function je(s,e,l){let t,a;ge(s,Ne,i=>l(5,a=i));let{data:r,pageNum:n,totalPages:o}=e,h=[];const m=`@${pe.twitter.split("/").pop()}`;return s.$$set=i=>{"data"in i&&l(3,r=i.data),"pageNum"in i&&l(0,n=i.pageNum),"totalPages"in i&&l(1,o=i.totalPages)},s.$$.update=()=>{s.$$.dirty&32&&be.setMetadata({title:`${ve} | ${U}`,description:ke,keywords:Ee.join(", "),author:Pe,image:we,site:m,url:a.url.href}),s.$$.dirty&8&&l(4,{posts:t,pageNum:n,totalPages:o}=r.props,t,(l(0,n),l(3,r)),(l(1,o),l(3,r))),s.$$.dirty&16&&t&&l(2,h=(async()=>Promise.all(t.map(async i=>{try{const c=Array.isArray(i.meta.author)?i.meta.author:[i.meta.author],g=await Me(c);return{...i,authorMetadata:g}}catch(c){return console.error("Error fetching author metadata:",c),{...i,authorMetadata:[]}}return i})))())},[n,o,h,r,t,a]}class Oe extends ue{constructor(e){super(),he(this,e,je,$e,fe,{data:3,pageNum:0,totalPages:1})}}export{Oe as B}; +import{s as fe,c as ge,n as G,h as Q}from"./scheduler.DK_yUdRf.js";import{S as ue,i as he,e as E,s as y,c as P,a as M,f as q,d as p,y as b,g as L,h as d,n as I,k as X,l as D,m as Y,u as S,v as T,w as H,x as z,t as V,b as $,j as R,z as O}from"./index.BH5W4qoH.js";import{h as Z,u as _e}from"./await_block.MuLFoa1l.js";import{M as de,b as U,j as pe,m as be,t as ve,d as ke,k as Ee,c as Pe,o as we,l as Me,h as B,s as x,n as ee}from"./32.L6pbTd52.js";import{b as C}from"./entry.B3JBGiH6.js";import{p as Ne}from"./stores.BhPy-k-g.js";import{L as Ae}from"./Loader.BLQl2yzu.js";import{B as me}from"./Button.fdVjvHGv.js";function te(s){let e,l;return e=new me({props:{icon:"chevronLeft",href:C+"/"+s[2]+"/"+(s[0]-1),text:"Previous",iconPosition:"left",highlight:!0}}),{c(){S(e.$$.fragment)},l(t){T(e.$$.fragment,t)},m(t,a){H(e,t,a),l=!0},p(t,a){const r={};a&5&&(r.href=C+"/"+t[2]+"/"+(t[0]-1)),e.$set(r)},i(t){l||(I(e.$$.fragment,t),l=!0)},o(t){D(e.$$.fragment,t),l=!1},d(t){z(e,t)}}}function ae(s){let e,l;return e=new me({props:{icon:"chevronRight",href:C+"/"+s[2]+"/"+(s[0]+1),text:"Next",iconPosition:"right",highlight:!0}}),{c(){S(e.$$.fragment)},l(t){T(e.$$.fragment,t)},m(t,a){H(e,t,a),l=!0},p(t,a){const r={};a&5&&(r.href=C+"/"+t[2]+"/"+(t[0]+1)),e.$set(r)},i(t){l||(I(e.$$.fragment,t),l=!0)},o(t){D(e.$$.fragment,t),l=!1},d(t){z(e,t)}}}function Ie(s){let e,l,t,a=s[0]>1&&te(s),r=s[0]1?a?(a.p(n,o),o&1&&I(a,1)):(a=te(n),a.c(),I(a,1),a.m(e,l)):a&&(X(),D(a,1,1,()=>{a=null}),Y()),n[0]{r=null}),Y())},i(n){t||(I(a),I(r),t=!0)},o(n){D(a),D(r),t=!1},d(n){n&&p(e),a&&a.d(),r&&r.d()}}}function ye(s,e,l){let{pageNum:t}=e,{totalPages:a}=e,{route:r}=e;return s.$$set=n=>{"pageNum"in n&&l(0,t=n.pageNum),"totalPages"in n&&l(1,a=n.totalPages),"route"in n&&l(2,r=n.route)},[t,a,r]}class qe extends ue{constructor(e){super(),he(this,e,ye,Ie,fe,{pageNum:0,totalPages:1,route:2})}}function le(s,e,l){const t=s.slice();return t[8]=e[l],t}function re(s,e,l){const t=s.slice();return t[11]=e[l],t}function ne(s,e,l){const t=s.slice();return t[11]=e[l],t}function De(s){let e,l,t=s[16].message+"",a;return{c(){e=E("p"),l=V("Error loading posts: "),a=V(t)},l(r){e=P(r,"P",{});var n=M(e);l=$(n,"Error loading posts: "),a=$(n,t),n.forEach(p)},m(r,n){L(r,e,n),d(e,l),d(e,a)},p(r,n){n&4&&t!==(t=r[16].message+"")&&R(a,t)},i:G,o:G,d(r){r&&p(e)}}}function Le(s){let e,l,t,a,r=B(s[7]),n=[];for(let o=0;oo,i.anchor=null,m=!0},p(c,[g]){s=c,i.ctx=s,g&4&&h!==(h=s[2])&&Z(h,i)||_e(i,s,g)},i(c){m||(I(e.$$.fragment,c),I(i.block),m=!0)},o(c){D(e.$$.fragment,c);for(let g=0;g<3;g+=1){const _=i.blocks[g];D(_)}m=!1},d(c){c&&(p(l),p(t)),z(e,c),i.block.d(),i.token=null,i=null}}}function je(s,e,l){let t,a;ge(s,Ne,i=>l(5,a=i));let{data:r,pageNum:n,totalPages:o}=e,h=[];const m=`@${pe.twitter.split("/").pop()}`;return s.$$set=i=>{"data"in i&&l(3,r=i.data),"pageNum"in i&&l(0,n=i.pageNum),"totalPages"in i&&l(1,o=i.totalPages)},s.$$.update=()=>{s.$$.dirty&32&&be.setMetadata({title:`${ve} | ${U}`,description:ke,keywords:Ee.join(", "),author:Pe,image:we,site:m,url:a.url.href}),s.$$.dirty&8&&l(4,{posts:t,pageNum:n,totalPages:o}=r.props,t,(l(0,n),l(3,r)),(l(1,o),l(3,r))),s.$$.dirty&16&&t&&l(2,h=(async()=>Promise.all(t.map(async i=>{try{const c=Array.isArray(i.meta.author)?i.meta.author:[i.meta.author],g=await Me(c);return{...i,authorMetadata:g}}catch(c){return console.error("Error fetching author metadata:",c),{...i,authorMetadata:[]}}return i})))())},[n,o,h,r,t,a]}class Oe extends ue{constructor(e){super(),he(this,e,je,$e,fe,{data:3,pageNum:0,totalPages:1})}}export{Oe as B}; diff --git a/_app/immutable/chunks/Button.ChCyQFAf.js b/_app/immutable/chunks/Button.fdVjvHGv.js similarity index 98% rename from _app/immutable/chunks/Button.ChCyQFAf.js rename to _app/immutable/chunks/Button.fdVjvHGv.js index 61f926b..071ebb3 100644 --- a/_app/immutable/chunks/Button.ChCyQFAf.js +++ b/_app/immutable/chunks/Button.fdVjvHGv.js @@ -1 +1 @@ -import{s as G}from"./scheduler.DK_yUdRf.js";import{S as Q,i as V,e as w,s as E,c as d,a as k,f as F,d as g,y as h,D as r,g as z,h as S,n as _,l as b,u as M,v as N,w as j,x as D,t as W,b as X,j as H}from"./index.BH5W4qoH.js";import{I as R}from"./Icon.Bx2gT0jJ.js";import{BsFacebook as J,BsGithub as K,BsInstagram as O,BsMastodon as U,BsTwitterX as Y,BsWindows as Z,BsApple as y,BsQuestionCircleFill as p,BsDownload as x,BsRssFill as $}from"./index.D7Jwt5yH.js";const e0={a:{viewBox:"0 0 16 16",fill:"currentColor"},c:''};function t0(i){let e,a,s;return a=new R({props:{src:i[10],size:i[2]}}),{c(){e=w("span"),M(a.$$.fragment),this.h()},l(t){e=d(t,"SPAN",{class:!0});var l=k(e);N(a.$$.fragment,l),l.forEach(g),this.h()},h(){h(e,"class","svelte-1twby8b"),r(e,"icon-left",i[8]==="left")},m(t,l){z(t,e,l),j(a,e,null),s=!0},p(t,l){const c={};l&4&&(c.size=t[2]),a.$set(c),(!s||l&256)&&r(e,"icon-left",t[8]==="left")},i(t){s||(_(a.$$.fragment,t),s=!0)},o(t){b(a.$$.fragment,t),s=!1},d(t){t&&g(e),D(a)}}}function L(i){let e,a;return{c(){e=w("span"),a=W(i[5])},l(s){e=d(s,"SPAN",{});var t=k(e);a=X(t,i[5]),t.forEach(g)},m(s,t){z(s,e,t),S(e,a)},p(s,t){t&32&&H(a,s[5])},d(s){s&&g(e)}}}function a0(i){let e,a,s;return a=new R({props:{src:i[10],size:i[2]}}),{c(){e=w("span"),M(a.$$.fragment),this.h()},l(t){e=d(t,"SPAN",{class:!0});var l=k(e);N(a.$$.fragment,l),l.forEach(g),this.h()},h(){h(e,"class","svelte-1twby8b"),r(e,"icon-right",i[8]==="right")},m(t,l){z(t,e,l),j(a,e,null),s=!0},p(t,l){const c={};l&4&&(c.size=t[2]),a.$set(c),(!s||l&256)&&r(e,"icon-right",t[8]==="right")},i(t){s||(_(a.$$.fragment,t),s=!0)},o(t){b(a.$$.fragment,t),s=!1},d(t){t&&g(e),D(a)}}}function i0(i){let e,a,s,t,l=i[11]&&t0(i),c=i[5]&&L(i),u=i[12]&&a0(i);return{c(){e=w("a"),l&&l.c(),a=E(),c&&c.c(),s=E(),u&&u.c(),this.h()},l(n){e=d(n,"A",{rel:!0,href:!0,title:!0,target:!0,class:!0});var f=k(e);l&&l.l(f),a=F(f),c&&c.l(f),s=F(f),u&&u.l(f),f.forEach(g),this.h()},h(){h(e,"rel",i[4]),h(e,"href",i[3]),h(e,"title",i[6]),h(e,"target",i[7]),h(e,"class","flex items-center justify-between gap-3 text-sm lg:text-xs svelte-1twby8b"),r(e,"button",i[0]),r(e,"w-full",i[9]),r(e,"icon-link",!i[0]),r(e,"hover:text-red-berry-950",!i[0]),r(e,"dark:hover:text-neutral-100",!i[0]),r(e,"highlight",i[0]&&i[1]),r(e,"py-4",i[0]),r(e,"px-5",i[0]),r(e,"rounded",i[0]),r(e,"regular",!i[1])},m(n,f){z(n,e,f),l&&l.m(e,null),S(e,a),c&&c.m(e,null),S(e,s),u&&u.m(e,null),t=!0},p(n,[f]){n[11]&&l.p(n,f),n[5]?c?c.p(n,f):(c=L(n),c.c(),c.m(e,s)):c&&(c.d(1),c=null),n[12]&&u.p(n,f),(!t||f&16)&&h(e,"rel",n[4]),(!t||f&8)&&h(e,"href",n[3]),(!t||f&64)&&h(e,"title",n[6]),(!t||f&128)&&h(e,"target",n[7]),(!t||f&1)&&r(e,"button",n[0]),(!t||f&512)&&r(e,"w-full",n[9]),(!t||f&1)&&r(e,"icon-link",!n[0]),(!t||f&1)&&r(e,"hover:text-red-berry-950",!n[0]),(!t||f&1)&&r(e,"dark:hover:text-neutral-100",!n[0]),(!t||f&3)&&r(e,"highlight",n[0]&&n[1]),(!t||f&1)&&r(e,"py-4",n[0]),(!t||f&1)&&r(e,"px-5",n[0]),(!t||f&1)&&r(e,"rounded",n[0]),(!t||f&2)&&r(e,"regular",!n[1])},i(n){t||(_(l),_(u),t=!0)},o(n){b(l),b(u),t=!1},d(n){n&&g(e),l&&l.d(),c&&c.d(),u&&u.d()}}}function n0(i,e,a){let s={facebook:J,github:K,instagram:O,mastodon:U,twitter:Y,windows:Z,linux:e0,mac:y,unknown:p,download:x,rss:$},{button:t=!0}=e,{highlight:l=!1}=e,{icon:c=""}=e,{iconSize:u=20}=e,{href:n=""}=e,{rel:f=""}=e,{text:B=""}=e,{title:v=B}=e,{target:P="_parent"}=e,{iconPosition:m="right"}=e,{fullwidth:A=!1}=e,I=s[c],C=c!==""&&I!==void 0,T=!!(C&&m==="left"),q=!!(C&&m==="right");return i.$$set=o=>{"button"in o&&a(0,t=o.button),"highlight"in o&&a(1,l=o.highlight),"icon"in o&&a(13,c=o.icon),"iconSize"in o&&a(2,u=o.iconSize),"href"in o&&a(3,n=o.href),"rel"in o&&a(4,f=o.rel),"text"in o&&a(5,B=o.text),"title"in o&&a(6,v=o.title),"target"in o&&a(7,P=o.target),"iconPosition"in o&&a(8,m=o.iconPosition),"fullwidth"in o&&a(9,A=o.fullwidth)},[t,l,u,n,f,B,v,P,m,A,I,T,q,c]}class r0 extends Q{constructor(e){super(),V(this,e,n0,i0,G,{button:0,highlight:1,icon:13,iconSize:2,href:3,rel:4,text:5,title:6,target:7,iconPosition:8,fullwidth:9})}}export{r0 as B}; +import{s as G}from"./scheduler.DK_yUdRf.js";import{S as Q,i as V,e as w,s as E,c as d,a as k,f as F,d as g,y as h,D as r,g as z,h as S,n as _,l as b,u as M,v as N,w as j,x as D,t as W,b as X,j as H}from"./index.BH5W4qoH.js";import{I as R}from"./Icon.vbkowJrT.js";import{BsFacebook as J,BsGithub as K,BsInstagram as O,BsMastodon as U,BsTwitterX as Y,BsWindows as Z,BsApple as y,BsQuestionCircleFill as p,BsDownload as x,BsRssFill as $}from"./index.D7Jwt5yH.js";const e0={a:{viewBox:"0 0 16 16",fill:"currentColor"},c:''};function t0(i){let e,a,s;return a=new R({props:{src:i[10],size:i[2]}}),{c(){e=w("span"),M(a.$$.fragment),this.h()},l(t){e=d(t,"SPAN",{class:!0});var l=k(e);N(a.$$.fragment,l),l.forEach(g),this.h()},h(){h(e,"class","svelte-1twby8b"),r(e,"icon-left",i[8]==="left")},m(t,l){z(t,e,l),j(a,e,null),s=!0},p(t,l){const c={};l&4&&(c.size=t[2]),a.$set(c),(!s||l&256)&&r(e,"icon-left",t[8]==="left")},i(t){s||(_(a.$$.fragment,t),s=!0)},o(t){b(a.$$.fragment,t),s=!1},d(t){t&&g(e),D(a)}}}function L(i){let e,a;return{c(){e=w("span"),a=W(i[5])},l(s){e=d(s,"SPAN",{});var t=k(e);a=X(t,i[5]),t.forEach(g)},m(s,t){z(s,e,t),S(e,a)},p(s,t){t&32&&H(a,s[5])},d(s){s&&g(e)}}}function a0(i){let e,a,s;return a=new R({props:{src:i[10],size:i[2]}}),{c(){e=w("span"),M(a.$$.fragment),this.h()},l(t){e=d(t,"SPAN",{class:!0});var l=k(e);N(a.$$.fragment,l),l.forEach(g),this.h()},h(){h(e,"class","svelte-1twby8b"),r(e,"icon-right",i[8]==="right")},m(t,l){z(t,e,l),j(a,e,null),s=!0},p(t,l){const c={};l&4&&(c.size=t[2]),a.$set(c),(!s||l&256)&&r(e,"icon-right",t[8]==="right")},i(t){s||(_(a.$$.fragment,t),s=!0)},o(t){b(a.$$.fragment,t),s=!1},d(t){t&&g(e),D(a)}}}function i0(i){let e,a,s,t,l=i[11]&&t0(i),c=i[5]&&L(i),u=i[12]&&a0(i);return{c(){e=w("a"),l&&l.c(),a=E(),c&&c.c(),s=E(),u&&u.c(),this.h()},l(n){e=d(n,"A",{rel:!0,href:!0,title:!0,target:!0,class:!0});var f=k(e);l&&l.l(f),a=F(f),c&&c.l(f),s=F(f),u&&u.l(f),f.forEach(g),this.h()},h(){h(e,"rel",i[4]),h(e,"href",i[3]),h(e,"title",i[6]),h(e,"target",i[7]),h(e,"class","flex items-center justify-between gap-3 text-sm lg:text-xs svelte-1twby8b"),r(e,"button",i[0]),r(e,"w-full",i[9]),r(e,"icon-link",!i[0]),r(e,"hover:text-red-berry-950",!i[0]),r(e,"dark:hover:text-neutral-100",!i[0]),r(e,"highlight",i[0]&&i[1]),r(e,"py-4",i[0]),r(e,"px-5",i[0]),r(e,"rounded",i[0]),r(e,"regular",!i[1])},m(n,f){z(n,e,f),l&&l.m(e,null),S(e,a),c&&c.m(e,null),S(e,s),u&&u.m(e,null),t=!0},p(n,[f]){n[11]&&l.p(n,f),n[5]?c?c.p(n,f):(c=L(n),c.c(),c.m(e,s)):c&&(c.d(1),c=null),n[12]&&u.p(n,f),(!t||f&16)&&h(e,"rel",n[4]),(!t||f&8)&&h(e,"href",n[3]),(!t||f&64)&&h(e,"title",n[6]),(!t||f&128)&&h(e,"target",n[7]),(!t||f&1)&&r(e,"button",n[0]),(!t||f&512)&&r(e,"w-full",n[9]),(!t||f&1)&&r(e,"icon-link",!n[0]),(!t||f&1)&&r(e,"hover:text-red-berry-950",!n[0]),(!t||f&1)&&r(e,"dark:hover:text-neutral-100",!n[0]),(!t||f&3)&&r(e,"highlight",n[0]&&n[1]),(!t||f&1)&&r(e,"py-4",n[0]),(!t||f&1)&&r(e,"px-5",n[0]),(!t||f&1)&&r(e,"rounded",n[0]),(!t||f&2)&&r(e,"regular",!n[1])},i(n){t||(_(l),_(u),t=!0)},o(n){b(l),b(u),t=!1},d(n){n&&g(e),l&&l.d(),c&&c.d(),u&&u.d()}}}function n0(i,e,a){let s={facebook:J,github:K,instagram:O,mastodon:U,twitter:Y,windows:Z,linux:e0,mac:y,unknown:p,download:x,rss:$},{button:t=!0}=e,{highlight:l=!1}=e,{icon:c=""}=e,{iconSize:u=20}=e,{href:n=""}=e,{rel:f=""}=e,{text:B=""}=e,{title:v=B}=e,{target:P="_parent"}=e,{iconPosition:m="right"}=e,{fullwidth:A=!1}=e,I=s[c],C=c!==""&&I!==void 0,T=!!(C&&m==="left"),q=!!(C&&m==="right");return i.$$set=o=>{"button"in o&&a(0,t=o.button),"highlight"in o&&a(1,l=o.highlight),"icon"in o&&a(13,c=o.icon),"iconSize"in o&&a(2,u=o.iconSize),"href"in o&&a(3,n=o.href),"rel"in o&&a(4,f=o.rel),"text"in o&&a(5,B=o.text),"title"in o&&a(6,v=o.title),"target"in o&&a(7,P=o.target),"iconPosition"in o&&a(8,m=o.iconPosition),"fullwidth"in o&&a(9,A=o.fullwidth)},[t,l,u,n,f,B,v,P,m,A,I,T,q,c]}class r0 extends Q{constructor(e){super(),V(this,e,n0,i0,G,{button:0,highlight:1,icon:13,iconSize:2,href:3,rel:4,text:5,title:6,target:7,iconPosition:8,fullwidth:9})}}export{r0 as B}; diff --git a/_app/immutable/chunks/Icon.Bx2gT0jJ.js b/_app/immutable/chunks/Icon.vbkowJrT.js similarity index 92% rename from _app/immutable/chunks/Icon.Bx2gT0jJ.js rename to _app/immutable/chunks/Icon.vbkowJrT.js index 2c92af4..7343c0a 100644 --- a/_app/immutable/chunks/Icon.Bx2gT0jJ.js +++ b/_app/immutable/chunks/Icon.vbkowJrT.js @@ -1 +1 @@ -import{s as c,b as _,n as u}from"./scheduler.DK_yUdRf.js";import{S as v,i as B,o as d,H as k,p as z,a as C,q as H,d as w,r as f,g as N}from"./index.BH5W4qoH.js";import{g as b}from"./31.DSOxMhdt.js";function q(i){let s,l,r,n=[{width:i[1]},{height:i[1]},{viewBox:i[2]},{style:r=i[3]?"color: "+i[3]+";":""},{"stroke-width":"0"},{class:i[4]},i[0].a,i[6],{xmlns:"http://www.w3.org/2000/svg"}],a={};for(let e=0;e{"src"in o&&l(0,r=o.src),"size"in o&&l(1,n=o.size),"viewBox"in o&&l(2,a=o.viewBox),"color"in o&&l(3,e=o.color),"title"in o&&l(7,t=o.title),"className"in o&&l(4,g=o.className)},i.$$.update=()=>{i.$$.dirty&9&&(l(6,h={}),e&&(r.a.stroke!=="none"&&l(6,h.stroke="currentColor",h),r.a.fill!=="none"&&l(6,h.fill="currentColor",h))),i.$$.dirty&129&&l(5,m=(t?`${t}`:"")+r.c)},[r,n,a,e,g,m,h,t]}class T extends v{constructor(s){super(),B(this,s,I,q,c,{src:0,size:1,viewBox:2,color:3,title:7,className:4})}}export{T as I}; +import{s as c,b as _,n as u}from"./scheduler.DK_yUdRf.js";import{S as v,i as B,o as d,H as k,p as z,a as C,q as H,d as w,r as f,g as N}from"./index.BH5W4qoH.js";import{g as b}from"./32.L6pbTd52.js";function q(i){let s,l,r,n=[{width:i[1]},{height:i[1]},{viewBox:i[2]},{style:r=i[3]?"color: "+i[3]+";":""},{"stroke-width":"0"},{class:i[4]},i[0].a,i[6],{xmlns:"http://www.w3.org/2000/svg"}],a={};for(let e=0;e{"src"in o&&l(0,r=o.src),"size"in o&&l(1,n=o.size),"viewBox"in o&&l(2,a=o.viewBox),"color"in o&&l(3,e=o.color),"title"in o&&l(7,t=o.title),"className"in o&&l(4,g=o.className)},i.$$.update=()=>{i.$$.dirty&9&&(l(6,h={}),e&&(r.a.stroke!=="none"&&l(6,h.stroke="currentColor",h),r.a.fill!=="none"&&l(6,h.fill="currentColor",h))),i.$$.dirty&129&&l(5,m=(t?`${t}`:"")+r.c)},[r,n,a,e,g,m,h,t]}class T extends v{constructor(s){super(),B(this,s,I,q,c,{src:0,size:1,viewBox:2,color:3,title:7,className:4})}}export{T as I}; diff --git a/_app/immutable/chunks/entry.B3JBGiH6.js b/_app/immutable/chunks/entry.B3JBGiH6.js new file mode 100644 index 0000000..918333d --- /dev/null +++ b/_app/immutable/chunks/entry.B3JBGiH6.js @@ -0,0 +1,3 @@ +import{n as le,s as ut,t as dt}from"./scheduler.DK_yUdRf.js";new URL("sveltekit-internal://");function ht(e,n){return e==="/"||n==="ignore"?e:n==="never"?e.endsWith("/")?e.slice(0,-1):e:n==="always"&&!e.endsWith("/")?e+"/":e}function pt(e){return e.split("%25").map(decodeURI).join("%25")}function gt(e){for(const n in e)e[n]=decodeURIComponent(e[n]);return e}function fe({href:e}){return e.split("#")[0]}const mt=["href","pathname","search","toString","toJSON"];function yt(e,n,t){const r=new URL(e);Object.defineProperty(r,"searchParams",{value:new Proxy(r.searchParams,{get(a,o){if(o==="get"||o==="getAll"||o==="has")return s=>(t(s),a[o](s));n();const i=Reflect.get(a,o);return typeof i=="function"?i.bind(a):i}}),enumerable:!0,configurable:!0});for(const a of mt)Object.defineProperty(r,a,{get(){return n(),e[a]},enumerable:!0,configurable:!0});return r}const _t="/__data.json",wt=".html__data.json";function vt(e){return e.endsWith(".html")?e.replace(/\.html$/,wt):e.replace(/\/$/,"")+_t}function bt(...e){let n=5381;for(const t of e)if(typeof t=="string"){let r=t.length;for(;r;)n=n*33^t.charCodeAt(--r)}else if(ArrayBuffer.isView(t)){const r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);let a=r.length;for(;a;)n=n*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(n>>>0).toString(36)}function At(e){const n=atob(e),t=new Uint8Array(n.length);for(let r=0;r((e instanceof Request?e.method:(n==null?void 0:n.method)||"GET")!=="GET"&&q.delete(me(e)),Ve(e,n));const q=new Map;function kt(e,n){const t=me(e,n),r=document.querySelector(t);if(r!=null&&r.textContent){let{body:a,...o}=JSON.parse(r.textContent);const i=r.getAttribute("data-ttl");return i&&q.set(t,{body:a,init:o,ttl:1e3*Number(i)}),r.getAttribute("data-b64")!==null&&(a=At(a)),Promise.resolve(new Response(a,o))}return window.fetch(e,n)}function Et(e,n,t){if(q.size>0){const r=me(e,t),a=q.get(r);if(a){if(performance.now(){const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return n.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/(.*))?";const o=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(o)return n.push({name:o[1],matcher:o[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const i=r.split(/\[(.+?)\](?!\])/);return"/"+i.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return ue(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return ue(String.fromCharCode(...c.slice(2).split("-").map(f=>parseInt(f,16))));const d=St.exec(c),[,h,y,u,g]=d;return n.push({name:u,matcher:g,optional:!!h,rest:!!y,chained:y?l===1&&i[0]==="":!1}),y?"(.*?)":h?"([^/]*)?":"([^/]+?)"}return ue(c)}).join("")}).join("")}/?$`),params:n}}function It(e){return!/^\([^)]+\)$/.test(e)}function Tt(e){return e.slice(1).split("/").filter(It)}function Ut(e,n,t){const r={},a=e.slice(1),o=a.filter(s=>s!==void 0);let i=0;for(let s=0;sd).join("/"),i=0),l===void 0){c.rest&&(r[c.name]="");continue}if(!c.matcher||t[c.matcher](l)){r[c.name]=l;const d=n[s+1],h=a[s+1];d&&!d.rest&&d.optional&&h&&c.chained&&(i=0),!d&&!h&&Object.keys(r).length===o.length&&(i=0);continue}if(c.optional&&c.chained){i++;continue}return}if(!i)return r}function ue(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Lt({nodes:e,server_loads:n,dictionary:t,matchers:r}){const a=new Set(n);return Object.entries(t).map(([s,[c,l,d]])=>{const{pattern:h,params:y}=Rt(s),u={id:s,exec:g=>{const f=h.exec(g);if(f)return Ut(f,y,r)},errors:[1,...d||[]].map(g=>e[g]),layouts:[0,...l||[]].map(i),leaf:o(c)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function o(s){const c=s<0;return c&&(s=~s),[c,e[s]]}function i(s){return s===void 0?s:[a.has(s),e[s]]}}function Be(e,n=JSON.parse){try{return n(sessionStorage[e])}catch{}}function Ue(e,n,t=JSON.stringify){const r=t(n);try{sessionStorage[e]=r}catch{}}const O=[];function ye(e,n=le){let t;const r=new Set;function a(s){if(ut(e,s)&&(e=s,t)){const c=!O.length;for(const l of r)l[1](),O.push(l,e);if(c){for(let l=0;l{r.delete(l),r.size===0&&t&&(t(),t=null)}}return{set:a,update:o,subscribe:i}}var $e;const U=(($e=globalThis.__sveltekit_1irf7hv)==null?void 0:$e.base)??"";var Fe;const Pt=((Fe=globalThis.__sveltekit_1irf7hv)==null?void 0:Fe.assets)??U,xt="1734142081191",qe="sveltekit:snapshot",Ge="sveltekit:scroll",Me="sveltekit:states",Ct="sveltekit:pageurl",$="sveltekit:history",M="sveltekit:navigation",z={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},W=location.origin;function He(e){if(e instanceof URL)return e;let n=document.baseURI;if(!n){const t=document.getElementsByTagName("base");n=t.length?t[0].href:document.URL}return new URL(e,n)}function _e(){return{x:pageXOffset,y:pageYOffset}}function j(e,n){return e.getAttribute(`data-sveltekit-${n}`)}const Le={...z,"":z.hover};function Ke(e){let n=e.assignedSlot??e.parentNode;return(n==null?void 0:n.nodeType)===11&&(n=n.host),n}function We(e,n){for(;e&&e!==n;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=Ke(e)}}function he(e,n){let t;try{t=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI)}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,a=!t||!!r||re(t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=(t==null?void 0:t.origin)===W&&e.hasAttribute("download");return{url:t,external:a,target:r,download:o}}function J(e){let n=null,t=null,r=null,a=null,o=null,i=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=j(s,"preload-code")),a===null&&(a=j(s,"preload-data")),n===null&&(n=j(s,"keepfocus")),t===null&&(t=j(s,"noscroll")),o===null&&(o=j(s,"reload")),i===null&&(i=j(s,"replacestate")),s=Ke(s);function c(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Le[r??"off"],preload_data:Le[a??"off"],keepfocus:c(n),noscroll:c(t),reload:c(o),replace_state:c(i)}}function Pe(e){const n=ye(e);let t=!0;function r(){t=!0,n.update(i=>i)}function a(i){t=!1,n.set(i)}function o(i){let s;return n.subscribe(c=>{(s===void 0||t&&c!==s)&&i(s=c)})}return{notify:r,set:a,subscribe:o}}function Nt(){const{set:e,subscribe:n}=ye(!1);let t;async function r(){clearTimeout(t);try{const a=await fetch(`${Pt}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const i=(await a.json()).version!==xt;return i&&(e(!0),clearTimeout(t)),i}catch{return!1}}return{subscribe:n,check:r}}function re(e,n){return e.origin!==W||!e.pathname.startsWith(n)}function xe(e){const n=jt(e),t=new ArrayBuffer(n.length),r=new DataView(t);for(let a=0;a>16),n+=String.fromCharCode((t&65280)>>8),n+=String.fromCharCode(t&255),t=r=0);return r===12?(t>>=4,n+=String.fromCharCode(t)):r===18&&(t>>=2,n+=String.fromCharCode((t&65280)>>8),n+=String.fromCharCode(t&255)),n}const Dt=-1,$t=-2,Ft=-3,Vt=-4,Bt=-5,qt=-6;function Gt(e,n){if(typeof e=="number")return a(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const t=e,r=Array(t.length);function a(o,i=!1){if(o===Dt)return;if(o===Ft)return NaN;if(o===Vt)return 1/0;if(o===Bt)return-1/0;if(o===qt)return-0;if(i)throw new Error("Invalid input");if(o in r)return r[o];const s=t[o];if(!s||typeof s!="object")r[o]=s;else if(Array.isArray(s))if(typeof s[0]=="string"){const c=s[0],l=n==null?void 0:n[c];if(l)return r[o]=l(a(s[1]));switch(c){case"Date":r[o]=new Date(s[1]);break;case"Set":const d=new Set;r[o]=d;for(let u=1;un!=null)}class ae{constructor(n,t){this.status=n,typeof t=="string"?this.body={message:t}:t?this.body=t:this.body={message:`Error: ${n}`}}toString(){return JSON.stringify(this.body)}}class ze{constructor(n,t){this.status=n,this.location=t}}class we extends Error{constructor(n,t,r){super(r),this.status=n,this.text=t}}const Kt="x-sveltekit-invalidated",Wt="x-sveltekit-trailing-slash";function X(e){return e instanceof ae||e instanceof we?e.status:500}function Yt(e){return e instanceof we?e.text:"Internal Error"}const zt=new Set(["icon","shortcut icon","apple-touch-icon"]),C=Be(Ge)??{},H=Be(qe)??{},P={url:Pe({}),page:Pe({}),navigating:ye(null),updated:Nt()};function ve(e){C[e]=_e()}function Jt(e,n){let t=e+1;for(;C[t];)delete C[t],t+=1;for(t=n+1;H[t];)delete H[t],t+=1}function V(e){return location.href=e.href,new Promise(()=>{})}async function Je(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}function Ce(){}let oe,pe,Z,L,ge,N;const Xe=[],Q=[];let R=null;const Ze=[],Xt=[];let D=[],_={branch:[],error:null,url:null},be=!1,ee=!1,Ne=!0,K=!1,B=!1,Qe=!1,Ae=!1,ke,S,T,I,te;const G=new Set;async function ln(e,n,t){var a,o,i,s;document.URL!==location.href&&(location.href=location.href),N=e,await((o=(a=e.hooks).init)==null?void 0:o.call(a)),oe=Lt(e),L=document.documentElement,ge=n,pe=e.nodes[0],Z=e.nodes[1],pe(),Z(),S=(i=history.state)==null?void 0:i[$],T=(s=history.state)==null?void 0:s[M],S||(S=T=Date.now(),history.replaceState({...history.state,[$]:S,[M]:T},""));const r=C[S];r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y)),t?await on(ge,t):rn(location.href,{replaceState:!0}),an()}function Zt(){Xe.length=0,Ae=!1}function et(e){Q.some(n=>n==null?void 0:n.snapshot)&&(H[e]=Q.map(n=>{var t;return(t=n==null?void 0:n.snapshot)==null?void 0:t.capture()}))}function tt(e){var n;(n=H[e])==null||n.forEach((t,r)=>{var a,o;(o=(a=Q[r])==null?void 0:a.snapshot)==null||o.restore(t)})}function Oe(){ve(S),Ue(Ge,C),et(T),Ue(qe,H)}async function nt(e,n,t,r){return Y({type:"goto",url:He(e),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:t,nav_token:r,accept:()=>{n.invalidateAll&&(Ae=!0)}})}async function Qt(e){if(e.id!==(R==null?void 0:R.id)){const n={};G.add(n),R={id:e.id,token:n,promise:at({...e,preload:n}).then(t=>(G.delete(n),t.type==="loaded"&&t.state.error&&(R=null),t))}}return R.promise}async function de(e){const n=oe.find(t=>t.exec(ot(e)));n&&await Promise.all([...n.layouts,n.leaf].map(t=>t==null?void 0:t[1]()))}function rt(e,n,t){var o;_=e.state;const r=document.querySelector("style[data-sveltekit]");r&&r.remove(),I=e.props.page,ke=new N.root({target:n,props:{...e.props,stores:P,components:Q},hydrate:t,sync:!1}),tt(T);const a={from:null,to:{params:_.params,route:{id:((o=_.route)==null?void 0:o.id)??null},url:new URL(location.href)},willUnload:!1,type:"enter",complete:Promise.resolve()};D.forEach(i=>i(a)),ee=!0}function ne({url:e,params:n,branch:t,status:r,error:a,route:o,form:i}){let s="never";if(U&&(e.pathname===U||e.pathname===U+"/"))s="always";else for(const u of t)(u==null?void 0:u.slash)!==void 0&&(s=u.slash);e.pathname=ht(e.pathname,s),e.search=e.search;const c={type:"loaded",state:{url:e,params:n,branch:t,error:a,route:o},props:{constructors:Ht(t).map(u=>u.node.component),page:I}};i!==void 0&&(c.props.form=i);let l={},d=!I,h=0;for(let u=0;u(s&&(c.route=!0),f[p])}),params:new Proxy(r,{get:(f,p)=>(s&&c.params.add(p),f[p])}),data:(o==null?void 0:o.data)??null,url:yt(t,()=>{s&&(c.url=!0)},f=>{s&&c.search_params.add(f)}),async fetch(f,p){let b;f instanceof Request?(b=f.url,p={body:f.method==="GET"||f.method==="HEAD"?void 0:await f.blob(),cache:f.cache,credentials:f.credentials,headers:[...f.headers].length?f.headers:void 0,integrity:f.integrity,keepalive:f.keepalive,method:f.method,mode:f.mode,redirect:f.redirect,referrer:f.referrer,referrerPolicy:f.referrerPolicy,signal:f.signal,...p}):b=f;const k=new URL(b,t);return s&&u(k.href),k.origin===t.origin&&(b=k.href.slice(t.origin.length)),ee?Et(b,k.href,p):kt(b,p)},setHeaders:()=>{},depends:u,parent(){return s&&(c.parent=!0),n()},untrack(f){s=!1;try{return f()}finally{s=!0}}};i=await l.universal.load.call(null,g)??null}return{node:l,loader:e,server:o,universal:(h=l.universal)!=null&&h.load?{type:"data",data:i,uses:c}:null,data:i??(o==null?void 0:o.data)??null,slash:((y=l.universal)==null?void 0:y.trailingSlash)??(o==null?void 0:o.slash)}}function je(e,n,t,r,a,o){if(Ae)return!0;if(!a)return!1;if(a.parent&&e||a.route&&n||a.url&&t)return!0;for(const i of a.search_params)if(r.has(i))return!0;for(const i of a.params)if(o[i]!==_.params[i])return!0;for(const i of a.dependencies)if(Xe.some(s=>s(new URL(i))))return!0;return!1}function Se(e,n){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?n??null:null}function en(e,n){if(!e)return new Set(n.searchParams.keys());const t=new Set([...e.searchParams.keys(),...n.searchParams.keys()]);for(const r of t){const a=e.searchParams.getAll(r),o=n.searchParams.getAll(r);a.every(i=>o.includes(i))&&o.every(i=>a.includes(i))&&t.delete(r)}return t}function De({error:e,url:n,route:t,params:r}){return{type:"loaded",state:{error:e,url:n,route:t,params:r,branch:[]},props:{page:I,constructors:[]}}}async function at({id:e,invalidating:n,url:t,params:r,route:a,preload:o}){if((R==null?void 0:R.id)===e)return G.delete(R.token),R.promise;const{errors:i,layouts:s,leaf:c}=a,l=[...s,c];i.forEach(m=>m==null?void 0:m().catch(()=>{})),l.forEach(m=>m==null?void 0:m[1]().catch(()=>{}));let d=null;const h=_.url?e!==_.url.pathname+_.url.search:!1,y=_.route?a.id!==_.route.id:!1,u=en(_.url,t);let g=!1;const f=l.map((m,v)=>{var x;const A=_.branch[v],E=!!(m!=null&&m[0])&&((A==null?void 0:A.loader)!==m[1]||je(g,y,h,u,(x=A.server)==null?void 0:x.uses,r));return E&&(g=!0),E});if(f.some(Boolean)){try{d=await ct(t,f)}catch(m){const v=await F(m,{url:t,params:r,route:{id:e}});return G.has(o)?De({error:v,url:t,params:r,route:a}):se({status:X(m),error:v,url:t,route:a})}if(d.type==="redirect")return d}const p=d==null?void 0:d.nodes;let b=!1;const k=l.map(async(m,v)=>{var ie;if(!m)return;const A=_.branch[v],E=p==null?void 0:p[v];if((!E||E.type==="skip")&&m[1]===(A==null?void 0:A.loader)&&!je(b,y,h,u,(ie=A.universal)==null?void 0:ie.uses,r))return A;if(b=!0,(E==null?void 0:E.type)==="error")throw E;return Ee({loader:m[1],url:t,params:r,route:a,parent:async()=>{var Te;const Ie={};for(let ce=0;ce{});const w=[];for(let m=0;mPromise.resolve({}),server_data_node:Se(o)}),c={node:await Z(),loader:Z,universal:null,server:null,data:null};return ne({url:t,params:a,branch:[s,c],status:e,error:n,route:null})}function Re(e,n){if(!e||re(e,U))return;let t;try{t=N.hooks.reroute({url:new URL(e)})??e.pathname}catch{return}const r=ot(t);for(const a of oe){const o=a.exec(r);if(o)return{id:e.pathname+e.search,invalidating:n,route:a,params:gt(o),url:e}}}function ot(e){return pt(e.slice(U.length)||"/")}function st({url:e,type:n,intent:t,delta:r}){let a=!1;const o=ft(_,t,e,n);r!==void 0&&(o.navigation.delta=r);const i={...o.navigation,cancel:()=>{a=!0,o.reject(new Error("navigation cancelled"))}};return K||Ze.forEach(s=>s(i)),a?null:o}async function Y({type:e,url:n,popped:t,keepfocus:r,noscroll:a,replace_state:o,state:i={},redirect_count:s=0,nav_token:c={},accept:l=Ce,block:d=Ce}){const h=Re(n,!1),y=st({url:n,type:e,delta:t==null?void 0:t.delta,intent:h});if(!y){d();return}const u=S,g=T;l(),K=!0,ee&&P.navigating.set(y.navigation),te=c;let f=h&&await at(h);if(!f){if(re(n,U))return await V(n);f=await it(n,{id:null},await F(new we(404,"Not Found",`Not found: ${n.pathname}`),{url:n,params:{},route:{id:null}}),404)}if(n=(h==null?void 0:h.url)||n,te!==c)return y.reject(new Error("navigation aborted")),!1;if(f.type==="redirect")if(s>=20)f=await se({status:500,error:await F(new Error("Redirect loop"),{url:n,params:{},route:{id:null}}),url:n,route:{id:null}});else return nt(new URL(f.location,n).href,{},s+1,c),!1;else f.props.page.status>=400&&await P.updated.check()&&(await Je(),await V(n));if(Zt(),ve(u),et(g),f.props.page.url.pathname!==n.pathname&&(n.pathname=f.props.page.url.pathname),i=t?t.state:i,!t){const w=o?0:1,m={[$]:S+=w,[M]:T+=w,[Me]:i};(o?history.replaceState:history.pushState).call(history,m,"",n),o||Jt(S,T)}if(R=null,f.props.page.state=i,ee){_=f.state,f.props.page&&(f.props.page.url=n);const w=(await Promise.all(Xt.map(m=>m(y.navigation)))).filter(m=>typeof m=="function");if(w.length>0){let m=function(){D=D.filter(v=>!w.includes(v))};w.push(m),D.push(...w)}ke.$set(f.props),Qe=!0}else rt(f,ge,!1);const{activeElement:p}=document;await dt();const b=t?t.scroll:a?_e():null;if(Ne){const w=n.hash&&document.getElementById(decodeURIComponent(n.hash.slice(1)));b?scrollTo(b.x,b.y):w?w.scrollIntoView():scrollTo(0,0)}const k=document.activeElement!==p&&document.activeElement!==document.body;!r&&!k&&sn(),Ne=!0,f.props.page&&(I=f.props.page),K=!1,e==="popstate"&&tt(T),y.fulfil(void 0),D.forEach(w=>w(y.navigation)),P.navigating.set(null)}async function it(e,n,t,r){return e.origin===W&&e.pathname===location.pathname&&!be?await se({status:r,error:t,url:e,route:n}):await V(e)}function nn(){let e;L.addEventListener("mousemove",o=>{const i=o.target;clearTimeout(e),e=setTimeout(()=>{r(i,2)},20)});function n(o){o.defaultPrevented||r(o.composedPath()[0],1)}L.addEventListener("mousedown",n),L.addEventListener("touchstart",n,{passive:!0});const t=new IntersectionObserver(o=>{for(const i of o)i.isIntersecting&&(de(i.target.href),t.unobserve(i.target))},{threshold:0});function r(o,i){const s=We(o,L);if(!s)return;const{url:c,external:l,download:d}=he(s,U);if(l||d)return;const h=J(s),y=c&&_.url.pathname+_.url.search===c.pathname+c.search;if(!h.reload&&!y)if(i<=h.preload_data){const u=Re(c,!1);u&&Qt(u)}else i<=h.preload_code&&de(c.pathname)}function a(){t.disconnect();for(const o of L.querySelectorAll("a")){const{url:i,external:s,download:c}=he(o,U);if(s||c)continue;const l=J(o);l.reload||(l.preload_code===z.viewport&&t.observe(o),l.preload_code===z.eager&&de(i.pathname))}}D.push(a),a()}function F(e,n){if(e instanceof ae)return e.body;const t=X(e),r=Yt(e);return N.hooks.handleError({error:e,event:n,status:t,message:r})??{message:r}}function rn(e,n={}){return e=He(e),e.origin!==W?Promise.reject(new Error("goto: invalid URL")):nt(e,n,0)}function an(){var n;history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let r=!1;if(Oe(),!K){const a=ft(_,void 0,null,"leave"),o={...a.navigation,cancel:()=>{r=!0,a.reject(new Error("navigation cancelled"))}};Ze.forEach(i=>i(o))}r?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Oe()}),(n=navigator.connection)!=null&&n.saveData||nn(),L.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const r=We(t.composedPath()[0],L);if(!r)return;const{url:a,external:o,target:i,download:s}=he(r,U);if(!a)return;if(i==="_parent"||i==="_top"){if(window.parent!==window)return}else if(i&&i!=="_self")return;const c=J(r);if(!(r instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||s)return;const[d,h]=a.href.split("#"),y=d===fe(location);if(o||c.reload&&(!y||!h)){st({url:a,type:"link"})?K=!0:t.preventDefault();return}if(h!==void 0&&y){const[,u]=_.url.href.split("#");if(u===h){if(t.preventDefault(),h===""||h==="top"&&r.ownerDocument.getElementById("top")===null)window.scrollTo({top:0});else{const g=r.ownerDocument.getElementById(decodeURIComponent(h));g&&(g.scrollIntoView(),g.focus())}return}if(B=!0,ve(S),e(a),!c.replace_state)return;B=!1}t.preventDefault(),await new Promise(u=>{requestAnimationFrame(()=>{setTimeout(u,0)}),setTimeout(u,100)}),Y({type:"link",url:a,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??a.href===location.href})}),L.addEventListener("submit",t=>{if(t.defaultPrevented)return;const r=HTMLFormElement.prototype.cloneNode.call(t.target),a=t.submitter;if(((a==null?void 0:a.formTarget)||r.target)==="_blank"||((a==null?void 0:a.formMethod)||r.method)!=="get")return;const s=new URL((a==null?void 0:a.hasAttribute("formaction"))&&(a==null?void 0:a.formAction)||r.action);if(re(s,U))return;const c=t.target,l=J(c);if(l.reload)return;t.preventDefault(),t.stopPropagation();const d=new FormData(c),h=a==null?void 0:a.getAttribute("name");h&&d.append(h,(a==null?void 0:a.getAttribute("value"))??""),s.search=new URLSearchParams(d).toString(),Y({type:"form",url:s,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??s.href===location.href})}),addEventListener("popstate",async t=>{var r;if((r=t.state)!=null&&r[$]){const a=t.state[$];if(te={},a===S)return;const o=C[a],i=t.state[Me]??{},s=new URL(t.state[Ct]??location.href),c=t.state[M],l=fe(location)===fe(_.url);if(c===T&&(Qe||l)){e(s),C[S]=_e(),o&&scrollTo(o.x,o.y),i!==I.state&&(I={...I,state:i},ke.$set({page:I})),S=a;return}const h=a-S;await Y({type:"popstate",url:s,popped:{state:i,scroll:o,delta:h},accept:()=>{S=a,T=c},block:()=>{history.go(-h)},nav_token:te})}else if(!B){const a=new URL(location.href);e(a)}}),addEventListener("hashchange",()=>{B&&(B=!1,history.replaceState({...history.state,[$]:++S,[M]:T},"",location.href))});for(const t of document.querySelectorAll("link"))zt.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&P.navigating.set(null)});function e(t){_.url=t,P.page.set({...I,url:t}),P.page.notify()}}async function on(e,{status:n=200,error:t,node_ids:r,params:a,route:o,data:i,form:s}){be=!0;const c=new URL(location.href);({params:a={},route:o={id:null}}=Re(c,!1)||{});let l,d=!0;try{const h=r.map(async(g,f)=>{const p=i[f];return p!=null&&p.uses&&(p.uses=lt(p.uses)),Ee({loader:N.nodes[g],url:c,params:a,route:o,parent:async()=>{const b={};for(let k=0;kg===o.id);if(u){const g=u.layouts;for(let f=0;fo?"1":"0").join(""));const r=await Ve(t.href);if(!r.ok){let o;throw(a=r.headers.get("content-type"))!=null&&a.includes("application/json")?o=await r.json():r.status===404?o="Not Found":r.status===500&&(o="Internal Error"),new ae(r.status,o)}return new Promise(async o=>{var h;const i=new Map,s=r.body.getReader(),c=new TextDecoder;function l(y){return Gt(y,{...N.decoders,Promise:u=>new Promise((g,f)=>{i.set(u,{fulfil:g,reject:f})})})}let d="";for(;;){const{done:y,value:u}=await s.read();if(y&&!d)break;for(d+=!u&&d?` +`:c.decode(u,{stream:!0});;){const g=d.indexOf(` +`);if(g===-1)break;const f=JSON.parse(d.slice(0,g));if(d=d.slice(g+1),f.type==="redirect")return o(f);if(f.type==="data")(h=f.nodes)==null||h.forEach(p=>{(p==null?void 0:p.type)==="data"&&(p.uses=lt(p.uses),p.data=l(p.data))}),o(f);else if(f.type==="chunk"){const{id:p,data:b,error:k}=f,w=i.get(p);i.delete(p),k?w.reject(l(k)):w.fulfil(l(b))}}}})}function lt(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}function sn(){const e=document.querySelector("[autofocus]");if(e)e.focus();else{const n=document.body,t=n.getAttribute("tabindex");n.tabIndex=-1,n.focus({preventScroll:!0,focusVisible:!1}),t!==null?n.setAttribute("tabindex",t):n.removeAttribute("tabindex");const r=getSelection();if(r&&r.type!=="None"){const a=[];for(let o=0;o{if(r.rangeCount===a.length){for(let o=0;o{a=d,o=h});return i.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:((c=e.route)==null?void 0:c.id)??null},url:e.url},to:t&&{params:(n==null?void 0:n.params)??null,route:{id:((l=n==null?void 0:n.route)==null?void 0:l.id)??null},url:t},willUnload:!n,type:r,complete:i},fulfil:a,reject:o}}export{ln as a,U as b,P as s,ye as w}; diff --git a/_app/immutable/chunks/entry.D3evG2He.js b/_app/immutable/chunks/entry.D3evG2He.js deleted file mode 100644 index b3bdd53..0000000 --- a/_app/immutable/chunks/entry.D3evG2He.js +++ /dev/null @@ -1,3 +0,0 @@ -import{n as le,s as ut,t as dt}from"./scheduler.DK_yUdRf.js";new URL("sveltekit-internal://");function ht(e,n){return e==="/"||n==="ignore"?e:n==="never"?e.endsWith("/")?e.slice(0,-1):e:n==="always"&&!e.endsWith("/")?e+"/":e}function pt(e){return e.split("%25").map(decodeURI).join("%25")}function gt(e){for(const n in e)e[n]=decodeURIComponent(e[n]);return e}function fe({href:e}){return e.split("#")[0]}const mt=["href","pathname","search","toString","toJSON"];function yt(e,n,t){const r=new URL(e);Object.defineProperty(r,"searchParams",{value:new Proxy(r.searchParams,{get(a,o){if(o==="get"||o==="getAll"||o==="has")return s=>(t(s),a[o](s));n();const i=Reflect.get(a,o);return typeof i=="function"?i.bind(a):i}}),enumerable:!0,configurable:!0});for(const a of mt)Object.defineProperty(r,a,{get(){return n(),e[a]},enumerable:!0,configurable:!0});return r}const _t="/__data.json",wt=".html__data.json";function vt(e){return e.endsWith(".html")?e.replace(/\.html$/,wt):e.replace(/\/$/,"")+_t}function bt(...e){let n=5381;for(const t of e)if(typeof t=="string"){let r=t.length;for(;r;)n=n*33^t.charCodeAt(--r)}else if(ArrayBuffer.isView(t)){const r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);let a=r.length;for(;a;)n=n*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(n>>>0).toString(36)}function At(e){const n=atob(e),t=new Uint8Array(n.length);for(let r=0;r((e instanceof Request?e.method:(n==null?void 0:n.method)||"GET")!=="GET"&&B.delete(me(e)),Ve(e,n));const B=new Map;function kt(e,n){const t=me(e,n),r=document.querySelector(t);if(r!=null&&r.textContent){let{body:a,...o}=JSON.parse(r.textContent);const i=r.getAttribute("data-ttl");return i&&B.set(t,{body:a,init:o,ttl:1e3*Number(i)}),r.getAttribute("data-b64")!==null&&(a=At(a)),Promise.resolve(new Response(a,o))}return window.fetch(e,n)}function Et(e,n,t){if(B.size>0){const r=me(e,t),a=B.get(r);if(a){if(performance.now(){const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return n.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/(.*))?";const o=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(o)return n.push({name:o[1],matcher:o[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const i=r.split(/\[(.+?)\](?!\])/);return"/"+i.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return ue(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return ue(String.fromCharCode(...c.slice(2).split("-").map(f=>parseInt(f,16))));const d=St.exec(c),[,h,y,u,g]=d;return n.push({name:u,matcher:g,optional:!!h,rest:!!y,chained:y?l===1&&i[0]==="":!1}),y?"(.*?)":h?"([^/]*)?":"([^/]+?)"}return ue(c)}).join("")}).join("")}/?$`),params:n}}function It(e){return!/^\([^)]+\)$/.test(e)}function Tt(e){return e.slice(1).split("/").filter(It)}function Ut(e,n,t){const r={},a=e.slice(1),o=a.filter(s=>s!==void 0);let i=0;for(let s=0;sd).join("/"),i=0),l===void 0){c.rest&&(r[c.name]="");continue}if(!c.matcher||t[c.matcher](l)){r[c.name]=l;const d=n[s+1],h=a[s+1];d&&!d.rest&&d.optional&&h&&c.chained&&(i=0),!d&&!h&&Object.keys(r).length===o.length&&(i=0);continue}if(c.optional&&c.chained){i++;continue}return}if(!i)return r}function ue(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Lt({nodes:e,server_loads:n,dictionary:t,matchers:r}){const a=new Set(n);return Object.entries(t).map(([s,[c,l,d]])=>{const{pattern:h,params:y}=Rt(s),u={id:s,exec:g=>{const f=h.exec(g);if(f)return Ut(f,y,r)},errors:[1,...d||[]].map(g=>e[g]),layouts:[0,...l||[]].map(i),leaf:o(c)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function o(s){const c=s<0;return c&&(s=~s),[c,e[s]]}function i(s){return s===void 0?s:[a.has(s),e[s]]}}function qe(e,n=JSON.parse){try{return n(sessionStorage[e])}catch{}}function Ue(e,n,t=JSON.stringify){const r=t(n);try{sessionStorage[e]=r}catch{}}const O=[];function ye(e,n=le){let t;const r=new Set;function a(s){if(ut(e,s)&&(e=s,t)){const c=!O.length;for(const l of r)l[1](),O.push(l,e);if(c){for(let l=0;l{r.delete(l),r.size===0&&t&&(t(),t=null)}}return{set:a,update:o,subscribe:i}}var $e;const U=(($e=globalThis.__sveltekit_sb0rq7)==null?void 0:$e.base)??"";var Fe;const Pt=((Fe=globalThis.__sveltekit_sb0rq7)==null?void 0:Fe.assets)??U,xt="1734127044258",Be="sveltekit:snapshot",Ge="sveltekit:scroll",Me="sveltekit:states",Ct="sveltekit:pageurl",$="sveltekit:history",M="sveltekit:navigation",z={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},W=location.origin;function He(e){if(e instanceof URL)return e;let n=document.baseURI;if(!n){const t=document.getElementsByTagName("base");n=t.length?t[0].href:document.URL}return new URL(e,n)}function _e(){return{x:pageXOffset,y:pageYOffset}}function j(e,n){return e.getAttribute(`data-sveltekit-${n}`)}const Le={...z,"":z.hover};function Ke(e){let n=e.assignedSlot??e.parentNode;return(n==null?void 0:n.nodeType)===11&&(n=n.host),n}function We(e,n){for(;e&&e!==n;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=Ke(e)}}function he(e,n){let t;try{t=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI)}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,a=!t||!!r||re(t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=(t==null?void 0:t.origin)===W&&e.hasAttribute("download");return{url:t,external:a,target:r,download:o}}function J(e){let n=null,t=null,r=null,a=null,o=null,i=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=j(s,"preload-code")),a===null&&(a=j(s,"preload-data")),n===null&&(n=j(s,"keepfocus")),t===null&&(t=j(s,"noscroll")),o===null&&(o=j(s,"reload")),i===null&&(i=j(s,"replacestate")),s=Ke(s);function c(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Le[r??"off"],preload_data:Le[a??"off"],keepfocus:c(n),noscroll:c(t),reload:c(o),replace_state:c(i)}}function Pe(e){const n=ye(e);let t=!0;function r(){t=!0,n.update(i=>i)}function a(i){t=!1,n.set(i)}function o(i){let s;return n.subscribe(c=>{(s===void 0||t&&c!==s)&&i(s=c)})}return{notify:r,set:a,subscribe:o}}function Nt(){const{set:e,subscribe:n}=ye(!1);let t;async function r(){clearTimeout(t);try{const a=await fetch(`${Pt}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const i=(await a.json()).version!==xt;return i&&(e(!0),clearTimeout(t)),i}catch{return!1}}return{subscribe:n,check:r}}function re(e,n){return e.origin!==W||!e.pathname.startsWith(n)}function xe(e){const n=jt(e),t=new ArrayBuffer(n.length),r=new DataView(t);for(let a=0;a>16),n+=String.fromCharCode((t&65280)>>8),n+=String.fromCharCode(t&255),t=r=0);return r===12?(t>>=4,n+=String.fromCharCode(t)):r===18&&(t>>=2,n+=String.fromCharCode((t&65280)>>8),n+=String.fromCharCode(t&255)),n}const Dt=-1,$t=-2,Ft=-3,Vt=-4,qt=-5,Bt=-6;function Gt(e,n){if(typeof e=="number")return a(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const t=e,r=Array(t.length);function a(o,i=!1){if(o===Dt)return;if(o===Ft)return NaN;if(o===Vt)return 1/0;if(o===qt)return-1/0;if(o===Bt)return-0;if(i)throw new Error("Invalid input");if(o in r)return r[o];const s=t[o];if(!s||typeof s!="object")r[o]=s;else if(Array.isArray(s))if(typeof s[0]=="string"){const c=s[0],l=n==null?void 0:n[c];if(l)return r[o]=l(a(s[1]));switch(c){case"Date":r[o]=new Date(s[1]);break;case"Set":const d=new Set;r[o]=d;for(let u=1;un!=null)}class ae{constructor(n,t){this.status=n,typeof t=="string"?this.body={message:t}:t?this.body=t:this.body={message:`Error: ${n}`}}toString(){return JSON.stringify(this.body)}}class ze{constructor(n,t){this.status=n,this.location=t}}class we extends Error{constructor(n,t,r){super(r),this.status=n,this.text=t}}const Kt="x-sveltekit-invalidated",Wt="x-sveltekit-trailing-slash";function X(e){return e instanceof ae||e instanceof we?e.status:500}function Yt(e){return e instanceof we?e.text:"Internal Error"}const zt=new Set(["icon","shortcut icon","apple-touch-icon"]),C=qe(Ge)??{},H=qe(Be)??{},P={url:Pe({}),page:Pe({}),navigating:ye(null),updated:Nt()};function ve(e){C[e]=_e()}function Jt(e,n){let t=e+1;for(;C[t];)delete C[t],t+=1;for(t=n+1;H[t];)delete H[t],t+=1}function V(e){return location.href=e.href,new Promise(()=>{})}async function Je(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}function Ce(){}let oe,pe,Z,L,ge,N;const Xe=[],Q=[];let R=null;const Ze=[],Xt=[];let D=[],_={branch:[],error:null,url:null},be=!1,ee=!1,Ne=!0,K=!1,q=!1,Qe=!1,Ae=!1,ke,S,T,I,te;const G=new Set;async function ln(e,n,t){var a,o,i,s;document.URL!==location.href&&(location.href=location.href),N=e,await((o=(a=e.hooks).init)==null?void 0:o.call(a)),oe=Lt(e),L=document.documentElement,ge=n,pe=e.nodes[0],Z=e.nodes[1],pe(),Z(),S=(i=history.state)==null?void 0:i[$],T=(s=history.state)==null?void 0:s[M],S||(S=T=Date.now(),history.replaceState({...history.state,[$]:S,[M]:T},""));const r=C[S];r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y)),t?await on(ge,t):rn(location.href,{replaceState:!0}),an()}function Zt(){Xe.length=0,Ae=!1}function et(e){Q.some(n=>n==null?void 0:n.snapshot)&&(H[e]=Q.map(n=>{var t;return(t=n==null?void 0:n.snapshot)==null?void 0:t.capture()}))}function tt(e){var n;(n=H[e])==null||n.forEach((t,r)=>{var a,o;(o=(a=Q[r])==null?void 0:a.snapshot)==null||o.restore(t)})}function Oe(){ve(S),Ue(Ge,C),et(T),Ue(Be,H)}async function nt(e,n,t,r){return Y({type:"goto",url:He(e),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:t,nav_token:r,accept:()=>{n.invalidateAll&&(Ae=!0)}})}async function Qt(e){if(e.id!==(R==null?void 0:R.id)){const n={};G.add(n),R={id:e.id,token:n,promise:at({...e,preload:n}).then(t=>(G.delete(n),t.type==="loaded"&&t.state.error&&(R=null),t))}}return R.promise}async function de(e){const n=oe.find(t=>t.exec(ot(e)));n&&await Promise.all([...n.layouts,n.leaf].map(t=>t==null?void 0:t[1]()))}function rt(e,n,t){var o;_=e.state;const r=document.querySelector("style[data-sveltekit]");r&&r.remove(),I=e.props.page,ke=new N.root({target:n,props:{...e.props,stores:P,components:Q},hydrate:t,sync:!1}),tt(T);const a={from:null,to:{params:_.params,route:{id:((o=_.route)==null?void 0:o.id)??null},url:new URL(location.href)},willUnload:!1,type:"enter",complete:Promise.resolve()};D.forEach(i=>i(a)),ee=!0}function ne({url:e,params:n,branch:t,status:r,error:a,route:o,form:i}){let s="never";if(U&&(e.pathname===U||e.pathname===U+"/"))s="always";else for(const u of t)(u==null?void 0:u.slash)!==void 0&&(s=u.slash);e.pathname=ht(e.pathname,s),e.search=e.search;const c={type:"loaded",state:{url:e,params:n,branch:t,error:a,route:o},props:{constructors:Ht(t).map(u=>u.node.component),page:I}};i!==void 0&&(c.props.form=i);let l={},d=!I,h=0;for(let u=0;u(s&&(c.route=!0),f[p])}),params:new Proxy(r,{get:(f,p)=>(s&&c.params.add(p),f[p])}),data:(o==null?void 0:o.data)??null,url:yt(t,()=>{s&&(c.url=!0)},f=>{s&&c.search_params.add(f)}),async fetch(f,p){let b;f instanceof Request?(b=f.url,p={body:f.method==="GET"||f.method==="HEAD"?void 0:await f.blob(),cache:f.cache,credentials:f.credentials,headers:[...f.headers].length?f.headers:void 0,integrity:f.integrity,keepalive:f.keepalive,method:f.method,mode:f.mode,redirect:f.redirect,referrer:f.referrer,referrerPolicy:f.referrerPolicy,signal:f.signal,...p}):b=f;const k=new URL(b,t);return s&&u(k.href),k.origin===t.origin&&(b=k.href.slice(t.origin.length)),ee?Et(b,k.href,p):kt(b,p)},setHeaders:()=>{},depends:u,parent(){return s&&(c.parent=!0),n()},untrack(f){s=!1;try{return f()}finally{s=!0}}};i=await l.universal.load.call(null,g)??null}return{node:l,loader:e,server:o,universal:(h=l.universal)!=null&&h.load?{type:"data",data:i,uses:c}:null,data:i??(o==null?void 0:o.data)??null,slash:((y=l.universal)==null?void 0:y.trailingSlash)??(o==null?void 0:o.slash)}}function je(e,n,t,r,a,o){if(Ae)return!0;if(!a)return!1;if(a.parent&&e||a.route&&n||a.url&&t)return!0;for(const i of a.search_params)if(r.has(i))return!0;for(const i of a.params)if(o[i]!==_.params[i])return!0;for(const i of a.dependencies)if(Xe.some(s=>s(new URL(i))))return!0;return!1}function Se(e,n){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?n??null:null}function en(e,n){if(!e)return new Set(n.searchParams.keys());const t=new Set([...e.searchParams.keys(),...n.searchParams.keys()]);for(const r of t){const a=e.searchParams.getAll(r),o=n.searchParams.getAll(r);a.every(i=>o.includes(i))&&o.every(i=>a.includes(i))&&t.delete(r)}return t}function De({error:e,url:n,route:t,params:r}){return{type:"loaded",state:{error:e,url:n,route:t,params:r,branch:[]},props:{page:I,constructors:[]}}}async function at({id:e,invalidating:n,url:t,params:r,route:a,preload:o}){if((R==null?void 0:R.id)===e)return G.delete(R.token),R.promise;const{errors:i,layouts:s,leaf:c}=a,l=[...s,c];i.forEach(m=>m==null?void 0:m().catch(()=>{})),l.forEach(m=>m==null?void 0:m[1]().catch(()=>{}));let d=null;const h=_.url?e!==_.url.pathname+_.url.search:!1,y=_.route?a.id!==_.route.id:!1,u=en(_.url,t);let g=!1;const f=l.map((m,v)=>{var x;const A=_.branch[v],E=!!(m!=null&&m[0])&&((A==null?void 0:A.loader)!==m[1]||je(g,y,h,u,(x=A.server)==null?void 0:x.uses,r));return E&&(g=!0),E});if(f.some(Boolean)){try{d=await ct(t,f)}catch(m){const v=await F(m,{url:t,params:r,route:{id:e}});return G.has(o)?De({error:v,url:t,params:r,route:a}):se({status:X(m),error:v,url:t,route:a})}if(d.type==="redirect")return d}const p=d==null?void 0:d.nodes;let b=!1;const k=l.map(async(m,v)=>{var ie;if(!m)return;const A=_.branch[v],E=p==null?void 0:p[v];if((!E||E.type==="skip")&&m[1]===(A==null?void 0:A.loader)&&!je(b,y,h,u,(ie=A.universal)==null?void 0:ie.uses,r))return A;if(b=!0,(E==null?void 0:E.type)==="error")throw E;return Ee({loader:m[1],url:t,params:r,route:a,parent:async()=>{var Te;const Ie={};for(let ce=0;ce{});const w=[];for(let m=0;mPromise.resolve({}),server_data_node:Se(o)}),c={node:await Z(),loader:Z,universal:null,server:null,data:null};return ne({url:t,params:a,branch:[s,c],status:e,error:n,route:null})}function Re(e,n){if(!e||re(e,U))return;let t;try{t=N.hooks.reroute({url:new URL(e)})??e.pathname}catch{return}const r=ot(t);for(const a of oe){const o=a.exec(r);if(o)return{id:e.pathname+e.search,invalidating:n,route:a,params:gt(o),url:e}}}function ot(e){return pt(e.slice(U.length)||"/")}function st({url:e,type:n,intent:t,delta:r}){let a=!1;const o=ft(_,t,e,n);r!==void 0&&(o.navigation.delta=r);const i={...o.navigation,cancel:()=>{a=!0,o.reject(new Error("navigation cancelled"))}};return K||Ze.forEach(s=>s(i)),a?null:o}async function Y({type:e,url:n,popped:t,keepfocus:r,noscroll:a,replace_state:o,state:i={},redirect_count:s=0,nav_token:c={},accept:l=Ce,block:d=Ce}){const h=Re(n,!1),y=st({url:n,type:e,delta:t==null?void 0:t.delta,intent:h});if(!y){d();return}const u=S,g=T;l(),K=!0,ee&&P.navigating.set(y.navigation),te=c;let f=h&&await at(h);if(!f){if(re(n,U))return await V(n);f=await it(n,{id:null},await F(new we(404,"Not Found",`Not found: ${n.pathname}`),{url:n,params:{},route:{id:null}}),404)}if(n=(h==null?void 0:h.url)||n,te!==c)return y.reject(new Error("navigation aborted")),!1;if(f.type==="redirect")if(s>=20)f=await se({status:500,error:await F(new Error("Redirect loop"),{url:n,params:{},route:{id:null}}),url:n,route:{id:null}});else return nt(new URL(f.location,n).href,{},s+1,c),!1;else f.props.page.status>=400&&await P.updated.check()&&(await Je(),await V(n));if(Zt(),ve(u),et(g),f.props.page.url.pathname!==n.pathname&&(n.pathname=f.props.page.url.pathname),i=t?t.state:i,!t){const w=o?0:1,m={[$]:S+=w,[M]:T+=w,[Me]:i};(o?history.replaceState:history.pushState).call(history,m,"",n),o||Jt(S,T)}if(R=null,f.props.page.state=i,ee){_=f.state,f.props.page&&(f.props.page.url=n);const w=(await Promise.all(Xt.map(m=>m(y.navigation)))).filter(m=>typeof m=="function");if(w.length>0){let m=function(){D=D.filter(v=>!w.includes(v))};w.push(m),D.push(...w)}ke.$set(f.props),Qe=!0}else rt(f,ge,!1);const{activeElement:p}=document;await dt();const b=t?t.scroll:a?_e():null;if(Ne){const w=n.hash&&document.getElementById(decodeURIComponent(n.hash.slice(1)));b?scrollTo(b.x,b.y):w?w.scrollIntoView():scrollTo(0,0)}const k=document.activeElement!==p&&document.activeElement!==document.body;!r&&!k&&sn(),Ne=!0,f.props.page&&(I=f.props.page),K=!1,e==="popstate"&&tt(T),y.fulfil(void 0),D.forEach(w=>w(y.navigation)),P.navigating.set(null)}async function it(e,n,t,r){return e.origin===W&&e.pathname===location.pathname&&!be?await se({status:r,error:t,url:e,route:n}):await V(e)}function nn(){let e;L.addEventListener("mousemove",o=>{const i=o.target;clearTimeout(e),e=setTimeout(()=>{r(i,2)},20)});function n(o){o.defaultPrevented||r(o.composedPath()[0],1)}L.addEventListener("mousedown",n),L.addEventListener("touchstart",n,{passive:!0});const t=new IntersectionObserver(o=>{for(const i of o)i.isIntersecting&&(de(i.target.href),t.unobserve(i.target))},{threshold:0});function r(o,i){const s=We(o,L);if(!s)return;const{url:c,external:l,download:d}=he(s,U);if(l||d)return;const h=J(s),y=c&&_.url.pathname+_.url.search===c.pathname+c.search;if(!h.reload&&!y)if(i<=h.preload_data){const u=Re(c,!1);u&&Qt(u)}else i<=h.preload_code&&de(c.pathname)}function a(){t.disconnect();for(const o of L.querySelectorAll("a")){const{url:i,external:s,download:c}=he(o,U);if(s||c)continue;const l=J(o);l.reload||(l.preload_code===z.viewport&&t.observe(o),l.preload_code===z.eager&&de(i.pathname))}}D.push(a),a()}function F(e,n){if(e instanceof ae)return e.body;const t=X(e),r=Yt(e);return N.hooks.handleError({error:e,event:n,status:t,message:r})??{message:r}}function rn(e,n={}){return e=He(e),e.origin!==W?Promise.reject(new Error("goto: invalid URL")):nt(e,n,0)}function an(){var n;history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let r=!1;if(Oe(),!K){const a=ft(_,void 0,null,"leave"),o={...a.navigation,cancel:()=>{r=!0,a.reject(new Error("navigation cancelled"))}};Ze.forEach(i=>i(o))}r?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Oe()}),(n=navigator.connection)!=null&&n.saveData||nn(),L.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const r=We(t.composedPath()[0],L);if(!r)return;const{url:a,external:o,target:i,download:s}=he(r,U);if(!a)return;if(i==="_parent"||i==="_top"){if(window.parent!==window)return}else if(i&&i!=="_self")return;const c=J(r);if(!(r instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||s)return;const[d,h]=a.href.split("#"),y=d===fe(location);if(o||c.reload&&(!y||!h)){st({url:a,type:"link"})?K=!0:t.preventDefault();return}if(h!==void 0&&y){const[,u]=_.url.href.split("#");if(u===h){if(t.preventDefault(),h===""||h==="top"&&r.ownerDocument.getElementById("top")===null)window.scrollTo({top:0});else{const g=r.ownerDocument.getElementById(decodeURIComponent(h));g&&(g.scrollIntoView(),g.focus())}return}if(q=!0,ve(S),e(a),!c.replace_state)return;q=!1}t.preventDefault(),await new Promise(u=>{requestAnimationFrame(()=>{setTimeout(u,0)}),setTimeout(u,100)}),Y({type:"link",url:a,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??a.href===location.href})}),L.addEventListener("submit",t=>{if(t.defaultPrevented)return;const r=HTMLFormElement.prototype.cloneNode.call(t.target),a=t.submitter;if(((a==null?void 0:a.formTarget)||r.target)==="_blank"||((a==null?void 0:a.formMethod)||r.method)!=="get")return;const s=new URL((a==null?void 0:a.hasAttribute("formaction"))&&(a==null?void 0:a.formAction)||r.action);if(re(s,U))return;const c=t.target,l=J(c);if(l.reload)return;t.preventDefault(),t.stopPropagation();const d=new FormData(c),h=a==null?void 0:a.getAttribute("name");h&&d.append(h,(a==null?void 0:a.getAttribute("value"))??""),s.search=new URLSearchParams(d).toString(),Y({type:"form",url:s,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??s.href===location.href})}),addEventListener("popstate",async t=>{var r;if((r=t.state)!=null&&r[$]){const a=t.state[$];if(te={},a===S)return;const o=C[a],i=t.state[Me]??{},s=new URL(t.state[Ct]??location.href),c=t.state[M],l=fe(location)===fe(_.url);if(c===T&&(Qe||l)){e(s),C[S]=_e(),o&&scrollTo(o.x,o.y),i!==I.state&&(I={...I,state:i},ke.$set({page:I})),S=a;return}const h=a-S;await Y({type:"popstate",url:s,popped:{state:i,scroll:o,delta:h},accept:()=>{S=a,T=c},block:()=>{history.go(-h)},nav_token:te})}else if(!q){const a=new URL(location.href);e(a)}}),addEventListener("hashchange",()=>{q&&(q=!1,history.replaceState({...history.state,[$]:++S,[M]:T},"",location.href))});for(const t of document.querySelectorAll("link"))zt.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&P.navigating.set(null)});function e(t){_.url=t,P.page.set({...I,url:t}),P.page.notify()}}async function on(e,{status:n=200,error:t,node_ids:r,params:a,route:o,data:i,form:s}){be=!0;const c=new URL(location.href);({params:a={},route:o={id:null}}=Re(c,!1)||{});let l,d=!0;try{const h=r.map(async(g,f)=>{const p=i[f];return p!=null&&p.uses&&(p.uses=lt(p.uses)),Ee({loader:N.nodes[g],url:c,params:a,route:o,parent:async()=>{const b={};for(let k=0;kg===o.id);if(u){const g=u.layouts;for(let f=0;fo?"1":"0").join(""));const r=await Ve(t.href);if(!r.ok){let o;throw(a=r.headers.get("content-type"))!=null&&a.includes("application/json")?o=await r.json():r.status===404?o="Not Found":r.status===500&&(o="Internal Error"),new ae(r.status,o)}return new Promise(async o=>{var h;const i=new Map,s=r.body.getReader(),c=new TextDecoder;function l(y){return Gt(y,{...N.decoders,Promise:u=>new Promise((g,f)=>{i.set(u,{fulfil:g,reject:f})})})}let d="";for(;;){const{done:y,value:u}=await s.read();if(y&&!d)break;for(d+=!u&&d?` -`:c.decode(u,{stream:!0});;){const g=d.indexOf(` -`);if(g===-1)break;const f=JSON.parse(d.slice(0,g));if(d=d.slice(g+1),f.type==="redirect")return o(f);if(f.type==="data")(h=f.nodes)==null||h.forEach(p=>{(p==null?void 0:p.type)==="data"&&(p.uses=lt(p.uses),p.data=l(p.data))}),o(f);else if(f.type==="chunk"){const{id:p,data:b,error:k}=f,w=i.get(p);i.delete(p),k?w.reject(l(k)):w.fulfil(l(b))}}}})}function lt(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}function sn(){const e=document.querySelector("[autofocus]");if(e)e.focus();else{const n=document.body,t=n.getAttribute("tabindex");n.tabIndex=-1,n.focus({preventScroll:!0,focusVisible:!1}),t!==null?n.setAttribute("tabindex",t):n.removeAttribute("tabindex");const r=getSelection();if(r&&r.type!=="None"){const a=[];for(let o=0;o{if(r.rangeCount===a.length){for(let o=0;o{a=d,o=h});return i.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:((c=e.route)==null?void 0:c.id)??null},url:e.url},to:t&&{params:(n==null?void 0:n.params)??null,route:{id:((l=n==null?void 0:n.route)==null?void 0:l.id)??null},url:t},willUnload:!n,type:r,complete:i},fulfil:a,reject:o}}export{ln as a,U as b,P as s,ye as w}; diff --git a/_app/immutable/chunks/stores.BM3ezKuT.js b/_app/immutable/chunks/stores.BhPy-k-g.js similarity index 72% rename from _app/immutable/chunks/stores.BM3ezKuT.js rename to _app/immutable/chunks/stores.BhPy-k-g.js index 48fcf36..2ddfee0 100644 --- a/_app/immutable/chunks/stores.BM3ezKuT.js +++ b/_app/immutable/chunks/stores.BhPy-k-g.js @@ -1 +1 @@ -import{s as e}from"./entry.D3evG2He.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p}; +import{s as e}from"./entry.B3JBGiH6.js";const r=()=>{const s=e;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},b={subscribe(s){return r().page.subscribe(s)}};export{b as p}; diff --git a/_app/immutable/entry/app.BEJM2vMu.js b/_app/immutable/entry/app.BEJM2vMu.js deleted file mode 100644 index 9993d76..0000000 --- a/_app/immutable/entry/app.BEJM2vMu.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.Dz6kyvS1.js","../chunks/scheduler.DK_yUdRf.js","../chunks/index.BH5W4qoH.js","../chunks/31.DSOxMhdt.js","../chunks/stores.BM3ezKuT.js","../chunks/entry.D3evG2He.js","../chunks/preload-helper.C1FmrZbK.js","../chunks/Icon.Bx2gT0jJ.js","../chunks/Divider.CPgZZ_Vn.js","../assets/Divider.D1tZzeMU.css","../chunks/Button.ChCyQFAf.js","../chunks/index.D7Jwt5yH.js","../assets/Button.572WoT2r.css","../assets/0.CUM-9RFr.css","../nodes/1.C_leV2J5.js","../nodes/2.BjK6yfax.js","../chunks/Loader.BLQl2yzu.js","../assets/Loader.BCLqNT-k.css","../chunks/await_block.MuLFoa1l.js","../assets/2.ImyfZtpj.css","../nodes/3.BXkYFKP0.js","../assets/3.ESwpS0g4.css","../nodes/4.Cmp6lILt.js","../chunks/Blog.CCBUvJ2X.js","../assets/Blog.qbKNoHxl.css","../nodes/5.CPEhPCo4.js","../nodes/6.BI8nFyYB.js","../nodes/7.ByDDEXL7.js","../nodes/8.CIMUlBgX.js","../nodes/9.BqYFX3cx.js","../nodes/10.ZhzfoyBI.js","../nodes/11.CeefyKN_.js","../nodes/12.C_U6RxTB.js","../nodes/13.DoChlMY0.js","../nodes/14.Uvgu7RSF.js","../nodes/15.DBfkxhtO.js","../nodes/16.QRUg7IPr.js","../nodes/17.CN4gGUtS.js","../nodes/18.DkyBdtYE.js","../nodes/19.Cwmy5wqK.js","../nodes/20.C176ImR1.js","../nodes/21.0NXIf5JO.js","../nodes/22.BpY3VGvo.js","../nodes/23.oi5a04Gm.js","../nodes/24.8Fmjw8b3.js","../nodes/25.Bk3GWU5c.js","../nodes/26.DCCBDnFV.js","../nodes/27.DzqyIc_W.js","../nodes/28.CVpMfAo_.js","../nodes/29.Ck8I_72p.js","../nodes/30.PBBgLjcP.js","../nodes/31.fo6ymEmL.js","../nodes/32.DyScs9hf.js"])))=>i.map(i=>d[i]); -import{_ as s}from"../chunks/preload-helper.C1FmrZbK.js";import{s as j,d as S,o as C,e as R,t as z}from"../chunks/scheduler.DK_yUdRf.js";import{S as B,i as M,s as U,A as d,f as X,g as h,l as g,m as I,n as E,d as b,e as F,c as G,a as H,y as T,B as c,t as J,b as K,j as Q,k as P,C as O,u as w,v as V,w as A,x as D}from"../chunks/index.BH5W4qoH.js";const _t={};function W(_){let t,r,i;var o=_[1][0];function f(e,n){return{props:{data:e[3],form:e[2]}}}return o&&(t=O(o,f(_)),_[12](t)),{c(){t&&w(t.$$.fragment),r=d()},l(e){t&&V(t.$$.fragment,e),r=d()},m(e,n){t&&A(t,e,n),h(e,r,n),i=!0},p(e,n){if(n&2&&o!==(o=e[1][0])){if(t){P();const a=t;g(a.$$.fragment,1,0,()=>{D(a,1)}),I()}o?(t=O(o,f(e)),e[12](t),w(t.$$.fragment),E(t.$$.fragment,1),A(t,r.parentNode,r)):t=null}else if(o){const a={};n&8&&(a.data=e[3]),n&4&&(a.form=e[2]),t.$set(a)}},i(e){i||(t&&E(t.$$.fragment,e),i=!0)},o(e){t&&g(t.$$.fragment,e),i=!1},d(e){e&&b(r),_[12](null),t&&D(t,e)}}}function Y(_){let t,r,i;var o=_[1][0];function f(e,n){return{props:{data:e[3],$$slots:{default:[Z]},$$scope:{ctx:e}}}}return o&&(t=O(o,f(_)),_[11](t)),{c(){t&&w(t.$$.fragment),r=d()},l(e){t&&V(t.$$.fragment,e),r=d()},m(e,n){t&&A(t,e,n),h(e,r,n),i=!0},p(e,n){if(n&2&&o!==(o=e[1][0])){if(t){P();const a=t;g(a.$$.fragment,1,0,()=>{D(a,1)}),I()}o?(t=O(o,f(e)),e[11](t),w(t.$$.fragment),E(t.$$.fragment,1),A(t,r.parentNode,r)):t=null}else if(o){const a={};n&8&&(a.data=e[3]),n&8215&&(a.$$scope={dirty:n,ctx:e}),t.$set(a)}},i(e){i||(t&&E(t.$$.fragment,e),i=!0)},o(e){t&&g(t.$$.fragment,e),i=!1},d(e){e&&b(r),_[11](null),t&&D(t,e)}}}function Z(_){let t,r,i;var o=_[1][1];function f(e,n){return{props:{data:e[4],form:e[2]}}}return o&&(t=O(o,f(_)),_[10](t)),{c(){t&&w(t.$$.fragment),r=d()},l(e){t&&V(t.$$.fragment,e),r=d()},m(e,n){t&&A(t,e,n),h(e,r,n),i=!0},p(e,n){if(n&2&&o!==(o=e[1][1])){if(t){P();const a=t;g(a.$$.fragment,1,0,()=>{D(a,1)}),I()}o?(t=O(o,f(e)),e[10](t),w(t.$$.fragment),E(t.$$.fragment,1),A(t,r.parentNode,r)):t=null}else if(o){const a={};n&16&&(a.data=e[4]),n&4&&(a.form=e[2]),t.$set(a)}},i(e){i||(t&&E(t.$$.fragment,e),i=!0)},o(e){t&&g(t.$$.fragment,e),i=!1},d(e){e&&b(r),_[10](null),t&&D(t,e)}}}function L(_){let t,r=_[6]&&y(_);return{c(){t=F("div"),r&&r.c(),this.h()},l(i){t=G(i,"DIV",{id:!0,"aria-live":!0,"aria-atomic":!0,style:!0});var o=H(t);r&&r.l(o),o.forEach(b),this.h()},h(){T(t,"id","svelte-announcer"),T(t,"aria-live","assertive"),T(t,"aria-atomic","true"),c(t,"position","absolute"),c(t,"left","0"),c(t,"top","0"),c(t,"clip","rect(0 0 0 0)"),c(t,"clip-path","inset(50%)"),c(t,"overflow","hidden"),c(t,"white-space","nowrap"),c(t,"width","1px"),c(t,"height","1px")},m(i,o){h(i,t,o),r&&r.m(t,null)},p(i,o){i[6]?r?r.p(i,o):(r=y(i),r.c(),r.m(t,null)):r&&(r.d(1),r=null)},d(i){i&&b(t),r&&r.d()}}}function y(_){let t;return{c(){t=J(_[7])},l(r){t=K(r,_[7])},m(r,i){h(r,t,i)},p(r,i){i&128&&Q(t,r[7])},d(r){r&&b(t)}}}function $(_){let t,r,i,o,f;const e=[Y,W],n=[];function a(l,p){return l[1][1]?0:1}t=a(_),r=n[t]=e[t](_);let u=_[5]&&L(_);return{c(){r.c(),i=U(),u&&u.c(),o=d()},l(l){r.l(l),i=X(l),u&&u.l(l),o=d()},m(l,p){n[t].m(l,p),h(l,i,p),u&&u.m(l,p),h(l,o,p),f=!0},p(l,[p]){let v=t;t=a(l),t===v?n[t].p(l,p):(P(),g(n[v],1,1,()=>{n[v]=null}),I(),r=n[t],r?r.p(l,p):(r=n[t]=e[t](l),r.c()),E(r,1),r.m(i.parentNode,i)),l[5]?u?u.p(l,p):(u=L(l),u.c(),u.m(o.parentNode,o)):u&&(u.d(1),u=null)},i(l){f||(E(r),f=!0)},o(l){g(r),f=!1},d(l){l&&(b(i),b(o)),n[t].d(l),u&&u.d(l)}}}function x(_,t,r){let{stores:i}=t,{page:o}=t,{constructors:f}=t,{components:e=[]}=t,{form:n}=t,{data_0:a=null}=t,{data_1:u=null}=t;S(i.page.notify);let l=!1,p=!1,v=null;C(()=>{const m=i.page.subscribe(()=>{l&&(r(6,p=!0),z().then(()=>{r(7,v=document.title||"untitled page")}))});return r(5,l=!0),m});function k(m){R[m?"unshift":"push"](()=>{e[1]=m,r(0,e)})}function N(m){R[m?"unshift":"push"](()=>{e[0]=m,r(0,e)})}function q(m){R[m?"unshift":"push"](()=>{e[0]=m,r(0,e)})}return _.$$set=m=>{"stores"in m&&r(8,i=m.stores),"page"in m&&r(9,o=m.page),"constructors"in m&&r(1,f=m.constructors),"components"in m&&r(0,e=m.components),"form"in m&&r(2,n=m.form),"data_0"in m&&r(3,a=m.data_0),"data_1"in m&&r(4,u=m.data_1)},_.$$.update=()=>{_.$$.dirty&768&&i.page.set(o)},[e,f,n,a,u,l,p,v,i,o,k,N,q]}class nt extends B{constructor(t){super(),M(this,t,x,$,j,{stores:8,page:9,constructors:1,components:0,form:2,data_0:3,data_1:4})}}const st=[()=>s(()=>import("../nodes/0.Dz6kyvS1.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]),import.meta.url),()=>s(()=>import("../nodes/1.C_leV2J5.js"),__vite__mapDeps([14,1,2,4,5]),import.meta.url),()=>s(()=>import("../nodes/2.BjK6yfax.js"),__vite__mapDeps([15,3,1,2,4,5,6,10,7,11,12,8,9,16,17,18,19]),import.meta.url),()=>s(()=>import("../nodes/3.BXkYFKP0.js"),__vite__mapDeps([20,1,2,4,5,3,6,16,17,7,11,21]),import.meta.url),()=>s(()=>import("../nodes/4.Cmp6lILt.js"),__vite__mapDeps([22,3,1,2,4,5,6,23,18,16,17,10,7,11,12,24]),import.meta.url),()=>s(()=>import("../nodes/5.CPEhPCo4.js"),__vite__mapDeps([25,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/6.BI8nFyYB.js"),__vite__mapDeps([26,3,1,2,4,5,6,23,18,16,17,10,7,11,12,24]),import.meta.url),()=>s(()=>import("../nodes/7.ByDDEXL7.js"),__vite__mapDeps([27,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/8.CIMUlBgX.js"),__vite__mapDeps([28,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/9.BqYFX3cx.js"),__vite__mapDeps([29,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/10.ZhzfoyBI.js"),__vite__mapDeps([30,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/11.CeefyKN_.js"),__vite__mapDeps([31,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/12.C_U6RxTB.js"),__vite__mapDeps([32,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/13.DoChlMY0.js"),__vite__mapDeps([33,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/14.Uvgu7RSF.js"),__vite__mapDeps([34,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/15.DBfkxhtO.js"),__vite__mapDeps([35,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/16.QRUg7IPr.js"),__vite__mapDeps([36,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/17.CN4gGUtS.js"),__vite__mapDeps([37,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/18.DkyBdtYE.js"),__vite__mapDeps([38,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/19.Cwmy5wqK.js"),__vite__mapDeps([39,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/20.C176ImR1.js"),__vite__mapDeps([40,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/21.0NXIf5JO.js"),__vite__mapDeps([41,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/22.BpY3VGvo.js"),__vite__mapDeps([42,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/23.oi5a04Gm.js"),__vite__mapDeps([43,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/24.8Fmjw8b3.js"),__vite__mapDeps([44,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/25.Bk3GWU5c.js"),__vite__mapDeps([45,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/26.DCCBDnFV.js"),__vite__mapDeps([46,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/27.DzqyIc_W.js"),__vite__mapDeps([47,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/28.CVpMfAo_.js"),__vite__mapDeps([48,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/29.Ck8I_72p.js"),__vite__mapDeps([49,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/30.PBBgLjcP.js"),__vite__mapDeps([50,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/31.fo6ymEmL.js"),__vite__mapDeps([51,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/32.DyScs9hf.js"),__vite__mapDeps([52,1,2,3,4,5,6,16,17,10,7,11,12]),import.meta.url)],at=[],lt={"/":[2],"/about":[3],"/blog":[4],"/blog/STX-interview":[5],"/blog/cbi-installers":[7],"/blog/czi-grant":[8],"/blog/ide-ux-bof-scipy-2024":[9],"/blog/installer-improvements":[10],"/blog/introducing-unittest-plugin":[11],"/blog/introducing-watchlist-plugin":[12],"/blog/release-qtconsole-440":[13],"/blog/release-spyder-330":[14],"/blog/release-spyder-4beta2":[16],"/blog/release-spyder-4":[15],"/blog/release-spyder-6.0.0":[17],"/blog/reusable-research-bof-scipy-2023-part-2":[19],"/blog/reusable-research-bof-scipy-2023":[18],"/blog/spyder-6-remote-development":[20],"/blog/spyder-debugger":[21],"/blog/spyder-files-improvements":[22],"/blog/spyder-kite-funding":[23],"/blog/spyder-roadmap-proposals-2022":[24],"/blog/spyder-status-2018-past":[25],"/blog/spyder-status-2018-present":[26],"/blog/spyder-terminal-030":[27],"/blog/spyder-variable-explorer":[28],"/blog/tdk-micronas-partners-with-quansight-labs":[29],"/blog/tutorial-docs":[30],"/blog/webcast-quansight-ep1":[31],"/blog/[page]":[6],"/download":[32]},tt={handleError:({error:_})=>{console.error(_)},reroute:()=>{},transport:{}},et=Object.fromEntries(Object.entries(tt.transport).map(([_,t])=>[_,t.decode])),mt=(_,t)=>et[_](t);export{mt as decode,et as decoders,lt as dictionary,tt as hooks,_t as matchers,st as nodes,nt as root,at as server_loads}; diff --git a/_app/immutable/entry/app.D_G8xEe3.js b/_app/immutable/entry/app.D_G8xEe3.js new file mode 100644 index 0000000..60be30f --- /dev/null +++ b/_app/immutable/entry/app.D_G8xEe3.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.x3Ress_v.js","../chunks/scheduler.DK_yUdRf.js","../chunks/index.BH5W4qoH.js","../chunks/32.L6pbTd52.js","../chunks/stores.BhPy-k-g.js","../chunks/entry.B3JBGiH6.js","../chunks/preload-helper.C1FmrZbK.js","../chunks/Icon.vbkowJrT.js","../chunks/Divider.CPgZZ_Vn.js","../assets/Divider.D1tZzeMU.css","../chunks/Button.fdVjvHGv.js","../chunks/index.D7Jwt5yH.js","../assets/Button.572WoT2r.css","../assets/0.CUM-9RFr.css","../nodes/1.B8mOfAuo.js","../nodes/2.F-sWv22l.js","../chunks/Loader.BLQl2yzu.js","../assets/Loader.BCLqNT-k.css","../chunks/await_block.MuLFoa1l.js","../assets/2.ImyfZtpj.css","../nodes/3.B6GkCI7p.js","../assets/3.ESwpS0g4.css","../nodes/4.CKLUs_MU.js","../chunks/Blog.BORsW5Py.js","../assets/Blog.qbKNoHxl.css","../nodes/5.CqoVVDiu.js","../nodes/6.oAQjjzF1.js","../nodes/7.WJiC7Xza.js","../nodes/8.B-pLuKb2.js","../nodes/9.DYrl36TH.js","../nodes/10.D29oWAnr.js","../nodes/11.BC_2hzsY.js","../nodes/12.C8OyNynO.js","../nodes/13.CIdLLayx.js","../nodes/14.BWF0sv7m.js","../nodes/15.CizcE9GW.js","../nodes/16.CrOfBvLU.js","../nodes/17.DLb4SMyJ.js","../nodes/18.BIT-op4z.js","../nodes/19.BceYICk8.js","../nodes/20.9p-hBudx.js","../nodes/21.kaO0DXVq.js","../nodes/22.B1ap9X7o.js","../nodes/23.DWuDqIAb.js","../nodes/24.Bevl404O.js","../nodes/25.BUOA8RmW.js","../nodes/26.DlcnYkeB.js","../nodes/27.BuDjkUqs.js","../nodes/28.2FF5OsbW.js","../nodes/29.B4sKOZ9y.js","../nodes/30.D3Q3e8xJ.js","../nodes/31.D1ZR4qZO.js","../nodes/32.QosUc112.js","../nodes/33.7fZvnt0G.js"])))=>i.map(i=>d[i]); +import{_ as s}from"../chunks/preload-helper.C1FmrZbK.js";import{s as j,d as S,o as C,e as T,t as z}from"../chunks/scheduler.DK_yUdRf.js";import{S as B,i as M,s as U,A as d,f as X,g as h,l as E,m as P,n as g,d as b,e as F,c as G,a as H,y as V,B as c,t as J,b as K,j as Q,k as R,C as O,u as A,v as w,w as D,x as I}from"../chunks/index.BH5W4qoH.js";const _t={};function W(_){let t,r,i;var o=_[1][0];function f(e,n){return{props:{data:e[3],form:e[2]}}}return o&&(t=O(o,f(_)),_[12](t)),{c(){t&&A(t.$$.fragment),r=d()},l(e){t&&w(t.$$.fragment,e),r=d()},m(e,n){t&&D(t,e,n),h(e,r,n),i=!0},p(e,n){if(n&2&&o!==(o=e[1][0])){if(t){R();const a=t;E(a.$$.fragment,1,0,()=>{I(a,1)}),P()}o?(t=O(o,f(e)),e[12](t),A(t.$$.fragment),g(t.$$.fragment,1),D(t,r.parentNode,r)):t=null}else if(o){const a={};n&8&&(a.data=e[3]),n&4&&(a.form=e[2]),t.$set(a)}},i(e){i||(t&&g(t.$$.fragment,e),i=!0)},o(e){t&&E(t.$$.fragment,e),i=!1},d(e){e&&b(r),_[12](null),t&&I(t,e)}}}function Y(_){let t,r,i;var o=_[1][0];function f(e,n){return{props:{data:e[3],$$slots:{default:[Z]},$$scope:{ctx:e}}}}return o&&(t=O(o,f(_)),_[11](t)),{c(){t&&A(t.$$.fragment),r=d()},l(e){t&&w(t.$$.fragment,e),r=d()},m(e,n){t&&D(t,e,n),h(e,r,n),i=!0},p(e,n){if(n&2&&o!==(o=e[1][0])){if(t){R();const a=t;E(a.$$.fragment,1,0,()=>{I(a,1)}),P()}o?(t=O(o,f(e)),e[11](t),A(t.$$.fragment),g(t.$$.fragment,1),D(t,r.parentNode,r)):t=null}else if(o){const a={};n&8&&(a.data=e[3]),n&8215&&(a.$$scope={dirty:n,ctx:e}),t.$set(a)}},i(e){i||(t&&g(t.$$.fragment,e),i=!0)},o(e){t&&E(t.$$.fragment,e),i=!1},d(e){e&&b(r),_[11](null),t&&I(t,e)}}}function Z(_){let t,r,i;var o=_[1][1];function f(e,n){return{props:{data:e[4],form:e[2]}}}return o&&(t=O(o,f(_)),_[10](t)),{c(){t&&A(t.$$.fragment),r=d()},l(e){t&&w(t.$$.fragment,e),r=d()},m(e,n){t&&D(t,e,n),h(e,r,n),i=!0},p(e,n){if(n&2&&o!==(o=e[1][1])){if(t){R();const a=t;E(a.$$.fragment,1,0,()=>{I(a,1)}),P()}o?(t=O(o,f(e)),e[10](t),A(t.$$.fragment),g(t.$$.fragment,1),D(t,r.parentNode,r)):t=null}else if(o){const a={};n&16&&(a.data=e[4]),n&4&&(a.form=e[2]),t.$set(a)}},i(e){i||(t&&g(t.$$.fragment,e),i=!0)},o(e){t&&E(t.$$.fragment,e),i=!1},d(e){e&&b(r),_[10](null),t&&I(t,e)}}}function L(_){let t,r=_[6]&&y(_);return{c(){t=F("div"),r&&r.c(),this.h()},l(i){t=G(i,"DIV",{id:!0,"aria-live":!0,"aria-atomic":!0,style:!0});var o=H(t);r&&r.l(o),o.forEach(b),this.h()},h(){V(t,"id","svelte-announcer"),V(t,"aria-live","assertive"),V(t,"aria-atomic","true"),c(t,"position","absolute"),c(t,"left","0"),c(t,"top","0"),c(t,"clip","rect(0 0 0 0)"),c(t,"clip-path","inset(50%)"),c(t,"overflow","hidden"),c(t,"white-space","nowrap"),c(t,"width","1px"),c(t,"height","1px")},m(i,o){h(i,t,o),r&&r.m(t,null)},p(i,o){i[6]?r?r.p(i,o):(r=y(i),r.c(),r.m(t,null)):r&&(r.d(1),r=null)},d(i){i&&b(t),r&&r.d()}}}function y(_){let t;return{c(){t=J(_[7])},l(r){t=K(r,_[7])},m(r,i){h(r,t,i)},p(r,i){i&128&&Q(t,r[7])},d(r){r&&b(t)}}}function $(_){let t,r,i,o,f;const e=[Y,W],n=[];function a(l,p){return l[1][1]?0:1}t=a(_),r=n[t]=e[t](_);let u=_[5]&&L(_);return{c(){r.c(),i=U(),u&&u.c(),o=d()},l(l){r.l(l),i=X(l),u&&u.l(l),o=d()},m(l,p){n[t].m(l,p),h(l,i,p),u&&u.m(l,p),h(l,o,p),f=!0},p(l,[p]){let v=t;t=a(l),t===v?n[t].p(l,p):(R(),E(n[v],1,1,()=>{n[v]=null}),P(),r=n[t],r?r.p(l,p):(r=n[t]=e[t](l),r.c()),g(r,1),r.m(i.parentNode,i)),l[5]?u?u.p(l,p):(u=L(l),u.c(),u.m(o.parentNode,o)):u&&(u.d(1),u=null)},i(l){f||(g(r),f=!0)},o(l){E(r),f=!1},d(l){l&&(b(i),b(o)),n[t].d(l),u&&u.d(l)}}}function x(_,t,r){let{stores:i}=t,{page:o}=t,{constructors:f}=t,{components:e=[]}=t,{form:n}=t,{data_0:a=null}=t,{data_1:u=null}=t;S(i.page.notify);let l=!1,p=!1,v=null;C(()=>{const m=i.page.subscribe(()=>{l&&(r(6,p=!0),z().then(()=>{r(7,v=document.title||"untitled page")}))});return r(5,l=!0),m});function k(m){T[m?"unshift":"push"](()=>{e[1]=m,r(0,e)})}function N(m){T[m?"unshift":"push"](()=>{e[0]=m,r(0,e)})}function q(m){T[m?"unshift":"push"](()=>{e[0]=m,r(0,e)})}return _.$$set=m=>{"stores"in m&&r(8,i=m.stores),"page"in m&&r(9,o=m.page),"constructors"in m&&r(1,f=m.constructors),"components"in m&&r(0,e=m.components),"form"in m&&r(2,n=m.form),"data_0"in m&&r(3,a=m.data_0),"data_1"in m&&r(4,u=m.data_1)},_.$$.update=()=>{_.$$.dirty&768&&i.page.set(o)},[e,f,n,a,u,l,p,v,i,o,k,N,q]}class nt extends B{constructor(t){super(),M(this,t,x,$,j,{stores:8,page:9,constructors:1,components:0,form:2,data_0:3,data_1:4})}}const st=[()=>s(()=>import("../nodes/0.x3Ress_v.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]),import.meta.url),()=>s(()=>import("../nodes/1.B8mOfAuo.js"),__vite__mapDeps([14,1,2,4,5]),import.meta.url),()=>s(()=>import("../nodes/2.F-sWv22l.js"),__vite__mapDeps([15,3,1,2,4,5,6,10,7,11,12,8,9,16,17,18,19]),import.meta.url),()=>s(()=>import("../nodes/3.B6GkCI7p.js"),__vite__mapDeps([20,1,2,4,5,3,6,16,17,7,11,21]),import.meta.url),()=>s(()=>import("../nodes/4.CKLUs_MU.js"),__vite__mapDeps([22,3,1,2,4,5,6,23,18,16,17,10,7,11,12,24]),import.meta.url),()=>s(()=>import("../nodes/5.CqoVVDiu.js"),__vite__mapDeps([25,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/6.oAQjjzF1.js"),__vite__mapDeps([26,3,1,2,4,5,6,23,18,16,17,10,7,11,12,24]),import.meta.url),()=>s(()=>import("../nodes/7.WJiC7Xza.js"),__vite__mapDeps([27,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/8.B-pLuKb2.js"),__vite__mapDeps([28,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/9.DYrl36TH.js"),__vite__mapDeps([29,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/10.D29oWAnr.js"),__vite__mapDeps([30,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/11.BC_2hzsY.js"),__vite__mapDeps([31,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/12.C8OyNynO.js"),__vite__mapDeps([32,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/13.CIdLLayx.js"),__vite__mapDeps([33,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/14.BWF0sv7m.js"),__vite__mapDeps([34,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/15.CizcE9GW.js"),__vite__mapDeps([35,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/16.CrOfBvLU.js"),__vite__mapDeps([36,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/17.DLb4SMyJ.js"),__vite__mapDeps([37,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/18.BIT-op4z.js"),__vite__mapDeps([38,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/19.BceYICk8.js"),__vite__mapDeps([39,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/20.9p-hBudx.js"),__vite__mapDeps([40,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/21.kaO0DXVq.js"),__vite__mapDeps([41,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/22.B1ap9X7o.js"),__vite__mapDeps([42,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/23.DWuDqIAb.js"),__vite__mapDeps([43,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/24.Bevl404O.js"),__vite__mapDeps([44,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/25.BUOA8RmW.js"),__vite__mapDeps([45,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/26.DlcnYkeB.js"),__vite__mapDeps([46,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/27.BuDjkUqs.js"),__vite__mapDeps([47,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/28.2FF5OsbW.js"),__vite__mapDeps([48,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/29.B4sKOZ9y.js"),__vite__mapDeps([49,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/30.D3Q3e8xJ.js"),__vite__mapDeps([50,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/31.D1ZR4qZO.js"),__vite__mapDeps([51,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/32.QosUc112.js"),__vite__mapDeps([52,3,1,2,4,5,6]),import.meta.url),()=>s(()=>import("../nodes/33.7fZvnt0G.js"),__vite__mapDeps([53,1,2,3,4,5,6,16,17,10,7,11,12]),import.meta.url)],at=[],lt={"/":[2],"/about":[3],"/blog":[4],"/blog/STX-interview":[5],"/blog/cbi-installers":[7],"/blog/czi-grant":[8],"/blog/ide-ux-bof-scipy-2024":[9],"/blog/installer-improvements":[10],"/blog/introducing-unittest-plugin":[11],"/blog/introducing-watchlist-plugin":[12],"/blog/release-qtconsole-440":[13],"/blog/release-spyder-330":[14],"/blog/release-spyder-4beta2":[16],"/blog/release-spyder-4":[15],"/blog/release-spyder-6.0.0":[17],"/blog/reusable-research-bof-scipy-2023-part-2":[19],"/blog/reusable-research-bof-scipy-2023":[18],"/blog/spyder-6-daniel":[20],"/blog/spyder-6-remote-development":[21],"/blog/spyder-debugger":[22],"/blog/spyder-files-improvements":[23],"/blog/spyder-kite-funding":[24],"/blog/spyder-roadmap-proposals-2022":[25],"/blog/spyder-status-2018-past":[26],"/blog/spyder-status-2018-present":[27],"/blog/spyder-terminal-030":[28],"/blog/spyder-variable-explorer":[29],"/blog/tdk-micronas-partners-with-quansight-labs":[30],"/blog/tutorial-docs":[31],"/blog/webcast-quansight-ep1":[32],"/blog/[page]":[6],"/download":[33]},tt={handleError:({error:_})=>{console.error(_)},reroute:()=>{},transport:{}},et=Object.fromEntries(Object.entries(tt.transport).map(([_,t])=>[_,t.decode])),mt=(_,t)=>et[_](t);export{mt as decode,et as decoders,lt as dictionary,tt as hooks,_t as matchers,st as nodes,nt as root,at as server_loads}; diff --git a/_app/immutable/entry/start.BGL7AcNK.js b/_app/immutable/entry/start.BGL7AcNK.js deleted file mode 100644 index 7a4da6e..0000000 --- a/_app/immutable/entry/start.BGL7AcNK.js +++ /dev/null @@ -1 +0,0 @@ -import{a as t}from"../chunks/entry.D3evG2He.js";export{t as start}; diff --git a/_app/immutable/entry/start.CJKdc7_6.js b/_app/immutable/entry/start.CJKdc7_6.js new file mode 100644 index 0000000..a16b375 --- /dev/null +++ b/_app/immutable/entry/start.CJKdc7_6.js @@ -0,0 +1 @@ +import{a as t}from"../chunks/entry.B3JBGiH6.js";export{t as start}; diff --git a/_app/immutable/nodes/0.Dz6kyvS1.js b/_app/immutable/nodes/0.x3Ress_v.js similarity index 98% rename from _app/immutable/nodes/0.Dz6kyvS1.js rename to _app/immutable/nodes/0.x3Ress_v.js index 67f49bc..4a258b6 100644 --- a/_app/immutable/nodes/0.Dz6kyvS1.js +++ b/_app/immutable/nodes/0.x3Ress_v.js @@ -1,4 +1,4 @@ -import{s as K,z as Se,n as O,A as ze,B as Ie,C as Te,D as Ve}from"../chunks/scheduler.DK_yUdRf.js";import{S as W,i as J,e as k,s as M,u as H,t as R,E as Ae,c as w,F as ae,d as f,f as S,a as x,v as C,b as G,y as d,h as g,g as z,w as D,G as se,n as I,l as V,x as B,o as te,p as le,A as ue,k as Le,m as Me,z as X}from"../chunks/index.BH5W4qoH.js";import{p as Q,h as Z,q as ce,t as de,d as me,u as ge,j as He}from"../chunks/31.DSOxMhdt.js";import{I as oe}from"../chunks/Icon.Bx2gT0jJ.js";import{b as Ce}from"../chunks/entry.D3evG2He.js";import{L as pe,a as _e,g as De,D as Be}from"../chunks/Divider.CPgZZ_Vn.js";import{B as Ne}from"../chunks/Button.ChCyQFAf.js";const je=!0,Oe="always",pt=Object.freeze(Object.defineProperty({__proto__:null,prerender:je,trailingSlash:Oe},Symbol.toStringTag,{value:"Module"})),Ze={a:{viewBox:"0 0 24 24"},c:''},Pe={a:{viewBox:"0 0 1024 1024",fill:"currentColor","fill-rule":"evenodd"},c:''},{document:ve}=De;function Fe(c){let e,a=`localStorage.colourScheme === "dark" || +import{s as K,z as Se,n as O,A as ze,B as Ie,C as Te,D as Ve}from"../chunks/scheduler.DK_yUdRf.js";import{S as W,i as J,e as k,s as M,u as H,t as R,E as Ae,c as w,F as ae,d as f,f as S,a as x,v as C,b as G,y as d,h as g,g as z,w as D,G as se,n as I,l as V,x as B,o as te,p as le,A as ue,k as Le,m as Me,z as X}from"../chunks/index.BH5W4qoH.js";import{p as Q,h as Z,q as ce,t as de,d as me,u as ge,j as He}from"../chunks/32.L6pbTd52.js";import{I as oe}from"../chunks/Icon.vbkowJrT.js";import{b as Ce}from"../chunks/entry.B3JBGiH6.js";import{L as pe,a as _e,g as De,D as Be}from"../chunks/Divider.CPgZZ_Vn.js";import{B as Ne}from"../chunks/Button.fdVjvHGv.js";const je=!0,Oe="always",pt=Object.freeze(Object.defineProperty({__proto__:null,prerender:je,trailingSlash:Oe},Symbol.toStringTag,{value:"Module"})),Ze={a:{viewBox:"0 0 24 24"},c:''},Pe={a:{viewBox:"0 0 1024 1024",fill:"currentColor","fill-rule":"evenodd"},c:''},{document:ve}=De;function Fe(c){let e,a=`localStorage.colourScheme === "dark" || (!("colourScheme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches) ? document.documentElement.classList.add("dark") diff --git a/_app/immutable/nodes/1.C_leV2J5.js b/_app/immutable/nodes/1.B8mOfAuo.js similarity index 92% rename from _app/immutable/nodes/1.C_leV2J5.js rename to _app/immutable/nodes/1.B8mOfAuo.js index 1fd4210..d9a57ef 100644 --- a/_app/immutable/nodes/1.C_leV2J5.js +++ b/_app/immutable/nodes/1.B8mOfAuo.js @@ -1 +1 @@ -import{s as x,n as u,c as S}from"../chunks/scheduler.DK_yUdRf.js";import{S as j,i as q,e as h,t as d,s as y,c as v,a as g,b,d as c,f as C,g as _,h as E,j as $}from"../chunks/index.BH5W4qoH.js";import{p as H}from"../chunks/stores.BM3ezKuT.js";function P(p){var f;let a,s=p[0].status+"",r,o,n,i=((f=p[0].error)==null?void 0:f.message)+"",m;return{c(){a=h("h1"),r=d(s),o=y(),n=h("p"),m=d(i)},l(e){a=v(e,"H1",{});var t=g(a);r=b(t,s),t.forEach(c),o=C(e),n=v(e,"P",{});var l=g(n);m=b(l,i),l.forEach(c)},m(e,t){_(e,a,t),E(a,r),_(e,o,t),_(e,n,t),E(n,m)},p(e,[t]){var l;t&1&&s!==(s=e[0].status+"")&&$(r,s),t&1&&i!==(i=((l=e[0].error)==null?void 0:l.message)+"")&&$(m,i)},i:u,o:u,d(e){e&&(c(a),c(o),c(n))}}}function k(p,a,s){let r;return S(p,H,o=>s(0,r=o)),[r]}class B extends j{constructor(a){super(),q(this,a,k,P,x,{})}}export{B as component}; +import{s as x,n as u,c as S}from"../chunks/scheduler.DK_yUdRf.js";import{S as j,i as q,e as h,t as d,s as y,c as v,a as g,b,d as c,f as C,g as _,h as E,j as $}from"../chunks/index.BH5W4qoH.js";import{p as H}from"../chunks/stores.BhPy-k-g.js";function P(p){var f;let a,s=p[0].status+"",r,o,n,i=((f=p[0].error)==null?void 0:f.message)+"",m;return{c(){a=h("h1"),r=d(s),o=y(),n=h("p"),m=d(i)},l(e){a=v(e,"H1",{});var t=g(a);r=b(t,s),t.forEach(c),o=C(e),n=v(e,"P",{});var l=g(n);m=b(l,i),l.forEach(c)},m(e,t){_(e,a,t),E(a,r),_(e,o,t),_(e,n,t),E(n,m)},p(e,[t]){var l;t&1&&s!==(s=e[0].status+"")&&$(r,s),t&1&&i!==(i=((l=e[0].error)==null?void 0:l.message)+"")&&$(m,i)},i:u,o:u,d(e){e&&(c(a),c(o),c(n))}}}function k(p,a,s){let r;return S(p,H,o=>s(0,r=o)),[r]}class B extends j{constructor(a){super(),q(this,a,k,P,x,{})}}export{B as component}; diff --git a/_app/immutable/nodes/10.D29oWAnr.js b/_app/immutable/nodes/10.D29oWAnr.js new file mode 100644 index 0000000..b661e64 --- /dev/null +++ b/_app/immutable/nodes/10.D29oWAnr.js @@ -0,0 +1 @@ +import{I as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/10.ZhzfoyBI.js b/_app/immutable/nodes/10.ZhzfoyBI.js deleted file mode 100644 index a6c49bd..0000000 --- a/_app/immutable/nodes/10.ZhzfoyBI.js +++ /dev/null @@ -1 +0,0 @@ -import{I as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/11.BC_2hzsY.js b/_app/immutable/nodes/11.BC_2hzsY.js new file mode 100644 index 0000000..165ee44 --- /dev/null +++ b/_app/immutable/nodes/11.BC_2hzsY.js @@ -0,0 +1 @@ +import{J as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/11.CeefyKN_.js b/_app/immutable/nodes/11.CeefyKN_.js deleted file mode 100644 index fd71660..0000000 --- a/_app/immutable/nodes/11.CeefyKN_.js +++ /dev/null @@ -1 +0,0 @@ -import{J as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/12.C8OyNynO.js b/_app/immutable/nodes/12.C8OyNynO.js new file mode 100644 index 0000000..e224ef6 --- /dev/null +++ b/_app/immutable/nodes/12.C8OyNynO.js @@ -0,0 +1 @@ +import{K as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/12.C_U6RxTB.js b/_app/immutable/nodes/12.C_U6RxTB.js deleted file mode 100644 index c54f7fc..0000000 --- a/_app/immutable/nodes/12.C_U6RxTB.js +++ /dev/null @@ -1 +0,0 @@ -import{K as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/13.CIdLLayx.js b/_app/immutable/nodes/13.CIdLLayx.js new file mode 100644 index 0000000..41dd183 --- /dev/null +++ b/_app/immutable/nodes/13.CIdLLayx.js @@ -0,0 +1 @@ +import{L as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/13.DoChlMY0.js b/_app/immutable/nodes/13.DoChlMY0.js deleted file mode 100644 index 2eab0d6..0000000 --- a/_app/immutable/nodes/13.DoChlMY0.js +++ /dev/null @@ -1 +0,0 @@ -import{L as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/14.BWF0sv7m.js b/_app/immutable/nodes/14.BWF0sv7m.js new file mode 100644 index 0000000..917020a --- /dev/null +++ b/_app/immutable/nodes/14.BWF0sv7m.js @@ -0,0 +1 @@ +import{N as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/14.Uvgu7RSF.js b/_app/immutable/nodes/14.Uvgu7RSF.js deleted file mode 100644 index 589e11d..0000000 --- a/_app/immutable/nodes/14.Uvgu7RSF.js +++ /dev/null @@ -1 +0,0 @@ -import{N as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/15.CizcE9GW.js b/_app/immutable/nodes/15.CizcE9GW.js new file mode 100644 index 0000000..c44955d --- /dev/null +++ b/_app/immutable/nodes/15.CizcE9GW.js @@ -0,0 +1 @@ +import{O as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/15.DBfkxhtO.js b/_app/immutable/nodes/15.DBfkxhtO.js deleted file mode 100644 index 896ca66..0000000 --- a/_app/immutable/nodes/15.DBfkxhtO.js +++ /dev/null @@ -1 +0,0 @@ -import{O as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/16.CrOfBvLU.js b/_app/immutable/nodes/16.CrOfBvLU.js new file mode 100644 index 0000000..457e939 --- /dev/null +++ b/_app/immutable/nodes/16.CrOfBvLU.js @@ -0,0 +1 @@ +import{Q as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/16.QRUg7IPr.js b/_app/immutable/nodes/16.QRUg7IPr.js deleted file mode 100644 index dedb4b4..0000000 --- a/_app/immutable/nodes/16.QRUg7IPr.js +++ /dev/null @@ -1 +0,0 @@ -import{Q as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/17.CN4gGUtS.js b/_app/immutable/nodes/17.CN4gGUtS.js deleted file mode 100644 index 4cc75d9..0000000 --- a/_app/immutable/nodes/17.CN4gGUtS.js +++ /dev/null @@ -1 +0,0 @@ -import{R as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/17.DLb4SMyJ.js b/_app/immutable/nodes/17.DLb4SMyJ.js new file mode 100644 index 0000000..036f6a1 --- /dev/null +++ b/_app/immutable/nodes/17.DLb4SMyJ.js @@ -0,0 +1 @@ +import{R as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/18.BIT-op4z.js b/_app/immutable/nodes/18.BIT-op4z.js new file mode 100644 index 0000000..ddb68dd --- /dev/null +++ b/_app/immutable/nodes/18.BIT-op4z.js @@ -0,0 +1 @@ +import{S as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/18.DkyBdtYE.js b/_app/immutable/nodes/18.DkyBdtYE.js deleted file mode 100644 index 8eb8552..0000000 --- a/_app/immutable/nodes/18.DkyBdtYE.js +++ /dev/null @@ -1 +0,0 @@ -import{S as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/19.BceYICk8.js b/_app/immutable/nodes/19.BceYICk8.js new file mode 100644 index 0000000..39052c2 --- /dev/null +++ b/_app/immutable/nodes/19.BceYICk8.js @@ -0,0 +1 @@ +import{T as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/19.Cwmy5wqK.js b/_app/immutable/nodes/19.Cwmy5wqK.js deleted file mode 100644 index fd92761..0000000 --- a/_app/immutable/nodes/19.Cwmy5wqK.js +++ /dev/null @@ -1 +0,0 @@ -import{T as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/2.BjK6yfax.js b/_app/immutable/nodes/2.F-sWv22l.js similarity index 99% rename from _app/immutable/nodes/2.BjK6yfax.js rename to _app/immutable/nodes/2.F-sWv22l.js index 262bb9e..031eb21 100644 --- a/_app/immutable/nodes/2.BjK6yfax.js +++ b/_app/immutable/nodes/2.F-sWv22l.js @@ -1,4 +1,4 @@ -import{m as Ht,t as Nt,v as jt,d as Bt,k as At,c as Gt,s as Ot,e as Rt,p as Te,w as Ve,x as bt,y as qt,h as ne,z as Me,A as Ft,B as Ut,g as kt,C as vt,M as Wt,D as Xt,E as Yt}from"../chunks/31.DSOxMhdt.js";import{s as X,n as I,c as De,o as ae,d as Jt,e as ke,r as Pe,h as le,F as ze,A as fe,B as ue,C as me,D as de,m as Kt,l as he,G as wt,H as Qt,b as yt}from"../chunks/scheduler.DK_yUdRf.js";import{S as Y,i as J,e as y,s as G,c as C,F as Z,f as O,y as d,g as w,d as m,a as M,u as j,v as R,B as ie,h as L,w as B,G as Q,I as Ie,k as F,l as b,m as U,n as g,x as A,t as ee,b as te,z as _e,A as W,J as ye,j as se,D as K,H as Ct,q as St,K as Zt,C as oe,L as xt}from"../chunks/index.BH5W4qoH.js";import{B as Et}from"../chunks/Button.ChCyQFAf.js";import{I as ve}from"../chunks/Icon.Bx2gT0jJ.js";import{b as $t,c as el,D as It,g as tl}from"../chunks/Divider.CPgZZ_Vn.js";import{L as Ce}from"../chunks/Loader.BLQl2yzu.js";import{h as ll,u as nl}from"../chunks/await_block.MuLFoa1l.js";import{_ as il}from"../chunks/preload-helper.C1FmrZbK.js";import{BsPlayCircleFill as He,BsPauseCircleFill as Ne}from"../chunks/index.D7Jwt5yH.js";const rl=!0,sl=rl;function ol(r){let e,l="Works the way scientists do",t,n,i="Data analysts, scientists and engineers require a lot of experimentation, quick feedback and short iteration cycles while programming. Spyder was built from the ground up around that workflow.";return{c(){e=y("h2"),e.textContent=l,t=G(),n=y("p"),n.textContent=i,this.h()},l(s){e=C(s,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1orvp9o"&&(e.textContent=l),t=O(s),n=C(s,"P",{"data-svelte-h":!0}),Z(n)!=="svelte-170cb4w"&&(n.textContent=i),this.h()},h(){d(e,"class","section")},m(s,a){w(s,e,a),w(s,t,a),w(s,n,a)},p:I,i:I,o:I,d(s){s&&(m(e),m(t),m(n))}}}class al extends Y{constructor(e){super(),J(this,e,null,ol,X,{})}}function cl(r){let e,l="A perfect fit with the most popular scientific libraries",t,n,i='Spyder includes out of the box integration with Matplotlib, Pandas and many other libraries to help you work more efficiently with them.';return{c(){e=y("h2"),e.textContent=l,t=G(),n=y("p"),n.innerHTML=i,this.h()},l(s){e=C(s,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-5oxt2y"&&(e.textContent=l),t=O(s),n=C(s,"P",{"data-svelte-h":!0}),Z(n)!=="svelte-1wt0ml8"&&(n.innerHTML=i),this.h()},h(){d(e,"class","section")},m(s,a){w(s,e,a),w(s,t,a),w(s,n,a)},p:I,i:I,o:I,d(s){s&&(m(e),m(t),m(n))}}}class fl extends Y{constructor(e){super(),J(this,e,null,cl,X,{})}}function ul(r){let e,l="Get the ease of use of Jupyter along with many advanced features found in PyCharm and VSCode in a single programming environment";return{c(){e=y("h3"),e.textContent=l,this.h()},l(t){e=C(t,"H3",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-puhbdg"&&(e.textContent=l),this.h()},h(){d(e,"class","subsection")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class ml extends Y{constructor(e){super(),J(this,e,null,ul,X,{})}}function dl(r){let e,l="Make a bigger impact with reusable research",t,n,i="The software you write is critical for new scientific discoveries and engineering solutions. Spyder helps you move from single scripts to structured, reusable modules and packages without losing interactivity. It also includes powerful software development tools whenever you’re ready for them.";return{c(){e=y("h2"),e.textContent=l,t=G(),n=y("p"),n.textContent=i,this.h()},l(s){e=C(s,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1xr8kp3"&&(e.textContent=l),t=O(s),n=C(s,"P",{"data-svelte-h":!0}),Z(n)!=="svelte-b2fwve"&&(n.textContent=i),this.h()},h(){d(e,"class","section")},m(s,a){w(s,e,a),w(s,t,a),w(s,n,a)},p:I,i:I,o:I,d(s){s&&(m(e),m(t),m(n))}}}class hl extends Y{constructor(e){super(),J(this,e,null,dl,X,{})}}function _l(r){let e,l="Install with a single click and be productive right away",t,n,i="Spyder offers standalone installers to make it as easy and reliable as possible to get started and keep it up to date.";return{c(){e=y("h2"),e.textContent=l,t=G(),n=y("p"),n.textContent=i,this.h()},l(s){e=C(s,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1xbw40j"&&(e.textContent=l),t=O(s),n=C(s,"P",{"data-svelte-h":!0}),Z(n)!=="svelte-bdiao3"&&(n.textContent=i),this.h()},h(){d(e,"class","section")},m(s,a){w(s,e,a),w(s,t,a),w(s,n,a)},p:I,i:I,o:I,d(s){s&&(m(e),m(t),m(n))}}}class gl extends Y{constructor(e){super(),J(this,e,null,_l,X,{})}}function pl(r){let e,l='Spyder plots pane displaying a 3D visualization in the main panel, with options above for saving, zooming or removing it, and a right panel with thumbnails of other previous plots
    Browse all your plots in a single place
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-bgv5n0"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class bl extends Y{constructor(e){super(),J(this,e,null,pl,X,{})}}function kl(r){let e,l='Spyder Variable Explorer pane showing a pandas dataframe containing weather observations in a "spreadsheet" style view, with multi-level index columns, per-column heatmaps and toolbar options for displaying and editing the data
    Interact with the contents of your dataframes
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1ofk0hi"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class vl extends Y{constructor(e){super(),J(this,e,null,kl,X,{})}}function wl(r){let e,l='Spyder Consoles menu with the "New console in environment" submenu selected, showing a listing of Conda environments by name, type and Python version
    Work with multiple environments at once
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-366h3l"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class yl extends Y{constructor(e){super(),J(this,e,null,wl,X,{})}}function Cl(r){let e,l='Spyder's IPython Console pane, showing individual lines of code constructing SymPy expressions, and several complex symbolic formulas rendered inline in publication-style rich mathematical notation
    View rich symbolic expressions rendered with LaTeX
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-vu5wsu"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Sl extends Y{constructor(e){super(),J(this,e,null,Cl,X,{})}}function El(r){let e,l='Spyder Variable Explorer pane displaying a three-dimensional NumPy in a "spreadsheet" style view, with cell colors forming a heatmap of values and options to adjust the axis and index of the array slice
    Explore and edit multi-dimensional arrays
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-kiw5jh"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Il extends Y{constructor(e){super(),J(this,e,null,El,X,{})}}function Tl(r){let e,l='Spyder Editor pane, with several real-time code analysis warnings shown on different lines and the affected code underlined. A hovered-over warning is showing its associated message, while the Source menu is open to the left showing the "Underline errors and warnings" option enabled
    Take advantage of real-time hints and help to improve your code
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1rwla39"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Dl extends Y{constructor(e){super(),J(this,e,null,Tl,X,{})}}function Pl(r){let e,l='Spyder Editor pane showing the Projects pane to its left, listing the files and directories of a project in a tree-style layout
    Easily switch between projects and browse their files
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-r49vr6"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Ll extends Y{constructor(e){super(),J(this,e,null,Pl,X,{})}}function Vl(r){let e,l='Spyder Code Analysis pane showing the results for a file, including an overall score and a listing of errors, warnings, refactoring and convention issues; each has a name, code, line number and message
    Get in-depth insight on issues and improvements with your code
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-e7geul"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Ml extends Y{constructor(e){super(),J(this,e,null,Vl,X,{})}}function zl(r){let e,l='Spyder Find pane, showing an example search for a method name, buttons toggling search options, an exclude field listing various file extensions, a dropdown for search location and a count and list of results per-file, including the file name and path and the line, column and context for each result
    Quickly find uses of a variable or word across files
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-oty2ns"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Hl extends Y{constructor(e){super(),J(this,e,null,zl,X,{})}}function Nl(r){let e,l="Spyder is funded thanks to the generous support of";return{c(){e=y("h1"),e.textContent=l},l(t){e=C(t,"H1",{"data-svelte-h":!0}),Z(e)!=="svelte-2ufh9o"&&(e.textContent=l)},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class jl extends Y{constructor(e){super(),J(this,e,null,Nl,X,{})}}function Bl(r){let e,l="and the donations we have received from our users around the world through Open Collective:";return{c(){e=y("h2"),e.textContent=l,this.h()},l(t){e=C(t,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1rx1kf9"&&(e.textContent=l),this.h()},h(){d(e,"class","section")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Al extends Y{constructor(e){super(),J(this,e,null,Bl,X,{})}}let Tt={},Gl="linux",Ol=[];Tt={props:{buttons:[],blocks:[{id:"what-is-spyder-section",imgSrc:"/assets/media/banner.svg",background:"/assets/media/bg.svg",columns:!1,divider:!0,boxed:!0,title:"The Spyder advantage",extraContent:ml},{id:"interactive-section",title:"Interactive programming built in",divider:!0,border:!1,content:al,tabs:[{title:"Variable Explorer",isVideo:!0,content:{videoSources:[{src:"/assets/media/variable_explorer.mp4"}],videoCaption:"Explore variables after execution"}},{title:"Help",isVideo:!0,content:{videoSources:[{src:"/assets/media/help.mp4"}],videoCaption:"Get help for code you're working on with one click"}},{title:"Editor",isVideo:!0,content:{videoSources:[{src:"/assets/media/editor.mp4"}],videoCaption:'Run code in line by line or in sections called "cells"'}}]},{id:"pydata-section",title:"Seamless integration with the PyData ecosystem",divider:!0,content:fl,tabs:[{title:"Matplotlib",content:bl},{title:"Pandas",content:vl},{title:"Numpy",content:Il},{title:"Conda",content:yl},{title:"Sympy",content:Sl}]},{id:"growth-section",title:"Ready to take you to the next level",divider:!0,content:hl,tabs:[{title:"Developer tools",content:Dl},{title:"Projects",content:Ll},{title:"Code analysis",content:Ml},{title:"Code search",content:Hl}]},{id:"setup-section",title:"Simple install and update process",content:gl,divider:!0,imgSrc:`/assets/media/${Gl}.webp`,buttons:Ol},{id:"sponsors-section",title:"Sponsors",content:jl,divider:!0,columns:!1,boxed:!0,extraContent:Al,extraImage:"/assets/media/sponsors.svg",extraImageAlt:"Donate to our project",extraImageLink:"https://opencollective.com/spyder#support",innerColumns:[{imgSrc:"/assets/media/czi_light.svg",imgSrcDark:"/assets/media/czi_dark.svg",link:"https://chanzuckerberg.com/"},{imgSrc:"/assets/media/numfocus_lrg.png",link:"https://numfocus.org/"}]},{id:"learn-more-section",columns:!1,boxed:!0,background:"/assets/media/bg_more.svg",backgroundDark:"/assets/media/bg_more_dark.svg",innerColumns:[{title:"YouTube",content:"Learn more",icon:"BsYoutube",link:"https://www.youtube.com/c/spyderide",aspect:"xl:aspect-square"},{title:"Documentation",content:"Read the docs",icon:"BsBookHalf",link:"https://docs.spyder-ide.org",aspect:"xl:aspect-square"},{title:"GitHub",content:"Check out the source",icon:"BsGithub",link:"https://github.com/spyder-ide/spyder",aspect:"xl:aspect-square"},{title:"Donations",content:"Show your support",icon:"BsHeartFill",link:"https://opencollective.com/spyder",aspect:"xl:aspect-square"}]}]}};function Rl(){return Ht.setMetadata({title:`${Nt} | ${jt}`,description:Bt,keywords:At.join(", "),author:Gt,url:Ot,image:Rt}),Tt}const Li=Object.freeze(Object.defineProperty({__proto__:null,load:Rl},Symbol.toStringTag,{value:"Module"}));function ql(r){let e;return{c(){e=y("div"),this.h()},l(l){e=C(l,"DIV",{class:!0}),M(e).forEach(m),this.h()},h(){d(e,"class","vanta-container absolute inset-0 -z-10")},m(l,t){w(l,e,t),r[4](e)},p:I,i:I,o:I,d(l){l&&m(e),r[4](null)}}}function Fl(r,e,l){let t,n;De(r,Te,_=>l(3,n=_));let i,s,a;const o=(_,v)=>_[v]||_.light,c={light:16250866,dark:3158064},f={light:9175040,dark:10722156},u=()=>{if(s&&sl&&window.VANTA){i&&i.destroy();try{l(1,i=window.VANTA.DOTS({...t,el:s})),l(2,a=n),console.log("Vanta initialized successfully with scheme:",a)}catch(_){console.error("Vanta initialization error:",_)}}else console.error("Cannot initialize Vanta")};ae(()=>{u()}),Jt(()=>{i&&n!==a&&(console.log("After update: Color scheme changed, reinitializing Vanta"),u())});function h(_){ke[_?"unshift":"push"](()=>{s=_,l(0,s)})}return r.$$.update=()=>{r.$$.dirty&8&&(t={color:o(f,n),backgroundColor:o(c,n),mouseControls:!0,touchControls:!0,gyroControls:!1,minHeight:200,minWidth:200,scale:1,scaleMobile:1,showLines:!1}),r.$$.dirty&14&&i&&n!==a&&(console.log("Color scheme changed, reinitializing Vanta"),u())},[s,i,a,n,h]}class Ul extends Y{constructor(e){super(),J(this,e,Fl,ql,X,{})}}function Wl(r){let e,l;return e=new Ce({}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p:I,i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function Xl(r){let e,l,t,n;return{c(){e=y("img"),this.h()},l(i){e=C(i,"IMG",{alt:!0,src:!0,class:!0}),this.h()},h(){d(e,"alt",r[3]),le(e.src,l=r[2])||d(e,"src",l),d(e,"class","block absolute inset-0 z-20 object-cover select-none w-full h-full")},m(i,s){w(i,e,s),r[14](e),t||(n=Q(e,"load",r[8]),t=!0)},p(i,s){s&8&&d(e,"alt",i[3]),s&4&&!le(e.src,l=i[2])&&d(e,"src",l)},i:I,o:I,d(i){i&&m(e),r[14](null),t=!1,n()}}}function Yl(r){let e,l;return e=new Ce({}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p:I,i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function Jl(r){let e,l;return{c(){e=y("img"),this.h()},l(t){e=C(t,"IMG",{alt:!0,src:!0,class:!0,style:!0}),this.h()},h(){d(e,"alt",r[3]),le(e.src,l=r[1])||d(e,"src",l),d(e,"class","block absolute inset-0 z-20 object-cover select-none w-full h-full"),ie(e,"clip","rect(0, "+r[6]+"px, "+r[7]+"px, 0)")},m(t,n){w(t,e,n),r[15](e)},p(t,n){n&8&&d(e,"alt",t[3]),n&2&&!le(e.src,l=t[1])&&d(e,"src",l),n&192&&ie(e,"clip","rect(0, "+t[6]+"px, "+t[7]+"px, 0)")},i:I,o:I,d(t){t&&m(e),r[15](null)}}}function Kl(r){let e,l,t,n,i,s,a,o,c,f,u,h,_,v,k,p;const V=[Xl,Wl],z=[];function T(P,q){return P[2]?0:1}t=T(r),n=z[t]=V[t](r);const E=[Jl,Yl],S=[];function H(P,q){return P[1]?0:1}return a=H(r),o=S[a]=E[a](r),u=new ve({props:{src:$t}}),_=new ve({props:{src:el}}),{c(){e=y("div"),l=y("button"),n.c(),i=G(),s=y("button"),o.c(),c=G(),f=y("div"),j(u.$$.fragment),h=G(),j(_.$$.fragment),this.h()},l(P){e=C(P,"DIV",{role:!0,tabindex:!0,class:!0});var q=M(e);l=C(q,"BUTTON",{class:!0});var x=M(l);n.l(x),x.forEach(m),i=O(q),s=C(q,"BUTTON",{class:!0});var $=M(s);o.l($),$.forEach(m),c=O(q),f=C(q,"DIV",{class:!0,style:!0});var N=M(f);R(u.$$.fragment,N),h=O(N),R(_.$$.fragment,N),N.forEach(m),q.forEach(m),this.h()},h(){d(l,"class","svelte-11zk4sk"),d(s,"class","svelte-11zk4sk"),d(f,"class","handle absolute z-30 w-10 h-10 cursor-pointer select-none rounded-full flex items-center justify-center gap-0 bg-spring-wood-50 dark:bg-mine-shaft-900 svelte-11zk4sk"),ie(f,"left","calc("+r[0]*100+"% - 20px)"),d(e,"role","button"),d(e,"tabindex","0"),d(e,"class","overflow-hidden relative box-content h-full rounded-lg shadow-2xl")},m(P,q){w(P,e,q),L(e,l),z[t].m(l,null),L(e,i),L(e,s),S[a].m(s,null),L(e,c),L(e,f),B(u,f,null),L(f,h),B(_,f,null),v=!0,k||(p=[Q(window,"touchmove",r[9]),Q(window,"touchend",r[11]),Q(window,"mousemove",r[9]),Q(window,"mouseup",r[11]),Q(window,"resize",r[8]),Q(l,"mousedown",Ie(r[10])),Q(s,"mousedown",Ie(r[10])),Q(e,"touchstart",r[10]),Q(e,"mousedown",r[10])],k=!0)},p(P,[q]){let x=t;t=T(P),t===x?z[t].p(P,q):(F(),b(z[x],1,1,()=>{z[x]=null}),U(),n=z[t],n?n.p(P,q):(n=z[t]=V[t](P),n.c()),g(n,1),n.m(l,null));let $=a;a=H(P),a===$?S[a].p(P,q):(F(),b(S[$],1,1,()=>{S[$]=null}),U(),o=S[a],o?o.p(P,q):(o=S[a]=E[a](P),o.c()),g(o,1),o.m(s,null)),(!v||q&1)&&ie(f,"left","calc("+P[0]*100+"% - 20px)")},i(P){v||(g(n),g(o),g(u.$$.fragment,P),g(_.$$.fragment,P),v=!0)},o(P){b(n),b(o),b(u.$$.fragment,P),b(_.$$.fragment,P),v=!1},d(P){P&&m(e),z[t].d(),S[a].d(),A(u),A(_),k=!1,Pe(p)}}}function Ql(r,e,l){let t,n,i,s,a,o,c=!1,{offset:f=.5}=e,{before:u=""}=e,{after:h=""}=e,{alt:_=""}=e;const v=S=>{!a||!a.complete||l(12,s=(S.type==="load"?S.target:a).getBoundingClientRect())},k=S=>{if(c&&s){let H=(S.touches?S.touches[0].pageX:S.pageX)-s.left;H=H<0?0:H>t?t:H,l(0,f=H/t)}},p=S=>{c=!0,k(S)},V=()=>{c=!1},z=S=>{S&&S.addEventListener("load",v)};ae(()=>{a&&(z(a),a.complete&&v({target:a})),o&&o.complete&&v({target:o})});function T(S){ke[S?"unshift":"push"](()=>{a=S,l(4,a)})}function E(S){ke[S?"unshift":"push"](()=>{o=S,l(5,o)})}return r.$$set=S=>{"offset"in S&&l(0,f=S.offset),"before"in S&&l(1,u=S.before),"after"in S&&l(2,h=S.after),"alt"in S&&l(3,_=S.alt)},r.$$.update=()=>{r.$$.dirty&4096&&l(13,t=s&&s.width),r.$$.dirty&4096&&l(7,n=s&&s.height),r.$$.dirty&8193&&l(6,i=t*f)},[f,u,h,_,a,o,i,n,v,k,p,V,s,t,T,E]}class Zl extends Y{constructor(e){super(),J(this,e,Ql,Kl,X,{offset:0,before:1,after:2,alt:3})}}function je(r,e,l){const t=r.slice();return t[4]=e[l],t}function Be(r){let e,l,t=ne(r[0]),n=[];for(let s=0;sb(n[s],1,1,()=>{n[s]=null});return{c(){e=y("div");for(let s=0;s0&&Be(r);k=new Zl({props:{before:Ve.dark,after:Ve.light}});let E=r[3]&&Ge();return{c(){e=y("section"),j(l.$$.fragment),t=G(),n=y("div"),i=y("h1"),a=ee(s),o=G(),c=y("p"),u=ee(f),h=G(),T&&T.c(),_=G(),v=y("div"),j(k.$$.fragment),p=G(),E&&E.c(),this.h()},l(S){e=C(S,"SECTION",{id:!0,class:!0});var H=M(e);R(l.$$.fragment,H),t=O(H),n=C(H,"DIV",{class:!0});var P=M(n);i=C(P,"H1",{class:!0});var q=M(i);a=te(q,s),q.forEach(m),o=O(P),c=C(P,"P",{class:!0});var x=M(c);u=te(x,f),x.forEach(m),h=O(P),T&&T.l(P),P.forEach(m),_=O(H),v=C(H,"DIV",{class:!0});var $=M(v);R(k.$$.fragment,$),$.forEach(m),p=O(H),E&&E.l(H),H.forEach(m),this.h()},h(){d(i,"class","tracking-tight text-4xl md:text-5xl xl:text-7xl font-extralight text-gray-500 dark:text-mine-shaft-300 text-center"),d(c,"class","font-light md:text-lg xl:text-xl text-center"),d(n,"class","relative flex flex-col items-center gap-8 px-8 xl:max-w-6xl mx-auto hero-content-container"),d(v,"class","container aspect-video hero-image py-5 svelte-14gclcs"),d(e,"id",r[1]),d(e,"class",V="mt-20 "+r[2]+" svelte-14gclcs")},m(S,H){w(S,e,H),B(l,e,null),L(e,t),L(e,n),L(n,i),L(i,a),L(n,o),L(n,c),L(c,u),L(n,h),T&&T.m(n,null),L(e,_),L(e,v),B(k,v,null),L(e,p),E&&E.m(e,null),z=!0},p(S,[H]){S[0].length>0?T?(T.p(S,H),H&1&&g(T,1)):(T=Be(S),T.c(),g(T,1),T.m(n,null)):T&&(F(),b(T,1,1,()=>{T=null}),U()),S[3]?E?H&8&&g(E,1):(E=Ge(),E.c(),g(E,1),E.m(e,null)):E&&(F(),b(E,1,1,()=>{E=null}),U()),(!z||H&2)&&d(e,"id",S[1]),(!z||H&4&&V!==(V="mt-20 "+S[2]+" svelte-14gclcs"))&&d(e,"class",V)},i(S){z||(g(l.$$.fragment,S),g(T),g(k.$$.fragment,S),g(E),z=!0)},o(S){b(l.$$.fragment,S),b(T),b(k.$$.fragment,S),b(E),z=!1},d(S){S&&m(e),A(l),T&&T.d(),A(k),E&&E.d()}}}function $l(r,e,l){let{id:t=""}=e,{classes:n=""}=e,{divider:i=!1}=e,{buttons:s=[]}=e;return bt.subscribe(a=>{a.loading||l(0,s=[...a.osButtons,qt])}),r.$$set=a=>{"id"in a&&l(1,t=a.id),"classes"in a&&l(2,n=a.classes),"divider"in a&&l(3,i=a.divider),"buttons"in a&&l(0,s=a.buttons)},[s,t,n,i]}class en extends Y{constructor(e){super(),J(this,e,$l,xl,X,{id:1,classes:2,divider:3,buttons:0})}}function tn(r){let e,l='',t,n;return{c(){e=y("button"),e.innerHTML=l,this.h()},l(i){e=C(i,"BUTTON",{class:!0,"aria-label":!0,"data-svelte-h":!0}),Z(e)!=="svelte-1rbdl3"&&(e.innerHTML=l),this.h()},h(){d(e,"class","play__btn svelte-1srk8gt"),d(e,"aria-label","Play YouTube video")},m(i,s){w(i,e,s),t||(n=Q(e,"click",r[4]),t=!0)},p:I,i:I,o:I,d(i){i&&m(e),t=!1,n()}}}function ln(r){let e,l,t,n;const i=r[2].default,s=fe(i,r,r[1],null);return{c(){e=y("button"),s&&s.c(),this.h()},l(a){e=C(a,"BUTTON",{class:!0,"aria-label":!0});var o=M(e);s&&s.l(o),o.forEach(m),this.h()},h(){d(e,"class","custom__play__btn svelte-1srk8gt"),d(e,"aria-label","Play YouTube video")},m(a,o){w(a,e,o),s&&s.m(e,null),l=!0,t||(n=Q(e,"click",r[3]),t=!0)},p(a,o){s&&s.p&&(!l||o&2)&&ue(s,i,a,a[1],l?de(i,a[1],o,null):me(a[1]),null)},i(a){l||(g(s,a),l=!0)},o(a){b(s,a),l=!1},d(a){a&&m(e),s&&s.d(a),t=!1,n()}}}function nn(r){let e,l,t,n;const i=[ln,tn],s=[];function a(o,c){return o[0]?0:1}return e=a(r),l=s[e]=i[e](r),{c(){l.c(),t=W()},l(o){l.l(o),t=W()},m(o,c){s[e].m(o,c),w(o,t,c),n=!0},p(o,[c]){let f=e;e=a(o),e===f?s[e].p(o,c):(F(),b(s[f],1,1,()=>{s[f]=null}),U(),l=s[e],l?l.p(o,c):(l=s[e]=i[e](o),l.c()),g(l,1),l.m(t.parentNode,t))},i(o){n||(g(l),n=!0)},o(o){b(l),n=!1},d(o){o&&m(t),s[e].d(o)}}}function rn(r,e,l){let{$$slots:t={},$$scope:n}=e,{isCustomPlayButton:i}=e;function s(o){ze.call(this,r,o)}function a(o){ze.call(this,r,o)}return r.$$set=o=>{"isCustomPlayButton"in o&&l(0,i=o.isCustomPlayButton),"$$scope"in o&&l(1,n=o.$$scope)},[i,n,t,s,a]}class sn extends Y{constructor(e){super(),J(this,e,rn,nn,X,{isCustomPlayButton:0})}}function on(r){const e=r-1;return e*e*e+1}function we(r,{delay:e=0,duration:l=400,easing:t=Kt}={}){const n=+getComputedStyle(r).opacity;return{delay:e,duration:l,easing:t,css:i=>`opacity: ${i*n}`}}function an(r,{delay:e=0,duration:l=400,easing:t=on,start:n=0,opacity:i=0}={}){const s=getComputedStyle(r),a=+s.opacity,o=s.transform==="none"?"":s.transform,c=1-n,f=a*(1-i);return{delay:e,duration:l,easing:t,css:(u,h)=>` +import{m as Ht,t as Nt,v as jt,d as Bt,k as At,c as Gt,s as Ot,e as Rt,p as Te,w as Ve,x as bt,y as qt,h as ne,z as Me,A as Ft,B as Ut,g as kt,C as vt,M as Wt,D as Xt,E as Yt}from"../chunks/32.L6pbTd52.js";import{s as X,n as I,c as De,o as ae,d as Jt,e as ke,r as Pe,h as le,F as ze,A as fe,B as ue,C as me,D as de,m as Kt,l as he,G as wt,H as Qt,b as yt}from"../chunks/scheduler.DK_yUdRf.js";import{S as Y,i as J,e as y,s as G,c as C,F as Z,f as O,y as d,g as w,d as m,a as M,u as j,v as R,B as ie,h as L,w as B,G as Q,I as Ie,k as F,l as b,m as U,n as g,x as A,t as ee,b as te,z as _e,A as W,J as ye,j as se,D as K,H as Ct,q as St,K as Zt,C as oe,L as xt}from"../chunks/index.BH5W4qoH.js";import{B as Et}from"../chunks/Button.fdVjvHGv.js";import{I as ve}from"../chunks/Icon.vbkowJrT.js";import{b as $t,c as el,D as It,g as tl}from"../chunks/Divider.CPgZZ_Vn.js";import{L as Ce}from"../chunks/Loader.BLQl2yzu.js";import{h as ll,u as nl}from"../chunks/await_block.MuLFoa1l.js";import{_ as il}from"../chunks/preload-helper.C1FmrZbK.js";import{BsPlayCircleFill as He,BsPauseCircleFill as Ne}from"../chunks/index.D7Jwt5yH.js";const rl=!0,sl=rl;function ol(r){let e,l="Works the way scientists do",t,n,i="Data analysts, scientists and engineers require a lot of experimentation, quick feedback and short iteration cycles while programming. Spyder was built from the ground up around that workflow.";return{c(){e=y("h2"),e.textContent=l,t=G(),n=y("p"),n.textContent=i,this.h()},l(s){e=C(s,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1orvp9o"&&(e.textContent=l),t=O(s),n=C(s,"P",{"data-svelte-h":!0}),Z(n)!=="svelte-170cb4w"&&(n.textContent=i),this.h()},h(){d(e,"class","section")},m(s,a){w(s,e,a),w(s,t,a),w(s,n,a)},p:I,i:I,o:I,d(s){s&&(m(e),m(t),m(n))}}}class al extends Y{constructor(e){super(),J(this,e,null,ol,X,{})}}function cl(r){let e,l="A perfect fit with the most popular scientific libraries",t,n,i='Spyder includes out of the box integration with Matplotlib, Pandas and many other libraries to help you work more efficiently with them.';return{c(){e=y("h2"),e.textContent=l,t=G(),n=y("p"),n.innerHTML=i,this.h()},l(s){e=C(s,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-5oxt2y"&&(e.textContent=l),t=O(s),n=C(s,"P",{"data-svelte-h":!0}),Z(n)!=="svelte-1wt0ml8"&&(n.innerHTML=i),this.h()},h(){d(e,"class","section")},m(s,a){w(s,e,a),w(s,t,a),w(s,n,a)},p:I,i:I,o:I,d(s){s&&(m(e),m(t),m(n))}}}class fl extends Y{constructor(e){super(),J(this,e,null,cl,X,{})}}function ul(r){let e,l="Get the ease of use of Jupyter along with many advanced features found in PyCharm and VSCode in a single programming environment";return{c(){e=y("h3"),e.textContent=l,this.h()},l(t){e=C(t,"H3",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-puhbdg"&&(e.textContent=l),this.h()},h(){d(e,"class","subsection")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class ml extends Y{constructor(e){super(),J(this,e,null,ul,X,{})}}function dl(r){let e,l="Make a bigger impact with reusable research",t,n,i="The software you write is critical for new scientific discoveries and engineering solutions. Spyder helps you move from single scripts to structured, reusable modules and packages without losing interactivity. It also includes powerful software development tools whenever you’re ready for them.";return{c(){e=y("h2"),e.textContent=l,t=G(),n=y("p"),n.textContent=i,this.h()},l(s){e=C(s,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1xr8kp3"&&(e.textContent=l),t=O(s),n=C(s,"P",{"data-svelte-h":!0}),Z(n)!=="svelte-b2fwve"&&(n.textContent=i),this.h()},h(){d(e,"class","section")},m(s,a){w(s,e,a),w(s,t,a),w(s,n,a)},p:I,i:I,o:I,d(s){s&&(m(e),m(t),m(n))}}}class hl extends Y{constructor(e){super(),J(this,e,null,dl,X,{})}}function _l(r){let e,l="Install with a single click and be productive right away",t,n,i="Spyder offers standalone installers to make it as easy and reliable as possible to get started and keep it up to date.";return{c(){e=y("h2"),e.textContent=l,t=G(),n=y("p"),n.textContent=i,this.h()},l(s){e=C(s,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1xbw40j"&&(e.textContent=l),t=O(s),n=C(s,"P",{"data-svelte-h":!0}),Z(n)!=="svelte-bdiao3"&&(n.textContent=i),this.h()},h(){d(e,"class","section")},m(s,a){w(s,e,a),w(s,t,a),w(s,n,a)},p:I,i:I,o:I,d(s){s&&(m(e),m(t),m(n))}}}class gl extends Y{constructor(e){super(),J(this,e,null,_l,X,{})}}function pl(r){let e,l='Spyder plots pane displaying a 3D visualization in the main panel, with options above for saving, zooming or removing it, and a right panel with thumbnails of other previous plots
    Browse all your plots in a single place
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-bgv5n0"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class bl extends Y{constructor(e){super(),J(this,e,null,pl,X,{})}}function kl(r){let e,l='Spyder Variable Explorer pane showing a pandas dataframe containing weather observations in a "spreadsheet" style view, with multi-level index columns, per-column heatmaps and toolbar options for displaying and editing the data
    Interact with the contents of your dataframes
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1ofk0hi"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class vl extends Y{constructor(e){super(),J(this,e,null,kl,X,{})}}function wl(r){let e,l='Spyder Consoles menu with the "New console in environment" submenu selected, showing a listing of Conda environments by name, type and Python version
    Work with multiple environments at once
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-366h3l"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class yl extends Y{constructor(e){super(),J(this,e,null,wl,X,{})}}function Cl(r){let e,l='Spyder's IPython Console pane, showing individual lines of code constructing SymPy expressions, and several complex symbolic formulas rendered inline in publication-style rich mathematical notation
    View rich symbolic expressions rendered with LaTeX
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-vu5wsu"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Sl extends Y{constructor(e){super(),J(this,e,null,Cl,X,{})}}function El(r){let e,l='Spyder Variable Explorer pane displaying a three-dimensional NumPy in a "spreadsheet" style view, with cell colors forming a heatmap of values and options to adjust the axis and index of the array slice
    Explore and edit multi-dimensional arrays
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-kiw5jh"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Il extends Y{constructor(e){super(),J(this,e,null,El,X,{})}}function Tl(r){let e,l='Spyder Editor pane, with several real-time code analysis warnings shown on different lines and the affected code underlined. A hovered-over warning is showing its associated message, while the Source menu is open to the left showing the "Underline errors and warnings" option enabled
    Take advantage of real-time hints and help to improve your code
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1rwla39"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Dl extends Y{constructor(e){super(),J(this,e,null,Tl,X,{})}}function Pl(r){let e,l='Spyder Editor pane showing the Projects pane to its left, listing the files and directories of a project in a tree-style layout
    Easily switch between projects and browse their files
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-r49vr6"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Ll extends Y{constructor(e){super(),J(this,e,null,Pl,X,{})}}function Vl(r){let e,l='Spyder Code Analysis pane showing the results for a file, including an overall score and a listing of errors, warnings, refactoring and convention issues; each has a name, code, line number and message
    Get in-depth insight on issues and improvements with your code
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-e7geul"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Ml extends Y{constructor(e){super(),J(this,e,null,Vl,X,{})}}function zl(r){let e,l='Spyder Find pane, showing an example search for a method name, buttons toggling search options, an exclude field listing various file extensions, a dropdown for search location and a count and list of results per-file, including the file name and path and the line, column and context for each result
    Quickly find uses of a variable or word across files
    ';return{c(){e=y("figure"),e.innerHTML=l,this.h()},l(t){e=C(t,"FIGURE",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-oty2ns"&&(e.innerHTML=l),this.h()},h(){d(e,"class","figure")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Hl extends Y{constructor(e){super(),J(this,e,null,zl,X,{})}}function Nl(r){let e,l="Spyder is funded thanks to the generous support of";return{c(){e=y("h1"),e.textContent=l},l(t){e=C(t,"H1",{"data-svelte-h":!0}),Z(e)!=="svelte-2ufh9o"&&(e.textContent=l)},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class jl extends Y{constructor(e){super(),J(this,e,null,Nl,X,{})}}function Bl(r){let e,l="and the donations we have received from our users around the world through Open Collective:";return{c(){e=y("h2"),e.textContent=l,this.h()},l(t){e=C(t,"H2",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1rx1kf9"&&(e.textContent=l),this.h()},h(){d(e,"class","section")},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}class Al extends Y{constructor(e){super(),J(this,e,null,Bl,X,{})}}let Tt={},Gl="linux",Ol=[];Tt={props:{buttons:[],blocks:[{id:"what-is-spyder-section",imgSrc:"/assets/media/banner.svg",background:"/assets/media/bg.svg",columns:!1,divider:!0,boxed:!0,title:"The Spyder advantage",extraContent:ml},{id:"interactive-section",title:"Interactive programming built in",divider:!0,border:!1,content:al,tabs:[{title:"Variable Explorer",isVideo:!0,content:{videoSources:[{src:"/assets/media/variable_explorer.mp4"}],videoCaption:"Explore variables after execution"}},{title:"Help",isVideo:!0,content:{videoSources:[{src:"/assets/media/help.mp4"}],videoCaption:"Get help for code you're working on with one click"}},{title:"Editor",isVideo:!0,content:{videoSources:[{src:"/assets/media/editor.mp4"}],videoCaption:'Run code in line by line or in sections called "cells"'}}]},{id:"pydata-section",title:"Seamless integration with the PyData ecosystem",divider:!0,content:fl,tabs:[{title:"Matplotlib",content:bl},{title:"Pandas",content:vl},{title:"Numpy",content:Il},{title:"Conda",content:yl},{title:"Sympy",content:Sl}]},{id:"growth-section",title:"Ready to take you to the next level",divider:!0,content:hl,tabs:[{title:"Developer tools",content:Dl},{title:"Projects",content:Ll},{title:"Code analysis",content:Ml},{title:"Code search",content:Hl}]},{id:"setup-section",title:"Simple install and update process",content:gl,divider:!0,imgSrc:`/assets/media/${Gl}.webp`,buttons:Ol},{id:"sponsors-section",title:"Sponsors",content:jl,divider:!0,columns:!1,boxed:!0,extraContent:Al,extraImage:"/assets/media/sponsors.svg",extraImageAlt:"Donate to our project",extraImageLink:"https://opencollective.com/spyder#support",innerColumns:[{imgSrc:"/assets/media/czi_light.svg",imgSrcDark:"/assets/media/czi_dark.svg",link:"https://chanzuckerberg.com/"},{imgSrc:"/assets/media/numfocus_lrg.png",link:"https://numfocus.org/"}]},{id:"learn-more-section",columns:!1,boxed:!0,background:"/assets/media/bg_more.svg",backgroundDark:"/assets/media/bg_more_dark.svg",innerColumns:[{title:"YouTube",content:"Learn more",icon:"BsYoutube",link:"https://www.youtube.com/c/spyderide",aspect:"xl:aspect-square"},{title:"Documentation",content:"Read the docs",icon:"BsBookHalf",link:"https://docs.spyder-ide.org",aspect:"xl:aspect-square"},{title:"GitHub",content:"Check out the source",icon:"BsGithub",link:"https://github.com/spyder-ide/spyder",aspect:"xl:aspect-square"},{title:"Donations",content:"Show your support",icon:"BsHeartFill",link:"https://opencollective.com/spyder",aspect:"xl:aspect-square"}]}]}};function Rl(){return Ht.setMetadata({title:`${Nt} | ${jt}`,description:Bt,keywords:At.join(", "),author:Gt,url:Ot,image:Rt}),Tt}const Li=Object.freeze(Object.defineProperty({__proto__:null,load:Rl},Symbol.toStringTag,{value:"Module"}));function ql(r){let e;return{c(){e=y("div"),this.h()},l(l){e=C(l,"DIV",{class:!0}),M(e).forEach(m),this.h()},h(){d(e,"class","vanta-container absolute inset-0 -z-10")},m(l,t){w(l,e,t),r[4](e)},p:I,i:I,o:I,d(l){l&&m(e),r[4](null)}}}function Fl(r,e,l){let t,n;De(r,Te,_=>l(3,n=_));let i,s,a;const o=(_,v)=>_[v]||_.light,c={light:16250866,dark:3158064},f={light:9175040,dark:10722156},u=()=>{if(s&&sl&&window.VANTA){i&&i.destroy();try{l(1,i=window.VANTA.DOTS({...t,el:s})),l(2,a=n),console.log("Vanta initialized successfully with scheme:",a)}catch(_){console.error("Vanta initialization error:",_)}}else console.error("Cannot initialize Vanta")};ae(()=>{u()}),Jt(()=>{i&&n!==a&&(console.log("After update: Color scheme changed, reinitializing Vanta"),u())});function h(_){ke[_?"unshift":"push"](()=>{s=_,l(0,s)})}return r.$$.update=()=>{r.$$.dirty&8&&(t={color:o(f,n),backgroundColor:o(c,n),mouseControls:!0,touchControls:!0,gyroControls:!1,minHeight:200,minWidth:200,scale:1,scaleMobile:1,showLines:!1}),r.$$.dirty&14&&i&&n!==a&&(console.log("Color scheme changed, reinitializing Vanta"),u())},[s,i,a,n,h]}class Ul extends Y{constructor(e){super(),J(this,e,Fl,ql,X,{})}}function Wl(r){let e,l;return e=new Ce({}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p:I,i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function Xl(r){let e,l,t,n;return{c(){e=y("img"),this.h()},l(i){e=C(i,"IMG",{alt:!0,src:!0,class:!0}),this.h()},h(){d(e,"alt",r[3]),le(e.src,l=r[2])||d(e,"src",l),d(e,"class","block absolute inset-0 z-20 object-cover select-none w-full h-full")},m(i,s){w(i,e,s),r[14](e),t||(n=Q(e,"load",r[8]),t=!0)},p(i,s){s&8&&d(e,"alt",i[3]),s&4&&!le(e.src,l=i[2])&&d(e,"src",l)},i:I,o:I,d(i){i&&m(e),r[14](null),t=!1,n()}}}function Yl(r){let e,l;return e=new Ce({}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p:I,i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function Jl(r){let e,l;return{c(){e=y("img"),this.h()},l(t){e=C(t,"IMG",{alt:!0,src:!0,class:!0,style:!0}),this.h()},h(){d(e,"alt",r[3]),le(e.src,l=r[1])||d(e,"src",l),d(e,"class","block absolute inset-0 z-20 object-cover select-none w-full h-full"),ie(e,"clip","rect(0, "+r[6]+"px, "+r[7]+"px, 0)")},m(t,n){w(t,e,n),r[15](e)},p(t,n){n&8&&d(e,"alt",t[3]),n&2&&!le(e.src,l=t[1])&&d(e,"src",l),n&192&&ie(e,"clip","rect(0, "+t[6]+"px, "+t[7]+"px, 0)")},i:I,o:I,d(t){t&&m(e),r[15](null)}}}function Kl(r){let e,l,t,n,i,s,a,o,c,f,u,h,_,v,k,p;const V=[Xl,Wl],z=[];function T(P,q){return P[2]?0:1}t=T(r),n=z[t]=V[t](r);const E=[Jl,Yl],S=[];function H(P,q){return P[1]?0:1}return a=H(r),o=S[a]=E[a](r),u=new ve({props:{src:$t}}),_=new ve({props:{src:el}}),{c(){e=y("div"),l=y("button"),n.c(),i=G(),s=y("button"),o.c(),c=G(),f=y("div"),j(u.$$.fragment),h=G(),j(_.$$.fragment),this.h()},l(P){e=C(P,"DIV",{role:!0,tabindex:!0,class:!0});var q=M(e);l=C(q,"BUTTON",{class:!0});var x=M(l);n.l(x),x.forEach(m),i=O(q),s=C(q,"BUTTON",{class:!0});var $=M(s);o.l($),$.forEach(m),c=O(q),f=C(q,"DIV",{class:!0,style:!0});var N=M(f);R(u.$$.fragment,N),h=O(N),R(_.$$.fragment,N),N.forEach(m),q.forEach(m),this.h()},h(){d(l,"class","svelte-11zk4sk"),d(s,"class","svelte-11zk4sk"),d(f,"class","handle absolute z-30 w-10 h-10 cursor-pointer select-none rounded-full flex items-center justify-center gap-0 bg-spring-wood-50 dark:bg-mine-shaft-900 svelte-11zk4sk"),ie(f,"left","calc("+r[0]*100+"% - 20px)"),d(e,"role","button"),d(e,"tabindex","0"),d(e,"class","overflow-hidden relative box-content h-full rounded-lg shadow-2xl")},m(P,q){w(P,e,q),L(e,l),z[t].m(l,null),L(e,i),L(e,s),S[a].m(s,null),L(e,c),L(e,f),B(u,f,null),L(f,h),B(_,f,null),v=!0,k||(p=[Q(window,"touchmove",r[9]),Q(window,"touchend",r[11]),Q(window,"mousemove",r[9]),Q(window,"mouseup",r[11]),Q(window,"resize",r[8]),Q(l,"mousedown",Ie(r[10])),Q(s,"mousedown",Ie(r[10])),Q(e,"touchstart",r[10]),Q(e,"mousedown",r[10])],k=!0)},p(P,[q]){let x=t;t=T(P),t===x?z[t].p(P,q):(F(),b(z[x],1,1,()=>{z[x]=null}),U(),n=z[t],n?n.p(P,q):(n=z[t]=V[t](P),n.c()),g(n,1),n.m(l,null));let $=a;a=H(P),a===$?S[a].p(P,q):(F(),b(S[$],1,1,()=>{S[$]=null}),U(),o=S[a],o?o.p(P,q):(o=S[a]=E[a](P),o.c()),g(o,1),o.m(s,null)),(!v||q&1)&&ie(f,"left","calc("+P[0]*100+"% - 20px)")},i(P){v||(g(n),g(o),g(u.$$.fragment,P),g(_.$$.fragment,P),v=!0)},o(P){b(n),b(o),b(u.$$.fragment,P),b(_.$$.fragment,P),v=!1},d(P){P&&m(e),z[t].d(),S[a].d(),A(u),A(_),k=!1,Pe(p)}}}function Ql(r,e,l){let t,n,i,s,a,o,c=!1,{offset:f=.5}=e,{before:u=""}=e,{after:h=""}=e,{alt:_=""}=e;const v=S=>{!a||!a.complete||l(12,s=(S.type==="load"?S.target:a).getBoundingClientRect())},k=S=>{if(c&&s){let H=(S.touches?S.touches[0].pageX:S.pageX)-s.left;H=H<0?0:H>t?t:H,l(0,f=H/t)}},p=S=>{c=!0,k(S)},V=()=>{c=!1},z=S=>{S&&S.addEventListener("load",v)};ae(()=>{a&&(z(a),a.complete&&v({target:a})),o&&o.complete&&v({target:o})});function T(S){ke[S?"unshift":"push"](()=>{a=S,l(4,a)})}function E(S){ke[S?"unshift":"push"](()=>{o=S,l(5,o)})}return r.$$set=S=>{"offset"in S&&l(0,f=S.offset),"before"in S&&l(1,u=S.before),"after"in S&&l(2,h=S.after),"alt"in S&&l(3,_=S.alt)},r.$$.update=()=>{r.$$.dirty&4096&&l(13,t=s&&s.width),r.$$.dirty&4096&&l(7,n=s&&s.height),r.$$.dirty&8193&&l(6,i=t*f)},[f,u,h,_,a,o,i,n,v,k,p,V,s,t,T,E]}class Zl extends Y{constructor(e){super(),J(this,e,Ql,Kl,X,{offset:0,before:1,after:2,alt:3})}}function je(r,e,l){const t=r.slice();return t[4]=e[l],t}function Be(r){let e,l,t=ne(r[0]),n=[];for(let s=0;sb(n[s],1,1,()=>{n[s]=null});return{c(){e=y("div");for(let s=0;s0&&Be(r);k=new Zl({props:{before:Ve.dark,after:Ve.light}});let E=r[3]&&Ge();return{c(){e=y("section"),j(l.$$.fragment),t=G(),n=y("div"),i=y("h1"),a=ee(s),o=G(),c=y("p"),u=ee(f),h=G(),T&&T.c(),_=G(),v=y("div"),j(k.$$.fragment),p=G(),E&&E.c(),this.h()},l(S){e=C(S,"SECTION",{id:!0,class:!0});var H=M(e);R(l.$$.fragment,H),t=O(H),n=C(H,"DIV",{class:!0});var P=M(n);i=C(P,"H1",{class:!0});var q=M(i);a=te(q,s),q.forEach(m),o=O(P),c=C(P,"P",{class:!0});var x=M(c);u=te(x,f),x.forEach(m),h=O(P),T&&T.l(P),P.forEach(m),_=O(H),v=C(H,"DIV",{class:!0});var $=M(v);R(k.$$.fragment,$),$.forEach(m),p=O(H),E&&E.l(H),H.forEach(m),this.h()},h(){d(i,"class","tracking-tight text-4xl md:text-5xl xl:text-7xl font-extralight text-gray-500 dark:text-mine-shaft-300 text-center"),d(c,"class","font-light md:text-lg xl:text-xl text-center"),d(n,"class","relative flex flex-col items-center gap-8 px-8 xl:max-w-6xl mx-auto hero-content-container"),d(v,"class","container aspect-video hero-image py-5 svelte-14gclcs"),d(e,"id",r[1]),d(e,"class",V="mt-20 "+r[2]+" svelte-14gclcs")},m(S,H){w(S,e,H),B(l,e,null),L(e,t),L(e,n),L(n,i),L(i,a),L(n,o),L(n,c),L(c,u),L(n,h),T&&T.m(n,null),L(e,_),L(e,v),B(k,v,null),L(e,p),E&&E.m(e,null),z=!0},p(S,[H]){S[0].length>0?T?(T.p(S,H),H&1&&g(T,1)):(T=Be(S),T.c(),g(T,1),T.m(n,null)):T&&(F(),b(T,1,1,()=>{T=null}),U()),S[3]?E?H&8&&g(E,1):(E=Ge(),E.c(),g(E,1),E.m(e,null)):E&&(F(),b(E,1,1,()=>{E=null}),U()),(!z||H&2)&&d(e,"id",S[1]),(!z||H&4&&V!==(V="mt-20 "+S[2]+" svelte-14gclcs"))&&d(e,"class",V)},i(S){z||(g(l.$$.fragment,S),g(T),g(k.$$.fragment,S),g(E),z=!0)},o(S){b(l.$$.fragment,S),b(T),b(k.$$.fragment,S),b(E),z=!1},d(S){S&&m(e),A(l),T&&T.d(),A(k),E&&E.d()}}}function $l(r,e,l){let{id:t=""}=e,{classes:n=""}=e,{divider:i=!1}=e,{buttons:s=[]}=e;return bt.subscribe(a=>{a.loading||l(0,s=[...a.osButtons,qt])}),r.$$set=a=>{"id"in a&&l(1,t=a.id),"classes"in a&&l(2,n=a.classes),"divider"in a&&l(3,i=a.divider),"buttons"in a&&l(0,s=a.buttons)},[s,t,n,i]}class en extends Y{constructor(e){super(),J(this,e,$l,xl,X,{id:1,classes:2,divider:3,buttons:0})}}function tn(r){let e,l='',t,n;return{c(){e=y("button"),e.innerHTML=l,this.h()},l(i){e=C(i,"BUTTON",{class:!0,"aria-label":!0,"data-svelte-h":!0}),Z(e)!=="svelte-1rbdl3"&&(e.innerHTML=l),this.h()},h(){d(e,"class","play__btn svelte-1srk8gt"),d(e,"aria-label","Play YouTube video")},m(i,s){w(i,e,s),t||(n=Q(e,"click",r[4]),t=!0)},p:I,i:I,o:I,d(i){i&&m(e),t=!1,n()}}}function ln(r){let e,l,t,n;const i=r[2].default,s=fe(i,r,r[1],null);return{c(){e=y("button"),s&&s.c(),this.h()},l(a){e=C(a,"BUTTON",{class:!0,"aria-label":!0});var o=M(e);s&&s.l(o),o.forEach(m),this.h()},h(){d(e,"class","custom__play__btn svelte-1srk8gt"),d(e,"aria-label","Play YouTube video")},m(a,o){w(a,e,o),s&&s.m(e,null),l=!0,t||(n=Q(e,"click",r[3]),t=!0)},p(a,o){s&&s.p&&(!l||o&2)&&ue(s,i,a,a[1],l?de(i,a[1],o,null):me(a[1]),null)},i(a){l||(g(s,a),l=!0)},o(a){b(s,a),l=!1},d(a){a&&m(e),s&&s.d(a),t=!1,n()}}}function nn(r){let e,l,t,n;const i=[ln,tn],s=[];function a(o,c){return o[0]?0:1}return e=a(r),l=s[e]=i[e](r),{c(){l.c(),t=W()},l(o){l.l(o),t=W()},m(o,c){s[e].m(o,c),w(o,t,c),n=!0},p(o,[c]){let f=e;e=a(o),e===f?s[e].p(o,c):(F(),b(s[f],1,1,()=>{s[f]=null}),U(),l=s[e],l?l.p(o,c):(l=s[e]=i[e](o),l.c()),g(l,1),l.m(t.parentNode,t))},i(o){n||(g(l),n=!0)},o(o){b(l),n=!1},d(o){o&&m(t),s[e].d(o)}}}function rn(r,e,l){let{$$slots:t={},$$scope:n}=e,{isCustomPlayButton:i}=e;function s(o){ze.call(this,r,o)}function a(o){ze.call(this,r,o)}return r.$$set=o=>{"isCustomPlayButton"in o&&l(0,i=o.isCustomPlayButton),"$$scope"in o&&l(1,n=o.$$scope)},[i,n,t,s,a]}class sn extends Y{constructor(e){super(),J(this,e,rn,nn,X,{isCustomPlayButton:0})}}function on(r){const e=r-1;return e*e*e+1}function we(r,{delay:e=0,duration:l=400,easing:t=Kt}={}){const n=+getComputedStyle(r).opacity;return{delay:e,duration:l,easing:t,css:i=>`opacity: ${i*n}`}}function an(r,{delay:e=0,duration:l=400,easing:t=on,start:n=0,opacity:i=0}={}){const s=getComputedStyle(r),a=+s.opacity,o=s.transform==="none"?"":s.transform,c=1-n,f=a*(1-i);return{delay:e,duration:l,easing:t,css:(u,h)=>` transform: ${o} scale(${1-c*h}); opacity: ${a-f*h} `}}function cn(r){let e,l,t;return{c(){e=y("iframe"),this.h()},l(n){e=C(n,"IFRAME",{src:!0,title:!0,frameborder:!0,allow:!0,class:!0}),M(e).forEach(m),this.h()},h(){le(e.src,l="https://www.youtube.com/embed/"+r[1]+"?autoplay=1&rel=0")||d(e,"src",l),d(e,"title",r[0]),d(e,"frameborder","0"),d(e,"allow","autoplay; picture-in-picture; clipboard-write"),e.allowFullscreen=!0,d(e,"class","svelte-11gebsu")},m(n,i){w(n,e,i)},p(n,[i]){r=n,i&2&&!le(e.src,l="https://www.youtube.com/embed/"+r[1]+"?autoplay=1&rel=0")&&d(e,"src",l),i&1&&d(e,"title",r[0])},i(n){n&&(t||he(()=>{t=ye(e,an,r[2]?{delay:500,duration:800}:{}),t.start()}))},o:I,d(n){n&&m(e)}}}function fn(r,e,l){let{title:t=""}=e,{id:n=""}=e,{animations:i}=e;return r.$$set=s=>{"title"in s&&l(0,t=s.title),"id"in s&&l(1,n=s.id),"animations"in s&&l(2,i=s.animations)},[t,n,i]}class un extends Y{constructor(e){super(),J(this,e,fn,cn,X,{title:0,id:1,animations:2})}}function Oe(r){let e,l,t;return{c(){e=y("img"),this.h()},l(n){e=C(n,"IMG",{src:!0,title:!0,alt:!0,referrerpolicy:!0,class:!0}),this.h()},h(){le(e.src,l="https://i.ytimg.com/vi/"+r[0]+"/"+(r[2]?"hqdefault":"maxresdefault")+".jpg")||d(e,"src",l),d(e,"title",r[1]),d(e,"alt",t="Youtube video: "+r[1]),d(e,"referrerpolicy","no-referrer"),d(e,"class","svelte-hw9fhp")},m(n,i){w(n,e,i)},p(n,i){i&5&&!le(e.src,l="https://i.ytimg.com/vi/"+n[0]+"/"+(n[2]?"hqdefault":"maxresdefault")+".jpg")&&d(e,"src",l),i&2&&d(e,"title",n[1]),i&2&&t!==(t="Youtube video: "+n[1])&&d(e,"alt",t)},d(n){n&&m(e)}}}function mn(r){let e=r[3],l,t=Oe(r);return{c(){t.c(),l=W()},l(n){t.l(n),l=W()},m(n,i){t.m(n,i),w(n,l,i)},p(n,[i]){i&8&&X(e,e=n[3])?(t.d(1),t=Oe(n),t.c(),t.m(l.parentNode,l)):t.p(n,i)},i:I,o:I,d(n){n&&m(l),t.d(n)}}}function dn(r,e,l){let{id:t=""}=e,{title:n=""}=e,{altThumb:i=""}=e,{play:s=!1}=e;return r.$$set=a=>{"id"in a&&l(0,t=a.id),"title"in a&&l(1,n=a.title),"altThumb"in a&&l(2,i=a.altThumb),"play"in a&&l(3,s=a.play)},[t,n,i,s]}let hn=class extends Y{constructor(e){super(),J(this,e,dn,mn,X,{id:0,title:1,altThumb:2,play:3})}};const _n=r=>({}),Re=r=>({});function gn(r){let e,l,t,n,i,s,a,o,c,f,u;const h=[kn,bn],_=[];function v(k,p){return k[8]?0:1}return e=v(r),l=_[e]=h[e](r),{c(){l.c(),t=G(),n=y("div"),i=G(),s=y("div"),a=y("h3"),o=ee(r[3]),this.h()},l(k){l.l(k),t=O(k),n=C(k,"DIV",{class:!0}),M(n).forEach(m),i=O(k),s=C(k,"DIV",{class:!0});var p=M(s);a=C(p,"H3",{class:!0});var V=M(a);o=te(V,r[3]),V.forEach(m),p.forEach(m),this.h()},h(){d(n,"class","b__overlay svelte-w0t24e"),d(a,"class","svelte-w0t24e"),d(s,"class","v__title svelte-w0t24e")},m(k,p){_[e].m(k,p),w(k,t,p),w(k,n,p),w(k,i,p),w(k,s,p),L(s,a),L(a,o),c=!0,f||(u=[Q(n,"click",r[10]),Q(n,"keypress",r[11])],f=!0)},p(k,p){l.p(k,p),(!c||p&8)&&se(o,k[3])},i(k){c||(g(l),c=!0)},o(k){b(l),c=!1},d(k){k&&(m(t),m(n),m(i),m(s)),_[e].d(k),f=!1,Pe(u)}}}function pn(r){let e,l;return e=new un({props:{id:r[0],title:r[3],animations:r[2]}}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p(t,n){const i={};n&1&&(i.id=t[0]),n&8&&(i.title=t[3]),n&4&&(i.animations=t[2]),e.$set(i)},i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function bn(r){let e,l;return e=new hn({props:{id:r[0],title:r[3],altThumb:r[1],play:r[6]}}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p(t,n){const i={};n&1&&(i.id=t[0]),n&8&&(i.title=t[3]),n&2&&(i.altThumb=t[1]),n&64&&(i.play=t[6]),e.$set(i)},i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function kn(r){let e;const l=r[9].thumbnail,t=fe(l,r,r[13],Re);return{c(){t&&t.c()},l(n){t&&t.l(n)},m(n,i){t&&t.m(n,i),e=!0},p(n,i){t&&t.p&&(!e||i&8192)&&ue(t,l,n,n[13],e?de(l,n[13],i,_n):me(n[13]),Re)},i(n){e||(g(t,n),e=!0)},o(n){b(t,n),e=!1},d(n){t&&t.d(n)}}}function qe(r){let e,l;return e=new sn({props:{isCustomPlayButton:r[7],$$slots:{default:[vn]},$$scope:{ctx:r}}}),e.$on("click",r[12]),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p(t,n){const i={};n&8192&&(i.$$scope={dirty:n,ctx:t}),e.$set(i)},i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function vn(r){let e;const l=r[9].default,t=fe(l,r,r[13],null);return{c(){t&&t.c()},l(n){t&&t.l(n)},m(n,i){t&&t.m(n,i),e=!0},p(n,i){t&&t.p&&(!e||i&8192)&&ue(t,l,n,n[13],e?de(l,n[13],i,null):me(n[13]),null)},i(n){e||(g(t,n),e=!0)},o(n){b(t,n),e=!1},d(n){t&&t.d(n)}}}function wn(r){let e,l,t,n,i;const s=[pn,gn],a=[];function o(f,u){return f[6]?0:1}l=o(r),t=a[l]=s[l](r);let c=!r[6]&&qe(r);return{c(){e=y("div"),t.c(),n=G(),c&&c.c(),this.h()},l(f){e=C(f,"DIV",{class:!0,style:!0,title:!0});var u=M(e);t.l(u),n=O(u),c&&c.l(u),u.forEach(m),this.h()},h(){d(e,"class","you__tube svelte-w0t24e"),ie(e,"--aspect-ratio",r[4]/r[5]||"16/9"),d(e,"title",r[3])},m(f,u){w(f,e,u),a[l].m(e,null),L(e,n),c&&c.m(e,null),i=!0},p(f,[u]){let h=l;l=o(f),l===h?a[l].p(f,u):(F(),b(a[h],1,1,()=>{a[h]=null}),U(),t=a[l],t?t.p(f,u):(t=a[l]=s[l](f),t.c()),g(t,1),t.m(e,n)),f[6]?c&&(F(),b(c,1,1,()=>{c=null}),U()):c?(c.p(f,u),u&64&&g(c,1)):(c=qe(f),c.c(),g(c,1),c.m(e,null)),(!i||u&48)&&ie(e,"--aspect-ratio",f[4]/f[5]||"16/9"),(!i||u&8)&&d(e,"title",f[3])},i(f){i||(g(t),g(c),i=!0)},o(f){b(t),b(c),i=!1},d(f){f&&m(e),a[l].d(),c&&c.d()}}}function yn(r,e,l){let{$$slots:t={},$$scope:n}=e;const i=wt(t);let{id:s=null}=e,{altThumb:a=!1}=e,{animations:o=!0}=e,c="",f=0,u=0,h={};ae(async()=>{h=await(await fetch(`//www.youtube.com/oembed?url=https://www.youtube.com/watch?v=${s}&format=json`)).json(),l(3,c=h==null?void 0:h.title),l(4,f=h==null?void 0:h.width),l(5,u=h==null?void 0:h.height)});let _=!1;const v=i.default,k=i.thumbnail,p=()=>l(6,_=!0),V=()=>l(6,_=!0),z=()=>l(6,_=!0);return r.$$set=T=>{"id"in T&&l(0,s=T.id),"altThumb"in T&&l(1,a=T.altThumb),"animations"in T&&l(2,o=T.animations),"$$scope"in T&&l(13,n=T.$$scope)},[s,a,o,c,f,u,_,v,k,t,p,V,z,n]}class Cn extends Y{constructor(e){super(),J(this,e,yn,wn,X,{id:0,altThumb:1,animations:2})}}function Sn(r){let e,l,t=r[4]+"",n;return{c(){e=y("small"),l=ee("Error loading icon: "),n=ee(t)},l(i){e=C(i,"SMALL",{});var s=M(e);l=te(s,"Error loading icon: "),n=te(s,t),s.forEach(m)},m(i,s){w(i,e,s),L(e,l),L(e,n)},p:I,i:I,o:I,d(i){i&&m(e)}}}function En(r){let e,l,t,n;const i=[Tn,In],s=[];function a(o,c){return o[3]?0:1}return e=a(r),l=s[e]=i[e](r),{c(){l.c(),t=W()},l(o){l.l(o),t=W()},m(o,c){s[e].m(o,c),w(o,t,c),n=!0},p(o,c){l.p(o,c)},i(o){n||(g(l),n=!0)},o(o){b(l),n=!1},d(o){o&&m(t),s[e].d(o)}}}function In(r){let e,l="Icon not found";return{c(){e=y("small"),e.textContent=l},l(t){e=C(t,"SMALL",{"data-svelte-h":!0}),Z(e)!=="svelte-e1arbw"&&(e.textContent=l)},m(t,n){w(t,e,n)},p:I,i:I,o:I,d(t){t&&m(e)}}}function Tn(r){let e,l;return e=new ve({props:{src:r[3],size:r[0]}}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p(t,n){const i={};n&1&&(i.size=t[0]),e.$set(i)},i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function Dn(r){let e,l;return e=new Ce({}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p:I,i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function Pn(r){let e,l,t={ctx:r,current:null,token:null,hasCatch:!0,pending:Dn,then:En,catch:Sn,value:3,error:4,blocks:[,,,]};return ll(r[1],t),{c(){e=W(),t.block.c()},l(n){e=W(),t.block.l(n)},m(n,i){w(n,e,i),t.block.m(n,t.anchor=i),t.mount=()=>e.parentNode,t.anchor=e,l=!0},p(n,[i]){r=n,nl(t,r,i)},i(n){l||(g(t.block),l=!0)},o(n){for(let i=0;i<3;i+=1){const s=t.blocks[i];b(s)}l=!1},d(n){n&&m(e),t.block.d(n),t.token=null,t=null}}}function Ln(r,e,l){let{icon:t}=e,{size:n="4rem"}=e,i=Ft(t);return r.$$set=s=>{"icon"in s&&l(2,t=s.icon),"size"in s&&l(0,n=s.size)},[n,i,t]}class Vn extends Y{constructor(e){super(),J(this,e,Ln,Pn,X,{icon:2,size:0})}}function Mn(r){let e,l;return e=new Ce({}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p:I,i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function zn(r){let e;function l(i,s){return i[6]?Nn:Hn}let t=l(r),n=t(r);return{c(){n.c(),e=W()},l(i){n.l(i),e=W()},m(i,s){n.m(i,s),w(i,e,s)},p(i,s){t===(t=l(i))&&n?n.p(i,s):(n.d(1),n=t(i),n&&(n.c(),n.m(e.parentNode,e)))},i:I,o:I,d(i){i&&m(e),n.d(i)}}}function Hn(r){let e,l,t;return{c(){e=y("img"),this.h()},l(n){e=C(n,"IMG",{src:!0,class:!0,alt:!0,loading:!0}),this.h()},h(){le(e.src,l=r[9])||d(e,"src",l),d(e,"class",r[7]),d(e,"alt",t=r[0]||r[1]||""),d(e,"loading","lazy"),K(e,"rounded-md",r[4]),K(e,"shadow-lg",r[3]),K(e,"blur-md",r[2]),K(e,"shadow-md",r[3]),K(e,"object-contain",r[5]),K(e,"object-center",r[5])},m(n,i){w(n,e,i)},p(n,i){i&512&&!le(e.src,l=n[9])&&d(e,"src",l),i&128&&d(e,"class",n[7]),i&3&&t!==(t=n[0]||n[1]||"")&&d(e,"alt",t),i&144&&K(e,"rounded-md",n[4]),i&136&&K(e,"shadow-lg",n[3]),i&132&&K(e,"blur-md",n[2]),i&136&&K(e,"shadow-md",n[3]),i&160&&K(e,"object-contain",n[5]),i&160&&K(e,"object-center",n[5])},d(n){n&&m(e)}}}function Nn(r){let e,l,t,n,i,s=r[8]&&Fe(r);return{c(){e=y("figure"),l=y("img"),i=G(),s&&s.c(),this.h()},l(a){e=C(a,"FIGURE",{class:!0});var o=M(e);l=C(o,"IMG",{src:!0,class:!0,alt:!0,loading:!0}),i=O(o),s&&s.l(o),o.forEach(m),this.h()},h(){le(l.src,t=r[9])||d(l,"src",t),d(l,"class",r[7]),d(l,"alt",n=r[0]||r[1]||""),d(l,"loading","lazy"),K(l,"rounded-md",r[4]),K(l,"shadow-lg",r[3]),K(l,"blur-md",r[2]),K(l,"shadow-md",r[3]),K(l,"object-contain",r[5]),K(l,"object-center",r[5]),d(e,"class","grid grid-flow-col justify-center items-center")},m(a,o){w(a,e,o),L(e,l),L(e,i),s&&s.m(e,null)},p(a,o){o&512&&!le(l.src,t=a[9])&&d(l,"src",t),o&128&&d(l,"class",a[7]),o&3&&n!==(n=a[0]||a[1]||"")&&d(l,"alt",n),o&144&&K(l,"rounded-md",a[4]),o&136&&K(l,"shadow-lg",a[3]),o&132&&K(l,"blur-md",a[2]),o&136&&K(l,"shadow-md",a[3]),o&160&&K(l,"object-contain",a[5]),o&160&&K(l,"object-center",a[5]),a[8]?s?s.p(a,o):(s=Fe(a),s.c(),s.m(e,null)):s&&(s.d(1),s=null)},d(a){a&&m(e),s&&s.d()}}}function Fe(r){let e,l;return{c(){e=y("figcaption"),l=ee(r[8])},l(t){e=C(t,"FIGCAPTION",{});var n=M(e);l=te(n,r[8]),n.forEach(m)},m(t,n){w(t,e,n),L(e,l)},p(t,n){n&256&&se(l,t[8])},d(t){t&&m(e)}}}function jn(r){let e,l,t,n;const i=[zn,Mn],s=[];function a(o,c){return o[9]?0:1}return e=a(r),l=s[e]=i[e](r),{c(){l.c(),t=W()},l(o){l.l(o),t=W()},m(o,c){s[e].m(o,c),w(o,t,c),n=!0},p(o,[c]){let f=e;e=a(o),e===f?s[e].p(o,c):(F(),b(s[f],1,1,()=>{s[f]=null}),U(),l=s[e],l?l.p(o,c):(l=s[e]=i[e](o),l.c()),g(l,1),l.m(t.parentNode,t))},i(o){n||(g(l),n=!0)},o(o){b(l),n=!1},d(o){o&&m(t),s[e].d(o)}}}function Bn(r,e,l){let t,n;De(r,Te,p=>l(12,n=p));let{imgSrc:i=""}=e,{imgSrcDark:s=""}=e,{imgAlt:a=""}=e,{title:o=""}=e,{blur:c=!1}=e,{shadow:f=!1}=e,{rounded:u=!0}=e,{contain:h=!1}=e,{figure:_=!0}=e,{classes:v=""}=e,{caption:k=""}=e;return r.$$set=p=>{"imgSrc"in p&&l(10,i=p.imgSrc),"imgSrcDark"in p&&l(11,s=p.imgSrcDark),"imgAlt"in p&&l(0,a=p.imgAlt),"title"in p&&l(1,o=p.title),"blur"in p&&l(2,c=p.blur),"shadow"in p&&l(3,f=p.shadow),"rounded"in p&&l(4,u=p.rounded),"contain"in p&&l(5,h=p.contain),"figure"in p&&l(6,_=p.figure),"classes"in p&&l(7,v=p.classes),"caption"in p&&l(8,k=p.caption)},r.$$.update=()=>{r.$$.dirty&7168&&l(9,t=n==="dark"&&s?s:i)},[a,o,c,f,u,h,_,v,k,t,i,s,n]}class ge extends Y{constructor(e){super(),J(this,e,Bn,jn,X,{imgSrc:10,imgSrcDark:11,imgAlt:0,title:1,blur:2,shadow:3,rounded:4,contain:5,figure:6,classes:7,caption:8})}}function An(r){let e,l;return e=new ge({props:{figure:!1,imgSrc:r[1].imgSrc,imgSrcDark:r[1].imgSrcDark,contain:!0,classes:r[2]}}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p(t,n){const i={};n&2&&(i.imgSrc=t[1].imgSrc),n&2&&(i.imgSrcDark=t[1].imgSrcDark),n&4&&(i.classes=t[2]),e.$set(i)},i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function Gn(r){let e,l;return e=new Vn({props:{icon:r[1].icon,size:"48"}}),{c(){j(e.$$.fragment)},l(t){R(e.$$.fragment,t)},m(t,n){B(e,t,n),l=!0},p(t,n){const i={};n&2&&(i.icon=t[1].icon),e.$set(i)},i(t){l||(g(e.$$.fragment,t),l=!0)},o(t){b(e.$$.fragment,t),l=!1},d(t){A(e,t)}}}function Ue(r){let e,l=r[1].title+"",t;return{c(){e=y("h2"),t=ee(l),this.h()},l(n){e=C(n,"H2",{class:!0});var i=M(e);t=te(i,l),i.forEach(m),this.h()},h(){d(e,"class","text-3xl mt-4")},m(n,i){w(n,e,i),L(e,t)},p(n,i){i&2&&l!==(l=n[1].title+"")&&se(t,l)},d(n){n&&m(e)}}}function We(r){let e,l,t=r[1].content+"";return{c(){e=y("p"),l=new Ct(!1),this.h()},l(n){e=C(n,"P",{class:!0});var i=M(e);l=St(i,!1),i.forEach(m),this.h()},h(){l.a=null,d(e,"class","text-neutral-500 text-lg")},m(n,i){w(n,e,i),l.m(t,e)},p(n,i){i&2&&t!==(t=n[1].content+"")&&l.p(t)},d(n){n&&m(e)}}}function On(r){let e,l,t,n,i,s,a;const o=[Gn,An],c=[];function f(_,v){return _[1].icon?0:_[1].imgSrc?1:-1}~(l=f(r))&&(t=c[l]=o[l](r));let u=r[1].title&&Ue(r),h=r[1].content&&We(r);return{c(){e=y("div"),t&&t.c(),n=G(),u&&u.c(),i=G(),h&&h.c(),this.h()},l(_){e=C(_,"DIV",{class:!0});var v=M(e);t&&t.l(v),n=O(v),u&&u.l(v),i=O(v),h&&h.l(v),v.forEach(m),this.h()},h(){d(e,"class",s="text-red-berry-900 dark:text-neutral-300 flex flex-col items-center justify-center text-center "+r[0])},m(_,v){w(_,e,v),~l&&c[l].m(e,null),L(e,n),u&&u.m(e,null),L(e,i),h&&h.m(e,null),a=!0},p(_,[v]){let k=l;l=f(_),l===k?~l&&c[l].p(_,v):(t&&(F(),b(c[k],1,1,()=>{c[k]=null}),U()),~l?(t=c[l],t?t.p(_,v):(t=c[l]=o[l](_),t.c()),g(t,1),t.m(e,n)):t=null),_[1].title?u?u.p(_,v):(u=Ue(_),u.c(),u.m(e,i)):u&&(u.d(1),u=null),_[1].content?h?h.p(_,v):(h=We(_),h.c(),h.m(e,null)):h&&(h.d(1),h=null),(!a||v&1&&s!==(s="text-red-berry-900 dark:text-neutral-300 flex flex-col items-center justify-center text-center "+_[0]))&&d(e,"class",s)},i(_){a||(g(t),a=!0)},o(_){b(t),a=!1},d(_){_&&m(e),~l&&c[l].d(),u&&u.d(),h&&h.d()}}}function Rn(r,e,l){let{aspect:t=""}=e,{innerColumn:n}=e,{classes:i=""}=e;return r.$$set=s=>{"aspect"in s&&l(0,t=s.aspect),"innerColumn"in s&&l(1,n=s.innerColumn),"classes"in s&&l(2,i=s.classes)},[t,n,i]}class Dt extends Y{constructor(e){super(),J(this,e,Rn,On,X,{aspect:0,innerColumn:1,classes:2})}}function Xe(r,e,l){const t=r.slice();return t[7]=e[l],t}function Ye(r){let e,l=r[7].title+"",t,n,i,s;function a(){return r[6](r[7])}return{c(){e=y("button"),t=ee(l),n=G(),this.h()},l(o){e=C(o,"BUTTON",{class:!0});var c=M(e);t=te(c,l),n=O(c),c.forEach(m),this.h()},h(){d(e,"class","pb-2 border-b-2 border-neutral-500 text-gray-500 text-xs sm:text-sm lg:text-base font-light svelte-44uyyz"),K(e,"selected",r[1]===r[7])},m(o,c){w(o,e,c),L(e,t),L(e,n),i||(s=Q(e,"click",a),i=!0)},p(o,c){r=o,c&1&&l!==(l=r[7].title+"")&&se(t,l),c&3&&K(e,"selected",r[1]===r[7])},d(o){o&&m(e),i=!1,s()}}}function qn(r){let e=r[4],l,t,n=Qe(r);return{c(){n.c(),l=W()},l(i){n.l(i),l=W()},m(i,s){n.m(i,s),w(i,l,s),t=!0},p(i,s){s&16&&X(e,e=i[4])?(F(),b(n,1,1,I),U(),n=Qe(i),n.c(),g(n,1),n.m(l.parentNode,l)):n.p(i,s)},i(i){t||(g(n),t=!0)},o(i){b(n),t=!1},d(i){i&&m(l),n.d(i)}}}function Fn(r){let e,l='
    ',t,n,i;return{c(){e=y("div"),e.innerHTML=l,this.h()},l(s){e=C(s,"DIV",{class:!0,"data-svelte-h":!0}),Z(e)!=="svelte-1sa5uzo"&&(e.innerHTML=l),this.h()},h(){d(e,"class","skeleton-loader svelte-44uyyz")},m(s,a){w(s,e,a),i=!0},p:I,i(s){i||(s&&he(()=>{i&&(n&&n.end(1),t=ye(e,we,{duration:200}),t.start())}),i=!0)},o(s){t&&t.invalidate(),s&&(n=Zt(e,we,{duration:200})),i=!1},d(s){s&&m(e),s&&n&&n.end()}}}function Un(r){let e,l,t,n;var i=r[1].content;function s(a,o){return{}}return i&&(l=oe(i,s())),{c(){e=y("div"),l&&j(l.$$.fragment)},l(a){e=C(a,"DIV",{});var o=M(e);l&&R(l.$$.fragment,o),o.forEach(m)},m(a,o){w(a,e,o),l&&B(l,e,null),n=!0},p(a,o){if(o&2&&i!==(i=a[1].content)){if(l){F();const c=l;b(c.$$.fragment,1,0,()=>{A(c,1)}),U()}i?(l=oe(i,s()),j(l.$$.fragment),g(l.$$.fragment,1),B(l,e,null)):l=null}},i(a){n||(l&&g(l.$$.fragment,a),a&&(t||he(()=>{t=ye(e,we,{duration:200}),t.start()})),n=!0)},o(a){l&&b(l.$$.fragment,a),n=!1},d(a){a&&m(e),l&&A(l)}}}function Wn(r){let e,l,t,n=r[2]&&Je(r);return{c(){e=y("div"),n&&n.c()},l(i){e=C(i,"DIV",{});var s=M(e);n&&n.l(s),s.forEach(m)},m(i,s){w(i,e,s),n&&n.m(e,null),t=!0},p(i,s){i[2]?n?(n.p(i,s),s&4&&g(n,1)):(n=Je(i),n.c(),g(n,1),n.m(e,null)):n&&(F(),b(n,1,1,()=>{n=null}),U())},i(i){t||(g(n),i&&(l||he(()=>{l=ye(e,we,{duration:200}),l.start()})),t=!0)},o(i){b(n),t=!1},d(i){i&&m(e),n&&n.d()}}}function Je(r){let e,l,t,n;var i=r[2];function s(o,c){return{props:{videoSources:o[1].content.videoSources,videoPoster:o[1].content.videoPoster,info:!1}}}i&&(e=oe(i,s(r)));let a=r[1].content.videoCaption&&Ke(r);return{c(){e&&j(e.$$.fragment),l=G(),a&&a.c(),t=W()},l(o){e&&R(e.$$.fragment,o),l=O(o),a&&a.l(o),t=W()},m(o,c){e&&B(e,o,c),w(o,l,c),a&&a.m(o,c),w(o,t,c),n=!0},p(o,c){if(c&4&&i!==(i=o[2])){if(e){F();const f=e;b(f.$$.fragment,1,0,()=>{A(f,1)}),U()}i?(e=oe(i,s(o)),j(e.$$.fragment),g(e.$$.fragment,1),B(e,l.parentNode,l)):e=null}else if(i){const f={};c&2&&(f.videoSources=o[1].content.videoSources),c&2&&(f.videoPoster=o[1].content.videoPoster),e.$set(f)}o[1].content.videoCaption?a?a.p(o,c):(a=Ke(o),a.c(),a.m(t.parentNode,t)):a&&(a.d(1),a=null)},i(o){n||(e&&g(e.$$.fragment,o),n=!0)},o(o){e&&b(e.$$.fragment,o),n=!1},d(o){o&&(m(l),m(t)),e&&A(e,o),a&&a.d(o)}}}function Ke(r){let e,l=r[1].content.videoCaption+"",t;return{c(){e=y("p"),t=ee(l),this.h()},l(n){e=C(n,"P",{class:!0});var i=M(e);t=te(i,l),i.forEach(m),this.h()},h(){d(e,"class","text-gray-700 dark:text-neutral-300 text-[0.95rem] mt-3 text-center")},m(n,i){w(n,e,i),L(e,t)},p(n,i){i&2&&l!==(l=n[1].content.videoCaption+"")&&se(t,l)},d(n){n&&m(e)}}}function Qe(r){let e,l,t,n;const i=[Wn,Un],s=[];function a(o,c){return o[1].isVideo===!0?0:1}return e=a(r),l=s[e]=i[e](r),{c(){l.c(),t=W()},l(o){l.l(o),t=W()},m(o,c){s[e].m(o,c),w(o,t,c),n=!0},p(o,c){let f=e;e=a(o),e===f?s[e].p(o,c):(F(),b(s[f],1,1,()=>{s[f]=null}),U(),l=s[e],l?l.p(o,c):(l=s[e]=i[e](o),l.c()),g(l,1),l.m(t.parentNode,t))},i(o){n||(g(l),n=!0)},o(o){b(l),n=!1},d(o){o&&m(t),s[e].d(o)}}}function Xn(r){let e,l,t,n,i,s,a=ne(r[0]),o=[];for(let h=0;h{f[v]=null}),U(),i=f[n],i?i.p(h,_):(i=f[n]=c[n](h),i.c()),g(i,1),i.m(t,null))},i(h){s||(g(i),s=!0)},o(h){b(i),s=!1},d(h){h&&(m(e),m(l),m(t)),_e(o,h),f[n].d()}}}function Yn(r,e,l){let t,{tabs:n=[]}=e,i=n[0],s,a=!0;ae(async()=>{const f=await il(()=>Promise.resolve().then(()=>$n),void 0,import.meta.url);l(2,s=f.default),n.forEach(u=>{u.isVideo&&u.content.videoSources&&u.content.videoSources.forEach(h=>{const _=document.createElement("link");_.rel="preload",_.as="video",_.href=h.src,document.head.appendChild(_)})}),l(3,a=!1)});function o(f){l(3,a=!0),l(1,i=f),setTimeout(()=>{l(3,a=!1)},200)}const c=f=>o(f);return r.$$set=f=>{"tabs"in f&&l(0,n=f.tabs)},r.$$.update=()=>{r.$$.dirty&2&&l(4,t=i.isVideo?JSON.stringify(i.content):i.content)},[n,i,s,a,t,o,c]}class Jn extends Y{constructor(e){super(),J(this,e,Yn,Xn,X,{tabs:0})}}const{isNaN:Kn}=tl;function Ze(r,e,l){const t=r.slice();return t[24]=e[l],t}function xe(r){let e,l,t=!1,n,i=!0,s,a,o,c,f,u,h,_,v,k=ne(r[0]),p=[];for(let E=0;Er[18].call(l)),d(o,"class","p-4"),d(a,"class","controls svelte-1avzpyw"),ie(a,"opacity",r[7]&&r[8]?1:0),d(e,"class","video-container relative")},m(E,S){w(E,e,S),L(e,l);for(let H=0;H0&&xe(r);return{c(){t&&t.c(),e=W()},l(n){t&&t.l(n),e=W()},m(n,i){t&&t.m(n,i),w(n,e,i),l=!0},p(n,[i]){n[0].length>0?t?(t.p(n,i),i&1&&g(t,1)):(t=xe(n),t.c(),g(t,1),t.m(e.parentNode,e)):t&&(F(),b(t,1,1,()=>{t=null}),U())},i(n){l||(g(t),l=!0)},o(n){b(t),l=!1},d(n){n&&m(e),t&&t.d(n)}}}let Zn=!1;function xn(r,e,l){let{videoSources:t=[]}=e,{videoPoster:n=""}=e,{progress:i=!0}=e,{info:s=!0}=e,a=0,o=!1,c=!0,f,u=!1,h,_,v,k;const p=N=>{const[re]=N;re.isIntersecting?_&&c&&!o&&_.play():_&&!c&&_.pause()};function V(N){if(l(8,u=!0),c||(clearTimeout(h),l(14,h=setTimeout(()=>l(8,u=!1),2e3))),!f||N.type!=="touchmove"&&!(N.buttons&1))return;const re=N.type==="touchmove"?N.touches[0].clientX:N.clientX,{left:ce,right:pe}=this.getBoundingClientRect();l(5,a=f*(re-ce)/(pe-ce))}const z=N=>{k=new Date},T=N=>{new Date-k<300&&(c?(N.target.play(),l(4,o=!1)):(N.target.pause(),l(4,o=!0)))},E=N=>{if(isNaN(N))return"...";const re=Math.floor(N/60);return N=Math.floor(N%60),N<10&&(N="0"+N),`${re}:${N}`};ae(()=>{v=new IntersectionObserver(p,{root:null,rootMargin:"0px",threshold:.5}),_&&v.observe(_)}),Qt(()=>{v&&v.disconnect()});function S(N){ke[N?"unshift":"push"](()=>{_=N,l(9,_)})}const H=()=>{l(4,o=!1)};function P(){a=this.currentTime,l(5,a)}function q(){f=this.duration,l(7,f)}function x(){c=this.paused,l(6,c)}const $=()=>{l(6,c=!c),l(4,o=c),l(8,u=!0)};return r.$$set=N=>{"videoSources"in N&&l(0,t=N.videoSources),"videoPoster"in N&&l(1,n=N.videoPoster),"progress"in N&&l(2,i=N.progress),"info"in N&&l(3,s=N.info)},r.$$.update=()=>{r.$$.dirty&16400&&o&&(l(8,u=!0),clearTimeout(h))},[t,n,i,s,o,a,c,f,u,_,V,z,T,E,h,S,H,P,q,x,$]}class Pt extends Y{constructor(e){super(),J(this,e,xn,Qn,X,{videoSources:0,videoPoster:1,progress:2,info:3})}}const $n=Object.freeze(Object.defineProperty({__proto__:null,default:Pt},Symbol.toStringTag,{value:"Module"})),ei=r=>({}),nt=r=>({});function it(r,e,l){const t=r.slice();return t[32]=e[l],t}function rt(r,e,l){const t=r.slice();return t[35]=e[l],t}function st(r){let e,l,t;return{c(){e=y("h1"),l=new Ct(!1),this.h()},l(n){e=C(n,"H1",{class:!0});var i=M(e);l=St(i,!1),i.forEach(m),this.h()},h(){l.a=null,d(e,"class",t=`text-4xl font-semibold tracking-tight max-w-2xl px-8 mx-auto text-center text-red-berry-900 dark:text-neutral-400 diff --git a/_app/immutable/nodes/20.9p-hBudx.js b/_app/immutable/nodes/20.9p-hBudx.js new file mode 100644 index 0000000..433921e --- /dev/null +++ b/_app/immutable/nodes/20.9p-hBudx.js @@ -0,0 +1 @@ +import{U as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/20.C176ImR1.js b/_app/immutable/nodes/20.C176ImR1.js deleted file mode 100644 index 4912799..0000000 --- a/_app/immutable/nodes/20.C176ImR1.js +++ /dev/null @@ -1 +0,0 @@ -import{U as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/21.0NXIf5JO.js b/_app/immutable/nodes/21.0NXIf5JO.js deleted file mode 100644 index 63a4ef5..0000000 --- a/_app/immutable/nodes/21.0NXIf5JO.js +++ /dev/null @@ -1 +0,0 @@ -import{V as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/21.kaO0DXVq.js b/_app/immutable/nodes/21.kaO0DXVq.js new file mode 100644 index 0000000..4613523 --- /dev/null +++ b/_app/immutable/nodes/21.kaO0DXVq.js @@ -0,0 +1 @@ +import{V as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/22.B1ap9X7o.js b/_app/immutable/nodes/22.B1ap9X7o.js new file mode 100644 index 0000000..1bf6c98 --- /dev/null +++ b/_app/immutable/nodes/22.B1ap9X7o.js @@ -0,0 +1 @@ +import{W as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/22.BpY3VGvo.js b/_app/immutable/nodes/22.BpY3VGvo.js deleted file mode 100644 index 2dac662..0000000 --- a/_app/immutable/nodes/22.BpY3VGvo.js +++ /dev/null @@ -1 +0,0 @@ -import{W as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/23.DWuDqIAb.js b/_app/immutable/nodes/23.DWuDqIAb.js new file mode 100644 index 0000000..f8e5afa --- /dev/null +++ b/_app/immutable/nodes/23.DWuDqIAb.js @@ -0,0 +1 @@ +import{X as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/23.oi5a04Gm.js b/_app/immutable/nodes/23.oi5a04Gm.js deleted file mode 100644 index 678f7b6..0000000 --- a/_app/immutable/nodes/23.oi5a04Gm.js +++ /dev/null @@ -1 +0,0 @@ -import{X as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/24.8Fmjw8b3.js b/_app/immutable/nodes/24.8Fmjw8b3.js deleted file mode 100644 index d4f365f..0000000 --- a/_app/immutable/nodes/24.8Fmjw8b3.js +++ /dev/null @@ -1 +0,0 @@ -import{Y as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/24.Bevl404O.js b/_app/immutable/nodes/24.Bevl404O.js new file mode 100644 index 0000000..d9b56c7 --- /dev/null +++ b/_app/immutable/nodes/24.Bevl404O.js @@ -0,0 +1 @@ +import{Y as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/25.BUOA8RmW.js b/_app/immutable/nodes/25.BUOA8RmW.js new file mode 100644 index 0000000..e569e61 --- /dev/null +++ b/_app/immutable/nodes/25.BUOA8RmW.js @@ -0,0 +1 @@ +import{Z as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/25.Bk3GWU5c.js b/_app/immutable/nodes/25.Bk3GWU5c.js deleted file mode 100644 index d3678c9..0000000 --- a/_app/immutable/nodes/25.Bk3GWU5c.js +++ /dev/null @@ -1 +0,0 @@ -import{Z as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/26.DCCBDnFV.js b/_app/immutable/nodes/26.DCCBDnFV.js deleted file mode 100644 index 9ad573d..0000000 --- a/_app/immutable/nodes/26.DCCBDnFV.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/26.DlcnYkeB.js b/_app/immutable/nodes/26.DlcnYkeB.js new file mode 100644 index 0000000..d70ebb0 --- /dev/null +++ b/_app/immutable/nodes/26.DlcnYkeB.js @@ -0,0 +1 @@ +import{_ as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/27.BuDjkUqs.js b/_app/immutable/nodes/27.BuDjkUqs.js new file mode 100644 index 0000000..1f47eab --- /dev/null +++ b/_app/immutable/nodes/27.BuDjkUqs.js @@ -0,0 +1 @@ +import{$ as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/27.DzqyIc_W.js b/_app/immutable/nodes/27.DzqyIc_W.js deleted file mode 100644 index 3489788..0000000 --- a/_app/immutable/nodes/27.DzqyIc_W.js +++ /dev/null @@ -1 +0,0 @@ -import{$ as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/28.2FF5OsbW.js b/_app/immutable/nodes/28.2FF5OsbW.js new file mode 100644 index 0000000..73af1ca --- /dev/null +++ b/_app/immutable/nodes/28.2FF5OsbW.js @@ -0,0 +1 @@ +import{a0 as e}from"../chunks/32.L6pbTd52.js";export{e as component}; diff --git a/_app/immutable/nodes/28.CVpMfAo_.js b/_app/immutable/nodes/28.CVpMfAo_.js deleted file mode 100644 index 8fb2555..0000000 --- a/_app/immutable/nodes/28.CVpMfAo_.js +++ /dev/null @@ -1 +0,0 @@ -import{a0 as e}from"../chunks/31.DSOxMhdt.js";export{e as component}; diff --git a/_app/immutable/nodes/29.B4sKOZ9y.js b/_app/immutable/nodes/29.B4sKOZ9y.js new file mode 100644 index 0000000..098cde5 --- /dev/null +++ b/_app/immutable/nodes/29.B4sKOZ9y.js @@ -0,0 +1 @@ +import{a1 as e}from"../chunks/32.L6pbTd52.js";export{e as component}; diff --git a/_app/immutable/nodes/29.Ck8I_72p.js b/_app/immutable/nodes/29.Ck8I_72p.js deleted file mode 100644 index 12fb9b7..0000000 --- a/_app/immutable/nodes/29.Ck8I_72p.js +++ /dev/null @@ -1 +0,0 @@ -import{a1 as e}from"../chunks/31.DSOxMhdt.js";export{e as component}; diff --git a/_app/immutable/nodes/3.BXkYFKP0.js b/_app/immutable/nodes/3.B6GkCI7p.js similarity index 99% rename from _app/immutable/nodes/3.BXkYFKP0.js rename to _app/immutable/nodes/3.B6GkCI7p.js index 50a6d5a..61e9465 100644 --- a/_app/immutable/nodes/3.BXkYFKP0.js +++ b/_app/immutable/nodes/3.B6GkCI7p.js @@ -1,4 +1,4 @@ -import{s as Me,h as Xe,E as xt,k as Ct,c as kt,n as W}from"../chunks/scheduler.DK_yUdRf.js";import{S as ze,i as Fe,e as T,s as I,c as L,a as S,d as C,f as M,y as E,D as g,g as D,h as $,n as k,k as be,l as A,m as we,t as ce,b as fe,j as Ne,u as j,v as U,w as X,x as Y,A as Ce,z as Et,H as ft,q as ut}from"../chunks/index.BH5W4qoH.js";import{p as At}from"../chunks/stores.BM3ezKuT.js";import{h as Ye,M as $t,m as Tt,t as Lt,d as Rt,k as St,c as Dt,e as Ot}from"../chunks/31.DSOxMhdt.js";import{L as $e}from"../chunks/Loader.BLQl2yzu.js";import{I as Pt}from"../chunks/Icon.Bx2gT0jJ.js";import{BsInfoCircle as It}from"../chunks/index.D7Jwt5yH.js";const Mt="https://api.github.com/repos/spyder-ide/spyder/contributors?per_page=100",qe=[{id:365293,name:"Carlos Córdoba",role:"Lead mantainer",tooltip:[{list:["Lead maintainer since 2013"]}]},{id:16781833,name:"Daniel Althviz",role:"Co-mantainer",tooltip:[{list:["Release manager","Maintainer of QtPy and QtAwesome","Manager of NumFOCUS small development grants"]}]},{id:17051931,name:"C.A.M. Gerlach",role:"Core developer",avatar_url:"/assets/authors/camgerlach/pic.webp",tooltip:[{list:["Docs maintainer","Technical, grant and blog writer","Outreach lead"]}]},{id:6740194,name:"Quentin Peter",role:"Core developer",tooltip:[{list:["Re-architectured communications between Spyder and Spyder-Kernels","Creator of the Debugger pane","Many improvements to the IPython console"]}]},{id:9618975,name:"Ryan Clary",role:"Core developer",tooltip:[{list:["Maintainer of the standalone installers"]}]},{id:7941918,name:"Jitse Niesen",role:"Core developer",tooltip:[{list:["External plugins maintainer"]}]},{id:42411448,name:"Juan Sebastian Bautista",role:"Junior developer",tooltip:[{list:["Improvements to the Windows installer, QtConsole and Spyder's UI/UX"]}]},{id:5204788,name:"Hendrik D. Louzada",role:"Junior developer",tooltip:[{list:["Developed backend for the remote client plugin"]}]},{id:5027583,name:"Andrés Montoya",role:"Graphic and web designer",tooltip:[{list:["Developer and maintainer of this website","UI/UX improvements","Social media graphics designer"]}]}],zt=[{id:1311787,name:"Pierre Raybaut",role:"Spyder Creator",tooltip:[{list:["Created Spyder in 2009","Lead maintainer until 2013"]}]},{id:1878982,name:"Edgar Margffoy",role:"Core developer",tooltip:[{list:["LSP support for the entire application","Re-architectured plugin registration and interactions","New architecture for the Run plugin","Add global registries for actions, menus and toolbars"]}]},{id:50221806,name:"Isabela Presedo-Floyd",role:"Designer",tooltip:[{list:["New color system and palette for the application","Logo redesign","Many UI/UX improvements"]}]},{id:3627835,name:"Gonzalo Peña-Castellanos",role:"Core developer",tooltip:[{list:["Redesigned the plugins API","Creator of QtPy","Improved configuration system and added tests for it","Many improvements to the Editor"]}]},{id:18587879,name:"Juanita Gómez",role:"Core developer",tooltip:[{list:["Docs writer","Main content creator for Spyder's YouTube channel","Community manager"]}]},{id:10170372,name:"Jean-Sébastien Gosselin",role:"Core developer",tooltip:[{list:["Creator of the Plots plane","Many improvements across the entire application"]}]},{id:20992645,name:"Stephannie Jimenez",role:"Core developer",tooltip:[{list:["Spyder-Terminal maintainer","New architecture for the Run plugin","Enhancements to the icon manager"]}]},{id:2397974,name:"Sylvain Corlay",role:"Core developer",tooltip:[{list:["New icon theme for Spyder","Creator of QtAwesome"]}]},{id:2024217,name:"Rafael Laverde",role:"Core developer",tooltip:[{list:["Improvements to the Editor"]}]},{id:10513354,name:"Brian Olsen",role:"Core developer",tooltip:[{list:["Improvements to the IPython console"]}]},{id:2096628,name:"Steve Silvester",role:"Core developer",tooltip:[{list:["Code completion, keybindings and file opening improvements"]}]}],Ft={pageTitle:"Who We Are",pageIntro:`Spyder is an open source, community-developed scientific environment and IDE written in Python, for Python. +import{s as Me,h as Xe,E as xt,k as Ct,c as kt,n as W}from"../chunks/scheduler.DK_yUdRf.js";import{S as ze,i as Fe,e as T,s as I,c as L,a as S,d as C,f as M,y as E,D as g,g as D,h as $,n as k,k as be,l as A,m as we,t as ce,b as fe,j as Ne,u as j,v as U,w as X,x as Y,A as Ce,z as Et,H as ft,q as ut}from"../chunks/index.BH5W4qoH.js";import{p as At}from"../chunks/stores.BhPy-k-g.js";import{h as Ye,M as $t,m as Tt,t as Lt,d as Rt,k as St,c as Dt,e as Ot}from"../chunks/32.L6pbTd52.js";import{L as $e}from"../chunks/Loader.BLQl2yzu.js";import{I as Pt}from"../chunks/Icon.vbkowJrT.js";import{BsInfoCircle as It}from"../chunks/index.D7Jwt5yH.js";const Mt="https://api.github.com/repos/spyder-ide/spyder/contributors?per_page=100",qe=[{id:365293,name:"Carlos Córdoba",role:"Lead mantainer",tooltip:[{list:["Lead maintainer since 2013"]}]},{id:16781833,name:"Daniel Althviz",role:"Co-mantainer",tooltip:[{list:["Release manager","Maintainer of QtPy and QtAwesome","Manager of NumFOCUS small development grants"]}]},{id:17051931,name:"C.A.M. Gerlach",role:"Core developer",avatar_url:"/assets/authors/camgerlach/pic.webp",tooltip:[{list:["Docs maintainer","Technical, grant and blog writer","Outreach lead"]}]},{id:6740194,name:"Quentin Peter",role:"Core developer",tooltip:[{list:["Re-architectured communications between Spyder and Spyder-Kernels","Creator of the Debugger pane","Many improvements to the IPython console"]}]},{id:9618975,name:"Ryan Clary",role:"Core developer",tooltip:[{list:["Maintainer of the standalone installers"]}]},{id:7941918,name:"Jitse Niesen",role:"Core developer",tooltip:[{list:["External plugins maintainer"]}]},{id:42411448,name:"Juan Sebastian Bautista",role:"Junior developer",tooltip:[{list:["Improvements to the Windows installer, QtConsole and Spyder's UI/UX"]}]},{id:5204788,name:"Hendrik D. Louzada",role:"Junior developer",tooltip:[{list:["Developed backend for the remote client plugin"]}]},{id:5027583,name:"Andrés Montoya",role:"Graphic and web designer",tooltip:[{list:["Developer and maintainer of this website","UI/UX improvements","Social media graphics designer"]}]}],zt=[{id:1311787,name:"Pierre Raybaut",role:"Spyder Creator",tooltip:[{list:["Created Spyder in 2009","Lead maintainer until 2013"]}]},{id:1878982,name:"Edgar Margffoy",role:"Core developer",tooltip:[{list:["LSP support for the entire application","Re-architectured plugin registration and interactions","New architecture for the Run plugin","Add global registries for actions, menus and toolbars"]}]},{id:50221806,name:"Isabela Presedo-Floyd",role:"Designer",tooltip:[{list:["New color system and palette for the application","Logo redesign","Many UI/UX improvements"]}]},{id:3627835,name:"Gonzalo Peña-Castellanos",role:"Core developer",tooltip:[{list:["Redesigned the plugins API","Creator of QtPy","Improved configuration system and added tests for it","Many improvements to the Editor"]}]},{id:18587879,name:"Juanita Gómez",role:"Core developer",tooltip:[{list:["Docs writer","Main content creator for Spyder's YouTube channel","Community manager"]}]},{id:10170372,name:"Jean-Sébastien Gosselin",role:"Core developer",tooltip:[{list:["Creator of the Plots plane","Many improvements across the entire application"]}]},{id:20992645,name:"Stephannie Jimenez",role:"Core developer",tooltip:[{list:["Spyder-Terminal maintainer","New architecture for the Run plugin","Enhancements to the icon manager"]}]},{id:2397974,name:"Sylvain Corlay",role:"Core developer",tooltip:[{list:["New icon theme for Spyder","Creator of QtAwesome"]}]},{id:2024217,name:"Rafael Laverde",role:"Core developer",tooltip:[{list:["Improvements to the Editor"]}]},{id:10513354,name:"Brian Olsen",role:"Core developer",tooltip:[{list:["Improvements to the IPython console"]}]},{id:2096628,name:"Steve Silvester",role:"Core developer",tooltip:[{list:["Code completion, keybindings and file opening improvements"]}]}],Ft={pageTitle:"Who We Are",pageIntro:`Spyder is an open source, community-developed scientific environment and IDE written in Python, for Python. As scientists, engineers and analysts just like you, we built it to combine the power of a comprehensive development tool with the speed of an interactive data exploration package, all in one easy-to-use interface.`,currentTitle:"Core team",pastTitle:"Past team members",remainingTitle:"Contributor community",remainingIntro:`Spyder is made possible by a collective of developers, testers, translators and donors, hailing from all around the globe! We exist by and for our worldwide community, and even the smallest contribution makes a world of different for us all.`,diversityTitle:"Diversity and Inclusion",diversityIntro:`We're proud of our highly diverse core devs contributors and user community, bringing numerous distinct backgrounds and perspectives to the table. diff --git a/_app/immutable/nodes/30.D3Q3e8xJ.js b/_app/immutable/nodes/30.D3Q3e8xJ.js new file mode 100644 index 0000000..90df9b6 --- /dev/null +++ b/_app/immutable/nodes/30.D3Q3e8xJ.js @@ -0,0 +1 @@ +import{a2 as e}from"../chunks/32.L6pbTd52.js";export{e as component}; diff --git a/_app/immutable/nodes/30.PBBgLjcP.js b/_app/immutable/nodes/30.PBBgLjcP.js deleted file mode 100644 index 70cf78f..0000000 --- a/_app/immutable/nodes/30.PBBgLjcP.js +++ /dev/null @@ -1 +0,0 @@ -import{a2 as e}from"../chunks/31.DSOxMhdt.js";export{e as component}; diff --git a/_app/immutable/nodes/31.D1ZR4qZO.js b/_app/immutable/nodes/31.D1ZR4qZO.js new file mode 100644 index 0000000..3bec458 --- /dev/null +++ b/_app/immutable/nodes/31.D1ZR4qZO.js @@ -0,0 +1 @@ +import{a3 as e}from"../chunks/32.L6pbTd52.js";export{e as component}; diff --git a/_app/immutable/nodes/31.fo6ymEmL.js b/_app/immutable/nodes/31.fo6ymEmL.js deleted file mode 100644 index 16edfd2..0000000 --- a/_app/immutable/nodes/31.fo6ymEmL.js +++ /dev/null @@ -1 +0,0 @@ -import{a3 as e}from"../chunks/31.DSOxMhdt.js";export{e as component}; diff --git a/_app/immutable/nodes/32.QosUc112.js b/_app/immutable/nodes/32.QosUc112.js new file mode 100644 index 0000000..9882923 --- /dev/null +++ b/_app/immutable/nodes/32.QosUc112.js @@ -0,0 +1 @@ +import{a4 as e}from"../chunks/32.L6pbTd52.js";export{e as component}; diff --git a/_app/immutable/nodes/32.DyScs9hf.js b/_app/immutable/nodes/33.7fZvnt0G.js similarity index 97% rename from _app/immutable/nodes/32.DyScs9hf.js rename to _app/immutable/nodes/33.7fZvnt0G.js index 315c6bb..022b7ef 100644 --- a/_app/immutable/nodes/32.DyScs9hf.js +++ b/_app/immutable/nodes/33.7fZvnt0G.js @@ -1 +1 @@ -import{s as se,c as ie,o as fe,n as oe}from"../chunks/scheduler.DK_yUdRf.js";import{S as ce,i as ue,u as N,s as V,e as O,v as U,f as L,c as j,a as B,d as p,y as H,w as q,g as S,h as R,l as v,m as T,n as w,x as z,k as A,z as ae,H as G,t as Y,q as F,b as Z,j as he}from"../chunks/index.BH5W4qoH.js";import{M as me,m as _e,t as pe,d as ge,k as de,c as be,e as ke,r as M,h as C,i as we}from"../chunks/31.DSOxMhdt.js";import{p as ve}from"../chunks/stores.BM3ezKuT.js";import{L as ye}from"../chunks/Loader.BLQl2yzu.js";import{B as J}from"../chunks/Button.ChCyQFAf.js";const Se='visit our releases page on GitHub.',xe={props:{title:"Download Spyder",subtitle:"If the download does not start automatically, please click the button below",alternative:"To download Spyder for the detected OS, please click the button below",download:{title:"Download Started...",alternative:`Alternatively, you can manually select the package you want from the buttons below, or ${Se}`}}};function De(){return xe}const Ae=Object.freeze(Object.defineProperty({__proto__:null,load:De},Symbol.toStringTag,{value:"Module"}));function ee(a,l,r){const t=a.slice();return t[16]=l[r],t}function te(a,l,r){const t=a.slice();return t[19]=l[r],t}function Ee(a){let l,r;return l=new ye({}),{c(){N(l.$$.fragment)},l(t){U(l.$$.fragment,t)},m(t,e){q(l,t,e),r=!0},p:oe,i(t){r||(w(l.$$.fragment,t),r=!0)},o(t){v(l.$$.fragment,t),r=!1},d(t){z(l,t)}}}function $e(a){let l,r,t=(a[1]?a[5].title:a[8])+"",e,i,n,s,o,h,b,c,u=(a[1]?a[7]:a[6])+"",m,g,y,I,$,x,_=a[5].alternative+"",d;const D=[je,Oe],E=[];function K(f,k){return f[0]!=="mac"?0:1}return g=K(a),y=E[g]=D[g](a),{c(){l=O("h1"),r=new G(!1),e=V(),i=O("h2"),n=O("span"),s=Y(a[2]),o=Y(" detected"),h=V(),b=O("p"),c=new G(!1),m=V(),y.c(),I=V(),$=O("p"),x=new G(!1),this.h()},l(f){l=j(f,"H1",{class:!0});var k=B(l);r=F(k,!1),k.forEach(p),e=L(f),i=j(f,"H2",{class:!0});var P=B(i);n=j(P,"SPAN",{class:!0});var Q=B(n);s=Z(Q,a[2]),Q.forEach(p),o=Z(P," detected"),P.forEach(p),h=L(f),b=j(f,"P",{class:!0});var W=B(b);c=F(W,!1),W.forEach(p),m=L(f),y.l(f),I=L(f),$=j(f,"P",{class:!0});var X=B($);x=F(X,!1),X.forEach(p),this.h()},h(){r.a=null,H(l,"class","text-4xl lg:tracking-tight lg:text-6xl text-center tracking-tight font-extralight text-mine-shaft-600 dark:text-mine-shaft-200 my-16 md:my-32"),H(n,"class","text-red-berry-900 dark:text-white font-extrabold"),H(i,"class","text-center dark:text-neutral-200 text-4xl font-extralight mb-8"),c.a=null,H(b,"class","text-center text-xl font-light"),x.a=null,H($,"class","text-center text-lg font-light mb-8")},m(f,k){S(f,l,k),r.m(t,l),S(f,e,k),S(f,i,k),R(i,n),R(n,s),R(i,o),S(f,h,k),S(f,b,k),c.m(u,b),S(f,m,k),E[g].m(f,k),S(f,I,k),S(f,$,k),x.m(_,$),d=!0},p(f,k){(!d||k&290)&&t!==(t=(f[1]?f[5].title:f[8])+"")&&r.p(t),(!d||k&4)&&he(s,f[2]),(!d||k&194)&&u!==(u=(f[1]?f[7]:f[6])+"")&&c.p(u);let P=g;g=K(f),g===P?E[g].p(f,k):(A(),v(E[P],1,1,()=>{E[P]=null}),T(),y=E[g],y?y.p(f,k):(y=E[g]=D[g](f),y.c()),w(y,1),y.m(I.parentNode,I)),(!d||k&32)&&_!==(_=f[5].alternative+"")&&x.p(_)},i(f){d||(w(y),d=!0)},o(f){v(y),d=!1},d(f){f&&(p(l),p(e),p(i),p(h),p(b),p(m),p(I),p($)),E[g].d(f)}}}function Oe(a){let l,r,t=C(a[9]),e=[];for(let n=0;nv(e[n],1,1,()=>{e[n]=null});return{c(){l=O("div");for(let n=0;nv(e[n],1,1,()=>{e[n]=null});return{c(){l=O("div");for(let n=0;n{h[g]=null}),T(),i=h[e],i?i.p(u,m):(i=h[e]=o[e](u),i.c()),w(i,1),i.m(t,n)),u[4]?c?(c.p(u,m),m&16&&w(c,1)):(c=re(u),c.c(),w(c,1),c.m(t,null)):c&&(A(),v(c,1,1,()=>{c=null}),T())},i(u){s||(w(l.$$.fragment,u),w(i),w(c),s=!0)},o(u){v(l.$$.fragment,u),v(i),v(c),s=!1},d(u){u&&(p(r),p(t)),z(l,u),h[e].d(),c&&c.d()}}}function He(a,l,r){let t,e,i,n,s;ie(a,ve,_=>r(12,s=_));let o,h="unknown",b="unknown",c="unknown",u=Object.entries(M.mac),m="",g=[],y=_=>{for(let d in _)for(let D in _[d])_[d][D]&&(r(2,c=_[d][D].name),r(3,m=_[d][D].link),g.push({highlight:!0,icon:d,text:c,href:m}));return g};const I=()=>{let _,d;const D=new URLSearchParams(window.location.search);return _=D.get("os"),d=D.get("arch"),!_||!d?!1:{os:_,arch:d}};let $=()=>{r(1,o=I()),o?(r(0,b=o.os),r(11,h=o.arch)):(r(0,b=we()),r(11,h="x64")),b!=="mac"&&M[b][h]&&(r(2,c=M[b][h].name),r(3,m=M[b][h].link)),m&&o&&(window.location=m)};fe(()=>{$(),r(4,g=y(M))});let{data:x}=l;return a.$$set=_=>{"data"in _&&r(10,x=_.data)},a.$$.update=()=>{var _,d,D,E;a.$$.dirty&4096&&_e.setMetadata({title:`${pe} | Download`,description:ge,keywords:de.join(", "),author:be,image:ke,url:s.url.href}),a.$$.dirty&2049&&r(2,c=((d=(_=M[b])==null?void 0:_[h])==null?void 0:d.name)??""),a.$$.dirty&2049&&r(3,m=((E=(D=M[b])==null?void 0:D[h])==null?void 0:E.link)??""),a.$$.dirty&1024&&r(8,t=x.props.title),a.$$.dirty&1024&&r(7,e=x.props.subtitle),a.$$.dirty&1024&&r(6,i=x.props.alternative),a.$$.dirty&1024&&r(5,n=x.props.download)},[b,o,c,m,g,n,i,e,t,u,x,h,s]}class Ne extends ce{constructor(l){super(),ue(this,l,He,Be,se,{data:10})}}export{Ne as component,Ae as universal}; +import{s as se,c as ie,o as fe,n as oe}from"../chunks/scheduler.DK_yUdRf.js";import{S as ce,i as ue,u as N,s as V,e as O,v as U,f as L,c as j,a as B,d as p,y as H,w as q,g as S,h as R,l as v,m as T,n as w,x as z,k as A,z as ae,H as G,t as Y,q as F,b as Z,j as he}from"../chunks/index.BH5W4qoH.js";import{M as me,m as _e,t as pe,d as ge,k as de,c as be,e as ke,r as M,h as C,i as we}from"../chunks/32.L6pbTd52.js";import{p as ve}from"../chunks/stores.BhPy-k-g.js";import{L as ye}from"../chunks/Loader.BLQl2yzu.js";import{B as J}from"../chunks/Button.fdVjvHGv.js";const Se='visit our releases page on GitHub.',xe={props:{title:"Download Spyder",subtitle:"If the download does not start automatically, please click the button below",alternative:"To download Spyder for the detected OS, please click the button below",download:{title:"Download Started...",alternative:`Alternatively, you can manually select the package you want from the buttons below, or ${Se}`}}};function De(){return xe}const Ae=Object.freeze(Object.defineProperty({__proto__:null,load:De},Symbol.toStringTag,{value:"Module"}));function ee(a,l,r){const t=a.slice();return t[16]=l[r],t}function te(a,l,r){const t=a.slice();return t[19]=l[r],t}function Ee(a){let l,r;return l=new ye({}),{c(){N(l.$$.fragment)},l(t){U(l.$$.fragment,t)},m(t,e){q(l,t,e),r=!0},p:oe,i(t){r||(w(l.$$.fragment,t),r=!0)},o(t){v(l.$$.fragment,t),r=!1},d(t){z(l,t)}}}function $e(a){let l,r,t=(a[1]?a[5].title:a[8])+"",e,i,n,s,o,h,b,c,u=(a[1]?a[7]:a[6])+"",m,g,y,I,$,x,_=a[5].alternative+"",d;const D=[je,Oe],E=[];function K(f,k){return f[0]!=="mac"?0:1}return g=K(a),y=E[g]=D[g](a),{c(){l=O("h1"),r=new G(!1),e=V(),i=O("h2"),n=O("span"),s=Y(a[2]),o=Y(" detected"),h=V(),b=O("p"),c=new G(!1),m=V(),y.c(),I=V(),$=O("p"),x=new G(!1),this.h()},l(f){l=j(f,"H1",{class:!0});var k=B(l);r=F(k,!1),k.forEach(p),e=L(f),i=j(f,"H2",{class:!0});var P=B(i);n=j(P,"SPAN",{class:!0});var Q=B(n);s=Z(Q,a[2]),Q.forEach(p),o=Z(P," detected"),P.forEach(p),h=L(f),b=j(f,"P",{class:!0});var W=B(b);c=F(W,!1),W.forEach(p),m=L(f),y.l(f),I=L(f),$=j(f,"P",{class:!0});var X=B($);x=F(X,!1),X.forEach(p),this.h()},h(){r.a=null,H(l,"class","text-4xl lg:tracking-tight lg:text-6xl text-center tracking-tight font-extralight text-mine-shaft-600 dark:text-mine-shaft-200 my-16 md:my-32"),H(n,"class","text-red-berry-900 dark:text-white font-extrabold"),H(i,"class","text-center dark:text-neutral-200 text-4xl font-extralight mb-8"),c.a=null,H(b,"class","text-center text-xl font-light"),x.a=null,H($,"class","text-center text-lg font-light mb-8")},m(f,k){S(f,l,k),r.m(t,l),S(f,e,k),S(f,i,k),R(i,n),R(n,s),R(i,o),S(f,h,k),S(f,b,k),c.m(u,b),S(f,m,k),E[g].m(f,k),S(f,I,k),S(f,$,k),x.m(_,$),d=!0},p(f,k){(!d||k&290)&&t!==(t=(f[1]?f[5].title:f[8])+"")&&r.p(t),(!d||k&4)&&he(s,f[2]),(!d||k&194)&&u!==(u=(f[1]?f[7]:f[6])+"")&&c.p(u);let P=g;g=K(f),g===P?E[g].p(f,k):(A(),v(E[P],1,1,()=>{E[P]=null}),T(),y=E[g],y?y.p(f,k):(y=E[g]=D[g](f),y.c()),w(y,1),y.m(I.parentNode,I)),(!d||k&32)&&_!==(_=f[5].alternative+"")&&x.p(_)},i(f){d||(w(y),d=!0)},o(f){v(y),d=!1},d(f){f&&(p(l),p(e),p(i),p(h),p(b),p(m),p(I),p($)),E[g].d(f)}}}function Oe(a){let l,r,t=C(a[9]),e=[];for(let n=0;nv(e[n],1,1,()=>{e[n]=null});return{c(){l=O("div");for(let n=0;nv(e[n],1,1,()=>{e[n]=null});return{c(){l=O("div");for(let n=0;n{h[g]=null}),T(),i=h[e],i?i.p(u,m):(i=h[e]=o[e](u),i.c()),w(i,1),i.m(t,n)),u[4]?c?(c.p(u,m),m&16&&w(c,1)):(c=re(u),c.c(),w(c,1),c.m(t,null)):c&&(A(),v(c,1,1,()=>{c=null}),T())},i(u){s||(w(l.$$.fragment,u),w(i),w(c),s=!0)},o(u){v(l.$$.fragment,u),v(i),v(c),s=!1},d(u){u&&(p(r),p(t)),z(l,u),h[e].d(),c&&c.d()}}}function He(a,l,r){let t,e,i,n,s;ie(a,ve,_=>r(12,s=_));let o,h="unknown",b="unknown",c="unknown",u=Object.entries(M.mac),m="",g=[],y=_=>{for(let d in _)for(let D in _[d])_[d][D]&&(r(2,c=_[d][D].name),r(3,m=_[d][D].link),g.push({highlight:!0,icon:d,text:c,href:m}));return g};const I=()=>{let _,d;const D=new URLSearchParams(window.location.search);return _=D.get("os"),d=D.get("arch"),!_||!d?!1:{os:_,arch:d}};let $=()=>{r(1,o=I()),o?(r(0,b=o.os),r(11,h=o.arch)):(r(0,b=we()),r(11,h="x64")),b!=="mac"&&M[b][h]&&(r(2,c=M[b][h].name),r(3,m=M[b][h].link)),m&&o&&(window.location=m)};fe(()=>{$(),r(4,g=y(M))});let{data:x}=l;return a.$$set=_=>{"data"in _&&r(10,x=_.data)},a.$$.update=()=>{var _,d,D,E;a.$$.dirty&4096&&_e.setMetadata({title:`${pe} | Download`,description:ge,keywords:de.join(", "),author:be,image:ke,url:s.url.href}),a.$$.dirty&2049&&r(2,c=((d=(_=M[b])==null?void 0:_[h])==null?void 0:d.name)??""),a.$$.dirty&2049&&r(3,m=((E=(D=M[b])==null?void 0:D[h])==null?void 0:E.link)??""),a.$$.dirty&1024&&r(8,t=x.props.title),a.$$.dirty&1024&&r(7,e=x.props.subtitle),a.$$.dirty&1024&&r(6,i=x.props.alternative),a.$$.dirty&1024&&r(5,n=x.props.download)},[b,o,c,m,g,n,i,e,t,u,x,h,s]}class Ne extends ce{constructor(l){super(),ue(this,l,He,Be,se,{data:10})}}export{Ne as component,Ae as universal}; diff --git a/_app/immutable/nodes/4.Cmp6lILt.js b/_app/immutable/nodes/4.CKLUs_MU.js similarity index 89% rename from _app/immutable/nodes/4.Cmp6lILt.js rename to _app/immutable/nodes/4.CKLUs_MU.js index 1aa3911..af8fb36 100644 --- a/_app/immutable/nodes/4.Cmp6lILt.js +++ b/_app/immutable/nodes/4.CKLUs_MU.js @@ -1 +1 @@ -import{m as p,t as m,b as g,a as l,k as u,c,s as f,o as d,f as _}from"../chunks/31.DSOxMhdt.js";import{s as b}from"../chunks/scheduler.DK_yUdRf.js";import{S as P,i as $,u as w,v as y,w as N,n as S,l as h,x as k}from"../chunks/index.BH5W4qoH.js";import{B as j}from"../chunks/Blog.CCBUvJ2X.js";const i=1,B=10;async function M(){p.setMetadata({title:`${m} | ${g}`,description:l,keywords:u.join(", "),author:c,url:f,image:d});const{posts:e,totalPages:a}=await _(i,B);return{props:{posts:e,pageNum:i,totalPages:a}}}const v=!0,I=Object.freeze(Object.defineProperty({__proto__:null,load:M,prerender:v},Symbol.toStringTag,{value:"Module"}));function z(e){let a,o;return a=new j({props:{data:e[0],pageNum:e[1],totalPages:e[2]}}),{c(){w(a.$$.fragment)},l(t){y(a.$$.fragment,t)},m(t,s){N(a,t,s),o=!0},p(t,[s]){const n={};s&1&&(n.data=t[0]),s&2&&(n.pageNum=t[1]),s&4&&(n.totalPages=t[2]),a.$set(n)},i(t){o||(S(a.$$.fragment,t),o=!0)},o(t){h(a.$$.fragment,t),o=!1},d(t){k(a,t)}}}function O(e,a,o){let{data:t}=a,s,n;return e.$$set=r=>{"data"in r&&o(0,t=r.data)},e.$$.update=()=>{e.$$.dirty&1&&o(1,s=t.props.pageNum),e.$$.dirty&1&&o(2,n=t.props.totalPages)},[t,s,n]}class U extends P{constructor(a){super(),$(this,a,O,z,b,{data:0})}}export{U as component,I as universal}; +import{m as p,t as m,b as g,a as l,k as u,c,s as f,o as d,f as _}from"../chunks/32.L6pbTd52.js";import{s as b}from"../chunks/scheduler.DK_yUdRf.js";import{S as P,i as $,u as w,v as y,w as N,n as S,l as h,x as k}from"../chunks/index.BH5W4qoH.js";import{B as j}from"../chunks/Blog.BORsW5Py.js";const i=1,B=10;async function M(){p.setMetadata({title:`${m} | ${g}`,description:l,keywords:u.join(", "),author:c,url:f,image:d});const{posts:e,totalPages:a}=await _(i,B);return{props:{posts:e,pageNum:i,totalPages:a}}}const v=!0,I=Object.freeze(Object.defineProperty({__proto__:null,load:M,prerender:v},Symbol.toStringTag,{value:"Module"}));function z(e){let a,o;return a=new j({props:{data:e[0],pageNum:e[1],totalPages:e[2]}}),{c(){w(a.$$.fragment)},l(t){y(a.$$.fragment,t)},m(t,s){N(a,t,s),o=!0},p(t,[s]){const n={};s&1&&(n.data=t[0]),s&2&&(n.pageNum=t[1]),s&4&&(n.totalPages=t[2]),a.$set(n)},i(t){o||(S(a.$$.fragment,t),o=!0)},o(t){h(a.$$.fragment,t),o=!1},d(t){k(a,t)}}}function O(e,a,o){let{data:t}=a,s,n;return e.$$set=r=>{"data"in r&&o(0,t=r.data)},e.$$.update=()=>{e.$$.dirty&1&&o(1,s=t.props.pageNum),e.$$.dirty&1&&o(2,n=t.props.totalPages)},[t,s,n]}class U extends P{constructor(a){super(),$(this,a,O,z,b,{data:0})}}export{U as component,I as universal}; diff --git a/_app/immutable/nodes/5.CPEhPCo4.js b/_app/immutable/nodes/5.CPEhPCo4.js deleted file mode 100644 index 23133a9..0000000 --- a/_app/immutable/nodes/5.CPEhPCo4.js +++ /dev/null @@ -1 +0,0 @@ -import{P as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/5.CqoVVDiu.js b/_app/immutable/nodes/5.CqoVVDiu.js new file mode 100644 index 0000000..db6523d --- /dev/null +++ b/_app/immutable/nodes/5.CqoVVDiu.js @@ -0,0 +1 @@ +import{P as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/6.BI8nFyYB.js b/_app/immutable/nodes/6.oAQjjzF1.js similarity index 90% rename from _app/immutable/nodes/6.BI8nFyYB.js rename to _app/immutable/nodes/6.oAQjjzF1.js index ea5d35f..212d42d 100644 --- a/_app/immutable/nodes/6.BI8nFyYB.js +++ b/_app/immutable/nodes/6.oAQjjzF1.js @@ -1 +1 @@ -import{m as g,t as m,b as l,a as u,k as c,c as f,s as d,o as _,f as p}from"../chunks/31.DSOxMhdt.js";import{s as P}from"../chunks/scheduler.DK_yUdRf.js";import{S as b,i as y,u as $,v as w,w as h,n as N,l as S,x as k}from"../chunks/index.BH5W4qoH.js";import{B as j}from"../chunks/Blog.CCBUvJ2X.js";let r=10;async function B({params:a}){g.setMetadata({title:`${m} | ${l}`,description:u,keywords:c.join(", "),author:f,url:d,image:_});const e=parseInt(a.page,r)||1,{posts:o,totalPages:t}=await p(e,r);return{props:{posts:o,pageNum:e,totalPages:t}}}async function M(){const{_:a,totalPages:e}=await p(1,r);return Array.from({length:e},(t,n)=>({page:`${n+1}`}))}const v=!0,C=Object.freeze(Object.defineProperty({__proto__:null,entries:M,load:B,prerender:v},Symbol.toStringTag,{value:"Module"}));function z(a){let e,o;return e=new j({props:{data:a[0],pageNum:a[1],totalPages:a[2]}}),{c(){$(e.$$.fragment)},l(t){w(e.$$.fragment,t)},m(t,n){h(e,t,n),o=!0},p(t,[n]){const s={};n&1&&(s.data=t[0]),n&2&&(s.pageNum=t[1]),n&4&&(s.totalPages=t[2]),e.$set(s)},i(t){o||(N(e.$$.fragment,t),o=!0)},o(t){S(e.$$.fragment,t),o=!1},d(t){k(e,t)}}}function I(a,e,o){let{data:t}=e,n,s;return a.$$set=i=>{"data"in i&&o(0,t=i.data)},a.$$.update=()=>{a.$$.dirty&1&&o(1,n=t.props.pageNum),a.$$.dirty&1&&o(2,s=t.props.totalPages)},[t,n,s]}class D extends b{constructor(e){super(),y(this,e,I,z,P,{data:0})}}export{D as component,C as universal}; +import{m as g,t as m,b as l,a as u,k as c,c as f,s as d,o as _,f as p}from"../chunks/32.L6pbTd52.js";import{s as P}from"../chunks/scheduler.DK_yUdRf.js";import{S as b,i as y,u as $,v as w,w as h,n as N,l as S,x as k}from"../chunks/index.BH5W4qoH.js";import{B as j}from"../chunks/Blog.BORsW5Py.js";let r=10;async function B({params:a}){g.setMetadata({title:`${m} | ${l}`,description:u,keywords:c.join(", "),author:f,url:d,image:_});const e=parseInt(a.page,r)||1,{posts:o,totalPages:t}=await p(e,r);return{props:{posts:o,pageNum:e,totalPages:t}}}async function M(){const{_:a,totalPages:e}=await p(1,r);return Array.from({length:e},(t,n)=>({page:`${n+1}`}))}const v=!0,C=Object.freeze(Object.defineProperty({__proto__:null,entries:M,load:B,prerender:v},Symbol.toStringTag,{value:"Module"}));function z(a){let e,o;return e=new j({props:{data:a[0],pageNum:a[1],totalPages:a[2]}}),{c(){$(e.$$.fragment)},l(t){w(e.$$.fragment,t)},m(t,n){h(e,t,n),o=!0},p(t,[n]){const s={};n&1&&(s.data=t[0]),n&2&&(s.pageNum=t[1]),n&4&&(s.totalPages=t[2]),e.$set(s)},i(t){o||(N(e.$$.fragment,t),o=!0)},o(t){S(e.$$.fragment,t),o=!1},d(t){k(e,t)}}}function I(a,e,o){let{data:t}=e,n,s;return a.$$set=i=>{"data"in i&&o(0,t=i.data)},a.$$.update=()=>{a.$$.dirty&1&&o(1,n=t.props.pageNum),a.$$.dirty&1&&o(2,s=t.props.totalPages)},[t,n,s]}class D extends b{constructor(e){super(),y(this,e,I,z,P,{data:0})}}export{D as component,C as universal}; diff --git a/_app/immutable/nodes/7.ByDDEXL7.js b/_app/immutable/nodes/7.ByDDEXL7.js deleted file mode 100644 index 59af012..0000000 --- a/_app/immutable/nodes/7.ByDDEXL7.js +++ /dev/null @@ -1 +0,0 @@ -import{F as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/7.WJiC7Xza.js b/_app/immutable/nodes/7.WJiC7Xza.js new file mode 100644 index 0000000..eab372a --- /dev/null +++ b/_app/immutable/nodes/7.WJiC7Xza.js @@ -0,0 +1 @@ +import{F as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/8.B-pLuKb2.js b/_app/immutable/nodes/8.B-pLuKb2.js new file mode 100644 index 0000000..38c4186 --- /dev/null +++ b/_app/immutable/nodes/8.B-pLuKb2.js @@ -0,0 +1 @@ +import{G as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/immutable/nodes/8.CIMUlBgX.js b/_app/immutable/nodes/8.CIMUlBgX.js deleted file mode 100644 index 9fe0608..0000000 --- a/_app/immutable/nodes/8.CIMUlBgX.js +++ /dev/null @@ -1 +0,0 @@ -import{G as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/9.BqYFX3cx.js b/_app/immutable/nodes/9.BqYFX3cx.js deleted file mode 100644 index 43a2d13..0000000 --- a/_app/immutable/nodes/9.BqYFX3cx.js +++ /dev/null @@ -1 +0,0 @@ -import{H as m}from"../chunks/31.DSOxMhdt.js";export{m as component}; diff --git a/_app/immutable/nodes/9.DYrl36TH.js b/_app/immutable/nodes/9.DYrl36TH.js new file mode 100644 index 0000000..9cf2bd5 --- /dev/null +++ b/_app/immutable/nodes/9.DYrl36TH.js @@ -0,0 +1 @@ +import{H as m}from"../chunks/32.L6pbTd52.js";export{m as component}; diff --git a/_app/version.json b/_app/version.json index 65869c9..bb201d8 100644 --- a/_app/version.json +++ b/_app/version.json @@ -1 +1 @@ -{"version":"1734127044258"} \ No newline at end of file +{"version":"1734142081191"} \ No newline at end of file diff --git a/about/index.html b/about/index.html index 574d341..4cc8f45 100644 --- a/about/index.html +++ b/about/index.html @@ -11,19 +11,19 @@ - - + + - + - - - - + + + + - - + + Spyder | Who We Are + + + + + + + + + + + + + + + + + + Spyder | Spyder 6 under the hood: Editor migration, remote dev QA, test overhaul and more! + + +

    Spyder 6 under the hood: Editor migration, remote dev QA, test overhaul and more!

    December 13, 2024

    Daniel Althviz is one of our longest-tenured Spyder developers, having started working on the project near the end of 2016. +Now eight years later, he’s the project’s co-maintainer and its our release manager, responsible for the many steps required to release Spyder across all our various platforms. +On top of that, he is also the lead maintainer of two of the most important libraries on which Spyder, and a lot of other scientific software, depends: the QtPy GUI abstraction layer and the QtAwesome icon font framework.

    In 2023, Spyder received a Chan Zuckerberg Initiative Essential Open Source Software for Science Cycle 5 grant, number 384 to support a new remote development architecture and features in Spyder and related development. +This has helped us fund Daniel’s work on many of his contributions to Spyder 6 connected to that!

    Thanks to all his experience and responsibilities, Daniel has put in a lot of work toward Spyder 6’s development. +Read on to hear the highlights!

    The Spyder Contributions page on GitHub, showing a graph of all contributions over time, and Daniel highlighted as the number two contributor between Feb 1 2023 and the present, after lead maintainer Carlos Cordoba
    Daniel has the second-most contributions to the core Spyder repository since Feb 2023

    Spyder Editor migration to new plugin API

    We introduced a brand new plugin API with Spyder 5, and as part of that refactored most of Spyder’s panes and many other of its internal components to be plugins that use it, rather than tightly coupled with Spyder itself. +That both makes Spyder much more modular and easier to maintain, and gives external plugins all the same power and flexibility that internal panes and components have! +However, the one major exception to that in Spyder 5 was the Editor, which hadn’t been migrated due to the high level of complexity and the further new features that would need to be added to the plugin API.

    Migrating the Editor to the modular API was the final piece of the puzzle to make Spyder a fully pluggable application, avoid having to maintain two duplicate APIs and enhance interoperability with other plugins, such as those being developed for remote development in Spyder 6. +Specifically, it was a prerequisite for implementing remote editing capabilities, which will arrive in Spyder 6.2. +Therefore, we prioritized finishing this migration for Spyder 6, with Daniel completing the work originally started by Gonzalo Peña-Castellanos, Edgar Margffoy and Stephannie Jimenez.

    Given the size of the task, Daniel split it into a number of steps, each corresponding to a GitHub Pull Request. +First, he split the CodeEditor, the main widget for editing code, into a component in charge of code completion and linting, and another one in charge of editing. +This helped separate those concerns and improve improve overall modularity and maintainability. +Then, he refactored the EditorStack code, the widget in charge of displaying multiple tabbed CodeEditor views, to facilitate the migration. +Finally, he migrated the Editor itself to the new API in two steps: an initial migration, and a followup cleanup. +This last step alone took six months of hard work, but it will help to address a lot of technical debt accumulated throughout the years.

    Remote development architecture quality testing

    The Spyder remote kernel status dialog showing a successful connection, next to the IPython Console showing a kernel error
    Daniel helped find and solve remote development issues like this one

    Once the Editor migration was moving along, Daniel helped review, test and QA the new remote development architecture. +As part of that, he also developed a number of fixes and improvements to address the issues he found. +For instance, he implemented several UI/UX improvements for the graphical components used to create a remote connection, based on the issues he found.

    Furthermore, during his checks of remote connections working on Windows, he discovered several errors with running async code, which he helped fix. +Finally, he also encountered problems when trying to tunnel ports through SSH, which he also contributed to solving. +This all helped make our remote development architecture much more stable and usable. +To learn more about Spyder’s new remote development architecture, check out Hendrik’s blog post!.

    Spyder test suite overhaul

    To enhance testing of Spyder 6 and its new components, Daniel helped make the Spyder test suite faster and more robust. +The core team was witnessing constant errors and delays when running automated tests in continuous integration systems, which made it necessary for Daniel invest several weeks to fix that so that the Spyder 6 development process was smoother. +Therefore, Daniel’s work improved this situation, as well as making the tests more efficient overall.

    Review work and project management

    Spyder's file switcher dialog, with a path box to enter a file name above a list of matching files and their properties
    Spyder's File Switcher, with the improvements from Daniel and Angela's work

    Much of Daniel’s responsibilities involve reviewing, mentoring and assisting with the work of other developers, an important role in any project. +Daniel helped Ryan Clary, the developer who created our new Conda-based installers for Spyder 6, test and validate the installers and their update process for each release in the year-long process of stabilizing them, as well as finding and reporting many bugs on Windows.

    Daniel also reviewed and assisted with Angela Remolina’s work on major improvements to Spyder’s File/Symbol Switcher. +Angela, an intern who worked on Spyder over several months, migrated the File/Symbol switcher to a plugin, so it is modular and accessible to other plugins. +As part of this project, she also added the initial support in the switcher for lightning-fast, fzf-accelerated searching of all files in the current project.

    Finally, Daniel performed an in-depth review of the numerous UI/UX enhancements for Spyder 6 developed by Juan-Sebastian Bautista, whom Daniel has mentored and managed for the past two years. +This work has made Spyder much easier and more intuitive to use, including for users with accessibility needs. +Thanks to Daniel’s mentorship, Juan-Sebastian looks to continue his work with Spyder into the future.

    Spyder release management

    Spyder release page, showing a list of version numbers and their corresponding information and files
    Daniel has released dozens of recent Spyder versions

    Since February 1, 2023, thanks to the CZI grant funding mentioned before, Daniel has also been active as Spyder’s Release Manager, taking on the substantial task of handling the many critical steps required to produce stable packages for the many platforms we support, including:

    Since then, he has served as Release Manager for one minor and eight bugfix releases for Spyder 5 (from 5.4.3 to 5.5.6), and eight pre-releases, one major release and three bugfix releases for Spyder 6 (from 6.0 alpha2 to 6.0.3). +Without his work, our users wouldn’t have been able to benefit from all the developmental and stable releases that we’ve had, especially for Spyder 6!

    What’s next?

    In the immediate future, Daniel will continue his critical role as the Release Manager for Spyder, ensuring users keep seeing regular updates for Spyder 6. +Additionally, he’ll further his partnership with Juan-Sebastian, this time focused on maintaining Spyder 6.0 and fixing any further bugs that are found. +He’ll also work on improving Jupyter QtConsole, the frontend that Spyder (in the IPython Console) and other users and applications employ to provide a rich, interactive graphical interface to local and remote kernels. +Finally, he’ll help implement the frontend interface to remote file systems as part of our remote development work, allowing users to manipulate remote files and directories just like those locally!

    We’re looking forward to seeing the fruits of all that work, and as always, happy Spydering!🕸️

    + + +
    + + diff --git a/blog/spyder-6-daniel/remote-kernel-issue-windows.png b/blog/spyder-6-daniel/remote-kernel-issue-windows.png new file mode 100644 index 0000000..ea1358f Binary files /dev/null and b/blog/spyder-6-daniel/remote-kernel-issue-windows.png differ diff --git a/blog/spyder-6-remote-development/index.html b/blog/spyder-6-remote-development/index.html index 5b8e573..572929f 100644 --- a/blog/spyder-6-remote-development/index.html +++ b/blog/spyder-6-remote-development/index.html @@ -9,19 +9,19 @@ - - + + - + - - - - + + + + - - Spyder | The inside scoop on Spyder 6's new remote development platform