gugl 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fccdc086bbec504323e41dc2f940dc9a49c7781e
4
+ data.tar.gz: 9cb928ffc3da6cf87be2f09981cd057dd67594dc
5
+ SHA512:
6
+ metadata.gz: 511e8836e260f17864ca9974c2f0c3dae0d1bee3ab7cbbf7942b3c158852580a3a96811d6881a37af6805c79fe4f14fc417f67a2c29bdb7446f88e9b6239d0cb
7
+ data.tar.gz: ee3166ad00044285d8e605ab883d0e0488c4c124558b20a68e8ac84717bbcc283ef0396a293511c5e4ae9501d0999262b777a76b1bb55673e0ba59d0546ffe9d
data/bin/gugl ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Usage:
4
+ #
5
+ # gugl "word"
6
+ # gugl "word" -l 2
7
+ #
8
+
9
+ require_relative "../lib/gugl"
10
+
11
+ # the easy way
12
+
13
+ query = ARGV[0]
14
+ limit = ARGV[2]
15
+
16
+ searcher = Gugl.searcher.new
17
+
18
+ searcher.authorize do |auth|
19
+ auth.key = ENV["GOOGLE_CUSTOM_SEARCH_KEY"]
20
+ auth.cx = ENV["GOOGLE_CUSTOM_SEARCH_CX"]
21
+ end
22
+
23
+ if limit
24
+ searcher.limit = limit
25
+ end
26
+
27
+ searcher.query = query
28
+
29
+ searcher.search_and_display
data/lib/gugl.rb ADDED
@@ -0,0 +1,9 @@
1
+ require_relative 'search/searcher'
2
+
3
+ module Gugl
4
+ extend self
5
+
6
+ def searcher
7
+ Search::Searcher
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module Gugl
2
+ module Search
3
+ class ApiCredentials
4
+ attr_accessor :key, :cx
5
+
6
+ def to_h
7
+ { key: key, cx: cx }
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ require_relative './remote_searcher'
2
+ require_relative './result_item'
3
+
4
+ module Gugl
5
+ module Search
6
+ class DataGetter
7
+ attr_accessor :query, :limit
8
+
9
+ def get
10
+ searcher.search(query, limit) do |items|
11
+ items.map(&method(:build_item))
12
+ end
13
+ end
14
+
15
+ def searcher
16
+ @searcher ||= RemoteSearcher.new
17
+ end
18
+
19
+ private
20
+
21
+ def build_item(item)
22
+ ResultItem.new(item)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ require_relative './terminal_result_displayer'
2
+ require_relative './mini_terminal_result_displayer'
3
+
4
+ module Gugl
5
+ module Search
6
+ module Displayers
7
+ module DisplayerMapper
8
+ extend self
9
+
10
+ DISPLAYERS = {
11
+ term: ->{ Displayers::TerminalResultDisplayer.new },
12
+ mini_term: ->{ Displayers::MiniTerminalResultDisplayer.new },
13
+ }
14
+
15
+ DEFAULT_DISPLAYER = :term
16
+
17
+ def [](key)
18
+ if key == :default
19
+ DISPLAYERS[DEFAULT_DISPLAYER].call
20
+ else
21
+ DISPLAYERS[key].call
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ require 'term/ansicolor'
2
+
3
+ module Gugl
4
+ module Search
5
+ module Displayers
6
+ class MiniTerminalResultDisplayer
7
+ include Term::ANSIColor
8
+
9
+ def display(result, index)
10
+ # title => link
11
+ print magenta, result.title, reset, " => "
12
+ print blue, result.link, reset, "\n"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ require 'term/ansicolor'
2
+
3
+ module Gugl
4
+ module Search
5
+ module Displayers
6
+ class TerminalResultDisplayer
7
+ include Term::ANSIColor
8
+
9
+ ENDING_LINES = 50
10
+
11
+ def display(result, index)
12
+ # title
13
+ print magenta, index.next, ".", result.title, reset, "\n\n"
14
+ # snippet
15
+ print white, result.snippet, "\n\n", reset
16
+ # link
17
+ print white, "Link: ", blue, result.link, reset, "\n\n"
18
+
19
+ print ("-" * ENDING_LINES), "\n\n"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,50 @@
1
+ require_relative './api_credentials'
2
+ require 'httparty'
3
+ require 'json'
4
+
5
+ module Gugl
6
+ module Search
7
+ class RemoteSearcher
8
+ attr_accessor :credentials
9
+
10
+ ITEMS_RESPONSE_NODE = 'items'
11
+ ERROR_RESPONSE_NODE = 'error'
12
+
13
+ def search(query, limit)
14
+ data = fetch_and_parse(query, limit)
15
+ if results = data[ITEMS_RESPONSE_NODE]
16
+ yield results
17
+ else
18
+ raise "Error: #{data[ERROR_RESPONSE_NODE]}"
19
+ end
20
+ end
21
+
22
+ def authorize
23
+ self.credentials = ApiCredentials.new
24
+ yield credentials
25
+ end
26
+
27
+ private
28
+
29
+ def fetch_and_parse(query, limit)
30
+ response = fetch(query, limit)
31
+ parse_response(response)
32
+ end
33
+
34
+ def fetch(query, limit)
35
+ HTTParty.get(base_url, query: {
36
+ num: limit,
37
+ q: query
38
+ }.merge(credentials.to_h))
39
+ end
40
+
41
+ def base_url
42
+ "https://www.googleapis.com/customsearch/v1"
43
+ end
44
+
45
+ def parse_response(response)
46
+ JSON.parse(response.body)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,13 @@
1
+ module Gugl
2
+ module Search
3
+ class ResultItem
4
+ attr_reader :title, :snippet, :link
5
+
6
+ def initialize(plain_item)
7
+ @title = plain_item['title']
8
+ @snippet = plain_item['snippet'].gsub(/\s{2,}/, ' ')
9
+ @link = plain_item['link']
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,65 @@
1
+ require_relative './data_getter'
2
+ require_relative './displayers/displayer_mapper'
3
+
4
+ module Gugl
5
+ module Search
6
+ class Searcher
7
+ attr_reader :results
8
+ attr_accessor :limit, :query
9
+
10
+ DEFAULT_LIMIT = 5
11
+
12
+ def search
13
+ configure_getter
14
+ @results = getter.get
15
+ end
16
+
17
+ def display
18
+ results.each_with_index.map do |result, index|
19
+ displayer.display result, index
20
+ end
21
+ end
22
+
23
+ def authorize(&blk)
24
+ getter.searcher.authorize(&blk)
25
+ end
26
+
27
+ def search_and_display
28
+ search
29
+ display
30
+ end
31
+
32
+ def displayer=(displayer)
33
+ @displayer = if displayer.is_a?(Symbol)
34
+ mapped_displayer(displayer)
35
+ else
36
+ displayer
37
+ end
38
+ end
39
+
40
+ def displayer
41
+ @displayer ||= mapped_displayer(:default)
42
+ end
43
+
44
+ def limit
45
+ @limit ||= DEFAULT_LIMIT
46
+ end
47
+
48
+ private
49
+
50
+ def mapped_displayer(key)
51
+ Displayers::DisplayerMapper[key]
52
+ end
53
+
54
+ def getter
55
+ @getter ||= DataGetter.new
56
+ end
57
+
58
+ def configure_getter
59
+ getter.query = query
60
+ getter.limit = limit
61
+ end
62
+
63
+ end
64
+ end
65
+ end
data/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Gugl
2
+ VERSION = '0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gugl
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Julio García
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: term-ansicolor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: A wrapper to use google services programmatically, using your google
56
+ crdedentials, starting with Search.
57
+ email:
58
+ - julioggonz@gmail.com
59
+ executables:
60
+ - gugl
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - lib/gugl.rb
65
+ - lib/search/api_credentials.rb
66
+ - lib/search/data_getter.rb
67
+ - lib/search/displayers/displayer_mapper.rb
68
+ - lib/search/displayers/mini_terminal_result_displayer.rb
69
+ - lib/search/displayers/terminal_result_displayer.rb
70
+ - lib/search/remote_searcher.rb
71
+ - lib/search/result_item.rb
72
+ - lib/search/searcher.rb
73
+ - bin/gugl
74
+ - version.rb
75
+ homepage: https://github.com/juliogarciag/gugl
76
+ licenses:
77
+ - MIT
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.0.3
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: A wrapper to use google services programmatically
99
+ test_files: []