bing 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +9 -0
- data/.gemtest +0 -0
- data/.gitignore +1 -0
- data/History.txt +33 -0
- data/Manifest.txt +21 -0
- data/README.txt +73 -0
- data/Rakefile +100 -0
- data/lib/bing.rb +38 -0
- data/lib/bing/core_ext.rb +46 -0
- data/lib/bing/errors.rb +55 -0
- data/lib/bing/formatting_helper.rb +21 -0
- data/lib/bing/location.rb +69 -0
- data/lib/bing/request.rb +23 -0
- data/lib/bing/route.rb +108 -0
- data/lib/bing/route/itinerary.rb +28 -0
- data/test/helper.rb +15 -0
- data/test/test_bing.rb +19 -0
- data/test/test_bing_location.rb +103 -0
- data/test/test_bing_route.rb +141 -0
- data/test/test_bing_route_itinerary.rb +60 -0
- data/test/test_core_ext.rb +20 -0
- data/test/test_request.rb +26 -0
- metadata +196 -0
data/.autotest
ADDED
data/.gemtest
ADDED
File without changes
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
tmp
|
data/History.txt
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
=== 0.1.1 / 2011-07-25
|
2
|
+
* 5 unknown:
|
3
|
+
|
4
|
+
* Make dep gems comply with my needs
|
5
|
+
* Rm'd the bin, and added changelog generation.
|
6
|
+
* Updated History.
|
7
|
+
* Updated manifest.
|
8
|
+
* Updated manifest. Added task to create manifest and added autotest task.
|
9
|
+
|
10
|
+
=== 0.1.0 / 2011-07-25
|
11
|
+
|
12
|
+
* 6 minor enhancement(s):
|
13
|
+
|
14
|
+
* Added gitignore.
|
15
|
+
* Added more tests, more data coming back from Location and beginnings of Route.
|
16
|
+
* Improved coverage. Added route class and cleaned up some things.
|
17
|
+
* MiniTest is working, autotest is working, structure is getting better and coverage is happening.
|
18
|
+
* Moved everything into the lib/bing dir.
|
19
|
+
* Test helper clean up and README update.
|
20
|
+
|
21
|
+
* 0 bug fix(s):
|
22
|
+
|
23
|
+
|
24
|
+
* 7 unknown:
|
25
|
+
|
26
|
+
* Commiting what I have so far. Still a wip.
|
27
|
+
* Flattened the structure
|
28
|
+
* Little cleanup.
|
29
|
+
* Nothing significant.
|
30
|
+
* Prepped for release-0.1.0
|
31
|
+
* Rm'd unecessary test files.
|
32
|
+
* Updated manifest. Added task to create manifest and added autotest task.
|
33
|
+
|
data/Manifest.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
.autotest
|
2
|
+
.gitignore
|
3
|
+
History.txt
|
4
|
+
Manifest.txt
|
5
|
+
README.txt
|
6
|
+
Rakefile
|
7
|
+
lib/bing.rb
|
8
|
+
lib/bing/core_ext.rb
|
9
|
+
lib/bing/errors.rb
|
10
|
+
lib/bing/formatting_helper.rb
|
11
|
+
lib/bing/location.rb
|
12
|
+
lib/bing/request.rb
|
13
|
+
lib/bing/route.rb
|
14
|
+
lib/bing/route/itinerary.rb
|
15
|
+
test/helper.rb
|
16
|
+
test/test_bing.rb
|
17
|
+
test/test_bing_location.rb
|
18
|
+
test/test_bing_route.rb
|
19
|
+
test/test_bing_route_itinerary.rb
|
20
|
+
test/test_core_ext.rb
|
21
|
+
test/test_request.rb
|
data/README.txt
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
= bing
|
2
|
+
|
3
|
+
* https://github.com/hekaldama/bing
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
Bing api client library that exposes all of Bing's api features.
|
8
|
+
|
9
|
+
== FEATURES/PROBLEMS:
|
10
|
+
|
11
|
+
* Uses Net::HTTP::Persistent for connections to Bing.
|
12
|
+
* Shipped with a community Bing api key. Only used for testing.
|
13
|
+
Use in production may fail.
|
14
|
+
|
15
|
+
== SYNOPSIS:
|
16
|
+
|
17
|
+
# For locations
|
18
|
+
require 'bing/location'
|
19
|
+
|
20
|
+
Bing.config[:api_key] = 'my_key'
|
21
|
+
|
22
|
+
Bing::Location.find :query => 'Strawberry, CA'
|
23
|
+
|
24
|
+
# For routing
|
25
|
+
require 'bing/route'
|
26
|
+
|
27
|
+
Bing.config[:api_key] = 'my_key'
|
28
|
+
|
29
|
+
Bing::Route.find :waypoints => ['Shasta, CA', 'Chico, CA', 'Los Angeles, CA']
|
30
|
+
|
31
|
+
== REQUIREMENTS:
|
32
|
+
|
33
|
+
For development:
|
34
|
+
* rubygems >= 1.8.2
|
35
|
+
* isolate >= 3.1.1
|
36
|
+
|
37
|
+
== INSTALL:
|
38
|
+
|
39
|
+
[sudo] gem install bing
|
40
|
+
|
41
|
+
== DEVELOPERS:
|
42
|
+
|
43
|
+
After checking out the source, run:
|
44
|
+
|
45
|
+
$ rake newb
|
46
|
+
|
47
|
+
This task will install any missing dependencies, run the tests, and generate the
|
48
|
+
RDoc.
|
49
|
+
|
50
|
+
== LICENSE:
|
51
|
+
|
52
|
+
(The MIT License)
|
53
|
+
|
54
|
+
Copyright (c) 2011 Adam Avilla
|
55
|
+
|
56
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
57
|
+
a copy of this software and associated documentation files (the
|
58
|
+
'Software'), to deal in the Software without restriction, including
|
59
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
60
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
61
|
+
permit persons to whom the Software is furnished to do so, subject to
|
62
|
+
the following conditions:
|
63
|
+
|
64
|
+
The above copyright notice and this permission notice shall be
|
65
|
+
included in all copies or substantial portions of the Software.
|
66
|
+
|
67
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
68
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
69
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
70
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
71
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
72
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
73
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
Hoe.plugin :isolate
|
7
|
+
|
8
|
+
require 'isolate/rake'
|
9
|
+
|
10
|
+
Hoe.spec 'bing' do
|
11
|
+
developer('Adam Avilla', 'adam@avil.la')
|
12
|
+
|
13
|
+
self.testlib = :minitest
|
14
|
+
|
15
|
+
self.extra_deps << ['net-http-persistent', '>= 1.6']
|
16
|
+
self.extra_deps << ['json', '>= 1.5.3']
|
17
|
+
|
18
|
+
self.extra_dev_deps << ['minitest']
|
19
|
+
self.extra_dev_deps << ['git']
|
20
|
+
self.extra_dev_deps << ['webmock']
|
21
|
+
self.extra_dev_deps << ['ZenTest']
|
22
|
+
|
23
|
+
# make sure we use the gemmed minitest on 1.9
|
24
|
+
self.test_prelude = 'gem "minitest"'
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'run autotest'
|
28
|
+
task :autotest do
|
29
|
+
sh "rake isolate:sh[autotest]"
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "create Manifest.txt with git-ls-files."
|
33
|
+
task :create_manifest do
|
34
|
+
sh "git ls-files > Manifest.txt"
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "run irb with bing lib in path."
|
38
|
+
task :irb do
|
39
|
+
ARGV.clear
|
40
|
+
$: << "lib"
|
41
|
+
|
42
|
+
require 'irb'
|
43
|
+
require 'bing'
|
44
|
+
|
45
|
+
IRB.start
|
46
|
+
end
|
47
|
+
|
48
|
+
namespace :git do
|
49
|
+
|
50
|
+
desc "Generate a changelog for a given release."
|
51
|
+
task :changelog do
|
52
|
+
begin
|
53
|
+
require 'rubygems'
|
54
|
+
require 'git'
|
55
|
+
rescue LoadError
|
56
|
+
end
|
57
|
+
|
58
|
+
from = ENV['since']
|
59
|
+
to = ENV['until'] || 'HEAD'
|
60
|
+
codes = {"!" => :major, "+" => :minor, "-" => :bug}
|
61
|
+
$changes = Hash.new {|h,k| h[k] = Array.new}
|
62
|
+
|
63
|
+
def changelog_section(code)
|
64
|
+
name = {
|
65
|
+
:major => "major enhancement(s)",
|
66
|
+
:minor => "minor enhancement(s)",
|
67
|
+
:bug => "bug fix(s)",
|
68
|
+
:huh? => "unknown",
|
69
|
+
}[code]
|
70
|
+
|
71
|
+
puts "* #{$changes[code].size} #{name}:"
|
72
|
+
puts
|
73
|
+
$changes[code].sort.each do |line|
|
74
|
+
puts " * #{line}"
|
75
|
+
end
|
76
|
+
puts
|
77
|
+
end
|
78
|
+
|
79
|
+
git = Git.open(".")
|
80
|
+
git.log(nil).between(from, to).each do |log|
|
81
|
+
log.message.each_line do |msg|
|
82
|
+
if msg.match(/^([#{Regexp.escape(codes.keys.join)}])\s*(.*)/)
|
83
|
+
code, line = codes[$1], $2
|
84
|
+
$changes[code] << line
|
85
|
+
else
|
86
|
+
next if msg =~ /git-svn-id|^\s*$/
|
87
|
+
$changes[:huh?] << msg
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
changelog_section :major
|
93
|
+
changelog_section :minor
|
94
|
+
changelog_section :bug
|
95
|
+
changelog_section :huh?
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
# vim: syntax=ruby
|
data/lib/bing.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'net/http/persistent'
|
3
|
+
require 'uri'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Bing
|
7
|
+
|
8
|
+
VERSION = '0.1.1'
|
9
|
+
|
10
|
+
DEFAULTS = {
|
11
|
+
:api_key => 'AtsQ7PXwSqL266EUdxMYj3b4-H5A6ubkf8DwH-B4k3rVmmPycUrhmH-lZKHeWXm-',
|
12
|
+
:api_uri => URI.parse('http://api.bing.net'),
|
13
|
+
:map_uri => URI.parse('http://dev.virtualearth.net'),
|
14
|
+
}
|
15
|
+
|
16
|
+
class << self
|
17
|
+
attr_reader :config
|
18
|
+
end
|
19
|
+
|
20
|
+
@config = DEFAULTS.dup
|
21
|
+
|
22
|
+
##
|
23
|
+
# Set the configuration for this instance of bing.
|
24
|
+
|
25
|
+
def self.config= config
|
26
|
+
@config = DEFAULTS.merge config
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
require 'bing/core_ext'
|
32
|
+
require 'bing/errors'
|
33
|
+
require 'bing/formatting_helper'
|
34
|
+
require 'bing/request'
|
35
|
+
|
36
|
+
include Bing::FormattingHelper
|
37
|
+
# TODO figure out how to allow user defined request object.
|
38
|
+
include Bing::Request
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# core extensions to ruby
|
2
|
+
class Object
|
3
|
+
|
4
|
+
def blank?
|
5
|
+
respond_to?(:empty?) ? empty? : !self
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_param
|
9
|
+
to_s
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_query key
|
13
|
+
require 'cgi' unless defined?(CGI) && defined?(CGI::escape)
|
14
|
+
_key = CGI.escape(key.to_s.camelize(:lower)).gsub(/%(5B|5D)/n) {
|
15
|
+
[$1].pack('H*')
|
16
|
+
}
|
17
|
+
value = CGI.escape(to_param.to_s)
|
18
|
+
|
19
|
+
"#{_key}=#{value}"
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class Hash
|
25
|
+
|
26
|
+
def to_param namespace = nil
|
27
|
+
collect do |key, value|
|
28
|
+
value.to_query(namespace ? "#{namespace}[#{key}]" : key)
|
29
|
+
end.sort * '&'
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
class String
|
35
|
+
|
36
|
+
def camelize first_letter = :upper
|
37
|
+
case first_letter
|
38
|
+
when :upper then
|
39
|
+
self.gsub(/\/(.?)/) {"::#{$1.upcase}"}.gsub(/(?:^|_)(.)/) {$1.upcase}
|
40
|
+
when :lower then
|
41
|
+
self[0].chr.downcase + camelize()[1..-1]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
data/lib/bing/errors.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
##
|
2
|
+
# DO NOT use these classes. They are too generic.
|
3
|
+
|
4
|
+
class ServiceError < StandardError
|
5
|
+
def status() 500 end
|
6
|
+
end
|
7
|
+
|
8
|
+
class ResourceMissing < StandardError
|
9
|
+
def status() 502 end
|
10
|
+
|
11
|
+
def message() 'Resource is empty or nil.' end
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# Raised when we get an invalid response from an underlying server
|
16
|
+
|
17
|
+
class BadGateway < ServiceError
|
18
|
+
|
19
|
+
def self.parse_error text, uri = nil
|
20
|
+
error = new "parse error#{uri ? " from #{uri}" : nil} - #{text.inspect}"
|
21
|
+
error.text = text
|
22
|
+
error.uri = uri
|
23
|
+
error
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.bad_response code, uri, server_message=nil
|
27
|
+
server_message = " with message #{server_message}" if server_message
|
28
|
+
error = new "#{uri} returned #{code}#{server_message}"
|
29
|
+
error.code = code
|
30
|
+
error.uri = uri
|
31
|
+
error
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Status code from underlying server
|
36
|
+
|
37
|
+
attr_accessor :code
|
38
|
+
|
39
|
+
##
|
40
|
+
# Text we were unable to parse
|
41
|
+
|
42
|
+
attr_accessor :text
|
43
|
+
|
44
|
+
##
|
45
|
+
# URI for this request
|
46
|
+
|
47
|
+
attr_accessor :uri
|
48
|
+
|
49
|
+
def status() 502 end
|
50
|
+
end
|
51
|
+
|
52
|
+
class ItineraryResourceMissing < ResourceMissing; end
|
53
|
+
class LocationResourceMissing < ResourceMissing; end
|
54
|
+
class RouteResourceMissing < ResourceMissing; end
|
55
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
##
|
2
|
+
# Responsible for consolidating response formatting logic shared
|
3
|
+
# amongst resources.
|
4
|
+
|
5
|
+
module Bing::FormattingHelper
|
6
|
+
|
7
|
+
##
|
8
|
+
# Decipher bounding box from bbox in Bing response.
|
9
|
+
|
10
|
+
def bbox box
|
11
|
+
south, west, north, east = *box
|
12
|
+
{
|
13
|
+
:north => north,
|
14
|
+
:east => east,
|
15
|
+
:south => south,
|
16
|
+
:west => west,
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'bing'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Responsible for obtaining a location based off of data passed in.
|
5
|
+
# Most common method is to do:
|
6
|
+
#
|
7
|
+
# Bing::Location.find :query => '123 Address City State'
|
8
|
+
|
9
|
+
class Bing::Location
|
10
|
+
|
11
|
+
##
|
12
|
+
# Path to location resource.
|
13
|
+
|
14
|
+
PATH = '/REST/v1/Locations'
|
15
|
+
|
16
|
+
##
|
17
|
+
# Will find locations based off of +query+ and return an array of
|
18
|
+
# Bing::Location objects.
|
19
|
+
|
20
|
+
def self.find opts
|
21
|
+
uri = Bing.config[:map_uri].merge(
|
22
|
+
"#{PATH}?key=#{Bing.config[:api_key]}&#{opts.to_param}"
|
23
|
+
)
|
24
|
+
|
25
|
+
body = JSON.parse get(uri).body
|
26
|
+
|
27
|
+
body['resourceSets'].first['resources'].map do |resource|
|
28
|
+
new resource
|
29
|
+
end.compact
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_reader :address
|
33
|
+
attr_reader :bounding_box
|
34
|
+
attr_reader :canonical_description
|
35
|
+
attr_reader :coordinates
|
36
|
+
attr_reader :city
|
37
|
+
attr_reader :confidence
|
38
|
+
attr_reader :country
|
39
|
+
attr_reader :entity_type
|
40
|
+
attr_reader :full_name
|
41
|
+
attr_reader :state
|
42
|
+
attr_reader :zip
|
43
|
+
|
44
|
+
def initialize resource
|
45
|
+
raise LocationResourceMissing if resource.blank?
|
46
|
+
|
47
|
+
@confidence = resource['confidence']
|
48
|
+
@entity_type = resource['entityType']
|
49
|
+
@full_name = resource['name']
|
50
|
+
|
51
|
+
if resource['address'] then
|
52
|
+
@address = resource['address']['addressLine']
|
53
|
+
@city = resource['address']['locality']
|
54
|
+
@country = resource['address']['countryRegion']
|
55
|
+
@state = resource['address']['adminDistrict']
|
56
|
+
@zip = resource['address']['postalCode']
|
57
|
+
end
|
58
|
+
|
59
|
+
if resource['bbox'] then
|
60
|
+
@bounding_box = bbox resource['bbox']
|
61
|
+
end
|
62
|
+
|
63
|
+
if resource['point'] && resource['point']['coordinates'] then
|
64
|
+
@coordinates = resource['point']['coordinates']
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
data/lib/bing/request.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
##
|
2
|
+
# Responsible for making requests to Bing. Uses persistent HTTP connections.
|
3
|
+
|
4
|
+
module Bing::Request
|
5
|
+
|
6
|
+
HTTP = Net::HTTP::Persistent.new
|
7
|
+
USER_AGENT = "Bing Client Version: #{Bing::VERSION}"
|
8
|
+
HTTP.headers['user-agent'] = USER_AGENT
|
9
|
+
|
10
|
+
##
|
11
|
+
# Perform a get request and ensure that the response.code == 20\d,
|
12
|
+
# otherwise raise a BadGateway.
|
13
|
+
def get uri
|
14
|
+
response = HTTP.request uri
|
15
|
+
|
16
|
+
raise BadGateway.bad_response(response.code, uri) unless
|
17
|
+
response.code =~ /20\d/
|
18
|
+
|
19
|
+
response
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
data/lib/bing/route.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'bing'
|
2
|
+
|
3
|
+
class Bing::Route
|
4
|
+
|
5
|
+
##
|
6
|
+
# Path to route resource.
|
7
|
+
|
8
|
+
PATH = '/REST/v1/Routes'
|
9
|
+
|
10
|
+
##
|
11
|
+
# === Description
|
12
|
+
# Will return a route based off of +opts+ passed in. See
|
13
|
+
# http://msdn.microsoft.com/en-us/library/ff701717.aspx for reference on
|
14
|
+
# allowable +opts+ and what is required. All values in +opts+ are passed
|
15
|
+
# through save +waypoints+. The keys should follow ruby's convention of snake
|
16
|
+
# case which will translate into MSN's lower camelcase E.g. :date_time will be
|
17
|
+
# converted to dateTime for MSN.
|
18
|
+
#
|
19
|
+
# === opts
|
20
|
+
# +waypoints+:: Array of points. E.g. :waypoints =>
|
21
|
+
# ['start', 'next', 'end'] will turn into "waypoint.0=
|
22
|
+
# start&waypoint.1=next&waypoint.2=end". Reference above MSN
|
23
|
+
# docs for allowable waypoints. All points must be strings.
|
24
|
+
#
|
25
|
+
# === Example
|
26
|
+
# Bing::Route.find :avoid => 'minimizeHighways,tolls',
|
27
|
+
# :distance_before_first_turn => 500,
|
28
|
+
# :distance_unit => 'mi'
|
29
|
+
# :heading => 90,
|
30
|
+
# :optimize => 'time',
|
31
|
+
# :waypoints => ['start', 'next', 'end']
|
32
|
+
#
|
33
|
+
# === Return
|
34
|
+
# http://msdn.microsoft.com/en-us/library/ff701718.aspx
|
35
|
+
|
36
|
+
def self.find opts
|
37
|
+
waypoints = format_waypoints opts.delete :waypoints
|
38
|
+
|
39
|
+
uri = Bing.config[:map_uri].merge(
|
40
|
+
"#{PATH}?key=#{Bing.config[:api_key]}&#{opts.to_param}&#{waypoints}"
|
41
|
+
)
|
42
|
+
|
43
|
+
body = JSON.parse get(uri).body
|
44
|
+
|
45
|
+
body['resourceSets'].first['resources'].map do |resource|
|
46
|
+
new resource
|
47
|
+
end.compact
|
48
|
+
end
|
49
|
+
|
50
|
+
attr_reader :bounding_box
|
51
|
+
attr_reader :distance_unit
|
52
|
+
attr_reader :duration_unit
|
53
|
+
attr_reader :ending_coordinates
|
54
|
+
attr_reader :itinerary
|
55
|
+
attr_reader :starting_coordinates
|
56
|
+
attr_reader :total_distance
|
57
|
+
attr_reader :total_duration
|
58
|
+
attr_reader :type
|
59
|
+
|
60
|
+
def initialize resource
|
61
|
+
raise RouteResourceMissing if resource.blank?
|
62
|
+
|
63
|
+
@distance_unit = resource['distanceUnit']
|
64
|
+
@duration_unit = resource['durationUnit']
|
65
|
+
@total_distance = resource['travelDistance']
|
66
|
+
@total_duration = resource['travelDuration']
|
67
|
+
|
68
|
+
if resource['bbox'] then
|
69
|
+
@bounding_box = bbox resource['bbox']
|
70
|
+
end
|
71
|
+
|
72
|
+
# TODO does not support multiple route legs. My testing thus far just
|
73
|
+
# breaks Bing if I try to obtain multiple anyways.
|
74
|
+
if resource['routeLegs'] && leg = resource['routeLegs'].first then
|
75
|
+
@type = leg['type']
|
76
|
+
|
77
|
+
if leg['actualEnd'] && leg['actualEnd']['coordinates'] then
|
78
|
+
@ending_coordinates = leg['actualEnd']['coordinates']
|
79
|
+
end
|
80
|
+
|
81
|
+
if leg['actualStart'] && leg['actualStart']['coordinates'] then
|
82
|
+
@starting_coordinates = leg['actualStart']['coordinates']
|
83
|
+
end
|
84
|
+
|
85
|
+
unless leg['itineraryItems'].blank? then
|
86
|
+
@itinerary = leg['itineraryItems'].collect do |itinerary|
|
87
|
+
Bing::Route::Itinerary.new itinerary
|
88
|
+
end.compact
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def self.format_waypoints waypoints
|
96
|
+
return unless waypoints
|
97
|
+
ways = []
|
98
|
+
|
99
|
+
waypoints.each_with_index do |way, i|
|
100
|
+
ways << "waypoint.#{i}=#{CGI.escape way}"
|
101
|
+
end
|
102
|
+
|
103
|
+
ways.join '&'
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
require 'bing/route/itinerary'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Bing::Route::Itinerary
|
2
|
+
|
3
|
+
attr_reader :action
|
4
|
+
attr_reader :coordinates
|
5
|
+
attr_reader :distance
|
6
|
+
attr_reader :duration
|
7
|
+
attr_reader :instruction
|
8
|
+
attr_reader :travel_mode
|
9
|
+
|
10
|
+
def initialize resource
|
11
|
+
raise ItineraryResourceMissing if resource.blank?
|
12
|
+
|
13
|
+
@distance = resource['travelDistance']
|
14
|
+
@duration = resource['travelDuration']
|
15
|
+
@travel_mode = resource['travelMode']
|
16
|
+
|
17
|
+
if instructions = resource['instruction'] then
|
18
|
+
@action = instructions['maneuverType']
|
19
|
+
@instruction = instructions['text']
|
20
|
+
end
|
21
|
+
|
22
|
+
if resource['maneuverPoint'] && resource['maneuverPoint']['coordinates'] then
|
23
|
+
@coordinates = resource['maneuverPoint']['coordinates']
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
data/test/helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'logger'
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "webmock"
|
5
|
+
|
6
|
+
require "bing"
|
7
|
+
require "bing/location"
|
8
|
+
require "bing/route"
|
9
|
+
|
10
|
+
include WebMock::API
|
11
|
+
|
12
|
+
def mock_map_request status, path, body, headers={}
|
13
|
+
stub_request(:any, /.*virtualearth.*#{path}.*/).
|
14
|
+
to_return(:status => status, :body => body, :headers => headers)
|
15
|
+
end
|
data/test/test_bing.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestBing < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_defines_version
|
6
|
+
assert Bing::VERSION.to_f > 0.0
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_setting_config
|
10
|
+
Bing.config = {}
|
11
|
+
assert_equal Bing.config, Bing::DEFAULTS
|
12
|
+
|
13
|
+
Bing.config[:api_key] = 'frank'
|
14
|
+
assert_equal 'frank', Bing.config[:api_key]
|
15
|
+
refute_equal Bing.config, Bing::DEFAULTS
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestBingLocation < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_cls_find_successful
|
6
|
+
body = {
|
7
|
+
'resourceSets' => [
|
8
|
+
'resources' => [
|
9
|
+
{'name' => 'full name'}
|
10
|
+
]
|
11
|
+
]
|
12
|
+
}.to_json
|
13
|
+
|
14
|
+
mock_map_request 200, '/REST/v1/Locations', body
|
15
|
+
|
16
|
+
locs = Bing::Location.find :query => '123'
|
17
|
+
|
18
|
+
assert_equal 'full name', locs.first.full_name
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_cls_find_failure
|
22
|
+
mock_map_request 400, '/REST/v1/Locations', '{}'
|
23
|
+
|
24
|
+
assert_raises BadGateway do
|
25
|
+
Bing::Location.find :query => '123'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_initialize_with_coordinates
|
30
|
+
resource = {
|
31
|
+
'point' => {
|
32
|
+
'coordinates' => [123, 456]
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
bl = Bing::Location.new resource
|
37
|
+
|
38
|
+
assert_equal [123, 456], bl.coordinates
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_initialize_with_address
|
42
|
+
resource = {
|
43
|
+
'address' => {
|
44
|
+
'addressLine' => 'address',
|
45
|
+
'locality' => 'city',
|
46
|
+
'countryRegion' => 'country',
|
47
|
+
'adminDistrict' => 'state',
|
48
|
+
'postalCode' => 'zip',
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
bl = Bing::Location.new resource
|
53
|
+
|
54
|
+
assert_equal 'address', bl.address
|
55
|
+
assert_equal 'city', bl.city
|
56
|
+
assert_equal 'country', bl.country
|
57
|
+
assert_equal 'state', bl.state
|
58
|
+
assert_equal 'zip', bl.zip
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_initialize_with_confidence
|
62
|
+
resource = { 'confidence' => 'High' }
|
63
|
+
|
64
|
+
bl = Bing::Location.new resource
|
65
|
+
|
66
|
+
assert_equal 'High', bl.confidence
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_initialize_with_bbox
|
70
|
+
resource = { 'bbox' => %w[south west north east] }
|
71
|
+
|
72
|
+
bl = Bing::Location.new resource
|
73
|
+
|
74
|
+
assert_equal 'north', bl.bounding_box[:north]
|
75
|
+
assert_equal 'east', bl.bounding_box[:east]
|
76
|
+
assert_equal 'south', bl.bounding_box[:south]
|
77
|
+
assert_equal 'west', bl.bounding_box[:west]
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_initialize_with_entity_type
|
81
|
+
resource = { 'entityType' => 'Postal' }
|
82
|
+
|
83
|
+
bl = Bing::Location.new resource
|
84
|
+
|
85
|
+
assert_equal 'Postal', bl.entity_type
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_initialize_with_full_name
|
89
|
+
resource = { 'name' => '123 street, ca' }
|
90
|
+
|
91
|
+
bl = Bing::Location.new resource
|
92
|
+
|
93
|
+
assert_equal '123 street, ca', bl.full_name
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_initialize_without_resource_raises
|
97
|
+
assert_raises LocationResourceMissing do
|
98
|
+
Bing::Location.new nil
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class Bing::Route
|
4
|
+
class << self
|
5
|
+
public :format_waypoints
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class TestBingRoute < MiniTest::Unit::TestCase
|
10
|
+
|
11
|
+
def test_cls_find
|
12
|
+
body = {
|
13
|
+
'resourceSets' => [
|
14
|
+
'resources' => [
|
15
|
+
{'name' => 'full name'}
|
16
|
+
]
|
17
|
+
]
|
18
|
+
}.to_json
|
19
|
+
|
20
|
+
mock_map_request 200, '/REST/v1/Routes', body
|
21
|
+
|
22
|
+
route = Bing::Route.find :waypoints => ['start', 'end']
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_cls_format_waypoints
|
26
|
+
waypoints = ['start', 'end']
|
27
|
+
|
28
|
+
assert_equal 'waypoint.0=start&waypoint.1=end',
|
29
|
+
Bing::Route.format_waypoints(waypoints)
|
30
|
+
|
31
|
+
waypoints = ["4.9, -1.2", "1.2, 2.2"]
|
32
|
+
|
33
|
+
assert_equal 'waypoint.0=4.9%2C+-1.2&waypoint.1=1.2%2C+2.2',
|
34
|
+
Bing::Route.format_waypoints(waypoints)
|
35
|
+
|
36
|
+
assert_equal nil, Bing::Route.format_waypoints(nil)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_initialize_with_bbox
|
40
|
+
resource = { 'bbox' => %w[south west north east] }
|
41
|
+
|
42
|
+
bl = Bing::Route.new resource
|
43
|
+
|
44
|
+
assert_equal 'north', bl.bounding_box[:north]
|
45
|
+
assert_equal 'east', bl.bounding_box[:east]
|
46
|
+
assert_equal 'south', bl.bounding_box[:south]
|
47
|
+
assert_equal 'west', bl.bounding_box[:west]
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_initialize_with_distance_unit
|
51
|
+
resource = { 'distanceUnit' => 'miles' }
|
52
|
+
|
53
|
+
br = Bing::Route.new resource
|
54
|
+
|
55
|
+
assert_equal 'miles', br.distance_unit
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_initialize_with_duration_unit
|
59
|
+
resource = { 'durationUnit' => 'sec' }
|
60
|
+
|
61
|
+
br = Bing::Route.new resource
|
62
|
+
|
63
|
+
assert_equal 'sec', br.duration_unit
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_initialize_with_ending_coordinates
|
67
|
+
resource = {
|
68
|
+
'routeLegs' => [{
|
69
|
+
'actualEnd' => {'coordinates' => [1,2]}
|
70
|
+
}]
|
71
|
+
}
|
72
|
+
|
73
|
+
br = Bing::Route.new resource
|
74
|
+
|
75
|
+
assert_equal [1,2], br.ending_coordinates
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_initialize_with_itinerary
|
79
|
+
resource = {
|
80
|
+
'routeLegs' => [{
|
81
|
+
'itineraryItems' => [
|
82
|
+
{'travelDistance' => 1},
|
83
|
+
{'travelDistance' => 2},
|
84
|
+
]
|
85
|
+
}]
|
86
|
+
}
|
87
|
+
|
88
|
+
br = Bing::Route.new resource
|
89
|
+
|
90
|
+
assert_equal 1, br.itinerary.first.distance
|
91
|
+
assert_equal 2, br.itinerary.last.distance
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_initialize_with_starting_coordinates
|
95
|
+
resource = {
|
96
|
+
'routeLegs' => [{
|
97
|
+
'actualStart' => {'coordinates' => [1,2]}
|
98
|
+
}]
|
99
|
+
}
|
100
|
+
|
101
|
+
br = Bing::Route.new resource
|
102
|
+
|
103
|
+
assert_equal [1,2], br.starting_coordinates
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_initialize_with_total_distance
|
107
|
+
resource = { 'travelDistance' => 117.406223 }
|
108
|
+
|
109
|
+
br = Bing::Route.new resource
|
110
|
+
|
111
|
+
assert_equal 117.406223, br.total_distance
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_initialize_with_total_duration
|
115
|
+
resource = { 'travelDuration' => 11723 }
|
116
|
+
|
117
|
+
br = Bing::Route.new resource
|
118
|
+
|
119
|
+
assert_equal 11723, br.total_duration
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_initialize_with_type
|
123
|
+
resource = {
|
124
|
+
'routeLegs' => [{
|
125
|
+
'type' => 'type'
|
126
|
+
}]
|
127
|
+
}
|
128
|
+
|
129
|
+
br = Bing::Route.new resource
|
130
|
+
|
131
|
+
assert_equal 'type', br.type
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_initialize_without_resource_raises
|
135
|
+
assert_raises RouteResourceMissing do
|
136
|
+
Bing::Route.new nil
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestBingRouteItinerary < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_initialize_with_action
|
6
|
+
resource = { 'instruction' => {'maneuverType' => 'turn'} }
|
7
|
+
|
8
|
+
bl = Bing::Route::Itinerary.new resource
|
9
|
+
|
10
|
+
assert_equal 'turn', bl.action
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_initialize_with_distance
|
14
|
+
resource = { 'travelDistance' => '3.0' }
|
15
|
+
|
16
|
+
bl = Bing::Route::Itinerary.new resource
|
17
|
+
|
18
|
+
assert_equal '3.0', bl.distance
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_initialize_with_duration
|
22
|
+
resource = { 'travelDuration' => '100' }
|
23
|
+
|
24
|
+
bl = Bing::Route::Itinerary.new resource
|
25
|
+
|
26
|
+
assert_equal '100', bl.duration
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_initialize_with_instruction
|
30
|
+
resource = { 'instruction' => {'text' => 'go right'} }
|
31
|
+
|
32
|
+
bl = Bing::Route::Itinerary.new resource
|
33
|
+
|
34
|
+
assert_equal 'go right', bl.instruction
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_initialize_with_coordinates
|
38
|
+
resource = { 'maneuverPoint' => {'coordinates' => [1,2]} }
|
39
|
+
|
40
|
+
bl = Bing::Route::Itinerary.new resource
|
41
|
+
|
42
|
+
assert_equal [1,2], bl.coordinates
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_initialize_with_travel_mode
|
46
|
+
resource = { 'travelMode' => 'driving' }
|
47
|
+
|
48
|
+
bl = Bing::Route::Itinerary.new resource
|
49
|
+
|
50
|
+
assert_equal 'driving', bl.travel_mode
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_initialize_without_resource_raises
|
54
|
+
assert_raises ItineraryResourceMissing do
|
55
|
+
Bing::Route::Itinerary.new nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestCoreExt < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_camelize
|
6
|
+
assert_equal 'hiMom', 'hi_mom'.camelize(:lower)
|
7
|
+
assert_equal 'HiMom', 'hi_mom'.camelize
|
8
|
+
assert_equal 'Hi', 'hi'.camelize
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_to_param
|
12
|
+
query = {:hi_mom => true}
|
13
|
+
assert_equal 'hiMom=true', query.to_param
|
14
|
+
|
15
|
+
query[:yep] = false
|
16
|
+
assert_equal 'hiMom=true&yep=false', query.to_param
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestRequest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@uri = URI.parse 'http://example.com'
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_get_failure
|
10
|
+
stub_request(:any, "http://example.com").to_return(:status => 500)
|
11
|
+
|
12
|
+
assert_raises BadGateway do
|
13
|
+
get @uri
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_get_success
|
18
|
+
stub_request(:any, "http://example.com").to_return(:status => 200)
|
19
|
+
|
20
|
+
response = get @uri
|
21
|
+
|
22
|
+
assert_equal '200', response.code
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
metadata
ADDED
@@ -0,0 +1,196 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bing
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Adam Avilla
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-08-03 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: net-http-persistent
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 6
|
32
|
+
version: "1.6"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: json
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 5
|
44
|
+
segments:
|
45
|
+
- 1
|
46
|
+
- 5
|
47
|
+
- 3
|
48
|
+
version: 1.5.3
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: minitest
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
type: :development
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: git
|
67
|
+
prerelease: false
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
type: :development
|
78
|
+
version_requirements: *id004
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: webmock
|
81
|
+
prerelease: false
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
91
|
+
type: :development
|
92
|
+
version_requirements: *id005
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: ZenTest
|
95
|
+
prerelease: false
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
type: :development
|
106
|
+
version_requirements: *id006
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: hoe
|
109
|
+
prerelease: false
|
110
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ~>
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: 23
|
116
|
+
segments:
|
117
|
+
- 2
|
118
|
+
- 10
|
119
|
+
version: "2.10"
|
120
|
+
type: :development
|
121
|
+
version_requirements: *id007
|
122
|
+
description: Bing api client library that exposes all of Bing's api features.
|
123
|
+
email:
|
124
|
+
- adam@avil.la
|
125
|
+
executables: []
|
126
|
+
|
127
|
+
extensions: []
|
128
|
+
|
129
|
+
extra_rdoc_files:
|
130
|
+
- History.txt
|
131
|
+
- Manifest.txt
|
132
|
+
- README.txt
|
133
|
+
files:
|
134
|
+
- .autotest
|
135
|
+
- .gitignore
|
136
|
+
- History.txt
|
137
|
+
- Manifest.txt
|
138
|
+
- README.txt
|
139
|
+
- Rakefile
|
140
|
+
- lib/bing.rb
|
141
|
+
- lib/bing/core_ext.rb
|
142
|
+
- lib/bing/errors.rb
|
143
|
+
- lib/bing/formatting_helper.rb
|
144
|
+
- lib/bing/location.rb
|
145
|
+
- lib/bing/request.rb
|
146
|
+
- lib/bing/route.rb
|
147
|
+
- lib/bing/route/itinerary.rb
|
148
|
+
- test/helper.rb
|
149
|
+
- test/test_bing.rb
|
150
|
+
- test/test_bing_location.rb
|
151
|
+
- test/test_bing_route.rb
|
152
|
+
- test/test_bing_route_itinerary.rb
|
153
|
+
- test/test_core_ext.rb
|
154
|
+
- test/test_request.rb
|
155
|
+
- .gemtest
|
156
|
+
homepage: https://github.com/hekaldama/bing
|
157
|
+
licenses: []
|
158
|
+
|
159
|
+
post_install_message:
|
160
|
+
rdoc_options:
|
161
|
+
- --main
|
162
|
+
- README.txt
|
163
|
+
require_paths:
|
164
|
+
- lib
|
165
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
166
|
+
none: false
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
hash: 3
|
171
|
+
segments:
|
172
|
+
- 0
|
173
|
+
version: "0"
|
174
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
+
none: false
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
hash: 3
|
180
|
+
segments:
|
181
|
+
- 0
|
182
|
+
version: "0"
|
183
|
+
requirements: []
|
184
|
+
|
185
|
+
rubyforge_project: bing
|
186
|
+
rubygems_version: 1.8.6
|
187
|
+
signing_key:
|
188
|
+
specification_version: 3
|
189
|
+
summary: Bing api client library that exposes all of Bing's api features.
|
190
|
+
test_files:
|
191
|
+
- test/test_bing.rb
|
192
|
+
- test/test_bing_location.rb
|
193
|
+
- test/test_core_ext.rb
|
194
|
+
- test/test_bing_route.rb
|
195
|
+
- test/test_bing_route_itinerary.rb
|
196
|
+
- test/test_request.rb
|