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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +138 -17
- data/LICENSE +1 -1
- data/README.md +153 -45
- data/Rakefile +1 -1
- data/arx.gemspec +7 -5
- data/lib/arx.rb +29 -7
- data/lib/arx/categories.rb +30 -0
- data/lib/arx/cleaner.rb +2 -0
- data/lib/arx/entities/author.rb +48 -1
- data/lib/arx/entities/category.rb +46 -1
- data/lib/arx/entities/link.rb +1 -0
- data/lib/arx/entities/paper.rb +104 -13
- data/lib/arx/inspector.rb +2 -0
- data/lib/arx/query/query.rb +76 -18
- data/lib/arx/query/validate.rb +13 -0
- data/lib/arx/version.rb +1 -1
- metadata +51 -17
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
|
data/lib/arx/query/query.rb
CHANGED
@@ -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',
|
30
|
-
author: 'au',
|
31
|
-
abstract: 'abs',
|
32
|
-
comment: 'co',
|
33
|
-
journal: 'jr',
|
34
|
-
category: 'cat',
|
35
|
-
report: 'rn',
|
36
|
-
|
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
|
-
|
43
|
-
|
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!
|
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
|
-
|
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
|
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
|
-
|
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
|
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.
|
data/lib/arx/query/validate.rb
CHANGED
@@ -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
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.
|
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:
|
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: '
|
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: '
|
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: '
|
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: '
|
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:
|
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:
|
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
|
-
|
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@
|
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.
|
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: []
|