serrano 0.5.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "erb"
1
4
  require "serrano/version"
2
5
  require "serrano/request"
3
6
  require "serrano/request_cursor"
@@ -6,8 +9,8 @@ require "serrano/cnrequest"
6
9
  require "serrano/filters"
7
10
  require "serrano/styles"
8
11
 
9
- require 'rexml/document'
10
- require 'rexml/xpath'
12
+ require "rexml/document"
13
+ require "rexml/xpath"
11
14
 
12
15
  # @!macro serrano_params
13
16
  # @param offset [Fixnum] Number of record to start at, any non-negative integer up to 10,000
@@ -19,10 +22,10 @@ require 'rexml/xpath'
19
22
  # @param sort [String] Field to sort on, one of score, relevance,
20
23
  # updated (date of most recent change to metadata - currently the same as deposited),
21
24
  # deposited (time of most recent deposit), indexed (time of most recent index),
22
- # published (publication date), published-print (print publication date),
23
- # published-online (online publication date), issued (issued date (earliest known publication date)),
24
- # is-referenced-by-count (number of times this DOI is referenced by other Crossref DOIs), or
25
- # references-count (number of references included in the references section of the document
25
+ # published (publication date), published-print (print publication date),
26
+ # published-online (online publication date), issued (issued date (earliest known publication date)),
27
+ # is-referenced-by-count (number of times this DOI is referenced by other Crossref DOIs), or
28
+ # references-count (number of references included in the references section of the document
26
29
  # identified by this DOI). Note: If the API call includes a query, then the sort
27
30
  # order will be by the relevance score. If no query is included, then the sort order
28
31
  # will be by DOI update date.
@@ -32,7 +35,7 @@ require 'rexml/xpath'
32
35
  # @param select [String/Array(String)] Crossref metadata records can be
33
36
  # quite large. Sometimes you just want a few elements from the schema. You can "select"
34
37
  # a subset of elements to return. This can make your API calls much more efficient. Not
35
- # clear yet which fields are allowed here.
38
+ # clear yet which fields are allowed here.
36
39
  # @param verbose [Boolean] Print request headers to stdout. Default: false
37
40
 
38
41
  # @!macro cursor_params
@@ -60,11 +63,10 @@ require 'rexml/xpath'
60
63
  # - oauth [Hash] A hash with OAuth details
61
64
 
62
65
  # @!macro field_queries
63
- # @param [Hash<Object>] args Field queries, as named parameters. See
66
+ # @param [Hash<Object>] args Field queries, as named parameters. See
64
67
  # https://github.com/CrossRef/rest-api-doc/blob/master/rest_api.md#field-queries
65
68
  # Field query parameters mut be named, and must start with `query_`. Any dashes or
66
69
  # periods should be replaced with underscores. The options include:
67
- # - query_title: Query title and subtitle
68
70
  # - query_container_title: Query container-title aka. publication name
69
71
  # - query_author: Query author given and family names
70
72
  # - query_editor: Query editor given and family names
@@ -108,7 +110,7 @@ require 'rexml/xpath'
108
110
  # searching full text, or even abstracts of articles, but only what is
109
111
  # available in the data that is returned to you. That is, they search
110
112
  # article titles, authors, etc. For some discussion on this, see
111
- # https://github.com/CrossRef/rest-api-doc/issues/101
113
+ # https://gitlab.com/crossref/issues/issues/101
112
114
  #
113
115
  #
114
116
  # The Polite Pool
@@ -119,13 +121,13 @@ require 'rexml/xpath'
119
121
  # information, then they will send you to a separate pool of machines,
120
122
  # with better control the performance of these machines because they can
121
123
  # block abusive users.
122
- #
124
+ #
123
125
  # We have been using `https` in `serrano` for a while now, so that's good
124
126
  # to go. To get into the Polite Pool, also set your `mailto` email address
125
127
  # with `Serrano.configuration` (example below), or set as an environment
126
128
  # variable with the name `CROSSREF_EMAIL` and your mailto will be set
127
- # for each request automatically.
128
- #
129
+ # for each request automatically.
130
+ #
129
131
  # require 'serrano'
130
132
  # Serrano.configuration do |config|
131
133
  # config.mailto = "foo@bar.com"
@@ -138,6 +140,12 @@ require 'rexml/xpath'
138
140
  # limit is 50 requests per second. Look for the headers `X-Rate-Limit-Limit`
139
141
  # and `X-Rate-Limit-Interval` in requests to see what the current rate
140
142
  # limits are.
143
+ #
144
+ #
145
+ # URL Encoding
146
+ # We do URL encoding of DOIs for you for all methods except `Serrano.citation_count`
147
+ # which doesn't work if you encode DOIs beforehand. We use `ERB::Util.url_encode`
148
+ # to encode.
141
149
 
142
150
  module Serrano
143
151
  extend Configuration
@@ -193,7 +201,7 @@ module Serrano
193
201
  #
194
202
  # # sample
195
203
  # Serrano.works(sample: 2)
196
- #
204
+ #
197
205
  # # select - pass an array or a comma separated string
198
206
  # Serrano.works(query: "ecology", select: "DOI,title", limit: 30)
199
207
  # Serrano.works(query: "ecology", select: ["DOI","title"], limit: 30)
@@ -222,10 +230,11 @@ module Serrano
222
230
  # Serrano.works(select: ['DOI', 'title'], limit: 3)
223
231
  def self.works(ids: nil, query: nil, filter: nil, offset: nil,
224
232
  limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
225
- select: nil, options: nil, verbose: false, cursor: nil,
233
+ select: nil, options: nil, verbose: false, cursor: nil,
226
234
  cursor_max: 5000, **args)
227
235
 
228
- RequestCursor.new('works', ids, query, filter, offset,
236
+ assert_valid_filters(filter) if filter
237
+ RequestCursor.new("works", ids, query, filter, offset,
229
238
  limit, sample, sort, order, facet, select, nil, nil, options,
230
239
  verbose, cursor, cursor_max, args).perform
231
240
  end
@@ -281,8 +290,9 @@ module Serrano
281
290
  select: nil, works: false, options: nil, verbose: false,
282
291
  cursor: nil, cursor_max: 5000, **args)
283
292
 
284
- RequestCursor.new('members', ids, query, filter, offset,
285
- limit, sample, sort, order, facet, select, works, nil,
293
+ assert_valid_filters(filter) if filter
294
+ RequestCursor.new("members", ids, query, filter, offset,
295
+ limit, sample, sort, order, facet, select, works, nil,
286
296
  options, verbose, cursor, cursor_max, args).perform
287
297
  end
288
298
 
@@ -317,19 +327,20 @@ module Serrano
317
327
  # items.collect{ |z| z['DOI'] }[0,50]
318
328
  #
319
329
  # # field queries
320
- # ## query.title
321
- # res = Serrano.prefixes(ids: "10.1016", works: true, query_title: 'cell biology')
330
+ # ## query.bibliographic
331
+ # res = Serrano.prefixes(ids: "10.1016", works: true, query_bibliographic: 'cell biology')
322
332
  # res[0]['message']['items'].collect { |x| x['title'] }
323
333
  #
324
334
  # # select certain fields
325
- # Serrano.prefixes(ids: "10.1016", works: true, select: ['DOI', 'title'], limit: 3)
335
+ # Serrano.prefixes(ids: "10.1016", works: true, select: ['DOI', 'title'], limit: 3)
326
336
  def self.prefixes(ids:, filter: nil, offset: nil,
327
337
  limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
328
338
  select: nil, works: false, options: nil, verbose: false,
329
339
  cursor: nil, cursor_max: 5000, **args)
330
340
 
331
- RequestCursor.new('prefixes', ids, nil, filter, offset,
332
- limit, sample, sort, order, facet, select, works, nil,
341
+ assert_valid_filters(filter) if filter
342
+ RequestCursor.new("prefixes", ids, nil, filter, offset,
343
+ limit, sample, sort, order, facet, select, works, nil,
333
344
  options, verbose, cursor, cursor_max, args).perform
334
345
  end
335
346
 
@@ -374,13 +385,14 @@ module Serrano
374
385
  # res[0]['message']['items'].collect { |x| x['author'][0]['family'] }
375
386
  #
376
387
  # # select certain fields
377
- # Serrano.funders(ids: "10.13039/100000001", works: true, select: ['DOI', 'title'], limit: 3)
388
+ # Serrano.funders(ids: "10.13039/100000001", works: true, select: ['DOI', 'title'], limit: 3)
378
389
  def self.funders(ids: nil, query: nil, filter: nil, offset: nil,
379
390
  limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
380
391
  select: nil, works: false, options: nil, verbose: false,
381
392
  cursor: nil, cursor_max: 5000, **args)
382
393
 
383
- RequestCursor.new('funders', ids, query, filter, offset,
394
+ assert_valid_filters(filter) if filter
395
+ RequestCursor.new("funders", ids, query, filter, offset,
384
396
  limit, sample, sort, order, facet, select, works, nil, options,
385
397
  verbose, cursor, cursor_max, args).perform
386
398
  end
@@ -426,13 +438,14 @@ module Serrano
426
438
  # res[0]['message']['items'].collect { |x| x['container-title'] }
427
439
  #
428
440
  # # select certain fields
429
- # Serrano.journals(ids: "2167-8359", works: true, select: ['DOI', 'title'], limit: 3)
441
+ # Serrano.journals(ids: "2167-8359", works: true, select: ['DOI', 'title'], limit: 3)
430
442
  def self.journals(ids: nil, query: nil, filter: nil, offset: nil,
431
443
  limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
432
444
  select: nil, works: false, options: nil, verbose: false,
433
445
  cursor: nil, cursor_max: 5000, **args)
434
446
 
435
- RequestCursor.new('journals', ids, query, filter, offset,
447
+ assert_valid_filters(filter) if filter
448
+ RequestCursor.new("journals", ids, query, filter, offset,
436
449
  limit, sample, sort, order, facet, select, works, nil, options,
437
450
  verbose, cursor, cursor_max, args).perform
438
451
  end
@@ -448,7 +461,7 @@ module Serrano
448
461
  # @param select [String/Array(String)] Crossref metadata records can be
449
462
  # quite large. Sometimes you just want a few elements from the schema. You can "select"
450
463
  # a subset of elements to return. This can make your API calls much more efficient. Not
451
- # clear yet which fields are allowed here.
464
+ # clear yet which fields are allowed here.
452
465
  # @return [Array] An array of hashes
453
466
  #
454
467
  # @example
@@ -470,11 +483,11 @@ module Serrano
470
483
  # res[0]['message']['items'].collect { |x| x['container-title'] }
471
484
  #
472
485
  # # select certain fields
473
- # Serrano.types(ids: "journal", works: true, select: ['DOI', 'title'], limit: 3)
486
+ # Serrano.types(ids: "journal", works: true, select: ['DOI', 'title'], limit: 3)
474
487
  def self.types(ids: nil, offset: nil, limit: nil, select: nil, works: false,
475
488
  options: nil, verbose: false, cursor: nil, cursor_max: 5000, **args)
476
489
 
477
- RequestCursor.new('types', ids, nil, nil, offset,
490
+ RequestCursor.new("types", ids, nil, nil, offset,
478
491
  limit, nil, nil, nil, nil, select, works, nil, options,
479
492
  verbose, cursor, cursor_max, args).perform
480
493
  end
@@ -482,9 +495,28 @@ module Serrano
482
495
  ##
483
496
  # Search the licenses route
484
497
  #
485
- # @!macro serrano_params
486
498
  # @!macro serrano_options
487
499
  # @param query [String] A query string
500
+ # @param offset [Fixnum] Number of record to start at, any non-negative integer up to 10,000
501
+ # @param limit [Fixnum] Number of results to return. Not relavant when searching with specific dois.
502
+ # Default: 20. Max: 1000
503
+ # @param sample [Fixnum] Number of random results to return. when you use the sample parameter,
504
+ # the limit and offset parameters are ignored. This parameter only used when works requested.
505
+ # Max: 100.
506
+ # @param sort [String] Field to sort on, one of score, relevance,
507
+ # updated (date of most recent change to metadata - currently the same as deposited),
508
+ # deposited (time of most recent deposit), indexed (time of most recent index),
509
+ # published (publication date), published-print (print publication date),
510
+ # published-online (online publication date), issued (issued date (earliest known publication date)),
511
+ # is-referenced-by-count (number of times this DOI is referenced by other Crossref DOIs), or
512
+ # references-count (number of references included in the references section of the document
513
+ # identified by this DOI). Note: If the API call includes a query, then the sort
514
+ # order will be by the relevance score. If no query is included, then the sort order
515
+ # will be by DOI update date.
516
+ # @param order [String] Sort order, one of 'asc' or 'desc'
517
+ # @param facet [Boolean/String] Include facet results OR a query (e.g., `license:*`) to facet by
518
+ # license. Default: false
519
+ # @param verbose [Boolean] Print request headers to stdout. Default: false
488
520
  # @return [Array] An array of hashes
489
521
  #
490
522
  # @example
@@ -496,7 +528,7 @@ module Serrano
496
528
  limit: nil, sample: nil, sort: nil, order: nil,
497
529
  facet: nil, options: nil, verbose: false)
498
530
 
499
- Request.new('licenses', nil, query, nil, offset,
531
+ Request.new("licenses", nil, query, nil, offset,
500
532
  limit, sample, sort, order, facet, nil, nil, nil, options, verbose).perform
501
533
  end
502
534
 
@@ -512,9 +544,8 @@ module Serrano
512
544
  # Serrano.registration_agency(ids: '10.1371/journal.pone.0033693')
513
545
  # Serrano.registration_agency(ids: ['10.1007/12080.1874-1746','10.1007/10452.1573-5125', '10.1111/(issn)1442-9993'])
514
546
  def self.registration_agency(ids:, options: nil, verbose: false)
515
-
516
- Request.new('works', ids, nil, nil, nil,
517
- nil, nil, nil, nil, nil, false, true, options, verbose).perform
547
+ Request.new("works", ids, nil, nil, nil,
548
+ nil, nil, nil, nil, nil, nil, false, true, options, verbose).perform
518
549
  end
519
550
 
520
551
  ##
@@ -535,10 +566,9 @@ module Serrano
535
566
  # Serrano.random_dois(sample: 10)
536
567
  # Serrano.random_dois(sample: 100)
537
568
  def self.random_dois(sample: 10, options: nil, verbose: false)
538
-
539
- tmp = Request.new('works', nil, nil, nil, nil,
569
+ tmp = Request.new("works", nil, nil, nil, nil,
540
570
  nil, sample, nil, nil, nil, nil, false, nil, options, verbose).perform
541
- tmp['message']['items'].collect { |x| x['DOI'] }
571
+ tmp["message"]["items"].collect { |x| x["DOI"] }
542
572
  end
543
573
 
544
574
  ##
@@ -564,7 +594,7 @@ module Serrano
564
594
  # Serrano.content_negotiation(ids: "10.1126/science.169.3946.635", format: "crossref-xml")
565
595
  # Serrano.content_negotiation(ids: "10.1126/science.169.3946.635", format: "text")
566
596
  #
567
- # # return an R bibentry type
597
+ # # return a bibentry type
568
598
  # Serrano.content_negotiation(ids: "10.1126/science.169.3946.635", format: "bibentry")
569
599
  # Serrano.content_negotiation(ids: "10.6084/m9.figshare.97218", format: "bibentry")
570
600
  #
@@ -577,30 +607,32 @@ module Serrano
577
607
  # Serrano.content_negotiation(ids: "10.1126/science.169.3946.635", format: "text", style: "oikos")
578
608
  #
579
609
  # # example with many DOIs
580
- # dois = cr_r(2)
581
- # Serrano.content_negotiation(dois, format: "text", style: "apa")
610
+ # dois = Serrano.random_dois(sample: 2)
611
+ # Serrano.content_negotiation(ids: dois, format: "text", style: "apa")
582
612
  #
583
613
  # # Using DataCite DOIs
584
- # ## some formats don't work
585
- # # Serrano.content_negotiation(ids: "10.5284/1011335", format: "text")
586
- # # Serrano.content_negotiation(ids: "10.5284/1011335", format: "crossref-xml")
587
- # # Serrano.content_negotiation(ids: "10.5284/1011335", format: "crossref-tdm")
614
+ # doi = "10.1126/science.169.3946.635"
615
+ # Serrano.content_negotiation(ids: doi, format: "text")
616
+ # Serrano.content_negotiation(ids: doi, format: "crossref-xml")
617
+ # Serrano.content_negotiation(ids: doi, format: "crossref-tdm")
588
618
  #
589
619
  # ## But most do work
590
- # Serrano.content_negotiation(ids: "10.5284/1011335", format: "datacite-xml")
591
- # Serrano.content_negotiation(ids: "10.5284/1011335", format: "rdf-xml")
592
- # Serrano.content_negotiation(ids: "10.5284/1011335", format: "turtle")
593
- # Serrano.content_negotiation(ids: "10.5284/1011335", format: "citeproc-json")
594
- # Serrano.content_negotiation(ids: "10.5284/1011335", format: "ris")
595
- # Serrano.content_negotiation(ids: "10.5284/1011335", format: "bibtex")
596
- # Serrano.content_negotiation(ids: "10.5284/1011335", format: "bibentry")
597
- # Serrano.content_negotiation(ids: "10.5284/1011335", format: "bibtex")
620
+ # Serrano.content_negotiation(ids: doi, format: "datacite-xml")
621
+ # Serrano.content_negotiation(ids: doi, format: "rdf-xml")
622
+ # Serrano.content_negotiation(ids: doi, format: "turtle")
623
+ # Serrano.content_negotiation(ids: doi, format: "citeproc-json")
624
+ # Serrano.content_negotiation(ids: doi, format: "ris")
625
+ # Serrano.content_negotiation(ids: doi, format: "bibtex")
626
+ # Serrano.content_negotiation(ids: doi, format: "bibentry")
627
+ # Serrano.content_negotiation(ids: doi, format: "bibtex")
598
628
  #
599
629
  # # many DOIs
600
- # dois = ['10.5167/UZH-30455','10.5167/UZH-49216','10.5167/UZH-503', '10.5167/UZH-38402','10.5167/UZH-41217']
630
+ # dois = ['10.5167/UZH-30455','10.5167/UZH-49216','10.5167/UZH-503',
631
+ # '10.5167/UZH-38402','10.5167/UZH-41217']
601
632
  # x = Serrano.content_negotiation(ids: dois)
602
633
  # puts x
603
- def self.content_negotiation(ids:, format: "bibtex", style: 'apa', locale: "en-US")
634
+ def self.content_negotiation(ids:, format: "bibtex", style: "apa", locale: "en-US")
635
+ ids = Array(ids).map { |x| ERB::Util.url_encode(x) }
604
636
  CNRequest.new(ids, format, style, locale).perform
605
637
  end
606
638
 
@@ -619,17 +651,16 @@ module Serrano
619
651
  # Serrano.citation_count(doi: "10.1016/j.fbr.2012.01.001")
620
652
  # # DOI not found
621
653
  # Serrano.citation_count(doi: "10.1016/j.fbr.2012")
622
- def self.citation_count(doi:, url: "http://www.crossref.org/openurl/",
654
+ def self.citation_count(doi:, url: "https://www.crossref.org/openurl/",
623
655
  key: "cboettig@ropensci.org", options: nil)
624
656
 
625
- args = { id: "doi:" + doi, pid: key, noredirect: true }
626
- opts = args.delete_if { |k, v| v.nil? }
627
- conn = Faraday.new(:url => url, :request => options)
628
- res = conn.get '', opts
657
+ args = {id: "doi:" + doi, pid: key, noredirect: true}
658
+ opts = args.delete_if { |_k, v| v.nil? }
659
+ conn = Faraday.new(url: url, request: options)
660
+ res = conn.get "", opts
629
661
  x = res.body
630
662
  oc = REXML::Document.new("<doc>#{x}</doc>")
631
- value = REXML::XPath.first(oc, '//query').attributes['fl_count'].to_i
632
- return value
663
+ REXML::XPath.first(oc, "//query").attributes["fl_count"].to_i
633
664
  end
634
665
 
635
666
  # Get csl styles
@@ -639,7 +670,25 @@ module Serrano
639
670
  # @example
640
671
  # Serrano.csl_styles
641
672
  def self.csl_styles
642
- get_styles()
673
+ fetch_styles
643
674
  end
644
675
 
676
+ def self.assert_valid_filters(filters)
677
+ unless filters.is_a? Hash
678
+ raise ArgumentError, <<~ERR
679
+ Filters must be provided as a hash, like:
680
+
681
+ Serrano.works(query: "something", filters: { has_abstract: true })
682
+ ERR
683
+ end
684
+
685
+ filters.each do |name, _|
686
+ filter_strings = Filters.names.map(&:to_s)
687
+ next if filter_strings.include?(name.to_s)
688
+
689
+ raise ArgumentError, <<~ERR
690
+ The filter "#{name}" is not a valid filter. Please run `Serrano.filters.filters` to see all valid filters.
691
+ ERR
692
+ end
693
+ end
645
694
  end
@@ -1,14 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "serrano/version"
2
4
  require "serrano/cnrequest"
3
5
 
4
6
  ##
5
7
  # ContentNegotiation - Content Negotiation class
6
8
  #
7
- # @see http://www.crosscite.org/cn/ for details
9
+ # @see https://citation.crosscite.org/docs.html for details
8
10
  module Serrano
9
-
10
11
  class ContentNegotiation
11
-
12
12
  attr_accessor :ids
13
13
  attr_accessor :format
14
14
  attr_accessor :style
@@ -22,9 +22,7 @@ module Serrano
22
22
  end
23
23
 
24
24
  def cn
25
- CNRequest.new(self.ids, self.format, self.style, self.locale).perform
25
+ CNRequest.new(ids, format, style, locale).perform
26
26
  end
27
-
28
27
  end
29
-
30
28
  end
@@ -1,10 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "faraday"
2
4
  require "faraday_middleware"
3
5
  require "multi_json"
4
6
  require "serrano/error"
5
- require "serrano/constants"
6
- require 'serrano/utils'
7
- require 'serrano/helpers/configuration'
7
+ require "serrano/utils"
8
+ require "serrano/helpers/configuration"
9
+
10
+ CN_FORMAT_HEADERS = {"rdf-xml" => "application/rdf+xml",
11
+ "turtle" => "text/turtle",
12
+ "citeproc-json" => "transform/application/vnd.citationstyles.csl+json",
13
+ "text" => "text/x-bibliography",
14
+ "ris" => "application/x-research-info-systems",
15
+ "bibtex" => "application/x-bibtex",
16
+ "crossref-xml" => "application/vnd.crossref.unixref+xml",
17
+ "datacite-xml" => "application/vnd.datacite.datacite+xml",
18
+ "bibentry" => "application/x-bibtex",
19
+ "crossref-tdm" => "application/vnd.crossref.unixsd+xml"}.freeze
8
20
 
9
21
  ##
10
22
  # Serrano::CNRequest
@@ -12,12 +24,16 @@ require 'serrano/helpers/configuration'
12
24
  # Class to perform HTTP requests to the Crossref API
13
25
  module Serrano
14
26
  class CNRequest #:nodoc:
15
-
16
27
  attr_accessor :ids
17
28
  attr_accessor :format
18
29
  attr_accessor :style
19
30
  attr_accessor :locale
20
31
 
32
+ CN_FORMATS = %w[rdf-xml turtle citeproc-json
33
+ citeproc-json-ish text ris bibtex
34
+ crossref-xml datacite-xml bibentry
35
+ crossref-tdm].freeze
36
+
21
37
  def initialize(ids, format, style, locale)
22
38
  self.ids = ids
23
39
  self.format = format
@@ -26,37 +42,35 @@ module Serrano
26
42
  end
27
43
 
28
44
  def perform
29
- if !$cn_formats.include? self.format
45
+ unless CN_FORMATS.include? format
30
46
  raise "format not one of accepted types"
31
47
  end
32
48
 
33
- $conn = Faraday.new "https://doi.org/" do |c|
49
+ conn = Faraday.new "https://doi.org/" do |c|
34
50
  c.use FaradayMiddleware::FollowRedirects
35
51
  c.adapter :net_http
36
52
  end
37
53
 
38
- if self.ids.length == 1
39
- if self.ids.class == Array
40
- self.ids = self.ids[0]
41
- end
42
- return make_request(self.ids, self.format, self.style, self.locale)
54
+ if ids.length == 1
55
+ self.ids = ids[0] if ids.class == Array
56
+ make_request(conn, ids, format, style, locale)
43
57
  else
44
58
  coll = []
45
- Array(self.ids).each do |x|
46
- coll << make_request(x, self.format, self.style, self.locale)
59
+ Array(ids).each do |x|
60
+ coll << make_request(conn, x, format, style, locale)
47
61
  end
48
- return coll
62
+ coll
49
63
  end
50
64
  end
51
65
  end
52
66
  end
53
67
 
54
- def make_request(ids, format, style, locale)
55
- type = $cn_format_headers.select { |x, _| x.include? format }.values[0]
68
+ def make_request(conn, ids, format, style, locale)
69
+ type = CN_FORMAT_HEADERS.select { |x, _| x.include? format }.values[0]
56
70
 
57
71
  if format == "citeproc-json"
58
- endpt = "http://api.crossref.org/works/" + ids + "/" + type
59
- cr_works = Faraday.new(:url => endpt)
72
+ endpt = "https://api.crossref.org/works/" + ids + "/" + type
73
+ cr_works = Faraday.new(url: endpt)
60
74
  cr_works.headers[:user_agent] = make_ua
61
75
  cr_works.headers["X-USER-AGENT"] = make_ua
62
76
  res = cr_works.get
@@ -65,15 +79,15 @@ def make_request(ids, format, style, locale)
65
79
  type = type + "; style = " + style + "; locale = " + locale
66
80
  end
67
81
 
68
- res = $conn.get do |req|
82
+ res = conn.get { |req|
69
83
  req.url ids
70
- req.headers['Accept'] = type
84
+ req.headers["Accept"] = type
71
85
  req.headers[:user_agent] = make_ua
72
86
  req.headers["X-USER-AGENT"] = make_ua
73
- end
87
+ }
74
88
  end
75
89
 
76
- return res.body
90
+ res.body
77
91
  end
78
92
 
79
93
  # parser <- cn_types[[self.format]]