onebox 1.5.16 → 1.5.17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 05960d76842fc3238a0f46a23628e0be16c1318a
4
- data.tar.gz: 48c532235d45121bc4f3c781b52b6400db94debb
3
+ metadata.gz: 451ff8d5ee7ce3d3c3fdeffca55cccba29cdb91c
4
+ data.tar.gz: 83033812a9b67dd10048cfe72896c5b315e2d5da
5
5
  SHA512:
6
- metadata.gz: 6a7f575db20f96c4267882b4cb7c9ec2b2a2c2e7335897545342ad1074a7eeccdc2bf4edd087f714c759b7560571bbe9de0b8038cb9f7d34028f4f0708b29270
7
- data.tar.gz: 0f5e9e0d2ea683fce332e4718ad4b810d5594159fedd2ccf9338c0d964fe90f9390f842c668d940570e7b7921697825486273c4b36bc4c02f1717309dcfec5aa
6
+ metadata.gz: a76b282e64d1191b6e7ddd4dc2f8a2b8f30c6f10f409a12ee71d3e794005c6cba66f26d315aec092e05ceb6bc586af6afe2c08ea29ba14000ebb4afd330992c6
7
+ data.tar.gz: 10faeefda12d96758903bbb6f11e1bfc2462a4f73e6be19466e1b6f3030d3eeb93ca2b0ceb9e7d74114fc0f04e25b5f272b24efc47125dce3b88027280f826a8
data/lib/onebox/engine.rb CHANGED
@@ -123,12 +123,14 @@ require_relative "engine/standard_embed"
123
123
  require_relative "engine/html"
124
124
  require_relative "engine/json"
125
125
  require_relative "engine/amazon_onebox"
126
- require_relative "engine/classic_google_maps_onebox"
127
126
  require_relative "engine/github_issue_onebox"
128
127
  require_relative "engine/github_blob_onebox"
129
128
  require_relative "engine/github_commit_onebox"
130
129
  require_relative "engine/github_gist_onebox"
131
130
  require_relative "engine/github_pullrequest_onebox"
131
+ require_relative "engine/google_calendar_onebox"
132
+ require_relative "engine/google_docs_onebox"
133
+ require_relative "engine/google_maps_onebox"
132
134
  require_relative "engine/google_play_app_onebox"
133
135
  require_relative "engine/image_onebox"
134
136
  require_relative "engine/video_onebox"
@@ -141,5 +143,3 @@ require_relative "engine/youku_onebox"
141
143
  require_relative "engine/douban_onebox"
142
144
  require_relative "engine/whitelisted_generic_onebox"
143
145
  require_relative "engine/pubmed_onebox"
144
- require_relative "engine/google_calendar_onebox"
145
- require_relative "engine/google_docs_onebox"
@@ -0,0 +1,176 @@
1
+ module Onebox
2
+ module Engine
3
+ class GoogleMapsOnebox
4
+ include Engine
5
+
6
+ class << self
7
+ def ===(other)
8
+ if other.kind_of? URI
9
+ @@matchers && @@matchers.any? {|m| other.to_s =~ m[:regexp] }
10
+ else
11
+ super
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def matches_regexp(key, regexp)
18
+ (@@matchers ||= []) << {key: key, regexp: regexp}
19
+ end
20
+ end
21
+
22
+ # Matches shortened Google Maps URLs
23
+ matches_regexp :short, %r"^(https?:)?//goo\.gl/maps/"
24
+
25
+ # Matches URLs for custom-created maps
26
+ matches_regexp :custom, %r"^(?:https?:)?//www\.google(?:\.(?:\w{2,}))+/maps/d/(?:edit|viewer|embed)\?mid=.+$"
27
+
28
+ # Matches URLs with streetview data
29
+ matches_regexp :streetview, %r"^(?:https?:)?//www\.google(?:\.(?:\w{2,}))+/maps[^@]+@(?<lon>[\d.]+),(?<lat>[\d.]+),(?:\d+)a,(?<zoom>[\d.]+)y,(?<heading>[\d.]+)h,(?<pitch>[\d.]+)t.+?data=.*?!1s(?<pano>[^!]{22})"
30
+
31
+ # Matches "normal" Google Maps URLs with arbitrary data
32
+ matches_regexp :standard, %r"^(?:https?:)?//www\.google(?:\.(?:\w{2,}))+/maps"
33
+
34
+ # Matches URLs for the old Google Maps domain which we occasionally get redirected to
35
+ matches_regexp :canonical, %r"^(?:https?:)?//maps\.google(?:\.(?:\w{2,}))+/maps\?"
36
+
37
+ def initialize(url, cache = nil, timeout = nil)
38
+ super
39
+ resolve_url!
40
+ rescue Net::HTTPServerException, Timeout::Error, Net::HTTPError, Errno::ECONNREFUSED, RuntimeError => err
41
+ raise ArgumentError, "malformed url or unresolveable: #{err.message}"
42
+ end
43
+
44
+ def streetview?
45
+ !!@streetview
46
+ end
47
+
48
+ def to_html
49
+ Helpers.click_to_scroll_div + "<iframe src=\"#{link}\" width=\"690\" height=\"400\" frameborder=\"0\" style=\"border:0\"></iframe>"
50
+ end
51
+
52
+ def placeholder_html
53
+ width = @placeholder_width || 690
54
+ height = @placeholder_height || 400
55
+ "<img src=\"#{CGI.escapeHTML(@placeholder)}\" width=\"#{width}\" height=\"#{height}\"/>"
56
+ end
57
+
58
+ private
59
+
60
+ def data
61
+ { link: url, title: url }
62
+ end
63
+
64
+ def resolve_url!
65
+ @streetview = false
66
+ type, match = match_url
67
+
68
+ # Resolve shortened URL, if necessary
69
+ if type == :short
70
+ follow_redirect!
71
+ type, match = match_url
72
+ end
73
+
74
+ # Try to get the old-maps URI, it is far easier to embed.
75
+ if type == :standard
76
+ retry_count = 10
77
+ while (retry_count -= 1) > 0
78
+ follow_redirect!
79
+ type, match = match_url
80
+ break if type != :standard
81
+ sleep 0.1
82
+ end
83
+ end
84
+
85
+ case type
86
+ when :standard
87
+ # Fallback for map URLs that don't resolve into an easily embeddable old-style URI
88
+ # Roadmaps use a "z" zoomlevel, satellite maps use "m" the horizontal width in meters
89
+ # TODO: tilted satellite maps using "a,y,t"
90
+ match = @url.match(/@(?<lon>[\d.-]+),(?<lat>[\d.-]+),(?<zoom>\d+)(?<mz>[mz])/)
91
+ raise "unexpected standard url #{@url}" unless match
92
+ zoom = match[:mz] == "z" ? match[:zoom] : Math.log2(57280048.0 / match[:zoom].to_f).round
93
+ location = "#{match[:lon]},#{match[:lat]}"
94
+ url = "https://maps.google.com/maps?ll=#{location}&z=#{zoom}&output=embed&dg=ntvb"
95
+ url += "&q=#{$1}" if match = @url.match(/\/place\/([^\/\?]+)/)
96
+ url += "&cid=#{($1 + $2).to_i(16)}" if @url.match(/!3m1!1s0x(\h{16}):0x(\h{16})/)
97
+ @url = url
98
+ @placeholder = "http://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&center=#{location}&zoom=#{zoom}&size=690x400&sensor=false"
99
+
100
+ when :custom
101
+ url = @url.dup
102
+ @url = rewrite_custom_url(url, "embed")
103
+ @placeholder = rewrite_custom_url(url, "thumbnail")
104
+ @placeholder_height = @placeholder_width = 120
105
+
106
+ when :streetview
107
+ @streetview = true
108
+ panoid = match[:pano]
109
+ lon = match[:lon].to_f.to_s
110
+ lat = match[:lat].to_f.to_s
111
+ heading = match[:heading].to_f.round(4).to_s
112
+ pitch = (match[:pitch].to_f / 10.0).round(4).to_s
113
+ fov = (match[:zoom].to_f / 100.0).round(4).to_s
114
+ zoom = match[:zoom].to_f.round
115
+ @url = "https://www.google.com/maps/embed?pb=!3m2!2sen!4v0!6m8!1m7!1s#{panoid}!2m2!1d#{lon}!2d#{lat}!3f#{heading}!4f#{pitch}!5f#{fov}"
116
+ @placeholder = "http://maps.googleapis.com/maps/api/streetview?size=690x400&location=#{lon},#{lat}&pano=#{panoid}&fov=#{zoom}&heading=#{heading}&pitch=#{pitch}&sensor=false"
117
+
118
+ when :canonical
119
+ uri = URI(@url)
120
+ query = Hash[*uri.query.split("&").map{|a|a.split("=")}.flatten]
121
+ if !query.has_key?("ll")
122
+ raise ArgumentError, "canonical url lacks location argument" unless query.has_key?("sll")
123
+ query["ll"] = query["sll"]
124
+ @url += "&ll=#{query["sll"]}"
125
+ end
126
+ location = query["ll"]
127
+ if !query.has_key?("z")
128
+ raise ArgumentError, "canonical url has incomplete query arguments" unless query.has_key?("spn") || query.has_key?("sspn")
129
+ if !query.has_key?("spn")
130
+ query["spn"] = query["sspn"]
131
+ @url += "&spn=#{query["sspn"]}"
132
+ end
133
+ angle = query["spn"].split(",").first.to_f
134
+ zoom = (Math.log(690.0 * 360.0 / angle / 256.0) / Math.log(2)).round
135
+ else
136
+ zoom = query["z"]
137
+ end
138
+ @url = @url.sub('output=classic', 'output=embed')
139
+ @placeholder = "http://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&size=690x400&sensor=false&center=#{location}&zoom=#{zoom}"
140
+
141
+ else
142
+ raise "unexpected url type #{type.inspect}"
143
+ end
144
+ end
145
+
146
+ def match_url
147
+ @@matchers.each do |matcher|
148
+ if m = matcher[:regexp].match(@url)
149
+ return matcher[:key], m
150
+ end
151
+ end
152
+ raise ArgumentError, "\"#{@url}\" does not match any known pattern"
153
+ end
154
+
155
+ def rewrite_custom_url(url, target)
156
+ uri = URI(url)
157
+ uri.path = uri.path.sub(/(?<=^\/maps\/d\/)\w+$/, target)
158
+ uri.to_s
159
+ end
160
+
161
+ def follow_redirect!
162
+ uri = URI(@url)
163
+ begin
164
+ http = Net::HTTP.start(uri.host, uri.port,
165
+ use_ssl: uri.scheme == 'https', open_timeout: timeout, read_timeout: timeout)
166
+ response = http.head(uri.path)
167
+ raise "unexpected response code #{response.code}" unless %w(301 302).include?(response.code)
168
+ @url = response["Location"]
169
+ ensure
170
+ http.finish rescue nil
171
+ end
172
+ end
173
+
174
+ end
175
+ end
176
+ end
@@ -19,9 +19,11 @@ module Onebox
19
19
  end
20
20
 
21
21
  # Some oembed providers (like meetup.com) don't provide links to themselves
22
- add_oembed_provider /www\.meetup\.com\//, 'http://api.meetup.com/oembed'
22
+ add_oembed_provider /www\.flickr\.com\//, 'http://www.flickr.com/services/oembed.json'
23
23
  add_oembed_provider /www\.kickstarter\.com\//, 'https://www.kickstarter.com/services/oembed'
24
+ add_oembed_provider /www\.meetup\.com\//, 'http://api.meetup.com/oembed'
24
25
  add_oembed_provider /www\.ted\.com\//, 'http://www.ted.com/services/v1/oembed.json'
26
+ add_oembed_provider /(.*\.)?vimeo\.com\//, 'http://vimeo.com/api/oembed.json'
25
27
 
26
28
  # Sites that work better with OpenGraph
27
29
  add_opengraph_provider /gfycat\.com\//
@@ -62,6 +62,7 @@ module Onebox
62
62
  hulu.com
63
63
  ign.com
64
64
  ikea.com
65
+ imdb.com
65
66
  imgur.com
66
67
  indiatimes.com
67
68
  instagr.am
@@ -131,7 +132,7 @@ module Onebox
131
132
  # include the entire page HTML. However for some providers like Imgur it allows us
132
133
  # to return gifv and galleries.
133
134
  def self.default_html_providers
134
- ['Imgur', 'Meetup']
135
+ ['Flickr', 'Imgur', 'Meetup']
135
136
  end
136
137
 
137
138
  def self.html_providers
@@ -51,5 +51,9 @@ module Onebox
51
51
  response.error!
52
52
  end
53
53
  end
54
+
55
+ def self.click_to_scroll_div(width = 690, height = 400)
56
+ "<div style=\"background:transparent;position:relative;width:#{width}px;height:#{height}px;top:#{height}px;margin-top:-#{height}px;\" onClick=\"style.pointerEvents='none'\"></div>"
57
+ end
54
58
  end
55
59
  end
@@ -1,3 +1,3 @@
1
1
  module Onebox
2
- VERSION = "1.5.16"
2
+ VERSION = "1.5.17"
3
3
  end
@@ -0,0 +1,70 @@
1
+ require "spec_helper"
2
+
3
+ describe Onebox::Engine::GoogleMapsOnebox do
4
+
5
+ URLS = {
6
+ short: {
7
+ test: "https://goo.gl/maps/rEG3D",
8
+ redirect: ["302 Found", :long],
9
+ expect: "https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=embed&dg=ntvb&ll=40.689249,-74.0445&spn=0.0062479,0.0109864",
10
+ },
11
+ long: {
12
+ test: "https://www.google.de/maps/place/Statue+of+Liberty+National+Monument/@40.689249,-74.0445,17z/data=!3m1!4b1!4m2!3m1!1s0x89c25090129c363d:0x40c6a5770d25022b",
13
+ redirect: ["301 Moved Permanently", :canonical],
14
+ expect: "https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=embed&dg=ntvb&ll=40.689249,-74.0445&spn=0.0062479,0.0109864",
15
+ },
16
+ canonical: {
17
+ test: "https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=classic&dg=ntvb",
18
+ expect: "https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=embed&dg=ntvb&ll=40.689249,-74.0445&spn=0.0062479,0.0109864",
19
+ },
20
+ custom: {
21
+ test: "https://www.google.com/maps/d/edit?mid=zPYyZFrHi1MU.kX85W_Y2y2_E",
22
+ expect: "https://www.google.com/maps/d/embed?mid=zPYyZFrHi1MU.kX85W_Y2y2_E",
23
+ },
24
+ streetview: {
25
+ test: "https://www.google.com/maps/@46.414384,10.013947,3a,75y,232.83h,99.08t/data=!3m5!1e1!3m3!1s9WgYUb5quXDjqqFd3DWI6A!2e0!3e5?hl=de",
26
+ expect: "https://www.google.com/maps/embed?pb=!3m2!2sen!4v0!6m8!1m7!1s9WgYUb5quXDjqqFd3DWI6A!2m2!1d46.414384!2d10.013947!3f232.83!4f9.908!5f0.75",
27
+ streetview: true
28
+ },
29
+ unresolveable: {
30
+ test: "https://www.google.com/maps/place/Den+Abattoir/@51.2285173,4.4336702,17z/data=!4m7!1m4!3m3!1s0x47c3f7a5ac48e237:0x63d716018f584a33!2zUGnDqXRyYWlu!3b1!3m1!1s0x0000000000000000:0xfbfac0c41c32471a",
31
+ redirect: ["302 Found", "https://www.google.com/maps/place/Den+Abattoir/@51.2285173,4.4336702,17z/data=!4m7!1m4!3m3!1s0x47c3f7a5ac48e237:0x63d716018f584a33!2zUGnDqXRyYWlu!3b1!3m1!1s0x0000000000000000:0xfbfac0c41c32471a?dg=dbrw&newdg=1"],
32
+ expect: "https://maps.google.com/maps?ll=51.2285173,4.4336702&z=17&output=embed&dg=ntvb&q=Den+Abattoir&cid=18157036796216755994"
33
+ },
34
+ satellite: {
35
+ test: "https://www.google.de/maps/@40.6894264,-74.0449146,758m/data=!3m1!1e3",
36
+ redirect: ["302 Found", "https://www.google.de/maps/@40.6894264,-74.0449146,758m/data=!3m1!1e3?dg=dbrw&newdg=1"],
37
+ expect: "https://maps.google.com/maps?ll=40.6894264,-74.0449146&z=16&output=embed&dg=ntvb"
38
+ }
39
+ }
40
+
41
+ # Register URL redirects
42
+ before(:all) do
43
+ URLS.values.each do |t|
44
+ status, location = *t[:redirect]
45
+ location = URLS[location][:test] if location.is_a? Symbol
46
+ FakeWeb.register_uri(:head, t[:test], response: "HTTP/1.1 #{status}\nLocation: #{location}\n\n")
47
+ end
48
+ end
49
+
50
+ # Prevent sleep from wasting our time when we test with strange redirects
51
+ subject { described_class.send(:allocate).tap {|obj|
52
+ obj.stub(:sleep)
53
+ obj.send(:initialize, link)
54
+ }}
55
+
56
+ let(:data) { Onebox::Helpers.symbolize_keys(subject.send(:data)) }
57
+ let(:link) {|example| URLS[example.metadata[:urltype] || :short][:test] }
58
+
59
+ include_context "an engine", urltype: :short
60
+
61
+ URLS.each do |kind, t|
62
+ it "processes #{kind.to_s} url correctly", urltype: kind do
63
+ expect(subject.url).to eq t[:expect]
64
+ expect(subject.streetview?).to t[:streetview] ? be_truthy : be_falsey
65
+ expect(subject.to_html).to include("<iframe")
66
+ expect(subject.placeholder_html).to include("<img")
67
+ end
68
+ end
69
+
70
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onebox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.16
4
+ version: 1.5.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joanna Zeta
@@ -10,244 +10,244 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-04-06 00:00:00.000000000 Z
13
+ date: 2015-05-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: multi_json
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - "~>"
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
21
  version: '1.7'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - "~>"
26
+ - - ~>
27
27
  - !ruby/object:Gem::Version
28
28
  version: '1.7'
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: mustache
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - "~>"
33
+ - - ~>
34
34
  - !ruby/object:Gem::Version
35
35
  version: '0.99'
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - "~>"
40
+ - - ~>
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0.99'
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: nokogiri
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - "~>"
47
+ - - ~>
48
48
  - !ruby/object:Gem::Version
49
49
  version: 1.6.1
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - "~>"
54
+ - - ~>
55
55
  - !ruby/object:Gem::Version
56
56
  version: 1.6.1
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: moneta
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - "~>"
61
+ - - ~>
62
62
  - !ruby/object:Gem::Version
63
63
  version: '0.7'
64
64
  type: :runtime
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - "~>"
68
+ - - ~>
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0.7'
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: bundler
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - "~>"
75
+ - - ~>
76
76
  - !ruby/object:Gem::Version
77
77
  version: '1.3'
78
78
  type: :development
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
- - - "~>"
82
+ - - ~>
83
83
  - !ruby/object:Gem::Version
84
84
  version: '1.3'
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: rake
87
87
  requirement: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - "~>"
89
+ - - ~>
90
90
  - !ruby/object:Gem::Version
91
91
  version: '10.0'
92
92
  type: :development
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
- - - "~>"
96
+ - - ~>
97
97
  - !ruby/object:Gem::Version
98
98
  version: '10.0'
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: rspec
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
- - - "~>"
103
+ - - ~>
104
104
  - !ruby/object:Gem::Version
105
105
  version: '2.14'
106
106
  type: :development
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
- - - "~>"
110
+ - - ~>
111
111
  - !ruby/object:Gem::Version
112
112
  version: '2.14'
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: yard
115
115
  requirement: !ruby/object:Gem::Requirement
116
116
  requirements:
117
- - - "~>"
117
+ - - ~>
118
118
  - !ruby/object:Gem::Version
119
119
  version: '0.8'
120
120
  type: :development
121
121
  prerelease: false
122
122
  version_requirements: !ruby/object:Gem::Requirement
123
123
  requirements:
124
- - - "~>"
124
+ - - ~>
125
125
  - !ruby/object:Gem::Version
126
126
  version: '0.8'
127
127
  - !ruby/object:Gem::Dependency
128
128
  name: fakeweb
129
129
  requirement: !ruby/object:Gem::Requirement
130
130
  requirements:
131
- - - "~>"
131
+ - - ~>
132
132
  - !ruby/object:Gem::Version
133
133
  version: '1.3'
134
134
  type: :development
135
135
  prerelease: false
136
136
  version_requirements: !ruby/object:Gem::Requirement
137
137
  requirements:
138
- - - "~>"
138
+ - - ~>
139
139
  - !ruby/object:Gem::Version
140
140
  version: '1.3'
141
141
  - !ruby/object:Gem::Dependency
142
142
  name: pry
143
143
  requirement: !ruby/object:Gem::Requirement
144
144
  requirements:
145
- - - "~>"
145
+ - - ~>
146
146
  - !ruby/object:Gem::Version
147
147
  version: '0.9'
148
148
  type: :development
149
149
  prerelease: false
150
150
  version_requirements: !ruby/object:Gem::Requirement
151
151
  requirements:
152
- - - "~>"
152
+ - - ~>
153
153
  - !ruby/object:Gem::Version
154
154
  version: '0.9'
155
155
  - !ruby/object:Gem::Dependency
156
156
  name: mocha
157
157
  requirement: !ruby/object:Gem::Requirement
158
158
  requirements:
159
- - - "~>"
159
+ - - ~>
160
160
  - !ruby/object:Gem::Version
161
161
  version: '0.14'
162
162
  type: :development
163
163
  prerelease: false
164
164
  version_requirements: !ruby/object:Gem::Requirement
165
165
  requirements:
166
- - - "~>"
166
+ - - ~>
167
167
  - !ruby/object:Gem::Version
168
168
  version: '0.14'
169
169
  - !ruby/object:Gem::Dependency
170
170
  name: rubocop
171
171
  requirement: !ruby/object:Gem::Requirement
172
172
  requirements:
173
- - - "~>"
173
+ - - ~>
174
174
  - !ruby/object:Gem::Version
175
175
  version: '0.11'
176
176
  type: :development
177
177
  prerelease: false
178
178
  version_requirements: !ruby/object:Gem::Requirement
179
179
  requirements:
180
- - - "~>"
180
+ - - ~>
181
181
  - !ruby/object:Gem::Version
182
182
  version: '0.11'
183
183
  - !ruby/object:Gem::Dependency
184
184
  name: twitter
185
185
  requirement: !ruby/object:Gem::Requirement
186
186
  requirements:
187
- - - "~>"
187
+ - - ~>
188
188
  - !ruby/object:Gem::Version
189
189
  version: '4.8'
190
190
  type: :development
191
191
  prerelease: false
192
192
  version_requirements: !ruby/object:Gem::Requirement
193
193
  requirements:
194
- - - "~>"
194
+ - - ~>
195
195
  - !ruby/object:Gem::Version
196
196
  version: '4.8'
197
197
  - !ruby/object:Gem::Dependency
198
198
  name: guard-rspec
199
199
  requirement: !ruby/object:Gem::Requirement
200
200
  requirements:
201
- - - "~>"
201
+ - - ~>
202
202
  - !ruby/object:Gem::Version
203
203
  version: 4.2.8
204
204
  type: :development
205
205
  prerelease: false
206
206
  version_requirements: !ruby/object:Gem::Requirement
207
207
  requirements:
208
- - - "~>"
208
+ - - ~>
209
209
  - !ruby/object:Gem::Version
210
210
  version: 4.2.8
211
211
  - !ruby/object:Gem::Dependency
212
212
  name: sinatra
213
213
  requirement: !ruby/object:Gem::Requirement
214
214
  requirements:
215
- - - "~>"
215
+ - - ~>
216
216
  - !ruby/object:Gem::Version
217
217
  version: '1.4'
218
218
  type: :development
219
219
  prerelease: false
220
220
  version_requirements: !ruby/object:Gem::Requirement
221
221
  requirements:
222
- - - "~>"
222
+ - - ~>
223
223
  - !ruby/object:Gem::Version
224
224
  version: '1.4'
225
225
  - !ruby/object:Gem::Dependency
226
226
  name: sinatra-contrib
227
227
  requirement: !ruby/object:Gem::Requirement
228
228
  requirements:
229
- - - "~>"
229
+ - - ~>
230
230
  - !ruby/object:Gem::Version
231
231
  version: '1.4'
232
232
  type: :development
233
233
  prerelease: false
234
234
  version_requirements: !ruby/object:Gem::Requirement
235
235
  requirements:
236
- - - "~>"
236
+ - - ~>
237
237
  - !ruby/object:Gem::Version
238
238
  version: '1.4'
239
239
  - !ruby/object:Gem::Dependency
240
240
  name: haml
241
241
  requirement: !ruby/object:Gem::Requirement
242
242
  requirements:
243
- - - "~>"
243
+ - - ~>
244
244
  - !ruby/object:Gem::Version
245
245
  version: '4.0'
246
246
  type: :development
247
247
  prerelease: false
248
248
  version_requirements: !ruby/object:Gem::Requirement
249
249
  requirements:
250
- - - "~>"
250
+ - - ~>
251
251
  - !ruby/object:Gem::Version
252
252
  version: '4.0'
253
253
  - !ruby/object:Gem::Dependency
@@ -273,11 +273,11 @@ executables: []
273
273
  extensions: []
274
274
  extra_rdoc_files: []
275
275
  files:
276
- - ".gitignore"
277
- - ".rspec"
278
- - ".rubocop.yml"
279
- - ".ruby-gemset"
280
- - ".travis.yml"
276
+ - .gitignore
277
+ - .rspec
278
+ - .rubocop.yml
279
+ - .ruby-gemset
280
+ - .travis.yml
281
281
  - Gemfile
282
282
  - Guardfile
283
283
  - LICENSE.txt
@@ -287,7 +287,6 @@ files:
287
287
  - lib/onebox/engine.rb
288
288
  - lib/onebox/engine/amazon_onebox.rb
289
289
  - lib/onebox/engine/audio_onebox.rb
290
- - lib/onebox/engine/classic_google_maps_onebox.rb
291
290
  - lib/onebox/engine/douban_onebox.rb
292
291
  - lib/onebox/engine/github_blob_onebox.rb
293
292
  - lib/onebox/engine/github_commit_onebox.rb
@@ -296,6 +295,7 @@ files:
296
295
  - lib/onebox/engine/github_pullrequest_onebox.rb
297
296
  - lib/onebox/engine/google_calendar_onebox.rb
298
297
  - lib/onebox/engine/google_docs_onebox.rb
298
+ - lib/onebox/engine/google_maps_onebox.rb
299
299
  - lib/onebox/engine/google_play_app_onebox.rb
300
300
  - lib/onebox/engine/html.rb
301
301
  - lib/onebox/engine/image_onebox.rb
@@ -343,13 +343,13 @@ files:
343
343
  - spec/fixtures/youtube.response
344
344
  - spec/lib/onebox/engine/amazon_onebox_spec.rb
345
345
  - spec/lib/onebox/engine/audio_onebox_spec.rb
346
- - spec/lib/onebox/engine/classic_google_maps_onebox_spec.rb
347
346
  - spec/lib/onebox/engine/douban_onebox_spec.rb
348
347
  - spec/lib/onebox/engine/github_blob_onebox_spec.rb
349
348
  - spec/lib/onebox/engine/github_commit_onebox_spec.rb
350
349
  - spec/lib/onebox/engine/github_gist_onebox_spec.rb
351
350
  - spec/lib/onebox/engine/github_pullrequest_onebox_spec.rb
352
351
  - spec/lib/onebox/engine/google_docs_onebox_spec.rb
352
+ - spec/lib/onebox/engine/google_maps_onebox_spec.rb
353
353
  - spec/lib/onebox/engine/google_play_app_onebox_spec.rb
354
354
  - spec/lib/onebox/engine/html_spec.rb
355
355
  - spec/lib/onebox/engine/image_onebox_spec.rb
@@ -399,17 +399,17 @@ require_paths:
399
399
  - lib
400
400
  required_ruby_version: !ruby/object:Gem::Requirement
401
401
  requirements:
402
- - - ">="
402
+ - - '>='
403
403
  - !ruby/object:Gem::Version
404
404
  version: '0'
405
405
  required_rubygems_version: !ruby/object:Gem::Requirement
406
406
  requirements:
407
- - - ">="
407
+ - - '>='
408
408
  - !ruby/object:Gem::Version
409
409
  version: '0'
410
410
  requirements: []
411
411
  rubyforge_project:
412
- rubygems_version: 2.2.2
412
+ rubygems_version: 2.0.14
413
413
  signing_key:
414
414
  specification_version: 4
415
415
  summary: A gem for turning URLs into previews.
@@ -437,13 +437,13 @@ test_files:
437
437
  - spec/fixtures/youtube.response
438
438
  - spec/lib/onebox/engine/amazon_onebox_spec.rb
439
439
  - spec/lib/onebox/engine/audio_onebox_spec.rb
440
- - spec/lib/onebox/engine/classic_google_maps_onebox_spec.rb
441
440
  - spec/lib/onebox/engine/douban_onebox_spec.rb
442
441
  - spec/lib/onebox/engine/github_blob_onebox_spec.rb
443
442
  - spec/lib/onebox/engine/github_commit_onebox_spec.rb
444
443
  - spec/lib/onebox/engine/github_gist_onebox_spec.rb
445
444
  - spec/lib/onebox/engine/github_pullrequest_onebox_spec.rb
446
445
  - spec/lib/onebox/engine/google_docs_onebox_spec.rb
446
+ - spec/lib/onebox/engine/google_maps_onebox_spec.rb
447
447
  - spec/lib/onebox/engine/google_play_app_onebox_spec.rb
448
448
  - spec/lib/onebox/engine/html_spec.rb
449
449
  - spec/lib/onebox/engine/image_onebox_spec.rb
@@ -463,3 +463,4 @@ test_files:
463
463
  - spec/lib/onebox_spec.rb
464
464
  - spec/spec_helper.rb
465
465
  - spec/support/html_spec_helper.rb
466
+ has_rdoc:
@@ -1,62 +0,0 @@
1
- module Onebox
2
- module Engine
3
- class ClassicGoogleMapsOnebox
4
- include Engine
5
-
6
- matches_regexp /^(https?:)?\/\/((maps|www)\.google\.[\w.]{2,}|goo\.gl)\/maps?.+$/
7
-
8
- def initialize(link, cache = nil, timeout = nil)
9
- super(link, cache, timeout)
10
- resolve_url!
11
- end
12
-
13
- def to_html
14
- "<div style=\"background:transparent;position:relative;width:690px;height:400px;top:400px;margin-top:-400px;\" onClick=\"style.pointerEvents='none'\"></div> <iframe src=\"#{link}\" width=\"690px\" height=\"400px\" frameborder=\"0\" style=\"border:0\"></iframe>"
15
- end
16
-
17
- def placeholder_html
18
- return to_html unless @placeholder
19
- "<img src=\"http://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&size=690x400&sensor=false&#{@placeholder}\" width=\"690\" height=\"400\"/>"
20
- end
21
-
22
- private
23
-
24
- def resolve_url!
25
- @url = follow_redirect(@url) if @url.include?("//goo.gl/maps")
26
- if m = @url.match(/@([-.\d]+,[-.\d]+),(\d+)z/)
27
- @placeholder = "center=#{m[1]}&zoom=#{m[2]}"
28
- end
29
-
30
- @url = follow_redirect(@url) if @url.include?("www.google")
31
- query = Hash[*URI(@url).query.split("&").map{|a|a.split("=")}.flatten]
32
- @url += "&ll=#{query["sll"]}" if !query["ll"]
33
- @url += "&spn=#{query["sspn"]}" if !query["spn"]
34
- if !@placeholder
35
- angle = (query["spn"] || query["sspn"]).split(",").first.to_f
36
- zoom = (Math.log(690.0 * 360.0 / angle / 256.0) / Math.log(2)).round
37
- @placeholder = "center=#{query["ll"] || query["sll"]}&zoom=#{zoom}"
38
- end
39
-
40
- @url = (@url =~ /output=classic/) ?
41
- @url.sub('output=classic', 'output=embed') :
42
- @url + '&output=embed'
43
- end
44
-
45
- def data
46
- {link: url, title: url}
47
- end
48
-
49
- def follow_redirect(link)
50
- uri = URI(link)
51
- http = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https')
52
- http.open_timeout = timeout
53
- http.read_timeout = timeout
54
- response = http.head(uri.path)
55
- response["Location"] if %(301 302).include?(response.code)
56
- rescue
57
- link
58
- end
59
-
60
- end
61
- end
62
- end
@@ -1,52 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Onebox::Engine::ClassicGoogleMapsOnebox do
4
-
5
- URLS = {
6
- short: "https://goo.gl/maps/rEG3D",
7
- long: "https://www.google.de/maps/place/Statue+of+Liberty+National+Monument/@40.689249,-74.0445,17z/data=!3m1!4b1!4m2!3m1!1s0x89c25090129c363d:0x40c6a5770d25022b",
8
- canonical: "https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=classic&dg=ntvb",
9
- embed: "https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=embed&dg=ntvb&ll=40.689249,-74.0445&spn=0.0062479,0.0109864"
10
- }
11
-
12
- before(:all) do
13
- FakeWeb.register_uri(:head, URLS[:short], response: "HTTP/1.1 302 Found\nLocation: #{URLS[:long]}\n\n")
14
- FakeWeb.register_uri(:head, URLS[:long], response: "HTTP/1.1 301 Moved Permanently\nLocation: #{URLS[:canonical]}\n\n")
15
- end
16
-
17
- subject { described_class.new(link) }
18
-
19
- it_behaves_like "an engine" do
20
- let(:link) { URLS[:canonical] }
21
- let(:data) { Onebox::Helpers.symbolize_keys(subject.send(:data)) }
22
- end
23
-
24
- shared_examples "embeddable" do |kind|
25
- let(:link) { URLS[kind] }
26
-
27
- it "resolves url correctly" do
28
- subject.url.should == URLS[:embed]
29
- end
30
-
31
- it "produces an iframe" do
32
- subject.to_html.should include("iframe", "output=embed")
33
- end
34
-
35
- it "produces a placeholder image" do
36
- subject.placeholder_html.should include("img")
37
- end
38
- end
39
-
40
- context "canonical url" do
41
- it_should_behave_like "embeddable", :canonical
42
- end
43
-
44
- context "long url" do
45
- it_should_behave_like "embeddable", :long
46
- end
47
-
48
- context "short url" do
49
- it_should_behave_like "embeddable", :short
50
- end
51
-
52
- end