arx 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1dae69d65fb2846820e6c457a10c5249a210ddfb551bd9cf7311562b1071da08
4
- data.tar.gz: d32adc9bf13a8e6d6cf0a1394d76f2a03b0406530f58b6a68604b66dda71a312
3
+ metadata.gz: 6530eb98d35658cacb54768f8a310e1c8f0ca7ecaf20fd816624e25ef69bd92a
4
+ data.tar.gz: 0e62e301e3c5eee07403f99c9b0cd0503716afc59b45b1a92404286ccbf58ce5
5
5
  SHA512:
6
- metadata.gz: 8f2af67fbe94f57dbfc5883dccd0bd74e023cfe400e4a8caecf95de0034646c3544e3f07b21787f0cd6fcc1eb7accb49328d60b8922a3b0d2cbacbc094106cbb
7
- data.tar.gz: 3e73cc8f30205c8077c945221f719186fc4c1ee6945a8cc9d5e1d8221d8075083eebc79b74c698559c98355b0513a76888b8e1bef65b424ca5be2eb4d1d82561
6
+ metadata.gz: d287f54c864acb1e03e9993e76f5b726ac1e3a382b3543b13f3bff8fb762464018d289c7645fbf2ac7047670f232e0e5580addcb06bf9fa5dbc92ec75e21872d
7
+ data.tar.gz: 8b4909da8e6fa1966b7acc78cef78164da9efda370cff81fbbbd90a49f525d496dd1a0a598b085c61fd4158aa077ba341106d35e937c748fc90c0f081d2b9766
data/CHANGELOG.md CHANGED
@@ -1,11 +1,28 @@
1
- # 1.2.1
1
+ ## 1.3.0
2
2
 
3
- #### Major changes
3
+ ### Major changes
4
+
5
+ - Add support for paging. ([#92](https://github.com/eonu/arx/pull/92) by @xuanxu)
6
+ - Allow searching by `last_updated_date`. ([#93](https://github.com/eonu/arx/pull/93) by @xuanxu)
7
+ - Add `submitted_at` for submission date querying. ([#97](https://github.com/eonu/arx/pull/97))<br/>
8
+ This also changes `last_updated_date` from #93 to `updated_at`, and similarly for the `last_updated` and `date_submitted` [sort-by criteria](https://github.com/eonu/arx/blob/3d093658579fb2d99b92f0feedb2aa790a22e2c8/lib/arx/query/query.rb#L43).
9
+
10
+ ### Minor changes
11
+
12
+ - Update `Arx()` to match new `Arx.search` signature (from #92). ([#94](https://github.com/eonu/arx/pull/94))
13
+ - Change incorrect `lastUpdated` sort-by criterion to `lastUpdatedDate`. ([#96](https://github.com/eonu/arx/pull/96))
14
+ - Add `to_s` methods for `Arx::Paper`, `Arx::Author` and `Arx::Category`. ([#99](https://github.com/eonu/arx/pull/99))
15
+ - Add fix for JSON warning in Ruby >=2.7. ([#101](https://github.com/eonu/arx/pull/101))
16
+ - Add contributors section to `README.md`. ([#102](https://github.com/eonu/arx/pull/102))
17
+
18
+ ## 1.2.1
19
+
20
+ ### Major changes
4
21
 
5
22
  - Add support for saving PDFs with `Paper#save` (see #81). ([#90](https://github.com/eonu/arx/pull/90))
6
23
  - Change gem Ruby version specifier from `~> 2.5` to `>= 2.5`. ([#86](https://github.com/eonu/arx/pull/86))
7
24
 
8
- #### Minor changes
25
+ ### Minor changes
9
26
 
10
27
  - Remove arXiv logo from `README.md`. ([#87](https://github.com/eonu/arx/pull/87))
11
28
  - Use `URI.open` instead of `Kernel.open` (see #82). ([#86](https://github.com/eonu/arx/pull/86))
@@ -16,9 +33,9 @@
16
33
  - Update specs using paper `1710.02185` to account for revision and acceptance by journal (_congratulations!_). ([#76](https://github.com/eonu/arx/pull/76))
17
34
  - Update email address in `LICENSE.md`. ([#73](https://github.com/eonu/arx/pull/73))
18
35
 
19
- # 1.2.0
36
+ ## 1.2.0
20
37
 
21
- #### Major changes
38
+ ### Major changes
22
39
 
23
40
  - Adds serialization support through the following methods ([#63](https://github.com/eonu/arx/pull/63)):
24
41
  - `to_h`: Serialize into a Ruby hash (with symbol keys). Accepts a boolean argument, representing whether or not to deep-serialize nested `Author` and `Category` objects (defaults to `false`).
@@ -51,7 +68,7 @@
51
68
 
52
69
  - Add equality operator (`==`) to entities. ([#68](https://github.com/eonu/arx/pull/68))
53
70
 
54
- #### Minor changes
71
+ ### Minor changes
55
72
 
56
73
  - Add more category mappings to `CATEGORIES`. ([#71](https://github.com/eonu/arx/pull/71))
57
74
  - Add licensing information to `README.md` under the *Acknowledgements* section. ([#66](https://github.com/eonu/arx/pull/66))
@@ -61,15 +78,15 @@
61
78
  - `coveralls` [`= 0.8.22` to `= 0.8.23`] ([#62](https://github.com/eonu/arx/pull/62))
62
79
  - `thor` [`~> 0.19.4` to `~> 0.20.3`] ([#67](https://github.com/eonu/arx/pull/67))
63
80
 
64
- # 1.1.0
81
+ ## 1.1.0
65
82
 
66
- #### Major changes
83
+ ### Major changes
67
84
 
68
85
  - Change `bundler` requirement to `>= 1.17` in `arx.gemspec`. ([#53](https://github.com/eonu/arx/pull/53))
69
86
  - Remove `Arx.find` alias of `Arx.search`. ([#57](https://github.com/eonu/arx/pull/57))
70
87
  - Add `Query#group` for subquery grouping support. ([#59](https://github.com/eonu/arx/pull/59))
71
88
 
72
- #### Minor changes
89
+ ### Minor changes
73
90
 
74
91
  - Add contributing guidelines (`CONTRIBUTING.md`). ([#48](https://github.com/eonu/arx/pull/48))
75
92
  - Add issue templates to `./github/ISSUE_TEMPLATE` for ([#49](https://github.com/eonu/arx/pull/49), [#54](https://github.com/eonu/arx/pull/54), [#55](https://github.com/eonu/arx/pull/55)):
@@ -86,14 +103,14 @@
86
103
  - Add `bin/console` for gem debugging. ([#60](https://github.com/eonu/arx/pull/60))
87
104
  - Modify `gem:debug` rake task to run `bin/console`. ([#60](https://github.com/eonu/arx/pull/60))
88
105
 
89
- # 1.0.1
106
+ ## 1.0.1
90
107
 
91
- #### Major changes
108
+ ### Major changes
92
109
 
93
110
  - Add cases to handle `nil` query returns. ([#45](https://github.com/eonu/arx/pull/45))
94
111
  - Add support for the `coveralls` gem (`.coveralls.yml` configuration file). ([#42](https://github.com/eonu/arx/pull/42))
95
112
 
96
- #### Minor changes
113
+ ### Minor changes
97
114
 
98
115
  - Add code coverage badge to `README.md`. ([#42](https://github.com/eonu/arx/pull/42))
99
116
  - Remove documentation badge from top of `README.md`. ([#42](https://github.com/eonu/arx/pull/42))
@@ -102,9 +119,9 @@
102
119
  - Add `/coverage/` directory to `.gitignore`. ([#45](https://github.com/eonu/arx/pull/45))
103
120
  - Remove version numbers from paper identifiers in error message in `README.md`. ([#46](https://github.com/eonu/arx/pull/46))
104
121
 
105
- # 1.0.0
122
+ ## 1.0.0
106
123
 
107
- #### Major changes
124
+ ### Major changes
108
125
 
109
126
  - Change `Query` connective instance methods ([#38](https://github.com/eonu/arx/pull/38)):
110
127
  - `#&` -> `#and`
@@ -116,15 +133,15 @@
116
133
  - Redefine `Arx.search` to user `Paper.parse`'s `search` key-word argument. ([#40](https://github.com/eonu/arx/pull/40))
117
134
  - Implement all tests. ([#40](https://github.com/eonu/arx/pull/40))
118
135
 
119
- #### Minor changes
136
+ ### Minor changes
120
137
 
121
138
  - Change declared regular expression literals from `%r""` to standard `//`. ([#39](https://github.com/eonu/arx/pull/39))
122
139
  - Remove `#extract_id` from `Query` and use `Cleaner.extract_id` instead. ([#39](https://github.com/eonu/arx/pull/39))
123
140
  - Redefine `Paper#revision?` to use the new `#version` instead of `#updated_at` and`#published_at`. ([#39](https://github.com/eonu/arx/pull/39))
124
141
 
125
- # 0.3.2
142
+ ## 0.3.2
126
143
 
127
- #### Major changes
144
+ ### Major changes
128
145
 
129
146
  - Add `Paper#category` alias for `Paper#primary_category`. ([#34](https://github.com/eonu/arx/pull/34))
130
147
  - Change `Author#affiliations?` to `Author#affiliated?`. ([#34](https://github.com/eonu/arx/pull/34))
@@ -135,47 +152,47 @@
135
152
  - Add `gem:release` rake task for preparing gem releases. ([#36](https://github.com/eonu/arx/pull/36))
136
153
  - Add `thor` gem development dependency. ([#36](https://github.com/eonu/arx/pull/36))
137
154
 
138
- #### Minor changes
155
+ ### Minor changes
139
156
 
140
157
  - Update documentation links to `rubydoc.info`'s GitHub service. ([#30](https://github.com/eonu/arx/pull/30))
141
158
  - Add email address to `LICENSE`. ([#31](https://github.com/eonu/arx/pull/31))
142
159
  - Improve `Error::MissingField` and `Error::MissingLink` error messages. ([#35](https://github.com/eonu/arx/pull/35))
143
160
 
144
- # 0.3.1
161
+ ## 0.3.1
145
162
 
146
- #### Major changes
163
+ ### Major changes
147
164
 
148
165
  - Add `.yardopts` for document generation configuration. ([#26](https://github.com/eonu/arx/pull/26))
149
166
  - Namespace errors in `Arx::Error` module and remove `Error` prefix from error classes. ([#26](https://github.com/eonu/arx/pull/26))
150
167
  - Move identifier format regular expression constant definitions from `Arx::Validate` to top-level namespace `Arx`. ([#26](https://github.com/eonu/arx/pull/26))
151
168
 
152
- #### Minor changes
169
+ ### Minor changes
153
170
 
154
171
  - Rename `lib/arx/exceptions.rb` to `lib/arx/errors.rb`. ([#26](https://github.com/eonu/arx/pull/26))
155
172
  - Make `Arx::Cleaner`, `Arx::Validate`, `Arx::Inspector`, `Arx::Link` private (hidden from `yard` documentation). ([#26](https://github.com/eonu/arx/pull/26))
156
173
 
157
- # 0.3.0
174
+ ## 0.3.0
158
175
 
159
- #### Major changes
176
+ ### Major changes
160
177
 
161
178
  - Add documentation, images, installation and usage instructions to `README.md`. ([#22](https://github.com/eonu/arx/pull/22), [#17](https://github.com/eonu/arx/pull/17))
162
179
  - Allow prior construction of a search query in `Arx.search`. ([#18](https://github.com/eonu/arx/pull/18))
163
180
  - Fix `Arx.search` query object yielding. ([#20](https://github.com/eonu/arx/pull/20))
164
181
 
165
- #### Minor changes
182
+ ### Minor changes
166
183
 
167
184
  - Remove conditional with `block_given?` in `Arx()` method. ([#16](https://github.com/eonu/arx/pull/16))
168
185
  - Remove leading ampersand (&) from search query string. ([#19](https://github.com/eonu/arx/pull/19))
169
186
  - Add base paper categories and more aliases. ([#21](https://github.com/eonu/arx/pull/21))
170
187
 
171
- # 0.2.0
188
+ ## 0.2.0
172
189
 
173
- #### Major changes
190
+ ### Major changes
174
191
 
175
192
  - Flatten provided values in `Arx::Paper`'s field instance methods (allow an array as the `values` splat parameter). ([#5](https://github.com/eonu/arx/pull/5))
176
193
  - Add `Arx.find` and `Arx.get` as aliases for `Arx.search`. ([#6](https://github.com/eonu/arx/pull/6), [#8](https://github.com/eonu/arx/pull/8))
177
194
 
178
- #### Minor changes
195
+ ### Minor changes
179
196
 
180
197
  - Add `homepage` and `metadata` fields to `arx.gemspec`. ([#1](https://github.com/eonu/arx/pull/1), [#14](https://github.com/eonu/arx/pull/14))
181
198
  - Specify required ruby version (`~> 2.5`) in `arx.gemspec`. ([#2](https://github.com/eonu/arx/pull/2))
@@ -186,6 +203,6 @@
186
203
  - Add ruby-head version to RVM rubies in `.travis.yml`. ([#12](https://github.com/eonu/arx/pull/12))
187
204
  - Remove unnecessary git-ignored files. ([#13](https://github.com/eonu/arx/pull/13), [#10](https://github.com/eonu/arx/pull/10))
188
205
 
189
- # 0.1.0
206
+ ## 0.1.0
190
207
 
191
208
  Initial commit! 🎉
data/README.md CHANGED
@@ -23,7 +23,7 @@ Although [Scholastica](https://github.com/scholastica) offer a great [Ruby gem](
23
23
  ```ruby
24
24
  require 'arx'
25
25
 
26
- papers = Arx(sort_by: :date_submitted) do |query|
26
+ papers = Arx(sort_by: :submitted_at) do |query|
27
27
  query.category('cs.FL')
28
28
  query.title('Buchi Automata').and_not.author('Tomáš Babiak')
29
29
  end
@@ -46,7 +46,7 @@ Although [Scholastica](https://github.com/scholastica) offer a great [Ruby gem](
46
46
  ## Features
47
47
 
48
48
  - Ruby classes `Arx::Paper`, `Arx::Author` and `Arx::Category` that wrap the resulting Atom XML query result from the search API.
49
- - Supports querying by a paper's ID, title, author(s), abstract, subject category, comment, journal reference, or report number.
49
+ - Supports querying by a paper's ID, title, author(s), abstract, subject category, comment, journal reference, report number or last updated date.
50
50
  - Provides a small DSL for writing queries.
51
51
  - Supports searching fields by exact match.
52
52
 
@@ -92,13 +92,13 @@ The `Arx::Query` class provides a small DSL for writing these query strings.
92
92
 
93
93
  The order in which search results are returned can be modified through the `sort_by` and `sort_order` keyword arguments (in the `Arx::Query` initializer):
94
94
 
95
- - `sort_by` accepts the symbols: `:relevance`, `:last_updated` or `:date_submitted`
95
+ - `sort_by` accepts the symbols: `:relevance`, `:updated_at` or `:submitted_at`
96
96
 
97
97
  - `sort_order` accepts the symbols: `:ascending` or `:descending`
98
98
 
99
99
  ```ruby
100
100
  # Sort by submission date in ascending order (earliest first)
101
- Arx::Query.new(sort_by: :date_submitted, sort_order: :ascending)
101
+ Arx::Query.new(sort_by: :submitted_at, sort_order: :ascending)
102
102
  #=> sortBy=submittedDate&sortOrder=ascending
103
103
  ```
104
104
 
@@ -108,6 +108,26 @@ Arx::Query.new(sort_by: :date_submitted, sort_order: :ascending)
108
108
  Arx::Query.new #=> sortBy=relevance&sortOrder=descending
109
109
  ```
110
110
 
111
+ #### Paging
112
+
113
+ The arXiv API offers a paging mechanism that allows you to get chucks of the result set at a time. It can be used through the `start` and `max_results` keyword arguments (in the `Arx::Query` initializer):
114
+
115
+ - `start` is the index of the first returned result (using 0-based indexing)
116
+
117
+ - `max_results` is the number of results returned by the query
118
+
119
+ ```ruby
120
+ # Get results 10-29
121
+ Arx::Query.new(start: 10, max_results: 20)
122
+ #=> start=10&max_results=20
123
+ ```
124
+
125
+ **Note**: The default values are those of the arXiv API: `start` defaults to `0` and `max_results` defaults to `10`:
126
+
127
+ ```ruby
128
+ Arx::Query.new #=> start=0&max_results=10
129
+ ```
130
+
111
131
  #### Searching by ID
112
132
 
113
133
  The arXiv search API doesn't only support searching for papers by metadata fields, but also by ID. When searching by ID, a different URL query string parameter `id_list` is used (instead of `search_query` as seen before).
@@ -133,14 +153,16 @@ The arXiv search API supports searches for the following paper metadata fields:
133
153
 
134
154
  ```ruby
135
155
  FIELDS = {
136
- title: 'ti', # Title
137
- author: 'au', # Author
138
- abstract: 'abs', # Abstract
139
- comment: 'co', # Comment
140
- journal: 'jr', # Journal reference
141
- category: 'cat', # Subject category
142
- report: 'rn', # Report number
143
- all: 'all' # All (of the above)
156
+ title: 'ti', # Title
157
+ author: 'au', # Author
158
+ abstract: 'abs', # Abstract
159
+ comment: 'co', # Comment
160
+ journal: 'jr', # Journal reference
161
+ category: 'cat', # Subject category
162
+ report: 'rn', # Report number
163
+ updated_at: 'lastUpdatedDate', # Last updated date
164
+ submitted_at: 'submittedDate', # Submission date
165
+ all: 'all' # All (of the above)
144
166
  }
145
167
  ```
146
168
 
@@ -256,7 +278,7 @@ Calling the `Arx()` method with a block allows for the construction and executio
256
278
 
257
279
  ```ruby
258
280
  # Papers in the cs.FL category whose title contains "Buchi Automata", not authored by Tomáš Babiak
259
- results = Arx(sort_by: :date_submitted) do |query|
281
+ results = Arx(sort_by: :submitted_at) do |query|
260
282
  query.category('cs.FL')
261
283
  query.title('Buchi Automata').and_not.author('Tomáš Babiak')
262
284
  end
@@ -272,7 +294,7 @@ The `Arx()` method accepts a predefined `Arx::Query` object through the `query`
272
294
 
273
295
  ```ruby
274
296
  # Papers in the cs.FL category whose title contains "Buchi Automata", not authored by Tomáš Babiak
275
- q = Arx::Query.new(sort_by: :date_submitted)
297
+ q = Arx::Query.new(sort_by: :submitted_at)
276
298
  q.category('cs.FL')
277
299
  q.title('Buchi Automata').and_not.author('Tomáš Babiak')
278
300
 
@@ -400,7 +422,7 @@ category.full_name
400
422
  #=> "Condensed Matter"
401
423
  ```
402
424
 
403
- # Acknowledgements
425
+ ## Acknowledgements
404
426
 
405
427
  A large portion of this library is based on the brilliant work done by [Scholastica](https://github.com/scholastica) in their [`arxiv`](https://github.com/scholastica/arxiv) gem for retrieving individual papers from arXiv through the search API.
406
428
 
@@ -408,15 +430,41 @@ Arx was created mostly due to the seemingly inactive nature of Scholastica's rep
408
430
 
409
431
  Nevertheless, a special thanks goes out to Scholastica for providing the influence for Arx.
410
432
 
433
+ ## Contributors
434
+
435
+ All contributions to this repository are greatly appreciated. Contribution guidelines can be found [here](/CONTRIBUTING.md).
436
+
437
+ <table>
438
+ <thead>
439
+ <tr>
440
+ <th align="center">
441
+ <a href="https://github.com/eonu">
442
+ <img src="https://avatars0.githubusercontent.com/u/24795571?s=460&v=4" alt="Edwin Onuonga" width="60px">
443
+ <br/>eonu
444
+ <br/><sub>(Edwin Onuonga)</sub>
445
+ </a>
446
+ <br/>
447
+ <a href="mailto:ed@eonu.net">✉️</a>
448
+ <a href="https://eonu.net">🌍</a>
449
+ </th>
450
+ <th align="center">
451
+ <a href="https://github.com/xuanxu">
452
+ <img src="https://avatars.githubusercontent.com/u/6528?v=4" alt="xuanxu" width="60px">
453
+ <br/>xuanxu
454
+ <br/><sub>(Juanjo Bazán)</sub>
455
+ </a>
456
+ <br/>
457
+ <a href="jjbazan@gmail.com">✉️</a>
458
+ <a href="http://juanjobazan.com/">🌍</a>
459
+ </th>
460
+ <!-- Add more <th></th> blocks for more contributors -->
461
+ </tr>
462
+ </thead>
463
+ </table>
464
+
411
465
  ---
412
466
 
413
467
  <p align="center">
414
468
  <b>Arx</b> &copy; 2019-2020, Edwin Onuonga - Released under the <a href="http://mit-license.org/">MIT</a> License.<br/>
415
469
  <em>Authored and maintained by Edwin Onuonga.</em>
416
-
417
- <p align="center">
418
- <a href="https://eonu.net">eonu.net</a>&nbsp;&middot;&nbsp;
419
- GitHub: <a href="https://github.com/eonu">@eonu</a>&nbsp;&middot;&nbsp;
420
- Email: <a href="mailto:ed@eonu.net">ed@eonu.net</a>
421
- </p>
422
470
  </p>
data/lib/arx.rb CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  require 'cgi'
4
4
  require 'json'
5
+
6
+ # Temporary fix for JSON warning in Ruby >= 2.7.0
7
+ # See: https://github.com/flori/json/issues/399#issuecomment-734863279
8
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0')
9
+ module JSON
10
+ module_function
11
+ def parse(source, opts = {})
12
+ Parser.new(source, **opts).parse
13
+ end
14
+ end
15
+ end
16
+
5
17
  require 'nokogiri'
6
18
  require 'open-uri'
7
19
  require 'happymapper'
@@ -47,19 +59,21 @@ module Arx
47
59
 
48
60
  # Performs a search query for papers on the arXiv search API.
49
61
  #
50
- # @note The +sort_by+ and +sort_order+ arguments are ignored if passing in your own +query+.
62
+ # @note The +sort_by+, +sort_order+, +start+ and +max_results+ arguments are ignored if passing in your own +query+.
51
63
  # @param ids [Array<String>] The IDs of the arXiv papers to restrict the query to.
52
64
  # @param query [Query, NilClass] Predefined search query object.
53
65
  # @param sort_by [Symbol] The sorting criteria for the returned results (see {Query::SORT_BY}).
54
66
  # @param sort_order [Symbol] The sorting order for the returned results (see {Query::SORT_ORDER}).
67
+ # @param start [Integer] The index of the first returned result.
68
+ # @param max_results [Integer] The number of results returned by the query
55
69
  # @return [Array<Paper>, Paper] The {Paper}(s) found by the search query.
56
- def search(*ids, query: nil, sort_by: :relevance, sort_order: :descending)
57
- query ||= Query.new(*ids, sort_by: sort_by, sort_order: sort_order)
70
+ def search(*ids, query: nil, sort_by: :relevance, sort_order: :descending, start: 0, max_results: 10)
71
+ query ||= Query.new(*ids, sort_by: sort_by, sort_order: sort_order, start: start, max_results: max_results)
58
72
  raise TypeError.new("Expected `query` to be an Arx::Query, got: #{query.class}") unless query.is_a? Query
59
73
 
60
74
  yield query if block_given?
61
75
 
62
- document = Nokogiri::XML(URI.open ENDPOINT + query.to_s + '&max_results=10000').remove_namespaces!
76
+ document = Nokogiri::XML(URI.open ENDPOINT + query.to_s).remove_namespaces!
63
77
  results = Paper.parse(document, single: ids.size == 1)
64
78
 
65
79
  if results.is_a? Paper
@@ -90,7 +104,9 @@ end
90
104
  # @param query [Query, NilClass] Predefined search query object.
91
105
  # @param sort_by [Symbol] The sorting criteria for the returned results (see {Arx::Query::SORT_BY}).
92
106
  # @param sort_order [Symbol] The sorting order for the returned results (see {Arx::Query::SORT_ORDER}).
107
+ # @param start [Integer] The index of the first returned result.
108
+ # @param max_results [Integer] The number of results returned by the query
93
109
  # @return [Array<Paper>, Paper] The {Arx::Paper}(s) found by the search query.
94
- def Arx(*ids, query: nil, sort_by: :relevance, sort_order: :descending, &block)
95
- Arx.search *ids, query: query, sort_by: sort_by, sort_order: sort_order, &block
110
+ def Arx(*ids, query: nil, sort_by: :relevance, sort_order: :descending, start: 0, max_results: 10, &block)
111
+ Arx.search *ids, query: query, sort_by: sort_by, sort_order: sort_order, start: start, max_results: max_results, &block
96
112
  end
@@ -54,6 +54,7 @@ module Arx
54
54
  #
55
55
  # @note This only performs a basic equality check between the authors' names.
56
56
  # @param author [Author] The author to compare against.
57
+ # @return [Boolean]
57
58
  def ==(author)
58
59
  if author.is_a? Author
59
60
  name == author.name
@@ -62,6 +63,13 @@ module Arx
62
63
  end
63
64
  end
64
65
 
66
+ # A string representation of the {Author} object.
67
+ #
68
+ # @return [String]
69
+ def to_s
70
+ "Arx::Author(name: #{name}, affiliations: [#{affiliations.join(', ')}])"
71
+ end
72
+
65
73
  inspector *ATTRIBUTES
66
74
  end
67
75
  end
@@ -48,6 +48,7 @@ module Arx
48
48
  # Equality check against another category.
49
49
  #
50
50
  # @param category [Category] The category to compare against.
51
+ # @return [Boolean]
51
52
  def ==(category)
52
53
  if category.is_a? Category
53
54
  name == category.name
@@ -56,6 +57,13 @@ module Arx
56
57
  end
57
58
  end
58
59
 
60
+ # A string representation of the {Category} object.
61
+ #
62
+ # @return [String]
63
+ def to_s
64
+ "Arx::Category(name: #{name}, full_name: #{full_name || 'nil'})"
65
+ end
66
+
59
67
  inspector *ATTRIBUTES
60
68
  end
61
69
  end
@@ -226,6 +226,7 @@ module Arx
226
226
  # @note This only performs a basic equality check between the papers' identifiers (disregarding version).
227
227
  # This means that a different version of the same paper will be viewed as equal.
228
228
  # @param paper [Paper] The paper to compare against.
229
+ # @return [Boolean]
229
230
  def ==(paper)
230
231
  if paper.is_a? Paper
231
232
  id == paper.id
@@ -247,6 +248,17 @@ module Arx
247
248
  end
248
249
  end
249
250
 
251
+ # A string representation of the {Paper} object.
252
+ #
253
+ # @return [String]
254
+ def to_s
255
+ _id = id true
256
+ _published_at = published_at.strftime("%Y-%m-%d")
257
+ _authors = authors.map(&:name)
258
+ _authors = [*_authors.first(2), '...'] if _authors.size > 2
259
+ "Arx::Paper(id: #{_id}, published_at: #{_published_at}, authors: [#{_authors.join(', ')}], title: #{title})"
260
+ end
261
+
250
262
  inspector *ATTRIBUTES
251
263
  end
252
264
  end
@@ -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.
@@ -27,21 +29,23 @@ module Arx
27
29
  # @see https://arxiv.org/help/prep arXiv metadata fields
28
30
  # @see https://arxiv.org/help/api/user-manual#query_details arXiv user manual (query details)
29
31
  FIELDS = {
30
- title: 'ti', # Title
31
- author: 'au', # Author
32
- abstract: 'abs', # Abstract
33
- comment: 'co', # Comment
34
- journal: 'jr', # Journal reference
35
- category: 'cat', # Subject category
36
- report: 'rn', # Report number
37
- 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)
38
42
  }
39
43
 
40
44
  # Supported criteria for the +sortBy+ parameter.
41
45
  SORT_BY = {
42
46
  relevance: 'relevance',
43
- last_updated: 'lastUpdated',
44
- date_submitted: 'submittedDate'
47
+ updated_at: 'lastUpdatedDate',
48
+ submitted_at: 'submittedDate'
45
49
  }
46
50
 
47
51
  # Supported criteria for the +sortOrder+ parameter.
@@ -55,8 +59,10 @@ module Arx
55
59
  # @param ids [Array<String>] The IDs of the arXiv papers to restrict the query to.
56
60
  # @param sort_by [Symbol] The sorting criteria for the returned results (see {SORT_BY}).
57
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
58
64
  # @return [Query] The initialized query object.
59
- def initialize(*ids, sort_by: :relevance, sort_order: :descending)
65
+ def initialize(*ids, sort_by: :relevance, sort_order: :descending, start: 0, max_results: 10)
60
66
  @query = String.new
61
67
 
62
68
  Validate.sort_by sort_by, permitted: SORT_BY.keys
@@ -65,6 +71,9 @@ module Arx
65
71
  Validate.sort_order sort_order, permitted: SORT_ORDER.keys
66
72
  @query << "&#{PARAMS[:sort_order]}=#{SORT_ORDER[sort_order]}"
67
73
 
74
+ Validate.paging start, max_results
75
+ @query << "&#{PARAMS[:start]}=#{start}&#{PARAMS[:max_results]}=#{max_results}"
76
+
68
77
  ids.flatten!
69
78
  unless ids.empty?
70
79
  ids.map! {|id| Cleaner.extract_id(id, version: true)}
@@ -150,6 +159,20 @@ module Arx
150
159
  # @param connective [Symbol] The logical connective to use (see {CONNECTIVES}). Only applies if there are multiple values.
151
160
  # @return [self]
152
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
+
153
176
  # @!method all(*values, exact: true, connective: :and)
154
177
  # Search for papers by all fields (see {FIELDS}).
155
178
  #
@@ -159,7 +182,8 @@ module Arx
159
182
  # @return [self]
160
183
 
161
184
  FIELDS.each do |name, field|
162
- 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|
163
187
  return if values.empty?
164
188
 
165
189
  values.flatten!
@@ -29,6 +29,18 @@ module Arx
29
29
  raise ArgumentError.new("Expected `sort_order` to be one of #{permitted}, got: #{value}") unless permitted.include? value
30
30
  end
31
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
+
32
44
  # Validates a list of arXiv paper identifiers.
33
45
  #
34
46
  # @param ids [Array<String>] The identifiers to validate.
data/lib/arx/version.rb CHANGED
@@ -5,8 +5,8 @@ module Arx
5
5
  # The current version of Arx.
6
6
  VERSION = {
7
7
  major: 1,
8
- minor: 2,
9
- patch: 1,
8
+ minor: 3,
9
+ patch: 0,
10
10
  meta: nil,
11
11
  }.compact.values.join('.').freeze
12
12
  end
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.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edwin Onuonga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-26 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