Skip to content

Commit

Permalink
fix #83 fix cn.content_negotation
Browse files Browse the repository at this point in the history
ids param moves from default of None to no default, required param now
internally now check that ids must be a str or a list of str
clean up content_negotation egs a b it
add some content_negotation tests for the new type errors when ids missing and when None
bump library version
  • Loading branch information
sckott committed Nov 8, 2019
1 parent 7f84aff commit 679e99f
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 24 deletions.
2 changes: 1 addition & 1 deletion habanero/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
'''

__title__ = 'habanero'
__version__ = '0.6.2.2'
__version__ = '0.6.2.3'
__author__ = 'Scott Chamberlain'
__license__ = 'MIT'

Expand Down
36 changes: 20 additions & 16 deletions habanero/cn/cn.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from ..cnrequest import CNRequest
from .constants import *

def content_negotiation(ids = None, format = "bibtex", style = 'apa',
def content_negotiation(ids, format = "bibtex", style = 'apa',
locale = "en-US", url = None, **kwargs):
'''
Get citations in various formats from CrossRef
:param ids: [str] Search by a single DOI or many DOIs, each a string. If many
Supports DOIs from Crossref, Datacite and Medra
:param ids: [str] required. a single DOI or many DOIs, each a string. If many
passed in, do so in a list
:param format: [str] Name of the format. One of "rdf-xml", "turtle", "citeproc-json",
"citeproc-json-ish", "text", "ris", "bibtex" (Default), "crossref-xml",
Expand All @@ -21,10 +23,15 @@ def content_negotiation(ids = None, format = "bibtex", style = 'apa',
:return: string, which can be parsed to various formats depending on what
format you request (e.g., JSON vs. XML vs. bibtex)
See https://citation.crosscite.org/docs.html for details
Usage::
from habanero import cn
cn.content_negotiation(ids = '10.1126/science.169.3946.635')
cn.content_negotiation(ids = "10.1126/science.169.3946.635")
# A Medra DOI
cn.content_negotiation(ids = "10.1400/22888")
# get citeproc-json
cn.content_negotiation(ids = '10.1126/science.169.3946.635', format = "citeproc-json")
Expand All @@ -36,7 +43,6 @@ def content_negotiation(ids = None, format = "bibtex", style = 'apa',
# return an R bibentry type
cn.content_negotiation(ids = "10.1126/science.169.3946.635", format = "bibentry")
cn.content_negotiation(ids = "10.6084/m9.figshare.97218", format = "bibentry")
# return an apa style citation
cn.content_negotiation(ids = "10.1126/science.169.3946.635", format = "text", style = "apa")
Expand All @@ -48,19 +54,18 @@ def content_negotiation(ids = None, format = "bibtex", style = 'apa',
# Using DataCite DOIs
## some formats don't work
# cn.content_negotiation(ids = "10.5284/1011335", format = "text")
# cn.content_negotiation(ids = "10.5284/1011335", format = "crossref-xml")
# cn.content_negotiation(ids = "10.5284/1011335", format = "crossref-tdm")
# cn.content_negotiation(ids = "10.15468/t4rau8", format = "crossref-xml")
## But most do work
cn.content_negotiation(ids = "10.5284/1011335", format = "datacite-xml")
cn.content_negotiation(ids = "10.5284/1011335", format = "rdf-xml")
cn.content_negotiation(ids = "10.5284/1011335", format = "turtle")
cn.content_negotiation(ids = "10.5284/1011335", format = "citeproc-json")
cn.content_negotiation(ids = "10.5284/1011335", format = "ris")
cn.content_negotiation(ids = "10.5284/1011335", format = "bibtex")
cn.content_negotiation(ids = "10.5284/1011335", format = "bibentry")
cn.content_negotiation(ids = "10.5284/1011335", format = "bibtex")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "text")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "crossref-tdm")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "datacite-xml")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "rdf-xml")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "turtle")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "ris")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "bibtex")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "bibentry")
cn.content_negotiation(ids = "10.15468/t4rau8", format = "bibtex")
# many DOIs
dois = ['10.5167/UZH-30455','10.5167/UZH-49216','10.5167/UZH-503', '10.5167/UZH-38402','10.5167/UZH-41217']
Expand All @@ -69,7 +74,6 @@ def content_negotiation(ids = None, format = "bibtex", style = 'apa',
# Use a different base url
url = "http://dx.doi.org"
cn.content_negotiation(ids = "10.1126/science.169.3946.635", url = url)
cn.content_negotiation(ids = "10.5284/1011335", url = url)
'''
if url is None:
url = cn_base_url
Expand Down
14 changes: 7 additions & 7 deletions habanero/cnrequest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
from .habanero_utils import switch_classes,make_ua
from .cn_formats import *

def CNRequest(url, ids = None, format = None, style = None,
locale = None, **kwargs):

def CNRequest(url, ids, format = None, style = None, locale = None, **kwargs):
if not isinstance(ids, (str, list)):
raise TypeError("'ids' must be a str or list of str's")
if isinstance(ids, list):
if not all([isinstance(z, str) for z in ids]):
raise TypeError("'ids' must be a str or list of all str's")
should_split = False
try:
# Python 2
Expand All @@ -19,10 +22,7 @@ def CNRequest(url, ids = None, format = None, style = None,
if should_split:
ids = ids.split()

if isinstance(ids, int):
ids = [ids]

if(len(ids) == 1):
if len(ids) == 1:
return make_request(url, ids[0], format, style, locale, **kwargs)
else:
coll = []
Expand Down
11 changes: 11 additions & 0 deletions test/test-content_negotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ def test_content_negotiation_style():
res_ieee = cn.content_negotiation(ids = u'10.1126/science.169.3946.635', format = "text", style = "ieee")
assert res_apa != res_ieee

# errors
@raises(TypeError)
def test_content_negotiation_ids_missing():
"content negotiation - ids missing raises a TypeError"
cn.content_negotiation()

@raises(TypeError)
def test_content_negotiation_ids_none():
"content negotiation - ids as None raises a TypeError"
cn.content_negotiation(ids = None)

@raises(HTTPError)
@vcr.use_cassette('test/vcr_cassettes/cn_badrequest.yaml')
def test_content_negotiation_raises_an_http_error_with_bad_requests():
Expand Down

0 comments on commit 679e99f

Please sign in to comment.