skooby 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +56 -0
- data/Rakefile +9 -0
- data/lib/skooby/book.rb +46 -0
- data/lib/skooby/request.rb +14 -0
- data/lib/skooby/search.rb +27 -0
- data/lib/skooby/version.rb +3 -0
- data/lib/skooby.rb +9 -0
- data/skooby.gemspec +24 -0
- data/test/fixtures/cassettes/fetch_movie.yml +1217 -0
- data/test/fixtures/cassettes/search_movie_multiple_results.yml +579 -0
- data/test/fixtures/cassettes/search_movie_one_result.yml +744 -0
- data/test/helper.rb +9 -0
- data/test/unit/test_book.rb +102 -0
- data/test/unit/test_request.rb +19 -0
- data/test/unit/test_search.rb +48 -0
- metadata +150 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Irio Irineu Musskopf Junior
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
Skooby
|
2
|
+
=====
|
3
|
+
|
4
|
+
Gives you some API like's methods to access [Skoob](http://skoob.com.br/) data.
|
5
|
+
|
6
|
+
Installation
|
7
|
+
------------
|
8
|
+
|
9
|
+
Add in your Gemfile
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'skooby'
|
13
|
+
```
|
14
|
+
|
15
|
+
Then run `bundle install`
|
16
|
+
|
17
|
+
Usage
|
18
|
+
-----
|
19
|
+
|
20
|
+
**Fetching information about a book**
|
21
|
+
```ruby
|
22
|
+
book = Skooby::Book.new(id: 108)
|
23
|
+
book.url
|
24
|
+
# => "http://skoob.com.br/livro/108"
|
25
|
+
book.fetch # forces eager load of attributes
|
26
|
+
# => #<Skooby::Book:0x007faafa445898
|
27
|
+
# @author="J. K. Rowling",
|
28
|
+
# @id=108,
|
29
|
+
# @rating=0.88,
|
30
|
+
# @title="Harry Potter e a Pedra Filosofal",
|
31
|
+
# @votes="47688">
|
32
|
+
```
|
33
|
+
|
34
|
+
**Searching books**
|
35
|
+
```ruby
|
36
|
+
collection = Skooby::Search.new.book("O Iluminado")
|
37
|
+
# => [#<Skooby::Book:0x007faafa335098
|
38
|
+
# @author="Stephen King",
|
39
|
+
# @id="19733",
|
40
|
+
# @title="O Iluminado">,
|
41
|
+
# #<Skooby::Book:0x007faafa333d60
|
42
|
+
# @author="Deepak Chopra",
|
43
|
+
# @id="1896",
|
44
|
+
# @title="Buda">,
|
45
|
+
# #<Skooby::Book:0x007faafa3327d0
|
46
|
+
# @author="Helena Jobim",
|
47
|
+
# @id="4447",
|
48
|
+
# @title="Antonio Carlos Jobim">, ...]
|
49
|
+
```
|
50
|
+
|
51
|
+
Contributing
|
52
|
+
------------
|
53
|
+
|
54
|
+
Feel free to contribute with any patch, even removing extra white spaces.
|
55
|
+
|
56
|
+
Open a pull request and make us all happy!
|
data/Rakefile
ADDED
data/lib/skooby/book.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module Skooby
|
4
|
+
class Book
|
5
|
+
attr_reader :id, :title, :author, :rating, :votes
|
6
|
+
|
7
|
+
def initialize(params = {})
|
8
|
+
@id = params[:id] if params.has_key?(:id)
|
9
|
+
@title = params[:title] if params.has_key?(:title)
|
10
|
+
@author = params[:author] if params.has_key?(:author)
|
11
|
+
@rating = params[:rating] if params.has_key?(:rating)
|
12
|
+
@votes = params[:votes] if params.has_key?(:votes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def url
|
16
|
+
Skooby::Request.base_uri + path
|
17
|
+
end
|
18
|
+
|
19
|
+
def author
|
20
|
+
@author || fetch.author
|
21
|
+
end
|
22
|
+
|
23
|
+
def rating
|
24
|
+
@rating || fetch.rating
|
25
|
+
end
|
26
|
+
|
27
|
+
def votes
|
28
|
+
@votes || fetch.votes
|
29
|
+
end
|
30
|
+
|
31
|
+
def fetch
|
32
|
+
doc = Nokogiri::HTML.parse(Request.new.get(path))
|
33
|
+
@title = doc.css('#barra_titulo h1')[0].content
|
34
|
+
@author = doc.css('.l11')[0].content
|
35
|
+
@rating = (doc.css('#bt_ranking')[0].content.to_f / 5).round(2)
|
36
|
+
@votes = /(\d+)/.match(doc.css('#bt_estrelas')[0].content)[1]
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def path
|
42
|
+
raise ArgumentError, 'Skooby::Book must have an id' if @id.nil?
|
43
|
+
"/livro/#@id"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module Skooby
|
4
|
+
class Search
|
5
|
+
def book(query)
|
6
|
+
opts = { body: { data: { Busca: { tipo: "livro", tag: query } } } }
|
7
|
+
page = Request.new.post('/livro/lista/', opts)
|
8
|
+
parse_result(page)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def parse_result(page_body)
|
13
|
+
doc = Nokogiri::HTML(page_body)
|
14
|
+
if doc.css('#livro').empty?
|
15
|
+
doc.css('.box_lista_busca').map do |book_node|
|
16
|
+
title_node = book_node.css('.l15ab')[0]
|
17
|
+
Book.new(id: /\A\/livro\/(\d+).*\Z/.match(title_node[:href])[1],
|
18
|
+
title: title_node.content,
|
19
|
+
author: book_node.css('.l11')[0].content)
|
20
|
+
end
|
21
|
+
else
|
22
|
+
Book.new(id: /\A\/livro\/(\d+).*\Z/.match(doc.css('#menubusca li:first a')[0][:href])[1],
|
23
|
+
title: doc.css('#barra_titulo h1')[0].content)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/skooby.rb
ADDED
data/skooby.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'skooby/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "skooby"
|
8
|
+
gem.version = Skooby::VERSION
|
9
|
+
gem.authors = ["Irio Irineu Musskopf Junior"]
|
10
|
+
gem.email = ["irio.musskopf@caixadeideias.com.br"]
|
11
|
+
gem.description = "API like interface to provide information about books available at Skoob."
|
12
|
+
gem.summary = "Gives you some API like's methods to access Skoob data."
|
13
|
+
gem.homepage = "https://github.com/Irio/skooby"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
gem.add_development_dependency "minitest"
|
20
|
+
gem.add_development_dependency "mocha"
|
21
|
+
gem.add_development_dependency "vcr"
|
22
|
+
gem.add_dependency "httparty"
|
23
|
+
gem.add_dependency "nokogiri"
|
24
|
+
end
|