alexandrite 0.1.0.pre.alpha → 0.1.2.pre.alpha
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/lib/alexandrite/version.rb +1 -1
- data/lib/alexandrite.rb +12 -20
- data/lib/alexandrite_book_data.rb +59 -0
- data/lib/alexandrite_bookshelf.rb +1 -1
- data/lib/alexandrite_google.rb +7 -0
- data/lib/alexandrite_oclc.rb +21 -20
- data/lib/helpers/file_handler.rb +1 -1
- metadata +4 -4
- data/lib/alexandrite_book.rb +0 -74
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1904340a4469d9f82f1d42d16a58cdd7a63e0a23711ed040d20c63648164d4fc
|
|
4
|
+
data.tar.gz: a6e306d3416403661661ed1bee823d43bd332f446cb1e1ee61e1529c8f5362aa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 40f3d5f4f06ce58a3f99156f4a26e399cb8b3e1c852a34de923947aa1b5cad75f39a2d75cc39ed86fa2a765292318ec890e5acc201fa922d861b91618e4d1d96
|
|
7
|
+
data.tar.gz: 0fc0a88be83ab17e5753cd389dac7de71ecffaa6915e59d7047a5dd4dc547b84a7fb0a2231be8e22fd911cf162945ad2fa16dafa531af82b0891f6539e22d3eb
|
data/lib/alexandrite/version.rb
CHANGED
data/lib/alexandrite.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative '
|
|
3
|
+
require_relative 'alexandrite_book_data'
|
|
4
4
|
require_relative 'alexandrite_google'
|
|
5
5
|
require_relative 'alexandrite_oclc'
|
|
6
6
|
require_relative 'error_type/errors'
|
|
@@ -8,37 +8,38 @@ require_relative 'error_type/errors'
|
|
|
8
8
|
# Main gem methods for creating books from ISBN
|
|
9
9
|
module Alexandrite
|
|
10
10
|
include ErrorType
|
|
11
|
+
include Alexandrite::BookData
|
|
11
12
|
|
|
12
13
|
# Get and Process data from Google API
|
|
13
14
|
class Google
|
|
15
|
+
include Alexandrite
|
|
14
16
|
extend Alexandrite::GoogleAPI
|
|
15
17
|
|
|
16
18
|
attr_reader :result
|
|
17
19
|
|
|
18
20
|
def initialize(key, query)
|
|
19
|
-
@result =
|
|
21
|
+
@result = search_with(key, query)
|
|
20
22
|
end
|
|
21
23
|
|
|
22
|
-
# @return [Alexandrite::
|
|
24
|
+
# @return [Alexandrite::BookData]
|
|
23
25
|
def self.create_from_google(key, query)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
Alexandrite::Book.new(volume_info)
|
|
26
|
+
Alexandrite::BookData.create_data(get_volume_info(key, query))
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
# Get and Process data from OCLC API
|
|
31
31
|
class OCLC
|
|
32
|
+
include Alexandrite
|
|
32
33
|
extend Alexandrite::OCLCAPI
|
|
33
34
|
|
|
34
35
|
attr_reader :result
|
|
35
36
|
|
|
36
37
|
# return [Alexandrite::OCLC]
|
|
37
38
|
def initialize(key, query, api: :oclc)
|
|
38
|
-
@result =
|
|
39
|
+
@result = search_with(key, query, api: api)
|
|
39
40
|
end
|
|
40
41
|
|
|
41
|
-
# @return [Alexandrite::
|
|
42
|
+
# @return [Alexandrite::BookData]
|
|
42
43
|
def self.create_from_oclc(type, identifier)
|
|
43
44
|
query = Alexandrite::OCLC.new(type, identifier)
|
|
44
45
|
response_code = get_response_code(query.result)
|
|
@@ -52,20 +53,20 @@ module Alexandrite
|
|
|
52
53
|
oclc: Alexandrite::OCLC
|
|
53
54
|
}.freeze
|
|
54
55
|
|
|
55
|
-
def
|
|
56
|
+
def search_with(key, query, api: :google)
|
|
56
57
|
API[api].search_by(key, query)
|
|
57
58
|
end
|
|
58
59
|
|
|
59
60
|
def create_book(key, query)
|
|
60
61
|
book = API[:google].create_from_google(key, query)
|
|
61
|
-
return API[:oclc].create_from_oclc(key, query) if book
|
|
62
|
+
return API[:oclc].create_from_oclc(key, query) if book[:error_message]
|
|
62
63
|
|
|
63
64
|
book
|
|
64
65
|
end
|
|
65
66
|
|
|
66
67
|
# @param key [String]
|
|
67
68
|
# @param data [Array<String>]
|
|
68
|
-
# @return [Array<Alexandrite::
|
|
69
|
+
# @return [Array<Alexandrite::BookData]
|
|
69
70
|
def bulk_create(key, data)
|
|
70
71
|
bookshelf = []
|
|
71
72
|
data.each do |query|
|
|
@@ -75,13 +76,4 @@ module Alexandrite
|
|
|
75
76
|
|
|
76
77
|
bookshelf
|
|
77
78
|
end
|
|
78
|
-
|
|
79
|
-
private
|
|
80
|
-
|
|
81
|
-
def get_volume_info(key, query)
|
|
82
|
-
query = search_by(key, query)
|
|
83
|
-
return query[:books].first['volumeInfo'] unless query[:error_message]
|
|
84
|
-
|
|
85
|
-
query
|
|
86
|
-
end
|
|
87
79
|
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'alexandrite'
|
|
4
|
+
require 'nokogiri'
|
|
5
|
+
|
|
6
|
+
module Alexandrite
|
|
7
|
+
# Create a book objects
|
|
8
|
+
module BookData
|
|
9
|
+
# @param volume_info [Hash]
|
|
10
|
+
# @return [Hash]
|
|
11
|
+
def self.create_data(volume_info)
|
|
12
|
+
data = add_basic_values(volume_info)
|
|
13
|
+
data[:data_source] = add_origin(volume_info)
|
|
14
|
+
data = add_industry_identifiers(volume_info, data)
|
|
15
|
+
data[:error_message] = volume_info[:error_message]
|
|
16
|
+
|
|
17
|
+
data
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.add_basic_values(volume_info)
|
|
21
|
+
{
|
|
22
|
+
title: volume_info['title'],
|
|
23
|
+
authors: volume_info['authors'],
|
|
24
|
+
published_date: volume_info['publisher'],
|
|
25
|
+
page_count: volume_info['pageCount'],
|
|
26
|
+
description: volume_info['description'],
|
|
27
|
+
categories: volume_info['categories'],
|
|
28
|
+
language: volume_info['language']
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @param [Hash] volume_info
|
|
34
|
+
# @return [String]
|
|
35
|
+
def self.add_origin(volume_info) = volume_info['origin'] || 'Google API'
|
|
36
|
+
|
|
37
|
+
# @param [Hash] volume_info
|
|
38
|
+
# @param [Hash] data
|
|
39
|
+
# @return [NilClass]
|
|
40
|
+
def self.add_industry_identifiers(volume_info, data)
|
|
41
|
+
return data unless volume_info[:error_message].nil?
|
|
42
|
+
|
|
43
|
+
if data[:data_source] == 'OCLC API'
|
|
44
|
+
data[:isbn10] = volume_info['ISBN_10']
|
|
45
|
+
data[:isbn13] = volume_info['ISBN_13']
|
|
46
|
+
return data
|
|
47
|
+
end
|
|
48
|
+
begin
|
|
49
|
+
volume_info['industryIdentifiers'].each do |identifier|
|
|
50
|
+
data[:isbn10] = identifier['identifier'] if identifier['type'] == 'ISBN_10'
|
|
51
|
+
data[:isbn13] = identifier['identifier'] if identifier['type'] == 'ISBN_13'
|
|
52
|
+
end
|
|
53
|
+
rescue NoMethodError
|
|
54
|
+
data
|
|
55
|
+
end
|
|
56
|
+
data
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
data/lib/alexandrite_google.rb
CHANGED
|
@@ -62,6 +62,13 @@ module Alexandrite
|
|
|
62
62
|
|
|
63
63
|
private
|
|
64
64
|
|
|
65
|
+
def get_volume_info(key, query)
|
|
66
|
+
query = search_by(key, query)
|
|
67
|
+
return query[:books].first['volumeInfo'] unless query[:error_message]
|
|
68
|
+
|
|
69
|
+
query
|
|
70
|
+
end
|
|
71
|
+
|
|
65
72
|
def zero_results?(response_body) = response_body['totalItems'].zero?
|
|
66
73
|
|
|
67
74
|
def process_response(response)
|
data/lib/alexandrite_oclc.rb
CHANGED
|
@@ -17,6 +17,7 @@ module Alexandrite
|
|
|
17
17
|
include Nokogiri
|
|
18
18
|
include Alexandrite::Helpers::Format
|
|
19
19
|
include Alexandrite::Helpers::Validation
|
|
20
|
+
include Alexandrite::BookData
|
|
20
21
|
|
|
21
22
|
BASE_URL = 'http://classify.oclc.org/classify2/Classify?'
|
|
22
23
|
|
|
@@ -30,28 +31,37 @@ module Alexandrite
|
|
|
30
31
|
Nokogiri::XML(conn.get(search).body)
|
|
31
32
|
end
|
|
32
33
|
|
|
34
|
+
def extract_value(attribute)
|
|
35
|
+
return nil unless attribute.respond_to?(:value)
|
|
36
|
+
|
|
37
|
+
attribute.value
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def extract_nokogiri_data(document, children, attribute)
|
|
41
|
+
extract_value(document.css(children).attribute(attribute))
|
|
42
|
+
end
|
|
43
|
+
|
|
33
44
|
def get_book_data(result)
|
|
34
45
|
isbn = result.css('input').children.text
|
|
35
46
|
isbn_type = define_isbn_type(isbn)
|
|
36
47
|
{
|
|
37
48
|
'origin' => 'OCLC API',
|
|
38
|
-
'title' => result
|
|
39
|
-
'authors' => result
|
|
40
|
-
'ddc' => result
|
|
49
|
+
'title' => extract_nokogiri_data(result, 'work', 'title'),
|
|
50
|
+
'authors' => extract_nokogiri_data(result, 'work', 'author'),
|
|
51
|
+
'ddc' => extract_nokogiri_data(result, 'mostPopular', 'nsfa'),
|
|
41
52
|
isbn_type => isbn
|
|
42
53
|
}
|
|
43
54
|
end
|
|
44
55
|
|
|
45
56
|
def recommend_classification(key, query, length = 5, mode: 'ddc')
|
|
46
57
|
results = search_by(key, query)
|
|
47
|
-
|
|
48
58
|
response_cases(results, length, mode)
|
|
49
59
|
end
|
|
50
60
|
|
|
51
61
|
private
|
|
52
62
|
|
|
53
63
|
# @return [Integer]
|
|
54
|
-
def get_response_code(result) = result
|
|
64
|
+
def get_response_code(result) = extract_nokogiri_data(result, 'response', 'code').to_i
|
|
55
65
|
|
|
56
66
|
def get_owis(result, length)
|
|
57
67
|
owis = []
|
|
@@ -83,22 +93,13 @@ module Alexandrite
|
|
|
83
93
|
end
|
|
84
94
|
|
|
85
95
|
def create_new_book(query)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
Alexandrite::Book.new(volume_info)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def retry_create_new_book(query)
|
|
92
|
-
owi = get_owis(query.result, 1)[0]
|
|
93
|
-
new_query = Alexandrite::OCLC.new('owi', owi)
|
|
94
|
-
volume_info = get_book_data(new_query.result)
|
|
95
|
-
Alexandrite::Book.new(volume_info)
|
|
96
|
+
Alexandrite::BookData.create_data(get_book_data(query.result))
|
|
96
97
|
end
|
|
97
98
|
|
|
98
|
-
def handle_error_creating_book
|
|
99
|
-
raise ErrorType::DataNotFound,
|
|
99
|
+
def handle_error_creating_book
|
|
100
|
+
raise ErrorType::DataNotFound, yield
|
|
100
101
|
rescue StandardError => e
|
|
101
|
-
Alexandrite::
|
|
102
|
+
Alexandrite::BookData.create_data({ :error_message => e.message, 'origin' => 'OCLC API' })
|
|
102
103
|
end
|
|
103
104
|
|
|
104
105
|
# @param [Nokogiri::XML] result
|
|
@@ -130,9 +131,9 @@ module Alexandrite
|
|
|
130
131
|
when 0, 2
|
|
131
132
|
create_new_book(query)
|
|
132
133
|
when 4
|
|
133
|
-
|
|
134
|
+
handle_error_creating_book { 'Not found exact item. Check coincidences' }
|
|
134
135
|
else
|
|
135
|
-
handle_error_creating_book(query)
|
|
136
|
+
handle_error_creating_book { response_cases(query.result, 0, 'none') }
|
|
136
137
|
end
|
|
137
138
|
end
|
|
138
139
|
end
|
data/lib/helpers/file_handler.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: alexandrite
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.2.pre.alpha
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- J. P. Pérez-Tejada
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-01-
|
|
11
|
+
date: 2023-01-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -156,7 +156,7 @@ files:
|
|
|
156
156
|
- data.dump
|
|
157
157
|
- lib/alexandrite.rb
|
|
158
158
|
- lib/alexandrite/version.rb
|
|
159
|
-
- lib/
|
|
159
|
+
- lib/alexandrite_book_data.rb
|
|
160
160
|
- lib/alexandrite_bookshelf.rb
|
|
161
161
|
- lib/alexandrite_google.rb
|
|
162
162
|
- lib/alexandrite_oclc.rb
|
|
@@ -189,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
189
189
|
- !ruby/object:Gem::Version
|
|
190
190
|
version: 1.3.1
|
|
191
191
|
requirements: []
|
|
192
|
-
rubygems_version: 3.
|
|
192
|
+
rubygems_version: 3.4.5
|
|
193
193
|
signing_key:
|
|
194
194
|
specification_version: 4
|
|
195
195
|
summary: Tools for fetching books data from Google and OCLC
|
data/lib/alexandrite_book.rb
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative 'alexandrite'
|
|
4
|
-
require 'nokogiri'
|
|
5
|
-
|
|
6
|
-
module Alexandrite
|
|
7
|
-
# Create a book objects
|
|
8
|
-
class Book
|
|
9
|
-
attr_accessor :title, :authors, :publisher, :published_date, :page_count, :description, :categories, :language,
|
|
10
|
-
:country, :isbn10, :isbn13, :error_message, :ddc, :lcc, :suggested_classifications
|
|
11
|
-
|
|
12
|
-
# @param volume_info [Hash]
|
|
13
|
-
# @return [Alexandrite::Books]
|
|
14
|
-
def initialize(volume_info)
|
|
15
|
-
add_origin(volume_info)
|
|
16
|
-
add_basic_values(volume_info)
|
|
17
|
-
add_industry_identifiers(volume_info, @origin)
|
|
18
|
-
@error_message = volume_info[:error_message]
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def self.collection = @@collection
|
|
22
|
-
|
|
23
|
-
def self.add_to_collection(book)
|
|
24
|
-
@@collection.push(book)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# @param [String] ddc_code
|
|
28
|
-
# @return [NilClass]
|
|
29
|
-
def add_ddc(ddc_code) = @ddc = ddc_code
|
|
30
|
-
|
|
31
|
-
# @param [String] lcc_code
|
|
32
|
-
# @return [NilClass]
|
|
33
|
-
def add_lcc(lcc_code) = @lcc = lcc_code
|
|
34
|
-
|
|
35
|
-
# @param [Array<String>] suggestions
|
|
36
|
-
# @return [NilClass]
|
|
37
|
-
def add_classification_suggested(suggestions) = @suggested_classifications = suggestions
|
|
38
|
-
|
|
39
|
-
private
|
|
40
|
-
|
|
41
|
-
def add_basic_values(volume_info)
|
|
42
|
-
@title = volume_info['title']
|
|
43
|
-
@authors = volume_info['authors']
|
|
44
|
-
@publisher = volume_info['publisher']
|
|
45
|
-
@published_date = volume_info['publishedDate']
|
|
46
|
-
@page_count = volume_info['pageCount']
|
|
47
|
-
@description = volume_info['description']
|
|
48
|
-
@categories = volume_info['categories']
|
|
49
|
-
@language = volume_info['language']
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# @param [Hash] volume_info
|
|
53
|
-
# @return [String]
|
|
54
|
-
def add_origin(volume_info) = @origin = volume_info['origin'] || 'Google API'
|
|
55
|
-
|
|
56
|
-
# @param [Hash] volume_info
|
|
57
|
-
# @param [String] origin
|
|
58
|
-
# @return [NilClass]
|
|
59
|
-
def add_industry_identifiers(volume_info, origin)
|
|
60
|
-
return nil unless volume_info[:error_message].nil?
|
|
61
|
-
|
|
62
|
-
if origin == 'OCLC API'
|
|
63
|
-
@isbn10 = volume_info['ISBN_10']
|
|
64
|
-
@isbn13 = volume_info['ISBN_13']
|
|
65
|
-
return
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
volume_info['industryIdentifiers'].each do |identifier|
|
|
69
|
-
@isbn10 = identifier['identifier'] if identifier['type'] == 'ISBN_10'
|
|
70
|
-
@isbn13 = identifier['identifier'] if identifier['type'] == 'ISBN_13'
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|