arx 0.3.0 → 0.3.1

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: 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