serrano 0.3.6 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # taken from: https://viget.com/extend/easy-gem-configuration-variables-with-defaults
2
4
  module Configuration
3
-
4
5
  def configuration
5
6
  yield self
6
7
  end
@@ -22,5 +23,4 @@ module Configuration
22
23
  define_method name, &block
23
24
  end
24
25
  end
25
-
26
26
  end
@@ -1,7 +1,9 @@
1
- require "faraday"
2
- require "multi_json"
3
- require "serrano/error"
4
- require "serrano/constants"
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'faraday'
5
+ require 'multi_json'
6
+ require 'serrano/error'
5
7
  require 'serrano/utils'
6
8
  require 'serrano/helpers/configuration'
7
9
 
@@ -11,7 +13,6 @@ require 'serrano/helpers/configuration'
11
13
  # Class to perform HTTP requests to the Crossref API
12
14
  module Serrano
13
15
  class Request #:nodoc:
14
-
15
16
  attr_accessor :endpt
16
17
  attr_accessor :id
17
18
  attr_accessor :query
@@ -22,14 +23,15 @@ module Serrano
22
23
  attr_accessor :sort
23
24
  attr_accessor :order
24
25
  attr_accessor :facet
26
+ attr_accessor :select
25
27
  attr_accessor :works
26
28
  attr_accessor :agency
27
29
  attr_accessor :options
28
30
  attr_accessor :verbose
29
31
 
30
32
  def initialize(endpt, id, query, filter, offset,
31
- limit, sample, sort, order, facet, works, agency,
32
- options, verbose)
33
+ limit, sample, sort, order, facet, select,
34
+ works, agency, options, verbose)
33
35
 
34
36
  self.endpt = endpt
35
37
  self.id = id
@@ -41,6 +43,7 @@ module Serrano
41
43
  self.sort = sort
42
44
  self.order = order
43
45
  self.facet = facet
46
+ self.select = select
44
47
  self.works = works
45
48
  self.agency = agency
46
49
  self.options = options
@@ -48,49 +51,53 @@ module Serrano
48
51
  end
49
52
 
50
53
  def perform
51
- filt = filter_handler(self.filter)
54
+ filt = filter_handler(filter)
52
55
 
53
- args = { query: self.query, filter: filt, offset: self.offset,
54
- rows: self.limit, sample: self.sample, sort: self.sort,
55
- order: self.order, facet: self.facet }
56
- opts = args.delete_if { |k, v| v.nil? }
56
+ self.select = select.join(',') if select && select.class == Array
57
57
 
58
- if verbose
59
- conn = Faraday.new(:url => Serrano.base_url, :request => options || []) do |f|
60
- f.response :logger
61
- f.adapter Faraday.default_adapter
62
- f.use FaradayMiddleware::RaiseHttpException
63
- end
64
- else
65
- conn = Faraday.new(:url => Serrano.base_url, :request => options || []) do |f|
66
- f.adapter Faraday.default_adapter
67
- f.use FaradayMiddleware::RaiseHttpException
68
- end
69
- end
58
+ args = { query: query, filter: filt, offset: offset,
59
+ rows: limit, sample: sample, sort: sort,
60
+ order: order, facet: facet,
61
+ select: select }
62
+ opts = args.delete_if { |_k, v| v.nil? }
63
+
64
+ conn = if verbose
65
+ Faraday.new(url: Serrano.base_url, request: options || []) do |f|
66
+ f.response :logger
67
+ f.use FaradayMiddleware::RaiseHttpException
68
+ f.adapter Faraday.default_adapter
69
+ end
70
+ else
71
+ Faraday.new(url: Serrano.base_url, request: options || []) do |f|
72
+ f.use FaradayMiddleware::RaiseHttpException
73
+ f.adapter Faraday.default_adapter
74
+ end
75
+ end
70
76
 
71
77
  conn.headers[:user_agent] = make_ua
72
- conn.headers["X-USER-AGENT"] = make_ua
78
+ conn.headers['X-USER-AGENT'] = make_ua
73
79
 
74
- if self.id.nil?
75
- res = conn.get self.endpt, opts
76
- return MultiJson.load(res.body)
80
+ if id.nil?
81
+ res = conn.get endpt, opts
82
+ MultiJson.load(res.body)
77
83
  else
84
+ self.id = Array(id)
85
+ # url encoding
86
+ self.id = id.map { |x| ERB::Util.url_encode(x) }
78
87
  coll = []
79
- Array(self.id).each do |x|
80
- if self.works
81
- endpt = self.endpt + '/' + x.to_s + "/works"
82
- else
83
- if self.agency
84
- endpt = self.endpt + '/' + x.to_s + "/agency"
85
- else
86
- endpt = self.endpt + '/' + x.to_s
87
- end
88
- end
88
+ id.each do |x|
89
+ endpt = if works
90
+ self.endpt + '/' + x.to_s + '/works'
91
+ elsif agency
92
+ self.endpt + '/' + x.to_s + '/agency'
93
+ else
94
+ self.endpt + '/' + x.to_s
95
+ end
89
96
 
90
97
  res = conn.get endpt, opts
91
98
  coll << MultiJson.load(res.body)
92
99
  end
93
- return coll
100
+ coll
94
101
  end
95
102
  end
96
103
  end
@@ -1,8 +1,10 @@
1
- require "faraday"
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'faraday'
2
5
  require 'faraday_middleware'
3
- require "multi_json"
4
- require "serrano/error"
5
- require "serrano/constants"
6
+ require 'multi_json'
7
+ require 'serrano/error'
6
8
  require 'serrano/helpers/configuration'
7
9
  require 'serrano/filterhandler'
8
10
  require 'serrano/error'
@@ -15,7 +17,6 @@ require 'serrano/utils'
15
17
  # Class to perform HTTP requests to the Crossref API
16
18
  module Serrano
17
19
  class RequestCursor #:nodoc:
18
-
19
20
  attr_accessor :endpt
20
21
  attr_accessor :id
21
22
  attr_accessor :query
@@ -26,6 +27,7 @@ module Serrano
26
27
  attr_accessor :sort
27
28
  attr_accessor :order
28
29
  attr_accessor :facet
30
+ attr_accessor :select
29
31
  attr_accessor :works
30
32
  attr_accessor :agency
31
33
  attr_accessor :options
@@ -35,8 +37,9 @@ module Serrano
35
37
  attr_accessor :args
36
38
 
37
39
  def initialize(endpt, id, query, filter, offset,
38
- limit, sample, sort, order, facet, works, agency,
39
- options, verbose, cursor, cursor_max, args)
40
+ limit, sample, sort, order, facet, select,
41
+ works, agency, options, verbose, cursor,
42
+ cursor_max, args)
40
43
 
41
44
  self.endpt = endpt
42
45
  self.id = id
@@ -48,6 +51,7 @@ module Serrano
48
51
  self.sort = sort
49
52
  self.order = order
50
53
  self.facet = facet
54
+ self.select = select
51
55
  self.works = works
52
56
  self.agency = agency
53
57
  self.options = options
@@ -58,86 +62,89 @@ module Serrano
58
62
  end
59
63
 
60
64
  def perform
61
- filt = filter_handler(self.filter)
62
- fieldqueries = field_query_handler(self.args)
65
+ filt = filter_handler(filter)
66
+ fieldqueries = field_query_handler(args)
67
+ self.select = select.join(',') if select && select.class == Array
63
68
 
64
- if self.cursor_max.class != nil
65
- if self.cursor_max.class != Fixnum
66
- raise "cursor_max must be of class int"
67
- end
69
+ unless cursor_max.class.nil?
70
+ raise 'cursor_max must be of class int' unless cursor_max.is_a?(Integer)
68
71
  end
69
72
 
70
- arguments = { query: self.query, filter: filt, offset: self.offset,
71
- rows: self.limit, sample: self.sample, sort: self.sort,
72
- order: self.order, facet: self.facet, cursor: self.cursor }.tostrings
73
+ arguments = { query: query, filter: filt, offset: offset,
74
+ rows: limit, sample: sample, sort: sort,
75
+ order: order, facet: facet, select: select,
76
+ cursor: cursor }.tostrings
73
77
  arguments = arguments.merge(fieldqueries)
74
- opts = arguments.delete_if { |k, v| v.nil? }
78
+ opts = arguments.delete_if { |_k, v| v.nil? }
75
79
 
76
- if verbose
77
- $conn = Faraday.new(:url => Serrano.base_url, :request => options || []) do |f|
78
- f.response :logger
79
- f.adapter Faraday.default_adapter
80
- f.use FaradayMiddleware::RaiseHttpException
81
- end
82
- else
83
- $conn = Faraday.new(:url => Serrano.base_url, :request => options || []) do |f|
84
- f.adapter Faraday.default_adapter
85
- f.use FaradayMiddleware::RaiseHttpException
86
- end
87
- end
80
+ conn = if verbose
81
+ Faraday.new(url: Serrano.base_url, request: options || []) do |f|
82
+ f.response :logger
83
+ f.use FaradayMiddleware::RaiseHttpException
84
+ f.adapter Faraday.default_adapter
85
+ end
86
+ else
87
+ Faraday.new(url: Serrano.base_url, request: options || []) do |f|
88
+ f.use FaradayMiddleware::RaiseHttpException
89
+ f.adapter Faraday.default_adapter
90
+ end
91
+ end
88
92
 
89
- $conn.headers[:user_agent] = make_ua
90
- $conn.headers["X-USER-AGENT"] = make_ua
93
+ conn.headers[:user_agent] = make_ua
94
+ conn.headers['X-USER-AGENT'] = make_ua
91
95
 
92
- if self.id.nil?
93
- js = self._req(self.endpt, opts)
96
+ if id.nil?
97
+ endpt2 = endpt
98
+ js = _req(conn, endpt, opts)
94
99
  cu = js['message']['next-cursor']
95
100
  max_avail = js['message']['total-results']
96
- res = self._redo_req(js, opts, cu, max_avail)
97
- return res
101
+ res = _redo_req(conn, js, opts, cu, max_avail)
102
+ res
98
103
  else
104
+ self.id = Array(id)
105
+ # url encoding
106
+ self.id = id.map { |x| ERB::Util.url_encode(x) }
99
107
  coll = []
100
- Array(self.id).each do |x|
101
- if self.works
102
- $endpt2 = self.endpt + '/' + x.to_s + "/works"
103
- else
104
- if self.agency
105
- $endpt2 = self.endpt + '/' + x.to_s + "/agency"
106
- else
107
- $endpt2 = self.endpt + '/' + x.to_s
108
- end
109
- end
108
+ id.each do |x|
109
+ endpt2 = if works
110
+ endpt + '/' + x.to_s + '/works'
111
+ else
112
+ endpt2 = if agency
113
+ endpt + '/' + x.to_s + '/agency'
114
+ else
115
+ endpt + '/' + x.to_s
116
+ end
117
+ end
110
118
 
111
- js = self._req($endpt2, opts)
119
+ js = _req(conn, endpt2, opts)
112
120
  cu = js['message']['next-cursor']
113
121
  max_avail = js['message']['total-results']
114
- coll << self._redo_req(js, opts, cu, max_avail)
122
+ coll << _redo_req(conn, js, opts, cu, max_avail)
115
123
  end
116
- return coll
124
+ coll
117
125
  end
118
126
  end
119
127
 
120
- def _redo_req(js, opts, cu, max_avail)
121
- if !cu.nil? and self.cursor_max > js['message']['items'].length
128
+ def _redo_req(conn, js, opts, cu, max_avail)
129
+ if !cu.nil? && (cursor_max > js['message']['items'].length)
122
130
  res = [js]
123
131
  total = js['message']['items'].length
124
- while !cu.nil? and self.cursor_max > total and total < max_avail do
132
+ while !cu.nil? && (cursor_max > total) && (total < max_avail)
125
133
  opts[:cursor] = cu
126
- out = self._req($endpt2, opts)
134
+ out = _req(conn, endpt2, opts)
127
135
  cu = out['message']['next-cursor']
128
136
  res << out
129
- total = res.collect {|x| x['message']['items'].length}.reduce(0, :+)
137
+ total = res.collect { |x| x['message']['items'].length }.reduce(0, :+)
130
138
  end
131
- return res
139
+ res
132
140
  else
133
- return js
141
+ js
134
142
  end
135
143
  end
136
144
 
137
- def _req(path, opts)
138
- res = $conn.get path, opts
139
- return MultiJson.load(res.body)
145
+ def _req(conn, path, opts)
146
+ res = conn.get path, opts
147
+ MultiJson.load(res.body)
140
148
  end
141
-
142
149
  end
143
150
  end
@@ -1,23 +1,28 @@
1
- require "faraday"
2
- require "multi_json"
1
+ # frozen_string_literal: true
3
2
 
4
- def get_styles
5
- base = "https://api.github.com/repos/citation-style-language/styles"
6
- conn = Faraday.new(:url => base)
3
+ require 'faraday'
4
+ require 'multi_json'
5
+
6
+ def fetch_styles
7
+ base = 'https://api.github.com/repos/citation-style-language/styles'
8
+ conn = Faraday.new(url: base) do |f|
9
+ f.use FaradayMiddleware::RaiseHttpException
10
+ f.adapter Faraday.default_adapter
11
+ end
7
12
  args = { per_page: 1 }
8
13
  tt = conn.get 'commits', args
9
14
  commres = MultiJson.load(tt.body)
10
15
  sha = commres[0]['sha']
11
- sty = conn.get "git/trees/" + sha
16
+ sty = conn.get 'git/trees/' + sha
12
17
  res = MultiJson.load(sty.body)
13
18
  files = res['tree'].collect { |x| x['path'] }
14
- matches = files.collect { |x|
19
+ matches = files.collect do |x|
15
20
  if x.match('csl').nil?
16
21
  nil
17
22
  else
18
23
  x.match('csl').string
19
24
  end
20
- }
25
+ end
21
26
  csls = matches.compact
22
- return csls.collect { |z| z.gsub('.csl', '') }
27
+ csls.collect { |z| z.gsub('.csl', '') }
23
28
  end
@@ -1,29 +1,36 @@
1
+ # frozen_string_literal: true
2
+
1
3
  def make_ua
2
- requa = 'Faraday/v' + Faraday::VERSION
4
+ requa = 'Faraday/v' + Faraday::VERSION
3
5
  habua = 'Serrano/v' + Serrano::VERSION
4
- return requa + ' ' + habua
6
+ ua = requa + ' ' + habua
7
+ if Serrano.mailto
8
+ ua = ua + " (mailto:%s)" % Serrano.mailto
9
+ end
10
+ # ua += format(' (mailto:%s)', Serrano.mailto) if Serrano.mailto
11
+ ua
5
12
  end
6
13
 
7
14
  def field_query_handler(x)
8
- tmp = x.keep_if { |z| z.match(/query_/) }
9
- return rename_query_filters(tmp)
15
+ tmp = x.keep_if { |z| z.match(/query_/) }
16
+ rename_query_filters(tmp)
10
17
  end
11
18
 
12
19
  def rename_query_filters(foo)
13
- foo = foo.tostrings
14
- foo = foo.map { |x,y| [x.to_s.sub('container_title', 'container-title'), y] }.to_h
15
- foo = foo.map { |x,y| [x.to_s.sub('query_', 'query.'), y] }.to_h
16
- return foo
20
+ foo = foo.tostrings
21
+ foo = foo.map { |x, y| [x.to_s.sub('container_title', 'container-title'), y] }.to_h
22
+ foo = foo.map { |x, y| [x.to_s.sub('query_', 'query.'), y] }.to_h
23
+ foo
17
24
  end
18
25
 
19
26
  class Hash
20
- def tostrings
21
- Hash[self.map{|(k,v)| [k.to_s,v]}]
22
- end
27
+ def tostrings
28
+ Hash[map { |(k, v)| [k.to_s, v] }]
29
+ end
23
30
  end
24
31
 
25
32
  class Hash
26
- def tosymbols
27
- Hash[self.map{|(k,v)| [k.to_sym,v]}]
28
- end
33
+ def tosymbols
34
+ Hash[map { |(k, v)| [k.to_sym, v] }]
35
+ end
29
36
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Serrano
2
- VERSION = "0.3.6"
4
+ VERSION = '0.6.2'
3
5
  end
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'serrano/version'
5
6
 
@@ -7,32 +8,44 @@ Gem::Specification.new do |s|
7
8
  s.name = 'serrano'
8
9
  s.version = Serrano::VERSION
9
10
  s.platform = Gem::Platform::RUBY
10
- s.required_ruby_version = '>= 2.0'
11
- s.date = '2017-04-04'
12
- s.summary = "Crossref Client"
13
- s.description = "Low Level Ruby Client for the Crossref Search API"
14
- s.authors = "Scott Chamberlain"
11
+ s.required_ruby_version = '>= 2.1'
12
+ s.date = '2020-05-29'
13
+ s.summary = 'Crossref Client'
14
+ s.description = 'Low Level Ruby Client for the Crossref Search API'
15
+ s.authors = 'Scott Chamberlain'
15
16
  s.email = 'myrmecocystus@gmail.com'
16
17
  s.homepage = 'https://github.com/sckott/serrano'
17
18
  s.licenses = 'MIT'
18
19
 
19
- s.files = `git ls-files -z`.split("\x0").reject {|f| f.match(%r{^(test|spec|features)/}) }
20
- s.require_paths = ["lib"]
20
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f.match(%r{^(test|spec|features)/})
22
+ end
23
+ s.require_paths = ['lib']
21
24
 
22
25
  s.bindir = 'bin'
23
26
  s.executables = ['serrano']
24
27
 
25
- s.add_development_dependency 'bundler', '~> 1.14', '>= 1.14.6'
26
- s.add_development_dependency 'rake', '~> 12.0', '>= 12.0.0'
27
- s.add_development_dependency 'test-unit', '~> 3.2', '>= 3.2.1'
28
- s.add_development_dependency 'simplecov', '~> 0.14.1'
28
+ s.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.2'
29
29
  s.add_development_dependency 'codecov', '~> 0.1.10'
30
- s.add_development_dependency 'json', '~> 2.0', '>= 2.0.3'
31
- s.add_development_dependency 'vcr', '~> 3.0', '>= 3.0.3'
32
- s.add_development_dependency 'webmock', '~> 2.3', '>= 2.3.2'
30
+ s.add_development_dependency 'json', '~> 2.1'
31
+ s.add_development_dependency 'rake', '>= 12.3.1', '~> 13.0'
32
+ s.add_development_dependency 'rubocop', '~> 0.84.0'
33
+ s.add_development_dependency 'simplecov', '~> 0.18.5'
34
+ s.add_development_dependency 'test-unit', '~> 3.2', '>= 3.2.7'
35
+ s.add_development_dependency 'vcr', '~> 6.0'
36
+ s.add_development_dependency 'webmock', '~> 3.4', '>= 3.4.1'
37
+
38
+ s.add_runtime_dependency 'faraday', '~> 1.0', '>= 1.0.1'
39
+ s.add_runtime_dependency 'faraday_middleware', '~> 1.0'
40
+ s.add_runtime_dependency 'multi_json', '~> 1.13', '>= 1.13.1'
41
+ s.add_runtime_dependency 'thor', '>= 0.20', '< 1.1'
33
42
 
34
- s.add_runtime_dependency 'faraday', '~> 0.12.0.1'
35
- s.add_runtime_dependency 'faraday_middleware', '~> 0.11.0.1'
36
- s.add_runtime_dependency 'thor', '~> 0.19.4'
37
- s.add_runtime_dependency 'multi_json', '~> 1.12', '>= 1.12.1'
43
+ s.metadata = {
44
+ 'homepage_uri' => 'https://github.com/sckott/serrano',
45
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/serrano',
46
+ 'changelog_uri' =>
47
+ "https://github.com/sckott/serrano/releases/tag/v#{s.version}",
48
+ 'source_code_uri' => 'https://github.com/sckott/serrano',
49
+ 'bug_tracker_uri' => 'https://github.com/sckott/serrano/issues'
50
+ }
38
51
  end