arx 0.3.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 060171d105d65f9380f65232ebc4ba838c88c0ea83a1019f07b7ee54c5156cd6
4
- data.tar.gz: e8253d7a61f2954f1b5522b7ed98cabd1103973bb85d29bf7f4ace357e2739ea
3
+ metadata.gz: 292c64f4c39d1d5a1d20ea803f98bd2f02f9830af51babcb1d8a2048ca06b403
4
+ data.tar.gz: 75ad806933191bcbb3d84c6aad20bcc73f18c559c0c122ca57d49e23f3f7757a
5
5
  SHA512:
6
- metadata.gz: 3c7ca66790bd3688556174120132e6eae5618202a32d05fe4b9c10c07892ca5e92f9bf71da3adf8f17cbc9a94a05550ed194c85a4dda69217920f2eda230daff
7
- data.tar.gz: 8cf1b676f6f18494a1b8b91678b2668ef110114b9987204e92a0ddc6d38001c9bcaa8ae3c065562329c806069a25cfd4ff2ce1ffba28838b27e6e46708f87c55
6
+ metadata.gz: 6b77f4ada7df3953695822feef7ca7e1f0feeb3d2a5375e3a37b9ae3a6db2d5c03db7979f19a19b6483e74226ca91113324052778a86a12b3f426e5689098b6a
7
+ data.tar.gz: 419f468c377406c8459528c8755330986b8c3c0545788a9efb99f0f1ee9902a9fc618f4dc760b7b083c9988180f8877cf7cc03ed1e0be8d725552105d7e72044
@@ -1,3 +1,16 @@
1
+ # 0.3.1
2
+
3
+ #### Major changes
4
+
5
+ - Add `.yardopts` for document generation configuration. ([#26](https://github.com/eonu/arx/pull/26))
6
+ - Namespace errors in `Arx::Error` module and remove `Error` prefix from error classes. ([#26](https://github.com/eonu/arx/pull/26))
7
+ - Move identifier format regular expression constant definitions from `Arx::Validate` to top-level namespace `Arx`. ([#26](https://github.com/eonu/arx/pull/26))
8
+
9
+ #### Minor changes
10
+
11
+ - Rename `lib/arx/exceptions.rb` to `lib/arx/errors.rb`. ([#26](https://github.com/eonu/arx/pull/26))
12
+ - Make `Arx::Cleaner`, `Arx::Validate`, `Arx::Inspector`, `Arx::Link` private (hidden from `yard` documentation). ([#26](https://github.com/eonu/arx/pull/26))
13
+
1
14
  # 0.3.0
2
15
 
3
16
  #### Major changes
data/README.md CHANGED
@@ -287,13 +287,13 @@ paper.revision?
287
287
  paper.comment?
288
288
  #=> false
289
289
  paper.comment
290
- #=> Arx::MissingFieldError (This arXiv paper is missing the `comment` field)
290
+ #=> Arx::Error::MissingField (This arXiv paper is missing the `comment` field)
291
291
 
292
292
  # Paper's journal reference
293
293
  paper.journal?
294
294
  #=> false
295
295
  paper.journal
296
- #=> Arx::MissingFieldError (This arXiv paper is missing the `journal` field)
296
+ #=> Arx::Error::MissingField (This arXiv paper is missing the `journal` field)
297
297
 
298
298
  # Paper's PDF URL
299
299
  paper.pdf?
data/lib/arx.rb CHANGED
@@ -1,13 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'cgi'
3
4
  require 'nokogiri'
4
5
  require 'open-uri'
6
+ require 'happymapper'
5
7
  require 'arx/version'
8
+ require 'arx/cleaner'
9
+ require 'arx/inspector'
6
10
  require 'arx/categories'
7
- require 'arx/query/query'
11
+ require 'arx/error'
8
12
  require 'arx/query/validate'
13
+ require 'arx/query/query'
9
14
  require 'arx/entities/author'
10
15
  require 'arx/entities/category'
16
+ require 'arx/entities/link'
11
17
  require 'arx/entities/paper'
12
18
 
13
19
  # A Ruby interface for querying academic papers on the arXiv search API.
@@ -16,6 +22,26 @@ module Arx
16
22
  # The arXiv search API endpoint.
17
23
  ENDPOINT = 'http://export.arxiv.org/api/query?'
18
24
 
25
+ # The current arxiv paper identifier scheme (1 April 2007 and onwards).
26
+ # The last block of digits can either be five digits (if the paper was published after 1501 - January 2015),
27
+ # or four digits (if the paper was published before 1501).
28
+ #
29
+ # @see https://arxiv.org/help/arxiv_identifier#new arXiv identifier (new)
30
+ # @example
31
+ # 1501.00001
32
+ # 1705.01662v1
33
+ # 1412.0135
34
+ # 0706.0001v2
35
+ NEW_IDENTIFIER_FORMAT = %r"^\d{4}\.\d{4,5}(v\d+)?$"
36
+
37
+ # The legacy arXiv paper identifier scheme (before 1 April 2007).
38
+ #
39
+ # @see https://arxiv.org/help/arxiv_identifier#old arXiv identifier (old)
40
+ # @example
41
+ # math/0309136v1
42
+ # cond-mat/0211034
43
+ OLD_IDENTIFIER_FORMAT = %r"^[a-z]+(\-[a-z]+)?\/\d{7}(v\d+)?$"
44
+
19
45
  class << self
20
46
 
21
47
  # Performs a search query for papers on the arXiv search API.
@@ -37,7 +63,7 @@ module Arx
37
63
  document = Nokogiri::XML(open ENDPOINT + query.to_s + '&max_results=10000').remove_namespaces!
38
64
 
39
65
  results = Paper.parse(document, single: false).reject {|paper| paper.id.empty?}
40
- raise MissingPaper.new(ids.first) if results.empty? && ids.size == 1
66
+ raise Error::MissingPaper.new(ids.first) if results.empty? && ids.size == 1
41
67
  ids.size == 1 && results.size == 1 ? results.first : results
42
68
  end
43
69
 
@@ -1,6 +1,7 @@
1
1
  module Arx
2
2
 
3
3
  # Class for cleaning strings.
4
+ # @private
4
5
  class Cleaner
5
6
 
6
7
  # Cleans strings.
@@ -1,11 +1,9 @@
1
- require 'happymapper'
2
- require 'arx/cleaner'
3
-
4
1
  module Arx
5
2
 
6
3
  # Entity/model representing an arXiv paper's author.
7
4
  class Author
8
5
  include HappyMapper
6
+ include Inspector
9
7
 
10
8
  tag 'author'
11
9
 
@@ -25,5 +23,7 @@ module Arx
25
23
  def affiliations?
26
24
  !affiliations.empty?
27
25
  end
26
+
27
+ inspector :name, :affiliations?, :affiliations
28
28
  end
29
29
  end
@@ -1,11 +1,9 @@
1
- require 'arx/categories'
2
- require 'arx/cleaner'
3
-
4
1
  module Arx
5
2
 
6
3
  # Entity/model representing an arXiv paper's category.
7
4
  class Category
8
5
  include HappyMapper
6
+ include Inspector
9
7
 
10
8
  tag 'category'
11
9
 
@@ -20,5 +18,7 @@ module Arx
20
18
  def full_name
21
19
  CATEGORIES[name]
22
20
  end
21
+
22
+ inspector :name, :full_name
23
23
  end
24
24
  end
@@ -1,8 +1,7 @@
1
- require 'happymapper'
2
-
3
1
  module Arx
4
2
 
5
3
  # Helper entity/model representing a link on an arXiv paper.
4
+ # @private
6
5
  class Link
7
6
  include HappyMapper
8
7
 
@@ -1,21 +1,15 @@
1
- require 'happymapper'
2
- require 'arx/exceptions'
3
- require 'arx/cleaner'
4
- require_relative 'author'
5
- require_relative 'category'
6
- require_relative 'link'
7
-
8
1
  module Arx
9
2
 
10
3
  # Entity/model representing an arXiv paper.
11
4
  class Paper
12
5
  include HappyMapper
6
+ include Inspector
13
7
 
14
8
  tag 'entry'
15
9
 
16
10
  element :id, Cleaner, parser: :clean, tag: 'id'
17
11
  # The identifier of the paper.
18
- # @note This is either in {Validate::OLD_IDENTIFIER_FORMAT} or {Validate::NEW_IDENTIFIER_FORMAT}.
12
+ # @note This is either in {OLD_IDENTIFIER_FORMAT} or {NEW_IDENTIFIER_FORMAT}.
19
13
  # @example
20
14
  # 1705.01662v1
21
15
  # cond-mat/0211034
@@ -87,7 +81,7 @@ module Arx
87
81
  # @!method comment
88
82
  # The comment of the paper.
89
83
  # @note This is an optional metadata field on an arXiv paper. To check whether the paper has a comment, use {comment?}
90
- # @raise {MissingFieldError} If the paper does not have a comment.
84
+ # @raise {Error::MissingField} If the paper does not have a comment.
91
85
  # @return [String]
92
86
  element :comment, Cleaner, parser: :clean, tag: 'comment'
93
87
 
@@ -98,7 +92,7 @@ module Arx
98
92
  # @!method journal
99
93
  # The journal reference of the paper.
100
94
  # @note This is an optional metadata field on an arXiv paper. To check whether the paper has a journal reference, use {journal?}
101
- # @raise {MissingFieldError} If the paper does not have a journal reference.
95
+ # @raise {Error::MissingField} If the paper does not have a journal reference.
102
96
  # @return [String]
103
97
  element :journal, Cleaner, parser: :clean, tag: 'journal_ref'
104
98
 
@@ -113,7 +107,7 @@ module Arx
113
107
  if self.send "#{optional}?"
114
108
  instance_variable_get("@#{optional}")
115
109
  else
116
- raise MissingFieldError.new(optional)
110
+ raise Error::MissingField.new(optional)
117
111
  end
118
112
  end
119
113
  end
@@ -127,7 +121,7 @@ module Arx
127
121
  # @!method pdf_url
128
122
  # Link to the PDF version of the paper.
129
123
  # @note This is an optional metadata field on an arXiv paper. To check whether the paper has a PDF link, use {pdf?}
130
- # @raise {MissingLinkError} If the paper does not have a PDF link.
124
+ # @raise {Error::MissingLink} If the paper does not have a PDF link.
131
125
  # @return [String]
132
126
 
133
127
  # @!method doi?
@@ -141,7 +135,7 @@ module Arx
141
135
  # @see https://arxiv.org/help/jref#doi
142
136
  # @see https://arxiv.org/help/prep#doi
143
137
  # @note This is an optional metadata field on an arXiv paper. To check whether the paper has a DOI link, use {doi?}
144
- # @raise {MissingLinkError} If the paper does not have a DOI link.
138
+ # @raise {Error::MissingLink} If the paper does not have a DOI link.
145
139
  # @return [String]
146
140
 
147
141
  %i[pdf doi].each do |link_type|
@@ -155,9 +149,19 @@ module Arx
155
149
  if self.send exists
156
150
  links.find(&exists).href
157
151
  else
158
- raise MissingLinkError.new link_type.to_s.upcase
152
+ raise Error::MissingLink.new link_type.to_s.upcase
159
153
  end
160
154
  end
161
155
  end
156
+
157
+ inspector *%i[
158
+ id url title summary authors
159
+ primary_category categories
160
+ publish_date last_updated revision?
161
+ comment? comment
162
+ journal? journal
163
+ pdf? pdf_url
164
+ doi? doi_url
165
+ ]
162
166
  end
163
167
  end
@@ -0,0 +1,27 @@
1
+ module Arx
2
+
3
+ # Various arXiv-related errors.
4
+ module Error
5
+
6
+ # Custom error for missing links on an arXiv paper.
7
+ class MissingLink < StandardError
8
+ def initialize(link_type)
9
+ super "This arXiv paper does not have a #{link_type} link"
10
+ end
11
+ end
12
+
13
+ # Custom error for missing fields on an arXiv paper.
14
+ class MissingField < StandardError
15
+ def initialize(field)
16
+ super "This arXiv paper is missing the `#{field}` field"
17
+ end
18
+ end
19
+
20
+ # Custom error for missing arXiv papers.
21
+ class MissingPaper < StandardError
22
+ def initialize(id)
23
+ super "Couldn't find an arXiv paper with ID: #{id}"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,42 @@
1
+ module Arx
2
+
3
+ # Restricts +inspect+ to dump a whitelist of methods on an object.
4
+ # It will always provide `object_id` at a minimum.
5
+ # @private
6
+ module Inspector
7
+
8
+ # Overwrites the object's own inspect method.
9
+ def inspect
10
+ pairs = {}
11
+
12
+ self.class.inspector_fields.each do |field|
13
+ pairs[field] = self.send(field).inspect
14
+ rescue
15
+ end
16
+
17
+ "#<#{self.class.name}:#{self.object_id} #{pairs.map {|k,v| "#{k}=#{v}"}.join(", ")}>"
18
+ end
19
+
20
+ class << self
21
+ # Returns the +inspected+ instance variable, or sets it if undefined.
22
+ def inspected
23
+ @inspected ||= []
24
+ end
25
+
26
+ # Defines helper +inspector_fields+ instance variable & method, and +inspector+ instance method on the target object.
27
+ # @param [Object] source An arbitrary object (the object that +includes+ the +Inspector+ module).
28
+ def included(source)
29
+ inspected << source
30
+ source.class_eval do
31
+ def self.inspector(*fields)
32
+ @inspector_fields = *fields
33
+ end
34
+
35
+ def self.inspector_fields
36
+ @inspector_fields ||= []
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'cgi'
4
- require_relative 'validate'
5
-
6
3
  module Arx
7
4
 
8
5
  # Class for generating arXiv search API query strings.
@@ -1,30 +1,8 @@
1
- require_relative '../categories'
2
-
3
1
  module Arx
4
2
 
5
3
  # Validations for arXiv search query fields and identifier schemes.
4
+ # @private
6
5
  module Validate
7
-
8
- # The current arxiv paper identifier scheme (1 April 2007 and onwards).
9
- # The last block of digits can either be five digits (if the paper was published after 1501 - January 2015),
10
- # or four digits (if the paper was published before 1501).
11
- #
12
- # @see https://arxiv.org/help/arxiv_identifier#new arXiv identifier (new)
13
- # @example
14
- # 1501.00001
15
- # 1705.01662v1
16
- # 1412.0135
17
- # 0706.0001v2
18
- NEW_IDENTIFIER_FORMAT = %r"^\d{4}\.\d{4,5}(v\d+)?$"
19
-
20
- # The legacy arXiv paper identifier scheme (before 1 April 2007).
21
- #
22
- # @see https://arxiv.org/help/arxiv_identifier#old arXiv identifier (old)
23
- # @example
24
- # math/0309136v1
25
- # cond-mat/0211034
26
- OLD_IDENTIFIER_FORMAT = %r"^[a-z]+(\-[a-z]+)?\/\d{7}(v\d+)?$"
27
-
28
6
  class << self
29
7
  # Validates the +sortBy+ field of the query string.
30
8
  #
@@ -6,7 +6,7 @@ module Arx
6
6
  VERSION = {
7
7
  major: 0,
8
8
  minor: 3,
9
- patch: 0,
9
+ patch: 1,
10
10
  meta: nil
11
11
  }.compact.values.join('.').freeze
12
12
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edwin Onuonga
@@ -100,7 +100,8 @@ files:
100
100
  - lib/arx/entities/category.rb
101
101
  - lib/arx/entities/link.rb
102
102
  - lib/arx/entities/paper.rb
103
- - lib/arx/exceptions.rb
103
+ - lib/arx/error.rb
104
+ - lib/arx/inspector.rb
104
105
  - lib/arx/query/query.rb
105
106
  - lib/arx/query/validate.rb
106
107
  - lib/arx/version.rb
@@ -1,23 +0,0 @@
1
- module Arx
2
-
3
- # Custom error for missing links on an arXiv paper.
4
- class MissingLinkError < StandardError
5
- def initialize(link_type)
6
- super "This arXiv paper does not have a #{link_type} link"
7
- end
8
- end
9
-
10
- # Custom error for missing fields on an arXiv paper.
11
- class MissingFieldError < StandardError
12
- def initialize(field)
13
- super "This arXiv paper is missing the `#{field}` field"
14
- end
15
- end
16
-
17
- # Custom error for missing arXiv papers.
18
- class MissingPaper < StandardError
19
- def initialize(id)
20
- super "Couldn't find an arXiv paper with ID: #{id}"
21
- end
22
- end
23
- end