gnib 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.
@@ -0,0 +1,2 @@
1
+ pkg/*
2
+ *.gem
data/.rvmrc ADDED
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
+ environment_id="ruby-1.9.3-p0@gnib"
8
+
9
+ #
10
+ # Uncomment following line if you want options to be set only for given project.
11
+ #
12
+ # PROJECT_JRUBY_OPTS=( --1.9 )
13
+ #
14
+ # The variable PROJECT_JRUBY_OPTS requires the following to be run in shell:
15
+ #
16
+ # chmod +x ${rvm_path}/hooks/after_use_jruby_opts
17
+ #
18
+
19
+ #
20
+ # First we attempt to load the desired environment directly from the environment
21
+ # file. This is very fast and efficient compared to running through the entire
22
+ # CLI and selector. If you want feedback on which environment was used then
23
+ # insert the word 'use' after --create as this triggers verbose mode.
24
+ #
25
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
26
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
27
+ then
28
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
29
+
30
+ if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
31
+ then
32
+ . "${rvm_path:-$HOME/.rvm}/hooks/after_use"
33
+ fi
34
+ else
35
+ # If the environment file has not yet been created, use the RVM CLI to select.
36
+ if ! rvm --create use "$environment_id"
37
+ then
38
+ echo "Failed to create RVM environment '${environment_id}'."
39
+ return 1
40
+ fi
41
+ fi
42
+
43
+ #
44
+ # If you use an RVM gemset file to install a list of gems (*.gems), you can have
45
+ # it be automatically loaded. Uncomment the following and adjust the filename if
46
+ # necessary.
47
+ #
48
+ # filename=".gems"
49
+ # if [[ -s "$filename" ]]
50
+ # then
51
+ # rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
52
+ # fi
53
+
54
+ # If you use bundler, this might be useful to you:
55
+ # if [[ -s Gemfile ]] && ! command -v bundle >/dev/null
56
+ # then
57
+ # printf "The rubygem 'bundler' is not installed. Installing it now.\n"
58
+ # gem install bundler
59
+ # fi
60
+ # if [[ -s Gemfile ]] && command -v bundle
61
+ # then
62
+ # bundle install
63
+ # fi
64
+
65
+ if [[ $- == *i* ]] # check for interactive shells
66
+ then
67
+ echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
68
+ else
69
+ echo "Using: $GEM_HOME" # don't use colors in interactive shells
70
+ fi
71
+
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,28 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ gnib (0.1.0)
5
+ activesupport
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ activesupport (3.1.3)
11
+ multi_json (~> 1.0)
12
+ diff-lcs (1.1.3)
13
+ multi_json (1.0.4)
14
+ rspec (2.7.0)
15
+ rspec-core (~> 2.7.0)
16
+ rspec-expectations (~> 2.7.0)
17
+ rspec-mocks (~> 2.7.0)
18
+ rspec-core (2.7.1)
19
+ rspec-expectations (2.7.0)
20
+ diff-lcs (~> 1.1.2)
21
+ rspec-mocks (2.7.0)
22
+
23
+ PLATFORMS
24
+ ruby
25
+
26
+ DEPENDENCIES
27
+ gnib!
28
+ rspec
@@ -0,0 +1,63 @@
1
+ Gnib
2
+ ====
3
+
4
+ Gnib is a Ruby interface for Microsoft Bing Search API.
5
+
6
+ Installation
7
+ ------------
8
+
9
+ ### Rails 3.x users
10
+
11
+ For Rails 3.x projects, add the following line to your `Gemfile`.
12
+
13
+ gem 'gnib'
14
+
15
+ ### All Others
16
+
17
+ Install `gnib` gem with Rubygems.
18
+
19
+ $ gem install gnib
20
+
21
+ Usage
22
+ -----
23
+
24
+ Obtain your Application key from [here] (https://ssl.bing.com/webmaster/developers/appids.aspx)
25
+
26
+ ### Standalone
27
+
28
+ Gnib.config.application_id = 'YOUR_APP_ID'
29
+ results = Gnib::Search.get('Great', :sources => [:image])
30
+
31
+ ### Rails 3.x
32
+
33
+ In initializers like `config/initializers/gnib.rb`, configure Gnib with
34
+ your Application key.
35
+
36
+ Gnib.config.application_id = 'YOUR_APP_ID'
37
+
38
+ You can search items in your actions.
39
+
40
+ @results = Gnib::Search.get('hello world', :sources => [:web, :image])
41
+
42
+ ### (Not so much) More Complicated Usage Example
43
+
44
+ `Gnib::Search#get` is a helper function implemented to maximize
45
+ usability of the library. You can utilize `Gnib::Search`,
46
+ `Gnib::SearchRequest`, `Gnib::SearchResponse` instances which provide
47
+ more useful options than that of the helper function.
48
+
49
+ search = Gnib::Search.new 'query', :sources => [:web, :image] #
50
+ Other options include :market, :version, :adult, :latitude, :longitude,
51
+ ...
52
+ request = search.request
53
+ response = request.response
54
+
55
+ image_results = response.images # Image search results
56
+ web_results = response.webs # Web search results
57
+
58
+ More descriptive documentations will be available soon. Stay tuned!
59
+
60
+ References
61
+ ----------
62
+
63
+ - [Bing Developer](http://www.bing.com/toolbox/bingdeveloper/)
@@ -0,0 +1,20 @@
1
+ require 'bundler'
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc 'Default: run specs.'
5
+ task :default => :spec
6
+
7
+ desc "Run specs"
8
+ RSpec::Core::RakeTask.new do |t|
9
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
10
+ # Put spec opts in a file named .rspec in root
11
+ end
12
+
13
+ desc "Generate code coverage"
14
+ RSpec::Core::RakeTask.new(:coverage) do |t|
15
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
16
+ t.rcov = true
17
+ t.rcov_opts = ['--exclude', 'spec']
18
+ end
19
+
20
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "gnib/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "gnib"
7
+ s.version = Gnib::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Inbeom Hwang"]
10
+ s.email = ["inbeom@wafflestudio.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Ruby library for Microsoft Bing Search API}
13
+ s.description = %q{Gnib provides interfaces for Bing Search API version 2.0}
14
+
15
+ s.add_dependency "activesupport"
16
+ s.add_development_dependency "rspec"
17
+
18
+ # s.rubyforge_project = "gnib"
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+ end
@@ -0,0 +1,19 @@
1
+ require 'active_support'
2
+ require 'active_support/inflector'
3
+ require 'gnib/configurations'
4
+ require 'gnib/search_request'
5
+ require 'gnib/search'
6
+ require 'gnib/search_result'
7
+ require 'gnib/response'
8
+
9
+ module Gnib
10
+ class << self
11
+ def config
12
+ if block_given?
13
+ yield Configurations.singleton_object
14
+ else
15
+ Configurations.singleton_object
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Gnib
2
+ class Configurations
3
+ private_class_method :new
4
+ attr_accessor :application_id, :api_root
5
+
6
+ def self.singleton_object
7
+ @singleton ||= new
8
+ end
9
+
10
+ def api_root
11
+ @api_root ||= 'http://api.bing.net/json.aspx'
12
+ end
13
+
14
+ private
15
+ # Prevent external initialization
16
+ def initialize; super; end
17
+ end
18
+ end
@@ -0,0 +1,44 @@
1
+ module Gnib
2
+ class Response
3
+ SOURCES = [:web, :image, :news, :spell, :phonebook, :related_search, :translation, :video]
4
+ def initialize(body)
5
+ @response_hash = ActiveSupport::JSON.decode(body)['SearchResponse']
6
+ end
7
+
8
+ def results_for(source)
9
+ results_container = @response_hash[source.to_s.camelize]
10
+
11
+ if results_container
12
+ @response_hash[source.to_s.camelize]['Results'].map do |result|
13
+ SearchResult.new result
14
+ end
15
+ else
16
+ []
17
+ end
18
+ end
19
+
20
+ def result_count_of(source)
21
+ @response_hash[source.to_s.camelize]['Total'].to_i
22
+ end
23
+
24
+ def results
25
+ ret = []
26
+
27
+ SOURCES.each do |type, v|
28
+ ret |= results_for(type)
29
+ end
30
+
31
+ ret
32
+ end
33
+
34
+ def method_missing(method, *args, &block)
35
+ singluar_form = method.to_s.singularize.to_sym
36
+
37
+ if SOURCES.include? singluar_form
38
+ results_for(singluar_form)
39
+ else
40
+ super
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,95 @@
1
+ require 'uri'
2
+ require 'cgi'
3
+
4
+ require 'gnib/search_helper'
5
+
6
+ module Gnib
7
+ class Search
8
+ extend SearchHelper
9
+
10
+ PARAMS = [:query, :sources, :market, :version, :adult, :options, :latitude, :longitude]
11
+
12
+ SPECIFIC_PARAMS = {
13
+ :image => [:count, :offset, :filters],
14
+ :web => [:count, :offset, :file_type, :options],
15
+ :news => [:location_override, :category, :sort_by],
16
+ :phonebook => [:count, :offset, :file_type, :loc_id, :sort_by],
17
+ :related_search => [],
18
+ :spell => [],
19
+ :translation => [:source_language, :target_language],
20
+ :video => [:count, :offset, :filters, :sort_by]
21
+ }
22
+
23
+ def initialize(q, options = {})
24
+ @parameters = {}
25
+
26
+ # Set default values for required parameters
27
+ @parameters[:app_id] = Gnib.config.application_id
28
+ @parameters[:sources] = ['Web']
29
+ @parameters[:query] = q
30
+
31
+ # Iterate params array except query
32
+ (PARAMS - [:query]).each do |param|
33
+ @parameters[param] = options[param] if options[param]
34
+ end
35
+
36
+ SPECIFIC_PARAMS.each do |source, params|
37
+ if options[source]
38
+ @parameters[source] = {}
39
+
40
+ params.each do |param|
41
+ @parameters[source][param] = options[source][param] if options[source][param]
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ # Returns a SearchRequest object initialized with URI of self
48
+ def request
49
+ SearchRequest.new self.request_uri
50
+ end
51
+
52
+ protected
53
+ def request_uri
54
+ URI.parse("#{Gnib.config.api_root}?#{serialized_parameters}")
55
+ end
56
+
57
+ # Convert @parameters into HTTP GET parameters
58
+ def serialized_parameters
59
+ @parameters.map do |k,v|
60
+ if v.is_a? Hash
61
+ # Source-specific parameters
62
+ expanded_hash_parameters(k, v)
63
+ else
64
+ # General required and optional parameters
65
+ "#{k.to_s.camelize}=#{CGI::escape(serialized_parameter(v))}"
66
+ end
67
+ end.join('&')
68
+ end
69
+
70
+ # Expand parameters organized in hash form which is used for
71
+ # source-specific purpose to serialized GET parameter string.
72
+ def expanded_hash_parameters(source, params_hash, options = {})
73
+ base_str = "#{source.to_s.camelize}Request"
74
+
75
+ params_hash.map do |k, v|
76
+ "#{base_str}.#{k.to_s.camelize}=#{serialized_parameter(v)}"
77
+ end.join('&')
78
+ end
79
+
80
+ # Serialize parameter values into string form what Bing recommends them to
81
+ # be. Currently supports String and Array parameters.
82
+ #
83
+ # String parameters
84
+ def serialized_parameter(v)
85
+ case v
86
+ when String
87
+ v
88
+ when Array
89
+ v.map(&:to_s).join(' ')
90
+ else
91
+ v.to_s
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,8 @@
1
+ module Gnib
2
+ module SearchHelper
3
+ def get(q, options = {})
4
+ search = self.new(q, options)
5
+ search.request.response.results
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+
4
+ module Gnib
5
+ class SearchRequest
6
+ def initialize(uri)
7
+ @uri = uri
8
+ end
9
+
10
+ def response
11
+ @response_body ||= do_http_request.body
12
+ Response.new(@response_body)
13
+ end
14
+
15
+ protected
16
+ def do_http_request
17
+ http = Net::HTTP.new(@uri.host, @uri.port)
18
+ http.request(Net::HTTP::Get.new(@uri.request_uri))
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,21 @@
1
+ module Gnib
2
+ class SearchResult
3
+ def initialize(rsp_body)
4
+ @rsp_body = rsp_body
5
+ end
6
+
7
+ def to_hash
8
+ @rsp_body
9
+ end
10
+
11
+ def method_missing(sym, *args, &block)
12
+ val = @rsp_body[sym.to_s.camelize]
13
+ if val
14
+ return val unless val.is_a? Hash
15
+ return SearchResult.new val
16
+ else
17
+ super
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module Gnib
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1 @@
1
+ {"SearchResponse":{"Version":"2.2","Query":{"SearchTerms":"google"},"Image":{"Total":146000000,"Offset":0,"Results":[{"Title":"Google Instant – Google setzt auf Schnelligkeit | Blog WebTec Braun","MediaUrl":"http:\/\/www.blog.webtec-braun.com\/wp-content\/uploads\/google.jpg","Url":"http:\/\/www.blog.webtec-braun.com\/google\/top-news-google-setzt-auf-schnelligkeit.html","DisplayUrl":"http:\/\/www.blog.webtec-braun.com\/google\/top-news-google-setzt-auf-schnelligkeit.html","Width":600,"Height":400,"FileSize":15719,"ContentType":"image\/jpeg","Thumbnail":{"Url":"http:\/\/ts4.mm.bing.net\/images\/thumbnail.aspx?q=1524014450527&id=421bf34508bee00c8f75b0af9529c1ab","ContentType":"image\/jpeg","Width":160,"Height":106,"FileSize":2611}},{"Title":"Google.com 1997-2011","MediaUrl":"http:\/\/blogoscoped.com\/files\/google-com-history\/1997.png","Url":"http:\/\/blogoscoped.com\/archive\/2006-04-21-n63.html","DisplayUrl":"http:\/\/blogoscoped.com\/archive\/2006-04-21-n63.html","Width":730,"Height":440,"FileSize":52312,"ContentType":"image\/png","Thumbnail":{"Url":"http:\/\/ts2.mm.bing.net\/images\/thumbnail.aspx?q=1533478044761&id=87c9b3eae3c7efd70ca8bd4c0000d049","ContentType":"image\/jpeg","Width":160,"Height":96,"FileSize":2462}},{"Title":"google","MediaUrl":"http:\/\/www.alertacosmico.com.ar\/images\/google.png","Url":"http:\/\/www.alertacosmico.com.ar\/google.html","DisplayUrl":"http:\/\/www.alertacosmico.com.ar\/google.html","Width":619,"Height":324,"FileSize":25156,"ContentType":"image\/png","Thumbnail":{"Url":"http:\/\/ts3.mm.bing.net\/images\/thumbnail.aspx?q=1513235355322&id=303ed99b926d0be48b2f97b5614c7306","ContentType":"image\/jpeg","Width":160,"Height":83,"FileSize":2262}},{"Title":"Free | Google Advertising Search Plugin | Top Spot or Not | New Google ...","MediaUrl":"http:\/\/blogoscoped.com\/files\/shaun-google-ie7.jpg","Url":"http:\/\/blogoscoped.com\/archive\/2005-09-20.html","DisplayUrl":"http:\/\/blogoscoped.com\/archive\/2005-09-20.html","Width":1011,"Height":838,"FileSize":100381,"ContentType":"image\/jpeg","Thumbnail":{"Url":"http:\/\/ts2.mm.bing.net\/images\/thumbnail.aspx?q=1516205713873&id=b7ae4c607d359b00a9b1faf0808f4681","ContentType":"image\/jpeg","Width":160,"Height":132,"FileSize":2649}},{"Title":"Google Chrome es el nombre del navegador creado por la empresa Google ...","MediaUrl":"http:\/\/cdn3.tusdescargasdirectas.net\/wp-content\/uploads\/2009\/11\/Google-Chrome.jpg","Url":"http:\/\/tusdescargasdirectas.net\/google-chrome.html","DisplayUrl":"http:\/\/tusdescargasdirectas.net\/google-chrome.html","Width":350,"Height":321,"FileSize":54768,"ContentType":"image\/jpeg","Thumbnail":{"Url":"http:\/\/ts1.mm.bing.net\/images\/thumbnail.aspx?q=1521468318840&id=f0adf89b0cd8ee21990954114ffc2a0d","ContentType":"image\/jpeg","Width":160,"Height":146,"FileSize":4086}},{"Title":"Facebook vs Google","MediaUrl":"http:\/\/www.myviewsandreviews.com\/wp-content\/uploads\/2010\/03\/Facebook-vs-Google.jpg","Url":"http:\/\/www.myviewsandreviews.com\/03\/facebook-vs-google.html","DisplayUrl":"http:\/\/www.myviewsandreviews.com\/03\/facebook-vs-google.html","Width":2100,"Height":1580,"FileSize":257487,"ContentType":"image\/jpeg","Thumbnail":{"Url":"http:\/\/ts1.mm.bing.net\/images\/thumbnail.aspx?q=1533133266808&id=d879272eecbea0f77a66a41d263c1f37","ContentType":"image\/jpeg","Width":160,"Height":120,"FileSize":3355}},{"Title":"Google Toolbar 6.6.1124.846","MediaUrl":"http:\/\/screenshots.de.sftcdn.net\/de\/scrn\/18000\/18858\/google-toolbar-23.jpg","Url":"http:\/\/google-toolbar.softonic.de\/","DisplayUrl":"http:\/\/google-toolbar.softonic.de\/","Width":700,"Height":525,"FileSize":101827,"ContentType":"image\/jpeg","Thumbnail":{"Url":"http:\/\/ts4.mm.bing.net\/images\/thumbnail.aspx?q=1532232607467&id=7934ed841772c774685dbf8c0e5c21ce","ContentType":"image\/jpeg","Width":160,"Height":120,"FileSize":3634}},{"Title":"Google « Cueca Virada – Blog de entretenimento, interatividade ...","MediaUrl":"http:\/\/esporteonline.com\/blogdomarcelao\/wp-content\/uploads\/2009\/03\/google-logos.jpg","Url":"http:\/\/www.cuecavirada.com.br\/tag\/google\/","DisplayUrl":"http:\/\/www.cuecavirada.com.br\/tag\/google\/","Width":480,"Height":369,"FileSize":66281,"ContentType":"image\/jpeg","Thumbnail":{"Url":"http:\/\/ts2.mm.bing.net\/images\/thumbnail.aspx?q=1518768498581&id=f16d4a57b41ee37ca6057a166355ee8c","ContentType":"image\/jpeg","Width":160,"Height":123,"FileSize":6511}},{"Title":" ... Google , google 23 nisan , google 23 nisan rezilliği , google","MediaUrl":"http:\/\/www.bosmezar.com\/wp-content\/uploads\/2011\/04\/google.jpg","Url":"http:\/\/www.bosmezar.com\/googleden-23-nisan-ulusal-egemenlik-bayrami-ayibi.html\/","DisplayUrl":"http:\/\/www.bosmezar.com\/googleden-23-nisan-ulusal-egemenlik-bayrami-ayibi.html\/","Width":513,"Height":510,"FileSize":39022,"ContentType":"image\/jpeg","Thumbnail":{"Url":"http:\/\/ts2.mm.bing.net\/images\/thumbnail.aspx?q=1519788043741&id=fe4520ac3cb69bb297ccb8ec00bb1618","ContentType":"image\/jpeg","Width":160,"Height":159,"FileSize":5621}},{"Title":"20 google chrome Fondos para Google Chrome gratis","MediaUrl":"http:\/\/www.electrocutado.com\/wp-content\/uploads\/2010\/12\/20-google_chrome.jpg","Url":"http:\/\/www.electrocutado.com\/fondos-para-google-chrome-gratis\/","DisplayUrl":"http:\/\/www.electrocutado.com\/fondos-para-google-chrome-gratis\/","Width":600,"Height":400,"FileSize":22100,"ContentType":"image\/jpeg","Thumbnail":{"Url":"http:\/\/ts2.mm.bing.net\/images\/thumbnail.aspx?q=1518657143645&id=8fe1ed85adabacce602b09a00f9f62a9","ContentType":"image\/jpeg","Width":160,"Height":106,"FileSize":3337}}]}}}
@@ -0,0 +1 @@
1
+ {"SearchResponse":{"Version":"2.2","Query":{"SearchTerms":"google"},"Web":{"Total":28400000,"Offset":0,"Results":[{"Title":"Google","Description":"웹 문서, 이미지, 뉴스그룹, 디렉터리 검색, 한글 페이지 검색.","Url":"http:\/\/www.google.co.kr\/","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=4974014912726957&w=111a8224,544e08ef","DisplayUrl":"www.google.co.kr","DateTime":"2011-12-28T12:34:00Z"},{"Title":"Google","Description":"Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for.","Url":"http:\/\/www.google.com\/","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=4933195533126007&w=72e45eda,26137f94","DisplayUrl":"www.google.com","DateTime":"2011-12-26T16:21:00Z"},{"Title":"iGoogle","Description":"iGoogle은 나만의 Google 페이지입니다. 웹에서 찾은 뉴스, 사진, 날씨 등의 콘텐츠를 자신의 페이지에 추가하세요.","Url":"http:\/\/www.google.co.kr\/ig?sp=korea&hl=ko","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=4558287859744921&w=2a57365e,1b78637b","DisplayUrl":"www.google.co.kr\/ig?sp=korea&hl=ko","DateTime":"2011-12-26T05:29:00Z"},{"Title":"Google Images","Description":"Google Images. The most comprehensive image search on the web.","Url":"http:\/\/images.google.com\/","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=4584517219321018&w=6b4e3337,232daa97","DisplayUrl":"images.google.com","DateTime":"2011-12-29T09:29:00Z"},{"Title":"Google+: real life sharing, rethought for the web.","Description":"You need a Google Account to join Google+. Don't have one? Create an account","Url":"https:\/\/plus.google.com\/","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=27023948180887767&w=61b9de45,d366ac15","DisplayUrl":"https:\/\/plus.google.com","DateTime":"2011-12-31T02:04:00Z"},{"Title":"Google Translate","Description":"Google's free online language translation service instantly translates text and web pages. This translator supports: English, Afrikaans, Albanian, Arabic, Armenian, Azerbaijani, Basque, Belarusian, Bengali, Bulgarian, Catalan ...","Url":"http:\/\/translate.google.com\/","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=5038448007579101&w=ec5bfdea,2ab8f20d","DisplayUrl":"translate.google.com","DateTime":"2011-12-27T18:44:00Z"},{"Title":"Google","Description":"Account Options. 로그인","Url":"http:\/\/www.google.com\/intl\/ko\/","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=4955370452355220&w=7f327507,42d4a341","DisplayUrl":"www.google.com\/intl\/ko","DateTime":"2011-12-29T13:11:00Z"},{"Title":"Google 학술 검색","Description":"거인의 어깨에 올라서서 더 넓은 세상을 바라보라 - 아이작 뉴턴 Google 학술검색 정보-Google 정보-Google Scholar in English ©2011 Google","Url":"http:\/\/scholar.google.co.kr\/","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=4840849451058731&w=7442bce0,5eb1cc76","DisplayUrl":"scholar.google.co.kr","DateTime":"2011-12-26T16:20:00Z"},{"Title":"Google 번역","Description":"Google의 무료 온라인 언어 번역 서비스는 텍스트와 웹페이지를 즉시 번역해 줍니다. 번역 서비스에서 지원하는 기능은 다음과 같습니다. 한국어, 갈리시아어, 구자라트어 ...","Url":"http:\/\/translate.google.com\/?hl=ko&tab=wT","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=4897079160537368&w=79d1b9d6,2c1b54fc","DisplayUrl":"translate.google.com\/?hl=ko&tab=wT","DateTime":"2011-12-26T22:24:00Z"},{"Title":"Google Maps","Description":"Interactive maps and satellite\/aerial imagery of the United States.","Url":"http:\/\/maps.google.com\/","CacheUrl":"http:\/\/cc.bingj.com\/cache.aspx?q=google&d=4900077049872785&w=7ffce161,7bede9a9","DisplayUrl":"maps.google.com","DateTime":"2011-12-29T01:35:00Z"}]}}}
@@ -0,0 +1,4 @@
1
+ require "rubygems"
2
+ require File.join(File.expand_path(__FILE__), "../../lib/gnib")
3
+ require "rspec"
4
+
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gnib::Configurations do
4
+ it "is not initialized by constructor" do
5
+ expect { Gnib::Configurations.new }.should raise_error
6
+ end
7
+
8
+ describe "#singleton_object" do
9
+ it "does not return nil object" do
10
+ Gnib::Configurations.singleton_object.should_not == nil
11
+ end
12
+
13
+ it "returns the singleton object" do
14
+ obj_before = Gnib::Configurations.singleton_object
15
+ obj_after = Gnib::Configurations.singleton_object
16
+
17
+ obj_before.object_id.should == obj_after.object_id
18
+ end
19
+ end
20
+
21
+ context "after initialization of singleton object" do
22
+ let(:config) { Gnib::Configurations.singleton_object }
23
+
24
+ describe "#application_id=" do
25
+ it "sets application id" do
26
+ config.application_id = 'myid'
27
+ config.application_id.should == 'myid'
28
+ end
29
+ end
30
+
31
+ describe "#api_root" do
32
+ it "returns default value if not modified" do
33
+ config.api_root.should == 'http://api.bing.net/json.aspx'
34
+ end
35
+ end
36
+
37
+ describe "#api_root=" do
38
+ it "sets api root uri" do
39
+ config.api_root = 'http://google.com'
40
+ config.api_root.should == 'http://google.com'
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gnib::Response do
4
+ let(:rsp) { Gnib::Response.new(File.open(File.join(File.dirname(__FILE__), '../sample_web_response'), 'r:ASCII-8BIT').read) }
5
+
6
+ describe "#result_count_of" do
7
+ it "counts number of total results" do
8
+ rsp.result_count_of(:web).should == 28400000
9
+ end
10
+ end
11
+
12
+ describe "#results_for" do
13
+ it "returns result objects for each result" do
14
+ rsp.results_for(:web).first.class.should == Gnib::SearchResult
15
+ end
16
+
17
+ it "returns results in one page" do
18
+ rsp.results_for(:web).count.should == 10
19
+ end
20
+ end
21
+
22
+ describe "#results" do
23
+ it "returns appropriate result objects" do
24
+ rsp.results.first.class.should == Gnib::SearchResult
25
+ end
26
+
27
+ it "returns all results objects" do
28
+ rsp.results.count.should == 10
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gnib::SearchResult do
4
+ context "when image results are fetched" do
5
+ let(:result) { Gnib::Response.new(File.open(File.join(File.dirname(__FILE__), '../sample_image_response'), 'r:ASCII-8BIT').read).results_for(:image).first }
6
+
7
+ describe "#media_url" do
8
+ it "returns media url of the result" do
9
+ result.media_url.should == "http:\/\/www.blog.webtec-braun.com\/wp-content\/uploads\/google.jpg"
10
+ end
11
+ end
12
+
13
+ describe "#url" do
14
+ it "returns url of the result" do
15
+ result.url.should == "http:\/\/www.blog.webtec-braun.com\/google\/top-news-google-setzt-auf-schnelligkeit.html"
16
+ end
17
+ end
18
+
19
+ describe "#width" do
20
+ it "returns width of the result" do
21
+ result.width.should == 600
22
+ end
23
+ end
24
+
25
+ describe "#height" do
26
+ it "returns height of the result" do
27
+ result.height.should == 400
28
+ end
29
+ end
30
+
31
+ describe "#file_size" do
32
+ it "returns file size of the result" do
33
+ result.file_size.should == 15719
34
+ end
35
+ end
36
+
37
+ describe "#content_type" do
38
+ it "returns content type of the result" do
39
+ result.content_type.should == "image/jpeg"
40
+ end
41
+ end
42
+
43
+ describe "#thumbnail_url" do
44
+ it "returns url of thumbnail of the result" do
45
+ result.thumbnail.url.should == "http:\/\/ts4.mm.bing.net\/images\/thumbnail.aspx?q=1524014450527&id=421bf34508bee00c8f75b0af9529c1ab"
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ context "when web results are fetched" do
52
+ let(:result) { Gnib::Response.new(File.open(File.join(File.dirname(__FILE__), '../sample_web_response'), 'r:ASCII-8BIT').read).results_for(:web).first }
53
+
54
+ it "parses the json and retrieves attributes" do
55
+ result.title.should == 'Google'
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gnib::Search do
4
+ before(:all) do
5
+ Gnib.config.application_id = 'myid'
6
+ end
7
+
8
+ it "is initialized with query" do
9
+ expect { s = Gnib::Search.new('google') }.should_not raise_error
10
+ end
11
+
12
+ context "when a string parameter is provided" do
13
+ let(:search) { Gnib::Search.new('google') }
14
+
15
+ it "serializes it appropriately" do
16
+ serialized_str = search.send :serialized_parameters
17
+ serialized_str.should include("Query=#{CGI::escape('google')}")
18
+ end
19
+
20
+ it "has app id in parameters" do
21
+ serialized_str = search.send :serialized_parameters
22
+ serialized_str.should include("AppId=myid")
23
+ end
24
+ end
25
+
26
+ context "when an array parameter is provided" do
27
+ let(:search) { Gnib::Search.new('google', :sources => ['image', 'spell']) }
28
+
29
+ it "serializes it appropriately" do
30
+ serialized_str = search.send :serialized_parameters
31
+ serialized_str.should include("Sources=#{CGI::escape('image+spell')}")
32
+ end
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gnib
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Inbeom Hwang
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: &70318958358140 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70318958358140
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70318958357720 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70318958357720
36
+ description: Gnib provides interfaces for Bing Search API version 2.0
37
+ email:
38
+ - inbeom@wafflestudio.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - .gitignore
44
+ - .rvmrc
45
+ - Gemfile
46
+ - Gemfile.lock
47
+ - README.md
48
+ - Rakefile
49
+ - gnib.gemspec
50
+ - lib/gnib.rb
51
+ - lib/gnib/configurations.rb
52
+ - lib/gnib/response.rb
53
+ - lib/gnib/search.rb
54
+ - lib/gnib/search_helper.rb
55
+ - lib/gnib/search_request.rb
56
+ - lib/gnib/search_result.rb
57
+ - lib/gnib/version.rb
58
+ - spec/sample_image_response
59
+ - spec/sample_web_response
60
+ - spec/spec_helper.rb
61
+ - spec/unit/configurations_spec.rb
62
+ - spec/unit/response_spec.rb
63
+ - spec/unit/search_result_spec.rb
64
+ - spec/unit/search_spec.rb
65
+ homepage: ''
66
+ licenses: []
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 1.8.10
86
+ signing_key:
87
+ specification_version: 3
88
+ summary: Ruby library for Microsoft Bing Search API
89
+ test_files:
90
+ - spec/sample_image_response
91
+ - spec/sample_web_response
92
+ - spec/spec_helper.rb
93
+ - spec/unit/configurations_spec.rb
94
+ - spec/unit/response_spec.rb
95
+ - spec/unit/search_result_spec.rb
96
+ - spec/unit/search_spec.rb