bing 0.1.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.
- 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
|