arx 1.0.0 → 1.3.0

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.
data/lib/arx/inspector.rb CHANGED
@@ -2,6 +2,7 @@ module Arx
2
2
 
3
3
  # Restricts +inspect+ to dump a whitelist of methods on an object.
4
4
  # It will always provide `object_id` at a minimum.
5
+ #
5
6
  # @private
6
7
  module Inspector
7
8
 
@@ -24,6 +25,7 @@ module Arx
24
25
  end
25
26
 
26
27
  # Defines helper +inspector_fields+ instance variable & method, and +inspector+ instance method on the target object.
28
+ #
27
29
  # @param [Object] source An arbitrary object (the object that +includes+ the +Inspector+ module).
28
30
  def included(source)
29
31
  inspected << source
@@ -12,7 +12,9 @@ module Arx
12
12
  search_query: 'search_query',
13
13
  id_list: 'id_list',
14
14
  sort_by: 'sortBy',
15
- sort_order: 'sortOrder'
15
+ sort_order: 'sortOrder',
16
+ start: 'start',
17
+ max_results: 'max_results',
16
18
  }
17
19
 
18
20
  # Logical connectives supported by the arXiv search API.
@@ -23,24 +25,27 @@ module Arx
23
25
  }
24
26
 
25
27
  # Supported fields for the search queries made to the arXiv search API.
28
+ #
26
29
  # @see https://arxiv.org/help/prep arXiv metadata fields
27
30
  # @see https://arxiv.org/help/api/user-manual#query_details arXiv user manual (query details)
28
31
  FIELDS = {
29
- title: 'ti', # Title
30
- author: 'au', # Author
31
- abstract: 'abs', # Abstract
32
- comment: 'co', # Comment
33
- journal: 'jr', # Journal reference
34
- category: 'cat', # Subject category
35
- report: 'rn', # Report number
36
- all: 'all' # All (of the above)
32
+ title: 'ti', # Title
33
+ author: 'au', # Author
34
+ abstract: 'abs', # Abstract
35
+ comment: 'co', # Comment
36
+ journal: 'jr', # Journal reference
37
+ category: 'cat', # Subject category
38
+ report: 'rn', # Report number
39
+ updated_at: 'lastUpdatedDate', # Last updated date
40
+ submitted_at: 'submittedDate', # Submission date
41
+ all: 'all' # All (of the above)
37
42
  }
38
43
 
39
44
  # Supported criteria for the +sortBy+ parameter.
40
45
  SORT_BY = {
41
46
  relevance: 'relevance',
42
- last_updated: 'lastUpdated',
43
- date_submitted: 'submittedDate'
47
+ updated_at: 'lastUpdatedDate',
48
+ submitted_at: 'submittedDate'
44
49
  }
45
50
 
46
51
  # Supported criteria for the +sortOrder+ parameter.
@@ -54,8 +59,10 @@ module Arx
54
59
  # @param ids [Array<String>] The IDs of the arXiv papers to restrict the query to.
55
60
  # @param sort_by [Symbol] The sorting criteria for the returned results (see {SORT_BY}).
56
61
  # @param sort_order [Symbol] The sorting order for the returned results (see {SORT_ORDER}).
62
+ # @param start [Integer] The index of the first returned result.
63
+ # @param max_results [Integer] The number of results returned by the query
57
64
  # @return [Query] The initialized query object.
58
- def initialize(*ids, sort_by: :relevance, sort_order: :descending)
65
+ def initialize(*ids, sort_by: :relevance, sort_order: :descending, start: 0, max_results: 10)
59
66
  @query = String.new
60
67
 
61
68
  Validate.sort_by sort_by, permitted: SORT_BY.keys
@@ -64,9 +71,12 @@ module Arx
64
71
  Validate.sort_order sort_order, permitted: SORT_ORDER.keys
65
72
  @query << "&#{PARAMS[:sort_order]}=#{SORT_ORDER[sort_order]}"
66
73
 
74
+ Validate.paging start, max_results
75
+ @query << "&#{PARAMS[:start]}=#{start}&#{PARAMS[:max_results]}=#{max_results}"
76
+
67
77
  ids.flatten!
68
78
  unless ids.empty?
69
- ids.map! &Cleaner.method(:extract_id)
79
+ ids.map! {|id| Cleaner.extract_id(id, version: true)}
70
80
  @query << "&#{PARAMS[:id_list]}=#{ids * ','}"
71
81
  end
72
82
 
@@ -75,16 +85,19 @@ module Arx
75
85
 
76
86
  # @!method and
77
87
  # Logical conjunction (+AND+) of subqueries.
88
+ #
78
89
  # @see https://arxiv.org/help/api/user-manual#query_details arXiv user manual
79
90
  # @return [self]
80
91
 
81
92
  # @!method and_not
82
93
  # Logical negated conjunction (+ANDNOT+) of subqueries.
94
+ #
83
95
  # @see https://arxiv.org/help/api/user-manual#query_details arXiv user manual
84
96
  # @return [self]
85
97
 
86
98
  # @!method or
87
99
  # Logical disjunction (+OR+) of subqueries.
100
+ #
88
101
  # @see https://arxiv.org/help/api/user-manual#query_details arXiv user manual
89
102
  # @return [self]
90
103
 
@@ -94,6 +107,7 @@ module Arx
94
107
 
95
108
  # @!method title(*values, exact: true, connective: :and)
96
109
  # Search for papers by {https://arxiv.org/help/prep#title title}.
110
+ #
97
111
  # @param values [Array<String>] Title(s) of papers to search for.
98
112
  # @param exact [Boolean] Whether to search for an exact match of the title(s).
99
113
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
@@ -101,6 +115,7 @@ module Arx
101
115
 
102
116
  # @!method author(*values, exact: true, connective: :and)
103
117
  # Search for papers by {https://arxiv.org/help/prep#author author}.
118
+ #
104
119
  # @param values [Array<String>] Author(s) of papers to search for.
105
120
  # @param exact [Boolean] Whether to search for an exact match of the author's name(s).
106
121
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
@@ -108,6 +123,7 @@ module Arx
108
123
 
109
124
  # @!method abstract(*values, exact: true, connective: :and)
110
125
  # Search for papers by {https://arxiv.org/help/prep#abstract abstract}.
126
+ #
111
127
  # @param values [Array<String>] Abstract(s) of papers to search for.
112
128
  # @param exact [Boolean] Whether to search for an exact match of the abstract(s).
113
129
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
@@ -115,6 +131,7 @@ module Arx
115
131
 
116
132
  # @!method comment(*values, exact: true, connective: :and)
117
133
  # Search for papers by {https://arxiv.org/help/prep#comments comment}.
134
+ #
118
135
  # @param values [Array<String>] Comment(s) of papers to search for.
119
136
  # @param exact [Boolean] Whether to search for an exact match of the comment(s).
120
137
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
@@ -122,6 +139,7 @@ module Arx
122
139
 
123
140
  # @!method journal(*values, exact: true, connective: :and)
124
141
  # Search for papers by {https://arxiv.org/help/prep#journal journal reference}.
142
+ #
125
143
  # @param values [Array<String>] Journal reference(s) of papers to search for.
126
144
  # @param exact [Boolean] Whether to search for an exact match of the journal refernece(s).
127
145
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
@@ -129,25 +147,43 @@ module Arx
129
147
 
130
148
  # @!method category(*values, connective: :and)
131
149
  # Search for papers by {https://arxiv.org/help/prep#category category}.
150
+ #
132
151
  # @param values [Array<String>] Category(s) of papers to search for.
133
152
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
134
153
  # @return [self]
135
154
 
136
155
  # @!method report(*values, connective: :and)
137
156
  # Search for papers by {https://arxiv.org/help/prep#report report number}.
157
+ #
138
158
  # @param values [Array<String>] Report number(s) of papers to search for.
139
159
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
140
160
  # @return [self]
141
161
 
162
+ # @!method updated_at(*values, connective: :and)
163
+ # Search for papers by lastUpdatedDate.
164
+ #
165
+ # @param values [Array<String>] lastUpdatedDate (string or range) of papers to search for.
166
+ # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
167
+ # @return [self]
168
+
169
+ # @!method submitted_at(*values, connective: :and)
170
+ # Search for papers by submittedDate.
171
+ #
172
+ # @param values [Array<String>] submittedDate (string or range) of papers to search for.
173
+ # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
174
+ # @return [self]
175
+
142
176
  # @!method all(*values, exact: true, connective: :and)
143
177
  # Search for papers by all fields (see {FIELDS}).
178
+ #
144
179
  # @param values [Array<String>] Field value(s) of papers to search for.
145
180
  # @param exact [Boolean] Whether to search for an exact match of the comment(s).
146
181
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
147
182
  # @return [self]
148
183
 
149
184
  FIELDS.each do |name, field|
150
- define_method(name) do |*values, exact: true, connective: :and|
185
+ _exact = ![:updated_at, :submitted_at].include?(name)
186
+ define_method(name) do |*values, exact: _exact, connective: :and|
151
187
  return if values.empty?
152
188
 
153
189
  values.flatten!
@@ -173,6 +209,20 @@ module Arx
173
209
  end
174
210
  end
175
211
 
212
+ # Creates a nested subquery (grouped statements with parentheses).
213
+ #
214
+ # @return [self]
215
+ def group
216
+ add_connective :and unless end_with_connective?
217
+ @query << (search_query? ? '+' : "&#{PARAMS[:search_query]}=")
218
+
219
+ @query << CGI.escape('(')
220
+ yield
221
+ @query << CGI.escape(')')
222
+
223
+ self
224
+ end
225
+
176
226
  # Returns the query string.
177
227
  #
178
228
  # @return [String]
@@ -189,7 +239,7 @@ module Arx
189
239
  # @return [self]
190
240
  def add_connective(connective)
191
241
  if search_query?
192
- @query << "+#{CONNECTIVES[connective]}" unless ends_with_connective?
242
+ @query << "+#{CONNECTIVES[connective]}" unless end_with_connective? || start_of_group?
193
243
  end
194
244
  self
195
245
  end
@@ -198,9 +248,10 @@ module Arx
198
248
  #
199
249
  # @param subquery [String] The subquery to add.
200
250
  def add_subquery(subquery)
251
+ add_connective :and unless end_with_connective?
252
+
201
253
  if search_query?
202
- add_connective :and unless ends_with_connective?
203
- @query << "+#{subquery}"
254
+ @query << (start_of_group? ? "#{subquery}" : "+#{subquery}")
204
255
  else
205
256
  @query << "&#{PARAMS[:search_query]}=#{subquery}"
206
257
  end
@@ -218,10 +269,17 @@ module Arx
218
269
  #
219
270
  # @see CONNECTIVES
220
271
  # @return [Boolean]
221
- def ends_with_connective?
272
+ def end_with_connective?
222
273
  CONNECTIVES.values.any? &@query.method(:end_with?)
223
274
  end
224
275
 
276
+ # Whether the query string ends in a start-of-group character '('.
277
+ #
278
+ # @return [Boolean]
279
+ def start_of_group?
280
+ @query.end_with? CGI.escape('(')
281
+ end
282
+
225
283
  # Parenthesizes a string with CGI-escaped parentheses.
226
284
  #
227
285
  # @param string [String] The string to parenthesize.
@@ -1,6 +1,7 @@
1
1
  module Arx
2
2
 
3
3
  # Validations for arXiv search query fields and identifier schemes.
4
+ #
4
5
  # @private
5
6
  module Validate
6
7
  class << self
@@ -28,6 +29,18 @@ module Arx
28
29
  raise ArgumentError.new("Expected `sort_order` to be one of #{permitted}, got: #{value}") unless permitted.include? value
29
30
  end
30
31
 
32
+ # Validates the paging fields of the query string: +start+ and +max_results+.
33
+ #
34
+ # @param start [Integer] The start value to validate.
35
+ # @param max_results [Integer] The max_results value to validate.
36
+ # @raise
37
+ # [TypeError] If the value of +start+ is not an +Integer+.
38
+ # [TypeError] If the value of +max_results+ is not an +Integer+.
39
+ def paging(start, max_results)
40
+ raise TypeError.new("Expected `start` to be an Integer, got: #{start.class}") unless start.is_a? Integer
41
+ raise TypeError.new("Expected `max_results` to be an Integer, got: #{max_results.class}") unless max_results.is_a? Integer
42
+ end
43
+
31
44
  # Validates a list of arXiv paper identifiers.
32
45
  #
33
46
  # @param ids [Array<String>] The identifiers to validate.
data/lib/arx/version.rb CHANGED
@@ -5,7 +5,7 @@ module Arx
5
5
  # The current version of Arx.
6
6
  VERSION = {
7
7
  major: 1,
8
- minor: 0,
8
+ minor: 3,
9
9
  patch: 0,
10
10
  meta: nil,
11
11
  }.compact.values.join('.').freeze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edwin Onuonga
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-08 00:00:00.000000000 Z
11
+ date: 2021-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -42,44 +42,44 @@ dependencies:
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '2.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '2.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '12.3'
61
+ version: '13.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '12.3'
68
+ version: '13.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: thor
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.20'
75
+ version: 0.20.3
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.20'
82
+ version: 0.20.3
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -94,9 +94,43 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.7'
97
- description:
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.8.23
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.8.23
111
+ - !ruby/object:Gem::Dependency
112
+ name: yard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.9'
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 0.9.10
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '0.9'
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 0.9.10
131
+ description:
98
132
  email:
99
- - ed@mail.eonu.net
133
+ - ed@eonu.net
100
134
  executables: []
101
135
  extensions: []
102
136
  extra_rdoc_files: []
@@ -128,13 +162,13 @@ metadata:
128
162
  documentation_uri: https://www.rubydoc.info/github/eonu/arx/master/toplevel
129
163
  bug_tracker_uri: https://github.com/eonu/arx/issues
130
164
  changelog_uri: https://github.com/eonu/arx/blob/master/CHANGELOG.md
131
- post_install_message:
165
+ post_install_message:
132
166
  rdoc_options: []
133
167
  require_paths:
134
168
  - lib
135
169
  required_ruby_version: !ruby/object:Gem::Requirement
136
170
  requirements:
137
- - - "~>"
171
+ - - ">="
138
172
  - !ruby/object:Gem::Version
139
173
  version: '2.5'
140
174
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -143,8 +177,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
177
  - !ruby/object:Gem::Version
144
178
  version: '0'
145
179
  requirements: []
146
- rubygems_version: 3.0.3
147
- signing_key:
180
+ rubygems_version: 3.1.2
181
+ signing_key:
148
182
  specification_version: 4
149
183
  summary: A Ruby interface for querying academic papers on the arXiv search API.
150
184
  test_files: []