boogle 0.0.0 → 0.1.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/.byebug_history +0 -0
- data/README.md +52 -10
- data/boogle.gemspec +4 -1
- data/lib/boogle.rb +14 -2
- data/lib/boogle/bookshelf.rb +21 -0
- data/lib/boogle/client.rb +20 -0
- data/lib/boogle/errors.rb +20 -0
- data/lib/boogle/service/connection.rb +19 -0
- data/lib/boogle/service/request.rb +89 -0
- data/lib/boogle/traits/bookshelf.rb +26 -0
- data/lib/boogle/traits/volume.rb +57 -0
- data/lib/boogle/version.rb +1 -1
- data/lib/boogle/volume.rb +46 -0
- metadata +67 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 240af5c6cda7443ced93e8e4f40cc361bf1f7cf2
|
4
|
+
data.tar.gz: aadf3010e3b63d7f39188284dfb163af1c85f674
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a1b13067929259131a322bab92ed214fdfb0b86cedb2f07c9e0848dc919dab019fc216e2c7b948f9396fbaa75ac52d10c604299cccfab86c15f24ed952c0b8a
|
7
|
+
data.tar.gz: 137ac017c58ee136fcb90773247231f54521a1d913246f74d7e03601e5503b56e0e6797c3ba3f7b2e77fadf8926e0f312b5aff028bf3b533b03b2e75fea4e030
|
data/.byebug_history
ADDED
File without changes
|
data/README.md
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
# Boogle
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
|
-
|
3
|
+
Boogle is a gem that takes off your hands from the haslle of dealing with [google books APIs](https://www.google.com)
|
7
4
|
## Installation
|
8
5
|
|
9
6
|
Add this line to your application's Gemfile:
|
@@ -21,21 +18,66 @@ Or install it yourself as:
|
|
21
18
|
$ gem install boogle
|
22
19
|
|
23
20
|
## Usage
|
21
|
+
#### 1 - Set the base connection
|
22
|
+
```ruby
|
23
|
+
boogle = Boogle::Client.new(key: 'api_key')
|
24
|
+
```
|
25
|
+
|
26
|
+
#### 2 - search for books
|
27
|
+
search by key word only
|
28
|
+
```ruby
|
29
|
+
boogle.volume.search(keyword: 'flowers')
|
30
|
+
```
|
31
|
+
you can choose to search in specific field by
|
32
|
+
```ruby
|
33
|
+
booble.volume.search(keyword: 'flower', field: 'intitle')
|
34
|
+
```
|
35
|
+
[here is a list of other feilds](https://developers.google.com/books/docs/v1/using#PerformingSearch)
|
24
36
|
|
25
|
-
|
37
|
+
#### 3 - get book by id
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
boogle.volume.find(id: '_oG_iTxP1pIC')
|
41
|
+
```
|
42
|
+
|
43
|
+
#### 4 - list of books
|
44
|
+
```ruby
|
45
|
+
boogle.volume.list(user_id: '', bookshelf_id: '')
|
46
|
+
```
|
47
|
+
#### 5 - return libarary books
|
48
|
+
```ruby
|
49
|
+
boogle.volume.mylibrary(auth_token: '', bookshelf_id: '')
|
50
|
+
```
|
51
|
+
#### 6 - remove a book
|
52
|
+
```ruby
|
53
|
+
boogle.volume.remove(auth_token: '', book_id: '', bookshelf_id: '')
|
54
|
+
```
|
55
|
+
#### 7 - Clearing all volumes from my bookshelf
|
56
|
+
```ruby
|
57
|
+
boogle.volume.clear(auth_token: '', bookshelf_id: '')
|
58
|
+
```
|
26
59
|
|
27
|
-
##
|
60
|
+
## Dealing with bookshelf
|
28
61
|
|
29
|
-
|
62
|
+
#### 1- list user's bookshelves
|
63
|
+
```ruby
|
64
|
+
boogle.bookshelf.list(user_id: '')
|
65
|
+
```
|
30
66
|
|
31
|
-
|
67
|
+
#### 2 - find specific bookshelf
|
68
|
+
```ruby
|
69
|
+
boogle.bookshelf.find(user_id: '', bookshelf_id: '')
|
70
|
+
```
|
32
71
|
|
72
|
+
#### 3- my libarary bookshelves
|
73
|
+
```ruby
|
74
|
+
boogle.bookshelf.mylibarary(auth_token: '')
|
75
|
+
```
|
33
76
|
## Contributing
|
34
77
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
78
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/hassantc/boogle. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
36
79
|
|
37
80
|
|
38
81
|
## License
|
39
82
|
|
40
83
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
41
|
-
|
data/boogle.gemspec
CHANGED
@@ -20,8 +20,11 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.bindir = "exe"
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
|
-
|
23
|
+
spec.add_dependency('faraday')
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.14"
|
25
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
26
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
+
spec.add_development_dependency 'mocha', '~> 1.0'
|
28
|
+
spec.add_development_dependency "fakeweb", ["~> 1.3"]
|
29
|
+
spec.add_development_dependency 'byebug'
|
27
30
|
end
|
data/lib/boogle.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require 'boogle/version'
|
2
|
+
require 'boogle/client' # user will deal with it
|
3
|
+
|
4
|
+
# google server will deal with those
|
5
|
+
require 'boogle/service/connection'
|
6
|
+
require 'boogle/service/request'
|
7
|
+
|
8
|
+
# how the object will render
|
9
|
+
require 'boogle/traits/volume'
|
10
|
+
require 'boogle/traits/bookshelf'
|
11
|
+
|
12
|
+
# object operations
|
13
|
+
require 'boogle/volume'
|
14
|
+
require 'boogle/bookshelf'
|
2
15
|
|
3
16
|
module Boogle
|
4
|
-
# Your code goes here...
|
5
17
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Boogle
|
2
|
+
class Bookshelf
|
3
|
+
attr_accessor :key
|
4
|
+
|
5
|
+
def initialize(key)
|
6
|
+
@key = key
|
7
|
+
end
|
8
|
+
|
9
|
+
def list(user_id: '')
|
10
|
+
Boogle::Service::Request.search(@key, "users/#{user_id}/bookshelves", {})
|
11
|
+
end
|
12
|
+
|
13
|
+
def find(user_id: '', bookshelf_id: '')
|
14
|
+
Boogle::Service::Request.find(@key, "users/#{user_id}/bookshelves", bookshelf_id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def mylibrary(auth_token: nil)
|
18
|
+
Boogle::Service::Request.mylibrary(auth_token, @key, 'mylibrary/bookshelves')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Boogle
|
2
|
+
class MisconfiguredClientError < StandardError; end
|
3
|
+
|
4
|
+
class Client
|
5
|
+
attr_accessor :key
|
6
|
+
|
7
|
+
def initialize(key: nil)
|
8
|
+
raise MisconfiguredClientError if key.nil? || key.empty? || !key.is_a?(String)
|
9
|
+
@key = key
|
10
|
+
end
|
11
|
+
|
12
|
+
def volume
|
13
|
+
Boogle::Volume.new(key)
|
14
|
+
end
|
15
|
+
|
16
|
+
def bookshelf
|
17
|
+
Boogle::Bookshelf.new(key)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Boogle
|
2
|
+
# base class exception from which all public Google books exceptions
|
3
|
+
class BoogleErrors < StandardError; end
|
4
|
+
# 400: Bad Request
|
5
|
+
class BadRequest < BoogleErrors; end
|
6
|
+
# 400: Invalid Sharing Request
|
7
|
+
# 401: Invalid Credentials
|
8
|
+
class InvalidCredentials < BoogleError; end
|
9
|
+
# 403: Daily Limit Exceeded
|
10
|
+
# 403: User Rate Limit Exceeded
|
11
|
+
# 403: Rate Limit Exceeded
|
12
|
+
# 403: Sharing Rate Limit Exceeded
|
13
|
+
class LimitExceedeed < BoogleError; end
|
14
|
+
# 404: resource not found: {fileId}
|
15
|
+
class ResourceNotFound < BoogleError; end
|
16
|
+
# 429: Too Many Requests
|
17
|
+
class TooManyRequests < BoogleError; end
|
18
|
+
# 500: Backend Error
|
19
|
+
class UnexpectedError < BoogleError; end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Boogle
|
5
|
+
module Service
|
6
|
+
class Connection
|
7
|
+
BASE_URL = 'https://www.googleapis.com/books/v1/'
|
8
|
+
|
9
|
+
def self.api(key)
|
10
|
+
Faraday.new(url: BASE_URL) do |faraday|
|
11
|
+
faraday.response :logger
|
12
|
+
faraday.adapter Faraday.default_adapter
|
13
|
+
faraday.headers['Content-Type'] = 'application/json'
|
14
|
+
faraday.params['key'] = key
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'byebug'
|
2
|
+
|
3
|
+
module Boogle
|
4
|
+
module Service
|
5
|
+
class Request
|
6
|
+
class << self
|
7
|
+
|
8
|
+
def find(key, path, id)
|
9
|
+
response = api(key).get("#{path}/#{id}")
|
10
|
+
response.status == 200 ? handle_find_response(response.body) : errors(response)
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(auth_token, key, path)
|
14
|
+
response = api(key).post do |req|
|
15
|
+
req.url path
|
16
|
+
req.headers['Authorization'] = auth_token
|
17
|
+
end
|
18
|
+
response.status == 200 ? true : errors(response)
|
19
|
+
end
|
20
|
+
|
21
|
+
def remove(auth_token, key, path)
|
22
|
+
response = api(key).post do |req|
|
23
|
+
req.url path
|
24
|
+
req.headers['Authorization'] = auth_token
|
25
|
+
end
|
26
|
+
response.status == 200 ? true : errors(response)
|
27
|
+
end
|
28
|
+
|
29
|
+
def clear(auth_token, key, path)
|
30
|
+
response = api(key).post do |req|
|
31
|
+
req.url path
|
32
|
+
req.headers['Authorization'] = auth_token
|
33
|
+
end
|
34
|
+
response.status == 200 ? true : errors(response)
|
35
|
+
end
|
36
|
+
|
37
|
+
def search(key, path, params)
|
38
|
+
response = api(key).get do |req|
|
39
|
+
req.url path, params
|
40
|
+
end
|
41
|
+
response.status == 200 ? handle_search_response(response.body) : errors(response)
|
42
|
+
end
|
43
|
+
|
44
|
+
def mylibrary(auth_token, key, path)
|
45
|
+
response = api(key).get do |req|
|
46
|
+
req.url path
|
47
|
+
req.headers['Authorization'] = auth_token
|
48
|
+
end
|
49
|
+
response.status == 200 ? handle_search_response(response.body) : errors(response)
|
50
|
+
end
|
51
|
+
|
52
|
+
def errors(response)
|
53
|
+
case response.status
|
54
|
+
when 400
|
55
|
+
raise Boogle::BadRequest, 'Bad rquest, please check your path again'
|
56
|
+
when 401
|
57
|
+
raise Boogle::InvalidCredentials, 'Check your Credentials'
|
58
|
+
when 403
|
59
|
+
raise Boogle::LimitExceedeed, 'you reached your limits'
|
60
|
+
when 404
|
61
|
+
raise Boogle::ResourceNotFound, 'Resource Not Found'
|
62
|
+
when 429
|
63
|
+
raise Boogle::TooManyRequests, 'Too many Requests'
|
64
|
+
else
|
65
|
+
raise Boogle::UnexpectedError, 'Something went wrong'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def handle_find_response(response)
|
70
|
+
response = JSON.parse(response)
|
71
|
+
response['kind'].include?('books#bookshelves') ? Boogle::Traits::Bookshelf.new(response) : Boogle::Traits::Volume.new(response)
|
72
|
+
end
|
73
|
+
|
74
|
+
def handle_search_response(response)
|
75
|
+
response = JSON.parse(response)
|
76
|
+
return [] unless response['items']
|
77
|
+
klass = response['kind'].include?('books#bookshelves') ? Boogle::Traits::Bookshelf : Boogle::Traits::Volume
|
78
|
+
response['items'].map do |item|
|
79
|
+
klass.new(item)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def api(key)
|
84
|
+
Boogle::Service::Connection.api(key)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Boogle
|
2
|
+
module Traits
|
3
|
+
class Bookshelf
|
4
|
+
attr_accessor :id, :kind, :self_link, :title, :description, :access
|
5
|
+
attr_accessor :created, :volume_count, :volumes_last_updated
|
6
|
+
|
7
|
+
def initialize(bookshelf_response)
|
8
|
+
convert_response_to_obj(bookshelf_response)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def convert_response_to_obj(bookshelf)
|
14
|
+
@id = bookshelf['id']
|
15
|
+
@kind = bookshelf['kind']
|
16
|
+
@self_link = bookshelf['selfLink']
|
17
|
+
@title = bookshelf['title']
|
18
|
+
@description = bookshelf['description']
|
19
|
+
@access = bookshelf['access']
|
20
|
+
@created = bookshelf['created']
|
21
|
+
@volume_count = bookshelf['volumeCount']
|
22
|
+
@volumes_last_updated = bookshelf['volumesLastUpdated']
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Boogle
|
2
|
+
module Traits
|
3
|
+
class Volume
|
4
|
+
attr_accessor :page_count, :printed_page_count, :print_type, :average_rating
|
5
|
+
attr_accessor :kind, :self_link, :etag, :authors, :published_date, :language
|
6
|
+
attr_accessor :allow_a_non_logging, :content_version, :panelization_summary
|
7
|
+
attr_accessor :publisher, :description, :industry_identifiers, :categories
|
8
|
+
attr_accessor :ratings_count, :maturity_rating, :image_links, :layer_info
|
9
|
+
attr_accessor :offers, :access_info, :quote_sharing_allowed, :volume_info
|
10
|
+
attr_accessor :id, :title, :access_view_status, :preview_link, :infoLink
|
11
|
+
attr_accessor :sale_info, :retail_price, :web_reader_link, :buy_link
|
12
|
+
attr_accessor :canonical_volume_link
|
13
|
+
|
14
|
+
def initialize(volume_response)
|
15
|
+
convert_response_to_obj(volume_response)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def convert_response_to_obj(volume)
|
21
|
+
@kind = volume['kind']
|
22
|
+
@id = volume['id']
|
23
|
+
@volume_info = volume['volumeInfo']
|
24
|
+
@title = volume['volumeInfo']['title']
|
25
|
+
@authors = volume['volumeInfo']['authors']
|
26
|
+
@publisher = volume['publisher']
|
27
|
+
@published_date = volume['publishedDate']
|
28
|
+
@description = volume['description']
|
29
|
+
@industry_identifiers = volume['industryIdentifiers']
|
30
|
+
@page_count = volume['pageCount']
|
31
|
+
@printed_page_count = volume['printedPageCount']
|
32
|
+
@print_type = volume['printType']
|
33
|
+
@categories = volume['categories']
|
34
|
+
@average_rating = volume['averageRating']
|
35
|
+
@ratings_count = volume['ratingsCount']
|
36
|
+
@maturity_rating = volume['maturityRating']
|
37
|
+
@allow_a_non_logging = volume['allowAnonLogging']
|
38
|
+
@content_version = volume['contentVersion']
|
39
|
+
@panelization_summary = volume['panelizationSummary']
|
40
|
+
@image_links = volume['imageLinks']
|
41
|
+
@language = volume['language']
|
42
|
+
@preview_link = volume['preview_link']
|
43
|
+
@info_link = volume['infoLink']
|
44
|
+
@canonical_volume_link = volume['canonicalVolumeLink']
|
45
|
+
@layer_info = volume['layerInfo']
|
46
|
+
@sale_info = volume['saleInfo']
|
47
|
+
@retail_price = volume['retailPrice']
|
48
|
+
@buy_link = volume['buyLink']
|
49
|
+
@offers = volume['offers']
|
50
|
+
@access_info = volume['accessInfo']
|
51
|
+
@web_reader_link = volume['webReaderLink']
|
52
|
+
@access_view_status = volume['accessViewStatus']
|
53
|
+
@quote_sharing_allowed = volume['quoteSharingAllowed']
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/boogle/version.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
module Boogle
|
2
|
+
class Volume
|
3
|
+
attr_accessor :key
|
4
|
+
def initialize(key)
|
5
|
+
@key = key
|
6
|
+
end
|
7
|
+
|
8
|
+
def find(id: '')
|
9
|
+
Boogle::Service::Request.find(@key, 'volumes', id)
|
10
|
+
end
|
11
|
+
|
12
|
+
def search(keyword: '', field: nil, download: nil, filter: nil, page: 1, per_page: 5, order_by: nil, projection: nil, type: 'all')
|
13
|
+
search_params = { q: query(keyword, field), download: download,
|
14
|
+
filter: filter, startIndex: page, maxResults: per_page,
|
15
|
+
printType: type, projection: projection,
|
16
|
+
orderBy: order_by }.reject { |_, v| v.nil? }
|
17
|
+
Boogle::Service::Request.search(@key, 'volumes', search_params)
|
18
|
+
end
|
19
|
+
|
20
|
+
def list(user_id: '', bookshelf_id: '')
|
21
|
+
Boogle::Service::Request.search(@key, "users/#{user_id}/bookshelves/#{bookshelf_id}/volumes", {})
|
22
|
+
end
|
23
|
+
|
24
|
+
def mylibrary(auth_token: nil, bookshelf_id: '')
|
25
|
+
Booogle::Service::Request.mylibrary(auth_token, @key, "mylibrary/bookshelves/#{bookshelf_id}/volumes")
|
26
|
+
end
|
27
|
+
|
28
|
+
def add(auth_token: nil, book_id: '', bookshelf_id: '')
|
29
|
+
Booogle::Service::Request.add(auth_token, @key, "mylibrary/bookshelves/#{bookshelf_id}/addVolume?volumeId=#{book_id}")
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove(auth_token: nil, book_id: '', bookshelf_id: '')
|
33
|
+
Booogle::Service::Request.add(auth_token, @key, "mylibrary/bookshelves/#{bookshelf_id}/removeVolume?volumeId=#{book_id}")
|
34
|
+
end
|
35
|
+
|
36
|
+
def clear(auth_token: nil, bookshelf_id: '')
|
37
|
+
Booogle::Service::Request.clear(auth_token, @key, "mylibrary/bookshelves/#{bookshelf_id}/clearVolumes")
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def query(keyword, field)
|
43
|
+
field ? "#{keyword}+#{field}:keys" : keyword
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: boogle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- HassanTC
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,48 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mocha
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: fakeweb
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.3'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: byebug
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
55
111
|
description: boogle is a gem that handle the google books apis hassle
|
56
112
|
email:
|
57
113
|
- hassan.mahmoud1@outlook.com
|
@@ -59,6 +115,7 @@ executables: []
|
|
59
115
|
extensions: []
|
60
116
|
extra_rdoc_files: []
|
61
117
|
files:
|
118
|
+
- ".byebug_history"
|
62
119
|
- ".gitignore"
|
63
120
|
- ".rspec"
|
64
121
|
- ".travis.yml"
|
@@ -71,7 +128,15 @@ files:
|
|
71
128
|
- bin/setup
|
72
129
|
- boogle.gemspec
|
73
130
|
- lib/boogle.rb
|
131
|
+
- lib/boogle/bookshelf.rb
|
132
|
+
- lib/boogle/client.rb
|
133
|
+
- lib/boogle/errors.rb
|
134
|
+
- lib/boogle/service/connection.rb
|
135
|
+
- lib/boogle/service/request.rb
|
136
|
+
- lib/boogle/traits/bookshelf.rb
|
137
|
+
- lib/boogle/traits/volume.rb
|
74
138
|
- lib/boogle/version.rb
|
139
|
+
- lib/boogle/volume.rb
|
75
140
|
homepage: https://github.com/HassanTC/boogle
|
76
141
|
licenses:
|
77
142
|
- MIT
|