onebox 1.5.16 → 1.5.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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