Skip to content

Commit 31ab3c7

Browse files
authored
[MRG] Add Figshare to UI (#951)
[MRG] Add Figshare to UI
2 parents 702f6e7 + 575fb2a commit 31ab3c7

File tree

9 files changed

+86
-8
lines changed

9 files changed

+86
-8
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,5 @@ travis
112112
helm-chart/travis-binder.yaml
113113

114114
# Federation data page
115-
doc/federation/data-federation.txt
115+
doc/federation/data-federation.txt
116+
.vscode/

CONTRIBUTING.md

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ every day development.
108108

109109
* Start and stop minikube with `minikube start` and `minikube stop`.
110110
* Install JupyterHub in minikube with helm `./testing/minikube/install-hub`
111-
* Setup docker to use the same docker daemon as your minikube cluster `eval $(minikube docker-env)`
111+
* Setup `docker` to use the same Docker daemon as your minikube cluster `eval $(minikube docker-env)`
112112
* Start BinderHub `python3 -m binderhub -f testing/minikube/binderhub_config.py`
113113
* Visit your BinderHub at[http://localhost:8585](http://localhost:8585)
114114

@@ -209,7 +209,7 @@ sudo apt install socat
209209
eval $(minikube docker-env)
210210
```
211211

212-
This command sets up docker to use the same docker daemon as your minikube
212+
This command sets up `docker` to use the same Docker daemon as your minikube
213213
cluster does. This means images you build are directly available to the
214214
cluster. Note: when you no longer wish to use the minikube host, you can
215215
undo this change by running:
@@ -229,6 +229,26 @@ sudo apt install socat
229229
All features should work, including building and launching of repositories.
230230

231231

232+
### Tip: Use local repo2docker version
233+
234+
BinderHub runs repo2docker in a container.
235+
For testing the combination of an unreleased repo2docker feature with BinderHub, you can use a locally build repo2docker image.
236+
You can configure the image in the file `testing/minikube/binderhub_config.py` with the following line:
237+
238+
```python
239+
c.BinderHub.build_image = 'jupyter-repo2docker:my_image_tag'
240+
```
241+
242+
**Important**: the image must be build using the same Docker daemon as the minikube cluster, otherwise you get an error _"Failed to pull image [...] repository does not exist or may require 'docker login'"_.
243+
244+
### Tip: Enable debug logging
245+
246+
In the file `testing/minikube/binderhub_config.py` add the following line:
247+
248+
```python
249+
c.BinderHub.debug = True
250+
```
251+
232252
### Tip: Increase your GitHub API limit
233253

234254
By default, GitHub has a limit of 60 API requests per hour. We recommend

binderhub/app.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from .main import MainHandler, ParameterizedMainHandler, LegacyRedirectHandler
3434
from .repoproviders import (GitHubRepoProvider, GitRepoProvider,
3535
GitLabRepoProvider, GistRepoProvider,
36-
ZenodoProvider)
36+
ZenodoProvider, FigshareProvider)
3737
from .metrics import MetricsHandler
3838

3939
from .utils import ByteSpecification, url_path_join
@@ -379,6 +379,7 @@ def _add_slash(self, proposal):
379379
'git': GitRepoProvider,
380380
'gl': GitLabRepoProvider,
381381
'zenodo': ZenodoProvider,
382+
'figshare': FigshareProvider,
382383
},
383384
config=True,
384385
help="""

binderhub/event-schemas/launch.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"Gist",
1212
"GitLab",
1313
"Git",
14-
"Zenodo"
14+
"Zenodo",
15+
"Figshare"
1516
],
1617
"description": "Provider for the repository being launched"
1718
},

binderhub/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"gist": "Gist",
1616
"gl": "GitLab",
1717
"git": "Git repo",
18-
"zenodo": "Zenodo"
18+
"zenodo": "Zenodo",
19+
"figshare": "Figshare"
1920
}
2021

2122

binderhub/repoproviders.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,39 @@ def get_build_slug(self):
217217
return "zenodo-{}".format(self.record_id)
218218

219219

220+
class FigshareProvider(RepoProvider):
221+
"""Provide contents of a Figshare article
222+
223+
Users must provide a spec consisting of the Figshare DOI.
224+
"""
225+
name = Unicode("Figshare")
226+
url_regex = re.compile(r"(.*)/articles/([^/]+)/(\d+)(/)?(\d+)?")
227+
228+
@gen.coroutine
229+
def get_resolved_ref(self):
230+
client = AsyncHTTPClient()
231+
req = HTTPRequest("https://doi.org/{}".format(self.spec),
232+
user_agent="BinderHub")
233+
r = yield client.fetch(req)
234+
235+
match = self.url_regex.match(r.effective_url)
236+
article_id = match.groups()[2]
237+
article_version = match.groups()[4]
238+
if not article_version:
239+
article_version = "1"
240+
self.record_id = "{}.v{}".format(article_id, article_version)
241+
242+
return self.record_id
243+
244+
def get_repo_url(self):
245+
# While called repo URL, the return value of this function is passed
246+
# as argument to repo2docker, hence we return the spec as is.
247+
return self.spec
248+
249+
def get_build_slug(self):
250+
return "figshare-{}".format(self.record_id)
251+
252+
220253
class GitRepoProvider(RepoProvider):
221254
"""Bare bones git repo provider.
222255

binderhub/static/js/index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ function updateRepoText() {
8484
$("#ref").prop("disabled", true);
8585
$("label[for=ref]").prop("disabled", true);
8686
}
87+
else if (provider === "figshare") {
88+
text = "Figshare DOI (10.6084/m9.figshare.9782777.v1)";
89+
$("#ref").prop("disabled", true);
90+
$("label[for=ref]").prop("disabled", true);
91+
}
8792
$("#repository").attr('placeholder', text);
8893
$("label[for=repository]").text(text);
8994
$("#ref").attr('placeholder', tag_text);
@@ -107,7 +112,7 @@ function getBuildFormValues() {
107112
}
108113

109114
var ref = $('#ref').val().trim() || 'master';
110-
if (providerPrefix === 'zenodo') {
115+
if (providerPrefix === 'zenodo' || providerPrefix === 'figshare') {
111116
ref = "";
112117
}
113118
var path = $('#filepath').val().trim();

binderhub/templates/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ <h4 id="form-header" class='row'>Build and launch a repository</h4>
5555
<li class="dropdown-item" value="gl"><a href="#">GitLab.com</a></li>
5656
<li class="dropdown-item" value="git"><a href="#">Git repository</a></li>
5757
<li class="dropdown-item" value="zenodo"><a href="#">Zenodo DOI</a></li>
58+
<li class="dropdown-item" value="figshare"><a href="#">Figshare DOI</a></li>
5859
</ul>
5960
</div>
6061
</div>

binderhub/tests/test_repoproviders.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from binderhub.repoproviders import (
88
tokenize_spec, strip_suffix, GitHubRepoProvider, GitRepoProvider,
9-
GitLabRepoProvider, GistRepoProvider, ZenodoProvider
9+
GitLabRepoProvider, GistRepoProvider, ZenodoProvider, FigshareProvider
1010
)
1111

1212

@@ -52,6 +52,21 @@ async def test_zenodo():
5252
assert repo_url == spec
5353

5454

55+
async def test_figshare():
56+
spec = '10.6084/m9.figshare.9782777.v1'
57+
58+
provider = FigshareProvider(spec=spec)
59+
60+
# have to resolve the ref first
61+
ref = await provider.get_resolved_ref()
62+
assert ref == '9782777.v1'
63+
64+
slug = provider.get_build_slug()
65+
assert slug == 'figshare-9782777.v1'
66+
repo_url = provider.get_repo_url()
67+
assert repo_url == spec
68+
69+
5570
@pytest.mark.github_api
5671
def test_github_ref():
5772
provider = GitHubRepoProvider(spec='jupyterhub/zero-to-jupyterhub-k8s/v0.4')

0 commit comments

Comments
 (0)