From c0e90480755bc92b471e01d0a63cdfd658a028f5 Mon Sep 17 00:00:00 2001 From: albertouh Date: Thu, 18 Jan 2024 12:07:32 +0100 Subject: [PATCH 1/2] execution urls for binder, colab and mineo --- nbviewer/app.py | 14 +++++++ nbviewer/providers/base.py | 18 +++++++++ nbviewer/providers/github/handlers.py | 49 ++++++++++++++++++----- nbviewer/static/img/icon-colab-color.png | Bin 0 -> 4339 bytes nbviewer/static/img/icon-colab.png | Bin 0 -> 3247 bytes nbviewer/static/img/icon-mineo-color.png | Bin 0 -> 14558 bytes nbviewer/static/img/icon-mineo.png | Bin 0 -> 11002 bytes nbviewer/static/less/layout.less | 30 ++++++++++++++ nbviewer/templates/faq.md | 11 ++++- nbviewer/templates/notebook.html | 10 ++++- nbviewer/tests/test_app.py | 2 + 11 files changed, 121 insertions(+), 13 deletions(-) create mode 100644 nbviewer/static/img/icon-colab-color.png create mode 100644 nbviewer/static/img/icon-colab.png create mode 100644 nbviewer/static/img/icon-mineo-color.png create mode 100644 nbviewer/static/img/icon-mineo.png diff --git a/nbviewer/app.py b/nbviewer/app.py index 5e8b05a4..f5214fe2 100644 --- a/nbviewer/app.py +++ b/nbviewer/app.py @@ -89,6 +89,8 @@ class NBViewer(Application): { "base-url": "NBViewer.base_url", "binder-base-url": "NBViewer.binder_base_url", + "colab-base-url": "NBViewer.colab_base_url", + "mineo-base-url": "NBViewer.mineo_base_url", "cache-expiry-max": "NBViewer.cache_expiry_max", "cache-expiry-min": "NBViewer.cache_expiry_min", "config-file": "NBViewer.config_file", @@ -221,6 +223,16 @@ class NBViewer(Application): help="URL base for binder notebook execution service.", ).tag(config=True) + colab_base_url = Unicode( + default_value="https://colab.research.google.com", + help="URL base for colab notebook execution service.", + ).tag(config=True) + + mineo_base_url = Unicode( + default_value="https://b.mineo.app", + help="URL base for mineo notebook execution service.", + ).tag(config=True) + cache_expiry_max = Int( default_value=2 * 60 * 60, help="Maximum cache expiry (seconds)." ).tag(config=True) @@ -662,6 +674,8 @@ def init_tornado_application(self): allow_remote_access=True, base_url=self._base_url, binder_base_url=self.binder_base_url, + colab_base_url=self.colab_base_url, + mineo_base_url=self.mineo_base_url, cache=self.cache, cache_expiry_max=self.cache_expiry_max, cache_expiry_min=self.cache_expiry_min, diff --git a/nbviewer/providers/base.py b/nbviewer/providers/base.py index 032fb456..326e9bf4 100644 --- a/nbviewer/providers/base.py +++ b/nbviewer/providers/base.py @@ -139,6 +139,14 @@ def base_url(self): def binder_base_url(self): return self.settings["binder_base_url"] + @property + def colab_base_url(self): + return self.settings["colab_base_url"] + + @property + def mineo_base_url(self): + return self.settings["mineo_base_url"] + @property def cache(self): return self.settings["cache"] @@ -664,11 +672,21 @@ def deliver_notebook(self, **kwargs): def render_notebook_template( self, body, nb, download_url, json_notebook, **namespace ): + executor_mineo_url = ( + "{mineo_base_url}/import/{notebook_url}".format( + mineo_base_url=self.mineo_base_url, + notebook_url=download_url + ) + if self.mineo_base_url + else None + ) + return self.render_template( "formats/%s.html" % self.format, body=body, nb=nb, download_url=download_url, + executor_mineo_url=executor_mineo_url, format=self.format, default_format=self.default_format, format_prefix=format_prefix, diff --git a/nbviewer/providers/github/handlers.py b/nbviewer/providers/github/handlers.py index cf34ebf3..70057227 100644 --- a/nbviewer/providers/github/handlers.py +++ b/nbviewer/providers/github/handlers.py @@ -41,13 +41,18 @@ class GithubClientMixin: PROVIDER_CTX = { "provider_label": "GitHub", "provider_icon": "github", - "executor_label": "Binder", - "executor_icon": "icon-binder", + "executor_label_binder": "Binder", + "executor_icon_binder": "icon-binder", + "executor_label_colab": "Colab", + "executor_icon_colab": "icon-colab", } BINDER_TMPL = "{binder_base_url}/gh/{org}/{repo}/{ref}" BINDER_PATH_TMPL = BINDER_TMPL + "?filepath={path}" + COLAB_TMPL = "{colab_base_url}/github/{org}/{repo}/blob/{ref}" + COLAB_PATH_TMPL = COLAB_TMPL + "/{path}" + @property def github_url(self): if getattr(self, "_github_url", None) is None: @@ -169,7 +174,8 @@ def render_treelist_template( path, branches, tags, - executor_url, + executor_url_binder, + executor_url_colab, **namespace, ): """ @@ -177,8 +183,10 @@ def render_treelist_template( Breadcrumb 'name' and 'url' to render as links at the top of the notebook page provider_url: str URL to the notebook document upstream at the provider (e.g., GitHub) - executor_url: str, optional - URL to execute the notebook document (e.g., Binder) + executor_url_binder: str, optional + URL to execute the notebook document with Binder + executor_url_colab: str, optional + URL to execute the notebook document withe Colab """ return self.render_template( "treelist.html", @@ -193,7 +201,8 @@ def render_treelist_template( tags=tags, tree_type="github", tree_label="repositories", - executor_url=executor_url, + executor_url_binder=executor_url_binder, + executor_url_colab=executor_url_colab, **self.PROVIDER_CTX, **namespace, ) @@ -308,13 +317,20 @@ async def get(self, user: str, repo: str, ref: str, path: str): entries.extend(others) # Enable a binder navbar icon if a binder base URL is configured - executor_url = ( + executor_url_binder = ( self.BINDER_TMPL.format( binder_base_url=self.binder_base_url, org=user, repo=repo, ref=ref ) if self.binder_base_url else None ) + executor_url_colab = ( + self.COLAB_PATH_TMPL.format( + colab_base_url=self.colab_base_url, org=user, repo=repo, ref=ref + ) + if self.colab_base_url + else None + ) html = self.render_treelist_template( entries=entries, @@ -326,7 +342,8 @@ async def get(self, user: str, repo: str, ref: str, path: str): path=path, branches=branches, tags=tags, - executor_url=executor_url, + executor_url_binder=executor_url_binder, + executor_url_colab=executor_url_colab, ) await self.cache_and_finish(html) @@ -414,7 +431,7 @@ async def deliver_notebook( breadcrumbs.extend(self.breadcrumbs(dir_path, base_url)) # Enable a binder navbar icon if a binder base URL is configured - executor_url = ( + executor_url_binder = ( self.BINDER_PATH_TMPL.format( binder_base_url=self.binder_base_url, org=user, @@ -425,6 +442,17 @@ async def deliver_notebook( if self.binder_base_url else None ) + executor_url_colab = ( + self.COLAB_PATH_TMPL.format( + colab_base_url=self.colab_base_url, + org=user, + repo=repo, + ref=ref, + path=quote(path), + ) + if self.binder_base_url + else None + ) try: # filedata may be bytes, but we need text @@ -447,7 +475,8 @@ async def deliver_notebook( nbjson, raw_url, provider_url=blob_url, - executor_url=executor_url, + executor_url_binder=executor_url_binder, + executor_url_colab=executor_url_colab, breadcrumbs=breadcrumbs, msg="file from GitHub: %s" % raw_url, public=True, diff --git a/nbviewer/static/img/icon-colab-color.png b/nbviewer/static/img/icon-colab-color.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae499654a1fb5c1677bf45e39f4b9fb46f88302 GIT binary patch literal 4339 zcma)9`8O2)_ntAs*tfASV~j+j#*j5T*|LXZZ6^CJWRPW$>>(jLQQ3`sWE)#Vp;RI< zwrr81GO~TW&-WkroO|xQ=iHxO_dNG`-TNe&o9eSL3NQiy02V`o>o?Cc{y(RuJC6hE z*f9VA_{dX7$J|gy2ObdU@8;>_3IIrEMrNuR448Apo7ulWa%-t1D!Ej~VzjK1%Wsv@ zb8FX4R>!?HIx98Qd9t)5N#qeawynKJRNC4kBk5x`;Nz^O$*7x4k%ncusl2dX%Uusx ze|?8gw_IQ53q$eMwt7eoUfCIIQ7WUzzYl4AZ!WlP20efF&^_|IrQ&DDr|w|~C$`-; z#$E7c@M723SPp;oVTCJ2`|9_eaf`=O3q$8hnK(599YYS&g8Hx;6U>4epH%NXyDiz$ zIQOR3qjGR+kVE&g1{jdi(q?h{Fyb&g`{|!DFt{)rqy3gRB2uUPcEn z{jTi@@-ANf4K$dleWFO}6GhvV{=A=#!?jLqFBJbcjsm%bdKTle-6}^EC@X>LV^uVbRp|NP6ibo1@HGN~+SRoNAW zX>98(naaFSc6OV;-#S5cdD3AE0WNQSaXM zGzYm)94QZLe0BWwZa<>r=rm$}jW$iM{DX&_!2gt{LizqsCrPd}Xs8lfs3Mx*0Qd@c z1<$}0BSr$2Le{}fG)@2~f^eY4y}Q5S_z-Vg$Oy6nCfs8ROcvIpNd(f8AWlran*b-e zHqb;0pCiQ#q2~wy`(9vw2jZd01x?|9U{#v{KWP+bwpil+{uo-(w+ha+1iyo*(?x)v zf#q11Gb1&5ccn1hK*0iGR(T%)*B2~T`W}!RMEXqHkZ*AoA+QqJzTQ=74NGD4_C)4K z@DWj5Q9dlb;UKE=Zn?VFgFuF%NA!3nUL%r3%qpptW5*3lpuJ67+bsMT*|>pS>L=U5 zS-N^z6?`GL_z7(@Wr|OL?8IjzYm#CNKgW80JE$GoH1A~f{Tq}h2b`vn!Z(Xyrc5#M z=&%bti9I7=O>!WLKu67@XAM>ajQJ$+O0{?@>_%ct!M#u8ogMjR=JwA#eMfG4e5 zl9m_yP0H^jY!lqs3;Y04Jg8YY1QdS0g5Y2n5Iq(`Edee~Kwz$+M;sQ=v-g_G3k^wZ4w<8&1vP%a zzzr8ELI|D;(CeA<@+{3E7jsf3=wN)hOS~sO`+aahmDZJbV}N(i#>!wd4LsL$5Py`} z>EJK6;3>ZU{Yz#dL@OO1%?IycIes|nXPnkTZCGn=yr**wxDfx_6nY*Lyl*yF>5UBgQAmqDcc2yIpB!C(e(GRstffqLb0 zLqf`6OMhml*9iP8-5iaor^;t{;%{~1EHn{WINaO0GM#|uZ_`l-CdBu#lGWrn&-gJN zz+PXN-o=~qLvk*!=QL>6*!CnMqrPm8yVv1Z%OA`klizus)K4p}!_7%FkJ|a~QakH% zBF3*dRNE>63Y=9`WrQfe{M<=*6;%XTn_N$b-gbBGrD7AM>oTdZT^p>;e!&my%d#Qi zw8879VP$Yk6C#Zvu&;R_TWcQ$fi+18FF;dmvqZ=k)?w_cA={`hlrE`rF zl1aK%sqJ+wOjM>%e#t-garR;eb^P}3oF+x5-tt(+7ISKlC^Flkw&3ariIX5$CGmSj zcG0fe<`5oYyO;}Ktm}lw9G>H`6<+t`_v;JsT*jYay^wd!!o`A~_JJEKsxE%zb?A%< zQ`fFo1~{{Gjy478*YJwEh!25zK~+!NU`wD1+4(6_JD2*N)>_jT+LBxm>}9h}`$*n;C|m>qr6(ywv=D zeJ57T--;|}B}%oO_^~OeSD(DCAspK9+}*cHcvcJp?PnLvIO0b>JO4+9^R=&er9MwM z4f1{?rAM;iEkpTJU}CJP!VmgGPr2FOIV7u9320cQCha%G z3fx+uoBadeYyG7bq`<7J9X0q2Ed=} zG3jJCKre1S*5pMj3dWRqFiJkZJM|6yusU90%*vxeIQszf)M^5aaIxI5vHa7`c=2gT zZwTjjVyyR1@!z6mpelNNVzCJOGPl}@BKO~*Da15AB~#O1>{BY(6*eO^Y<4k`SIgF9b}MK@rjcH016O)E zW;rFwUJjYKk|S=s!hqlw0!I12lPW) zrO(USC0?{xjRydgJ+*MT0=Jd}YK*?f5~<8R{mZ#W5@Qtc1hUcAH-TpZhe}{x!XCE_1(sh>>cVkKr6% z?W}toks!|$ip({2vUaAd0nNmI!EU~tI)UgI*#q#O8Rz*fMO9B~K$W1OvH>0P=BiIv z9qedwJNsXrT9JLQyV<7;!>jUA-dsrw8@St++9heUv*#pr>tQ$WvsxX#-z<$0o}WHi{_H2nBly3&>dGIxAv?DXKYQTeAL9H!#`NE z>bJ~GUfteF3|VVc>L=anIQyB1gg+=c4Yd>5UHJj@w8`yAqCcO1SCVR7^OIR$ZC~zK zm2jqTx?7+-8i{?0fGCI!0bJBh5 z{IE7-1x=ICvi4eGLwOfTKL5HR_@^=-iQy>l*qoJKQqGddqb4Ejp zuy-8UC>FnK_v3wTt-i(&oZXz~Ke9_?`*WqX`!1TIY|-nMf6N|Q%eqvvvK8~-*bO>B zRw<-fnS5CA?zRI_w%+QA4&o9%g;m}u>=>0oc>g@cnp0kJvFbTQWF$B}?*8*WMLD?( zvYV|nwBWowhO>j}Wl|r+OtjQf(r*a?ur>sdycLRD618Dig6EBVV!1jmahU0P0*>y= zYTeAFZglz|yPmOYL0n0{fJT=54M*3bgFjX|A(wq=)zdB?f091+WLc@a2#3zo%!+`w zNp}#rJt?QKEzO=W0gdEA4aSI5mt5Va+yE@QDqV!S%nL$q-{3EIzpuZq!s%fEzr6!F zkrABjt8@e9vIFihu$lnoq_ah|aZ+lE3+Pa}h=WQA`Da-)$uzPsj!LKghU$qycOE5DcV>68b}s zDqumklQ|PP={zqs{eJ@}?sDT=!nHN-5%1Z}NDxkh03*H+sczVx$}$}UziA~+XR3t$ zag!j>^odmgAN4h6Xh~)<)=24~^CNCqdps%!_)BE*mMI+P zX2Wp%+qKjmQP*ioE3B1xsmy!NU%izNnbaYjv<=ML&Fp)Hr`lFfEy&HJlFy-Y`*eHZ z-;Rl+E8{utcQa;e~PDiB+V8F2i9gd z&TFsG7G&```94>7v2Hp8z(9>M*%WW5iY64OjpWMQl)n}>QrOds=R&jQ5jdD20s7jF zK_jxkDw(V6XA@4w(i~-LKZv3a!+2yz+yPSqJpS6mdi3PQXuL@g3FV^Jzcyr%>3h<% n;Gx*;{Xa^^{}-2TE{D-$1%1|02LtKnVi;hkYkIw28x#9~uc8ys literal 0 HcmV?d00001 diff --git a/nbviewer/static/img/icon-colab.png b/nbviewer/static/img/icon-colab.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c91403f30b8703a8150b5ac171cff2ae7f01fd GIT binary patch literal 3247 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 literal 0 HcmV?d00001 diff --git a/nbviewer/static/img/icon-mineo-color.png b/nbviewer/static/img/icon-mineo-color.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae9acc9261b68c98d68a06c9e938c5f20dadf1e GIT binary patch literal 14558 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 literal 0 HcmV?d00001 diff --git a/nbviewer/static/img/icon-mineo.png b/nbviewer/static/img/icon-mineo.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc8cb97f01dfb19f6697158dc28350c0848b435 GIT binary patch literal 11002 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 Date: Thu, 18 Jan 2024 16:09:46 +0100 Subject: [PATCH 2/2] code format --- nbviewer/providers/base.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/nbviewer/providers/base.py b/nbviewer/providers/base.py index 326e9bf4..9f047af3 100644 --- a/nbviewer/providers/base.py +++ b/nbviewer/providers/base.py @@ -673,9 +673,8 @@ def render_notebook_template( self, body, nb, download_url, json_notebook, **namespace ): executor_mineo_url = ( - "{mineo_base_url}/import/{notebook_url}".format( - mineo_base_url=self.mineo_base_url, - notebook_url=download_url + "{mineo_base_url}/import/{notebook_url}".format( + mineo_base_url=self.mineo_base_url, notebook_url=download_url ) if self.mineo_base_url else None