Skip to content

Commit af38dc1

Browse files
committed
scientific: Clear an existing doi link is a new one is set
1 parent e9afcab commit af38dc1

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

pystac/extensions/scientific.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ def get_link(self) -> pystac.Link:
5757
return pystac.Link(CITE_AS, doi_to_url(self.doi))
5858

5959

60-
def remove_link(links: List[pystac.Link], pub: Publication):
61-
url = doi_to_url(pub.doi)
60+
def remove_link(links: List[pystac.Link], doi: str):
61+
url = doi_to_url(doi)
6262
for i, a_link in enumerate(links):
6363
if a_link.rel != CITE_AS:
6464
continue
@@ -123,6 +123,11 @@ def doi(self) -> str:
123123

124124
@doi.setter
125125
def doi(self, v: str) -> None:
126+
if DOI in self.item.properties:
127+
if v == self.item.properties[DOI]:
128+
return
129+
remove_link(self.item.links, self.item.properties[DOI])
130+
126131
self.item.properties[DOI] = v
127132
url = doi_to_url(self.doi)
128133
self.item.add_link(pystac.Link(CITE_AS, url))
@@ -167,13 +172,13 @@ def remove_publication(self, publication: Optional[Publication] = None) -> None:
167172

168173
if not publication:
169174
for one_pub in self.item.ext.scientific.publications:
170-
remove_link(self.item.links, one_pub)
175+
remove_link(self.item.links, one_pub.doi)
171176

172177
del self.item.properties[PUBLICATIONS]
173178
return
174179

175180
# One publication and link to remove
176-
remove_link(self.item.links, publication)
181+
remove_link(self.item.links, publication.doi)
177182
to_remove = publication.to_dict()
178183
self.item.properties[PUBLICATIONS].remove(to_remove)
179184

@@ -237,6 +242,10 @@ def doi(self) -> str:
237242

238243
@doi.setter
239244
def doi(self, v: str) -> None:
245+
if DOI in self.collection.extra_fields:
246+
if v == self.collection.extra_fields[DOI]:
247+
return
248+
remove_link(self.collection.links, self.collection.extra_fields[DOI])
240249
self.collection.extra_fields[DOI] = v
241250
url = doi_to_url(self.doi)
242251
self.collection.add_link(pystac.Link(CITE_AS, url))
@@ -283,13 +292,13 @@ def remove_publication(self, publication: Optional[Publication] = None) -> None:
283292

284293
if not publication:
285294
for one_pub in self.collection.ext.scientific.publications:
286-
remove_link(self.collection.links, one_pub)
295+
remove_link(self.collection.links, one_pub.doi)
287296

288297
del self.collection.extra_fields[PUBLICATIONS]
289298
return
290299

291300
# One publication and link to remove
292-
remove_link(self.collection.links, publication)
301+
remove_link(self.collection.links, publication.doi)
293302
to_remove = publication.to_dict()
294303
self.collection.extra_fields[PUBLICATIONS].remove(to_remove)
295304

tests/extensions/test_scientific.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,20 @@ def test_doi(self):
5353
self.assertEqual(DOI_URL, link.get_href())
5454
self.item.validate()
5555

56+
# Check that setting the doi does not cause extra links.
57+
58+
# Same doi.
59+
self.item.ext.scientific.doi = DOI
60+
self.assertEqual(1, len(self.item.get_links(scientific.CITE_AS)))
61+
self.item.validate()
62+
63+
# Different doi.
64+
self.item.ext.scientific.doi = PUB1_DOI
65+
self.assertEqual(1, len(self.item.get_links(scientific.CITE_AS)))
66+
link = self.item.get_links(scientific.CITE_AS)[0]
67+
self.assertEqual(PUB1_DOI_URL, link.get_href())
68+
self.item.validate()
69+
5670
def test_citation(self):
5771
self.item.ext.scientific.apply(citation=CITATION)
5872
self.assertEqual(CITATION, self.item.ext.scientific.citation)
@@ -187,7 +201,20 @@ def test_doi(self):
187201
self.assertIn(scientific.DOI, self.collection.extra_fields)
188202
link = self.collection.get_links(scientific.CITE_AS)[0]
189203
self.assertEqual(DOI_URL, link.get_href())
204+
self.collection.validate()
205+
206+
# Check that setting the doi does not cause extra links.
190207

208+
# Same doi.
209+
self.collection.ext.scientific.doi = DOI
210+
self.assertEqual(1, len(self.collection.get_links(scientific.CITE_AS)))
211+
self.collection.validate()
212+
213+
# Different doi.
214+
self.collection.ext.scientific.doi = PUB1_DOI
215+
self.assertEqual(1, len(self.collection.get_links(scientific.CITE_AS)))
216+
link = self.collection.get_links(scientific.CITE_AS)[0]
217+
self.assertEqual(PUB1_DOI_URL, link.get_href())
191218
self.collection.validate()
192219

193220
def test_citation(self):

0 commit comments

Comments
 (0)