ex_ua 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ex_ua.gemspec +3 -5
  4. data/lib/ex_ua/category.rb +3 -1
  5. data/lib/ex_ua/client.rb +15 -8
  6. data/lib/ex_ua/item.rb +20 -4
  7. data/lib/ex_ua/version.rb +1 -1
  8. data/spec/category_spec.rb +22 -11
  9. data/spec/item_spec.rb +36 -0
  10. metadata +6 -34
  11. data/fixtures/vcr_cassettes/ExUA_Category.yml +0 -151
  12. data/fixtures/vcr_cassettes/ExUA_Client.yml +0 -194
  13. data/spec/cassettes/ExUA_Category/general_1_page_category/_categories/has_current_category_as_a_parent_category_for_all_childs.yml +0 -366
  14. data/spec/cassettes/ExUA_Category/general_1_page_category/_categories/returns_list_of_child_categories.yml +0 -366
  15. data/spec/cassettes/ExUA_Category/general_1_page_category/canonical_url/.yml +0 -366
  16. data/spec/cassettes/ExUA_Category/general_1_page_category/description/.yml +0 -366
  17. data/spec/cassettes/ExUA_Category/general_1_page_category/items/.yml +0 -366
  18. data/spec/cassettes/ExUA_Category/general_1_page_category/name/.yml +0 -366
  19. data/spec/cassettes/ExUA_Category/general_1_page_category/next_/.yml +0 -366
  20. data/spec/cassettes/ExUA_Category/general_1_page_category/prev_/.yml +0 -366
  21. data/spec/cassettes/ExUA_Category/general_few_pages_category/_next/returns_a_category_with_same_url_but_different_page_number.yml +0 -555
  22. data/spec/cassettes/ExUA_Category/general_few_pages_category/_prev/raises_error_when_no_prev_url_found.yml +0 -555
  23. data/spec/cassettes/ExUA_Category/item_category/picture/.yml +0 -555
  24. data/spec/cassettes/ExUA_Client/_available_languages/returns_list_of_available_languages.yml +0 -194
  25. data/spec/cassettes/ExUA_Client/_search/returns_20_results_by_default.yml +0 -620
  26. data/spec/cassettes/ExUA_Client/_search/returns_list_of_categories.yml +0 -1233
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 38716e7eb3d61afd1b73ea1ac09bd9bf2f1f13c4
4
- data.tar.gz: 47ead9b6d1b28cc6f13bc6c0d6d563726342ca39
3
+ metadata.gz: acb906012343c1b591485c34e4f16c8d4d505038
4
+ data.tar.gz: 2d3d0f7f0068061c4c7a65690d5c5955ac6c55bb
5
5
  SHA512:
6
- metadata.gz: 1a57dcd9303152db33a67c12e1f484e8a0f9d0333b7232afd9f6a142c9eec9b86d1cdae133c23654572b8e7840ae997f898a28ffff26662a81769eda8bf4ecb8
7
- data.tar.gz: 23fb6bd56c351c2f55c3754ee4b405e2b9c5212b1f4e394206e8676d8df45220aceab7acc42f604dd23f08ebcf4ad2c6de8a294392be84ea4979645eb0d9df42
6
+ metadata.gz: f2ee3595dcf7d471b62ca53393dcb68da42b95c757a701b1312895d25857722cc0ae9c8e66a328ba128ad0ab2b07db6b2c017270c3e50feb68396dacd393258f
7
+ data.tar.gz: 6a191afbf4418a3edd3239a4ecf437c21b477449c25db68d82127402133360777858bf4db1e2b7a8e5bc3599aa1730cea56dc8ebe4b1a2d5736c12ac86a86fdc
data/README.md CHANGED
@@ -20,7 +20,7 @@ Example usage
20
20
  category = base_categories.first # Select first category (usually video)
21
21
  sub_categories = category.categories # Select sub-categories of a category
22
22
  example_video_category = sub_categories.first.categories.first
23
- download_items = example_video_category.items # Here you'll have an array of download items in a given category with #download_uri
23
+ download_items = example_video_category.items # Here you'll have an array of download items in a given category with #load_uri
24
24
 
25
25
 
26
26
  Search
data/ex_ua.gemspec CHANGED
@@ -7,14 +7,12 @@ Gem::Specification.new do |s|
7
7
  s.version = ExUa::VERSION
8
8
  s.authors = ["Andriy Dmytrenko"]
9
9
  s.email = ["refresh.xss@gmail.com"]
10
- s.homepage = ""
10
+ s.homepage = "https://github.com/Antti/ex_ua"
11
11
  s.summary = %q{An http://ex.ua/ API}
12
12
  s.description = %q{Ruby API for ex.ua}
13
13
 
14
- s.rubyforge_project = "ex_ua"
15
-
16
- s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.files = `git ls-files | grep -v spec/cassettes`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/* | grep -v spec/cassettes`.split("\n")
18
16
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
17
  s.require_paths = ["lib"]
20
18
  s.license = 'MIT'
@@ -93,6 +93,8 @@ module ExUA
93
93
  uri.query_values["p"].to_i
94
94
  end
95
95
 
96
+ # Category's path
97
+ # @return [String]
96
98
  def path
97
99
  uri.path
98
100
  end
@@ -104,7 +106,7 @@ module ExUA
104
106
  table_rows.map do |tr|
105
107
  tr.search("a[title!='']")
106
108
  end.reject(&:empty?).map do |links|
107
- Item.parse_links(links)
109
+ Item.parse(links)
108
110
  end
109
111
  end
110
112
 
data/lib/ex_ua/client.rb CHANGED
@@ -4,20 +4,21 @@ require 'singleton'
4
4
  require 'addressable/uri'
5
5
 
6
6
  module ExUA
7
- # Client for ExUA
8
- # @example Usage
9
- # client = ExUA::Client.new
10
- # categories = client.base_categories('ru')
11
- #
12
7
  class ExUAFetcher
13
8
  include HTTParty
14
9
  no_follow true
10
+ # Returns the redirect target for a given uri
15
11
  def self.get_redirect(uri)
16
12
  get Addressable::URI.parse(uri).normalize.to_s
17
13
  rescue HTTParty::RedirectionTooDeep => e
18
14
  e.response["location"]
19
15
  end
20
16
  end
17
+ # Client for ExUA
18
+ # @example Usage
19
+ # client = ExUA::Client.new
20
+ # categories = client.base_categories('ru')
21
+ #
21
22
  class Client
22
23
  include Singleton
23
24
  KNOWN_BASE_CATEGORIES = %w[video audio images texts games software]
@@ -40,9 +41,15 @@ module ExUA
40
41
  # client.base_categories('ru')
41
42
  # @return [Array<ExUA::Category>]
42
43
  def base_categories(lang)
43
- KNOWN_BASE_CATEGORIES.map{|cat| Category.new(url: "/#{lang}/#{cat}")}
44
+ base_categories_names.map{|cat| Category.new(url: "/#{lang}/#{cat}")}
44
45
  end
45
46
 
47
+ # Search for a given @text
48
+ # @param[String] text A term to search for
49
+ # @param[Integer] page Page number, starting from 0
50
+ # @param[Integer] per Items per page. Defaults to 20
51
+ # @return[Array<ExUA::Category>] list of categories
52
+
46
53
  def search(text, page=0, per=20)
47
54
  uri = Addressable::URI.parse("/search?#{Addressable::URI.form_encode(s: text, p: page, per: per)}")
48
55
  page = get(uri)
@@ -53,8 +60,8 @@ module ExUA
53
60
  end
54
61
  end
55
62
 
56
- def get(request_uri)
57
- Nokogiri.parse(HTTParty.get(Addressable::URI.join(ExUA::BASE_URL,request_uri).to_s).body)
63
+ def get(path)
64
+ Nokogiri.parse(HTTParty.get(Addressable::URI.join(ExUA::BASE_URL,path).to_s).body)
58
65
  end
59
66
 
60
67
  private
data/lib/ex_ua/item.rb CHANGED
@@ -3,7 +3,7 @@ require 'addressable/uri'
3
3
  module ExUA
4
4
  # Download item
5
5
  class Item < Struct.new(:id, :title, :additional_servers)
6
- def self.parse_links(links)
6
+ def self.parse(links)
7
7
  self.new.tap do |item|
8
8
  links.each { |link|
9
9
  case link.attributes["href"].value
@@ -19,14 +19,29 @@ module ExUA
19
19
  end
20
20
 
21
21
  # Queries ex.ua to get a real url to fetch data from (follows redirect)
22
+ # URI with content-disposition: attachment
22
23
  def retrieve_real_load_url
23
- retrieve_real_url(download_uri)
24
+ retrieve_real_url(load_uri)
24
25
  end
25
26
 
26
27
  def retrieve_real_get_url
27
28
  retrieve_real_url(get_uri)
28
29
  end
29
30
 
31
+ # @params[String, File] save_to Optional. File location to save content to
32
+ # @return[HTTParty::Response] Response
33
+ def download(save_to=nil)
34
+ response = HTTParty.get(retrieve_real_get_url)
35
+ File.write(save_to, response.body) if save_to
36
+ response
37
+ end
38
+
39
+ # Returns response with headers(includes content-type, content-lenght)
40
+ # @return[HTTParty::Response]
41
+ def head
42
+ @head ||= HTTParty.head(retrieve_real_get_url)
43
+ end
44
+
30
45
  # Actual download url with ex.ua included
31
46
  # You can add ?fs_id=server_id param to download form #additional_servers
32
47
  # @return[Addressable::URI]
@@ -35,8 +50,9 @@ module ExUA
35
50
  @get_url ||= Addressable::URI.join(ExUA::BASE_URL,"/get/#{self.id}")
36
51
  end
37
52
 
38
- def download_uri
39
- @downoadload_url ||= Addressable::URI.join(ExUA::BASE_URL, "/load/#{self.id}")
53
+ # URI with content-disposition: attachment
54
+ def load_uri
55
+ @load_url ||= Addressable::URI.join(ExUA::BASE_URL, "/load/#{self.id}")
40
56
  end
41
57
 
42
58
  private
data/lib/ex_ua/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ExUa
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -19,24 +19,35 @@ describe ExUA::Category, :vcr => true do
19
19
  its(:uri){should eq(Addressable::URI.parse('http://www.ex.ua/ru/video'))}
20
20
  end
21
21
  context "general few pages category" do
22
- subject{ExUA::Category.new(url: '/ru/video/foreign')}
23
- describe '#next' do
24
- it 'returns a category with same url, but different page number' do
25
- subject.next.uri.request_uri.should eq('/ru/video/foreign?p=1')
22
+ context "on third page" do
23
+ subject{ExUA::Category.new(url: '/ru/video/foreign?p=2')}
24
+ describe '#prev' do
25
+ it 'returns a category with same url, but previous page number' do
26
+ expect(subject.prev.uri.request_uri).to eq('/ru/video/foreign?p=1')
27
+ end
26
28
  end
27
- end
28
- describe '#prev' do
29
- it 'returns a category with same url, but different page number' do
30
- pending 'find a page with prev'
31
- expect(subject.prev.uri).to eq('')
29
+ describe '#next' do
30
+ it 'returns a category with same url, but different page number' do
31
+ subject.next.uri.request_uri.should eq('/ru/video/foreign?p=3')
32
+ end
32
33
  end
33
- it 'raises error when no prev url found' do
34
- expect{subject.prev}.to raise_error(ExUA::Category::NotFound)
34
+ end
35
+ context "on a first page" do
36
+ subject{ExUA::Category.new(url: '/ru/video/foreign')}
37
+ describe '#prev' do
38
+ it 'raises error when no prev url found' do
39
+ expect{subject.prev}.to raise_error(ExUA::Category::NotFound)
40
+ end
35
41
  end
36
42
  end
37
43
  end
38
44
  context "item category" do
39
45
  subject{ExUA::Category.new(url: '/71902463')}
40
46
  its(:picture){should_not be_nil}
47
+ describe '#items' do
48
+ it 'has an array of items' do
49
+ subject.items.size.should_not eq(0)
50
+ end
51
+ end
41
52
  end
42
53
  end
data/spec/item_spec.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'tempfile'
3
+
4
+ describe ExUA::Item, vcr: true do
5
+ let(:id) {68579769}
6
+ subject{ExUA::Item.new(id)}
7
+ describe '#download' do
8
+ let(:tmp_file) { Tempfile.new('foo')}
9
+ let(:png_header) {[137, 80, 78, 71, 13, 10, 26, 10] }
10
+ after(:each) do
11
+ tmp_file.unlink
12
+ end
13
+ it 'returns response with content-type' do
14
+ subject.download.content_type.should eq('image/png')
15
+ end
16
+ it 'returns response with content of a file' do
17
+ subject.download.body[0..7].bytes.to_a.should eq png_header
18
+ end
19
+ it 'saves content to a file' do
20
+ subject.download(tmp_file)
21
+ tmp_file.read[0..7].bytes.to_a.should eq png_header
22
+ end
23
+ end
24
+ describe '#head' do
25
+ it 'has content-type' do
26
+ subject.head.content_type.should eq('image/png')
27
+ end
28
+ it 'has content-length' do
29
+ subject.head.content_length.should_not be_nil
30
+ end
31
+ end
32
+ its(:get_uri){should eq Addressable::URI.parse("http://www.ex.ua/get/#{id}")}
33
+ its(:load_uri){should eq Addressable::URI.parse("http://www.ex.ua/load/#{id}")}
34
+ describe '#retrieve_real_load_url'
35
+ describe '#retrieve_real_get_url'
36
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ex_ua
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andriy Dmytrenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-16 00:00:00.000000000 Z
11
+ date: 2013-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -121,31 +121,16 @@ files:
121
121
  - README.md
122
122
  - Rakefile
123
123
  - ex_ua.gemspec
124
- - fixtures/vcr_cassettes/ExUA_Category.yml
125
- - fixtures/vcr_cassettes/ExUA_Client.yml
126
124
  - lib/ex_ua.rb
127
125
  - lib/ex_ua/category.rb
128
126
  - lib/ex_ua/client.rb
129
127
  - lib/ex_ua/item.rb
130
128
  - lib/ex_ua/version.rb
131
- - spec/cassettes/ExUA_Category/general_1_page_category/_categories/has_current_category_as_a_parent_category_for_all_childs.yml
132
- - spec/cassettes/ExUA_Category/general_1_page_category/_categories/returns_list_of_child_categories.yml
133
- - spec/cassettes/ExUA_Category/general_1_page_category/canonical_url/.yml
134
- - spec/cassettes/ExUA_Category/general_1_page_category/description/.yml
135
- - spec/cassettes/ExUA_Category/general_1_page_category/items/.yml
136
- - spec/cassettes/ExUA_Category/general_1_page_category/name/.yml
137
- - spec/cassettes/ExUA_Category/general_1_page_category/next_/.yml
138
- - spec/cassettes/ExUA_Category/general_1_page_category/prev_/.yml
139
- - spec/cassettes/ExUA_Category/general_few_pages_category/_next/returns_a_category_with_same_url_but_different_page_number.yml
140
- - spec/cassettes/ExUA_Category/general_few_pages_category/_prev/raises_error_when_no_prev_url_found.yml
141
- - spec/cassettes/ExUA_Category/item_category/picture/.yml
142
- - spec/cassettes/ExUA_Client/_available_languages/returns_list_of_available_languages.yml
143
- - spec/cassettes/ExUA_Client/_search/returns_20_results_by_default.yml
144
- - spec/cassettes/ExUA_Client/_search/returns_list_of_categories.yml
145
129
  - spec/category_spec.rb
146
130
  - spec/client_spec.rb
131
+ - spec/item_spec.rb
147
132
  - spec/spec_helper.rb
148
- homepage: ''
133
+ homepage: https://github.com/Antti/ex_ua
149
134
  licenses:
150
135
  - MIT
151
136
  metadata: {}
@@ -164,26 +149,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
149
  - !ruby/object:Gem::Version
165
150
  version: '0'
166
151
  requirements: []
167
- rubyforge_project: ex_ua
152
+ rubyforge_project:
168
153
  rubygems_version: 2.0.3
169
154
  signing_key:
170
155
  specification_version: 4
171
156
  summary: An http://ex.ua/ API
172
157
  test_files:
173
- - spec/cassettes/ExUA_Category/general_1_page_category/_categories/has_current_category_as_a_parent_category_for_all_childs.yml
174
- - spec/cassettes/ExUA_Category/general_1_page_category/_categories/returns_list_of_child_categories.yml
175
- - spec/cassettes/ExUA_Category/general_1_page_category/canonical_url/.yml
176
- - spec/cassettes/ExUA_Category/general_1_page_category/description/.yml
177
- - spec/cassettes/ExUA_Category/general_1_page_category/items/.yml
178
- - spec/cassettes/ExUA_Category/general_1_page_category/name/.yml
179
- - spec/cassettes/ExUA_Category/general_1_page_category/next_/.yml
180
- - spec/cassettes/ExUA_Category/general_1_page_category/prev_/.yml
181
- - spec/cassettes/ExUA_Category/general_few_pages_category/_next/returns_a_category_with_same_url_but_different_page_number.yml
182
- - spec/cassettes/ExUA_Category/general_few_pages_category/_prev/raises_error_when_no_prev_url_found.yml
183
- - spec/cassettes/ExUA_Category/item_category/picture/.yml
184
- - spec/cassettes/ExUA_Client/_available_languages/returns_list_of_available_languages.yml
185
- - spec/cassettes/ExUA_Client/_search/returns_20_results_by_default.yml
186
- - spec/cassettes/ExUA_Client/_search/returns_list_of_categories.yml
187
158
  - spec/category_spec.rb
188
159
  - spec/client_spec.rb
160
+ - spec/item_spec.rb
189
161
  - spec/spec_helper.rb
@@ -1,151 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: http://www.ex.ua/ru_video.html
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers: {}
10
- response:
11
- status:
12
- code: 404
13
- message: Not Found
14
- headers:
15
- Server:
16
- - nginx/1.4.2
17
- Date:
18
- - Fri, 16 Aug 2013 09:24:25 GMT
19
- Content-Type:
20
- - text/html; charset=utf-8
21
- Content-Length:
22
- - '5010'
23
- Connection:
24
- - keep-alive
25
- Set-Cookie:
26
- - ccid=5912645536229401831; domain=www.ex.ua; path=/; expires=Mon, 14-Aug-2023
27
- 09:24:25 GMT
28
- Cache-Control:
29
- - no-cache, no-store, must-revalidate
30
- Expires:
31
- - '0'
32
- Pragma:
33
- - no-cache
34
- body:
35
- encoding: ASCII-8BIT
36
- string: !binary |-
37
- PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEv
38
- L0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+
39
- DQogDQo8aHRtbD4NCg0KPGhlYWQ+DQo8dGl0bGU+RVguVUE8L3RpdGxlPg0K
40
- PGxpbmsgaHJlZj0iL2luZGV4LmNzcz8wLjA0IiB0eXBlPSJ0ZXh0L2NzcyIg
41
- cmVsPSJzdHlsZXNoZWV0Ij4NCjxsaW5rIGhyZWY9Ii9mYXZpY29uLmljbyIg
42
- cmVsPSJzaG9ydGN1dCBpY29uIj4NCjxtZXRhIG5hbWU9InJvYm90cyIgY29u
43
- dGVudD0ibm9hcmNoaXZlIj4NCjxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQt
44
- dHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxt
45
- ZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtbGFuZ3VhZ2UiIGNvbnRlbnQ9InJ1
46
- Ij4NCjxzY3JpcHQgc3JjPScvanMvbWFpbi5qcycgY2hhcnNldD0ndXRmLTgn
47
- IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+PC9zY3JpcHQ+DQo8c2NyaXB0IHNy
48
- Yz0nL2pzL3JlcXVlc3QuanMnIGNoYXJzZXQ9J3V0Zi04JyB0eXBlPSd0ZXh0
49
- L2phdmFzY3JpcHQnPjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSd0ZXh0L2ph
50
- dmFzY3JpcHQnPg0KaWYgKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSBkb2N1
51
- bWVudC5jb29raWUgPSAndWRwcj0nICsgd2luZG93LmRldmljZVBpeGVsUmF0
52
- aW8gKyAnO3BhdGg9Lyc7DQppZiAod2luZG93LnRvcCAhPSB3aW5kb3cuc2Vs
53
- Zikgd2luZG93LnRvcC5sb2NhdGlvbiA9IHdpbmRvdy5zZWxmLmxvY2F0aW9u
54
- Ow0KPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIg
55
- c3JjPSJodHRwczovL2FwaXMuZ29vZ2xlLmNvbS9qcy9wbHVzb25lLmpzIj4N
56
- CnsgbGFuZzogJ3J1JyB9DQo8L3NjcmlwdD4NCjwvaGVhZD4NCg0KPGJvZHkg
57
- b25sb2FkPSdpbml0Qm9keSgpJz4NCg0KPHRhYmxlIHdpZHRoPScxMDAlJyBo
58
- ZWlnaHQ9JzEwMCUnIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRp
59
- bmc9MD4NCjx0cj48dGQgdmFsaWduPXRvcCBzdHlsZT0naGVpZ2h0OiA2MHB4
60
- Oyc+DQo8ZGl2IHN0eWxlPSd3aWR0aDogMTAwJTsgaGVpZ2h0OiAzMHB4OyBv
61
- dmVyZmxvdzogaGlkZGVuOyBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2Nj
62
- YzsgcGFkZGluZzogMDsnIGlkPSdhbm5vdW5jZSc+PGlmcmFtZSB3aWR0aD0n
63
- MTAwJScgaGVpZ2h0PSczMCcgZnJhbWVib3JkZXI9JzAnIG1hcmdpbmhlaWdo
64
- dD0nMCcgbWFyZ2lud2lkdGg9JzAnIHNjcm9sbGluZz0nbm8nIHNyYz0nL2Fk
65
- X2Fubm91bmNlLmh0bWwnPjwvaWZyYW1lPjwvZGl2Pg0KDQo8dGFibGUgd2lk
66
- dGg9JzEwMCUnIGJvcmRlcj0wIGNsYXNzPW1lbnUgaWQ9bWVudT4NCjx0cj48
67
- dGQgY2xhc3M9bWVudV90ZXh0PiZuYnNwOw0KPGEgaHJlZj0nLyc+PGltZyBz
68
- cmM9Jy9pL2V4LXNtYWxsLnBuZycgd2lkdGg9MjYgaGVpZ2h0PTEyIGJvcmRl
69
- cj0wIGFsdD0nRVgnPi3QpNCw0LnQu9GLPC9hPiZuYnNwO3wNCjxhIGhyZWY9
70
- Jy9ydS92aWRlbyc+0JLQuNC00LXQvjwvYT4mbmJzcDt8DQo8YSBocmVmPScv
71
- cnUvYXVkaW8nPtCQ0YPQtNC40L48L2E+Jm5ic3A7fA0KPGEgaHJlZj0nL3J1
72
- L2ltYWdlcyc+0JjQt9C+0LHRgNCw0LbQtdC90LjRjzwvYT4mbmJzcDt8DQo8
73
- YSBocmVmPScvcnUvdGV4dHMnPtCi0LXQutGB0YLRizwvYT4mbmJzcDt8DQo8
74
- YSBocmVmPScvcnUvZ2FtZXMnPtCY0LPRgNGLPC9hPiZuYnNwO3wNCjxhIGhy
75
- ZWY9Jy9ydS9zb2Z0d2FyZSc+0J/RgNC+0LPRgNCw0LzQvNGLPC9hPiZuYnNw
76
- O3wNCjxhIGhyZWY9Jy9ydS9hYm91dCc+0J4g0YHQtdGA0LLQuNGB0LU8L2E+
77
- Jm5ic3A7fA0KPGEgaHJlZj0nL3NlYXJjaCc+0J/QvtC40YHQujwvYT4NCiZu
78
- YnNwOzwvdGQ+PHRkIGFsaWduPXJpZ2h0IHZhbGlnbj1jZW50ZXIgY2xhc3M9
79
- bWVudV90ZXh0PiZuYnNwOw0KPGZvcm0gc3R5bGU9J2Rpc3BsYXk6IGlubGlu
80
- ZTsnIGFjdGlvbj0nL2xhbmd1YWdlJz48c2VsZWN0IG5hbWU9bGFuZyBvbmNo
81
- YW5nZT0naWYgKHRoaXMuZm9ybSkgdGhpcy5mb3JtLnN1Ym1pdCgpOyc+PG9w
82
- dGlvbiB2YWx1ZT1ydSBzZWxlY3RlZD7RgNGD0YHRgdC60LjQuTxvcHRpb24g
83
- dmFsdWU9dWs+0YPQutGA0LDRl9C90YHRjNC60LA8b3B0aW9uIHZhbHVlPWVu
84
- PmVuZ2xpc2g8b3B0aW9uIHZhbHVlPWVzPmVzcGFub2w8b3B0aW9uIHZhbHVl
85
- PWRlPmRldXRzY2g8b3B0aW9uIHZhbHVlPWZyPmZyYW7Dp2FpczxvcHRpb24g
86
- dmFsdWU9cGw+cG9sc2tpPG9wdGlvbiB2YWx1ZT1qYT7ml6XmnKzoqp48b3B0
87
- aW9uIHZhbHVlPWtrPtKb0LDQt9Cw0ps8L3NlbGVjdD48L2Zvcm0+Jm5ic3A7
88
- fA0KPGEgaHJlZj0nL2xvZ2luJz7QktGF0L7QtDwvYT4NCiZuYnNwOw0KPC90
89
- ZD48L3RyPg0KPC90YWJsZT4NCjwvdGQ+PC90cj4NCjx0cj48dGQgdmFsaWdu
90
- PXRvcCBzdHlsZT0ncGFkZGluZzogMTZweDsnIGlkPSdib2R5X2VsZW1lbnQn
91
- Pg0KPHA+PGltZyBzcmM9Jy9pL2lfZXJyb3IucG5nJyB3aWR0aD0zMiBoZWln
92
- aHQ9MzIgdnNwYWNlPTEgYWxpZ249YWJzbWlkZGxlPiZuYnNwOzxiaWcgaWQ9
93
- J21lc3NhZ2UnPtCh0YLRgNCw0L3QuNGG0LAg0L3QtSDQvdCw0LnQtNC10L3Q
94
- sC48L2JpZz4NCjxwPg0KJm5ic3A7DQo8cD4NCjxzcGFuIGNsYXNzPXJfYnV0
95
- dG9uPjxhIGhyZWY9Jy8nPtC90LAg0YLQuNGC0YPQuzwvYT48L3NwYW4+DQoN
96
- CjwvdGQ+PC90cj4NCjx0cj48dGQgdmFsaWduPWJvdHRvbSBzdHlsZT0naGVp
97
- Z2h0OiAzMnB4Oyc+DQo8dGFibGUgd2lkdGg9JzEwMCUnIGJvcmRlcj0wIGNs
98
- YXNzPWNvcHlyaWdodD48dHI+PHRkPg0KDQo8IS0tIGhpdC51YSAtLT4NCjxz
99
- Y3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48IS0tDQoNCmZ1bmN0aW9u
100
- IGxvYWRKcyhzcmMpDQp7DQoJdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVt
101
- ZW50KCdzY3JpcHQnKTsNCglhLnNldEF0dHJpYnV0ZSgnc3JjJywgc3JjKTsN
102
- CglhLmFzeW5jID0gJ3RydWUnOw0KCXZhciBiID0gZG9jdW1lbnQuZ2V0RWxl
103
- bWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdOw0KCWIucGFyZW50Tm9kZS5p
104
- bnNlcnRCZWZvcmUoYSwgYik7DQp9DQoNCmlmICghZG9jdW1lbnQuY29va2ll
105
- KSBkb2N1bWVudC5jb29raWUgPSAiYj1iIjsNCg0KbG9hZEpzKCdodHRwOi8v
106
- Yy5oaXQudWEvaGl0P2k9MTM1MDEnICsNCgknJmc9MCZ4PTMmcz0xJyArDQoJ
107
- JyZ0PScgKyAobmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKSArDQoJ
108
- KGRvY3VtZW50LmNvb2tpZSA/ICcmYz0xJyA6ICcnKSArDQoJKHNlbGYgIT0g
109
- dG9wID8gJyZmPTEnIDogJycpICsNCgkobmF2aWdhdG9yLmphdmFFbmFibGVk
110
- KCkgPyAnJmo9MScgOiAnJykgKw0KCSh0eXBlb2Yoc2NyZWVuKSAhPSAndW5k
111
- ZWZpbmVkJyA/ICcmdz0nICsgc2NyZWVuLndpZHRoICsgJyZoPScgKyBzY3Jl
112
- ZW4uaGVpZ2h0ICsgJyZkPScgKyAoc2NyZWVuLmNvbG9yRGVwdGggPyBzY3Jl
113
- ZW4uY29sb3JEZXB0aCA6IHNjcmVlbi5waXhlbERlcHRoKSA6ICcnKSArDQoJ
114
- JyZyPScgKyBlc2NhcGUoZG9jdW1lbnQucmVmZXJyZXIpICsNCgknJnU9JyAr
115
- IGVzY2FwZSh3aW5kb3cubG9jYXRpb24uaHJlZikgKw0KCScmJyArIE1hdGgu
116
- cmFuZG9tKCkNCik7DQppZiAoZG9jdW1lbnQuY29va2llKSBsb2FkSnMoJ2h0
117
- dHA6Ly9jLmhpdC51YS9wb2xsP2k9MTM1MDEmYz0xJicgKyBNYXRoLnJhbmRv
118
- bSgpKTsNCg0KLy8tLT48L3NjcmlwdD4NCg0KPG5vc2NyaXB0Pg0KPGltZyBz
119
- cmM9J2h0dHA6Ly9jLmhpdC51YS9oaXQ/aT0xMzUwMSZhbXA7Zz0wJmFtcDt4
120
- PTInIGJvcmRlcj0nMCcgd2lkdGg9JzEnIGhlaWdodD0nMScvPg0KPC9ub3Nj
121
- cmlwdD4NCjwhLS0gLyBoaXQudWEgLS0+DQoNCjwvdGQ+PHRkIGFsaWduPWNl
122
- bnRlcj4NCg0KPG5vc2NyaXB0Pg0KPGltZyBzcmM9Imh0dHA6Ly9qdWtlLm1t
123
- aS5iZW1vYmlsZS51YS9idWcvcGljLmdpZj9zaXRlaWQ9ZXgudWEiPg0KPC9u
124
- b3NjcmlwdD4NCjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPg0KdmFy
125
- IHRuc19hbHJlYWR5OyBpZiAoInVuZGVmaW5lZCI9PXR5cGVvZih0bnNfYWxy
126
- ZWFkeSkgfHwgbnVsbD09dG5zX2FscmVhZHkgfHwgMD09dG5zX2FscmVhZHkp
127
- IHsgdG5zX2FscmVhZHk9MTsgdmFyIGk9bmV3IEltYWdlKCk7IGkuc3JjPSJo
128
- dHRwOi8vanVrZS5tbWkuYmVtb2JpbGUudWEvYnVnL3BpYy5naWY/c2l0ZWlk
129
- PWV4LnVhJmo9MSYiK01hdGgucmFuZG9tKCk7IChmdW5jdGlvbigpeyB2YXIg
130
- cD1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOyB2
131
- YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsgcy50eXBl
132
- PSJ0ZXh0L2phdmFzY3JpcHQiOyBzLnNyYz0iaHR0cDovL3NvdXJjZS5tbWku
133
- YmVtb2JpbGUudWEvY20vY20uanMiOyBzLmFzeW5jID0gdHJ1ZTsgcC5hcHBl
134
- bmRDaGlsZChzKTsgfSkoKTsgfTsNCjwvc2NyaXB0Pg0KDQo8L3RkPjx0ZCBh
135
- bGlnbj1yaWdodD4NCjxzcGFuIGNsYXNzPXNtYWxsIHRpdGxlPSdjb3B5cmln
136
- aHQnPiZjb3B5Ozwvc3Bhbj4mbmJzcDs8c3BhbiBjbGFzcz1zbWFsbD5leC51
137
- YSZuYnNwO3wmbmJzcDs8YSBocmVmPScvY29udGFjdCc+0LrQvtC90YLQsNC6
138
- 0YLQvdCw0Y8g0LjQvdGE0L7RgNC80LDRhtC40Y88L2E+Jm5ic3A7fCZuYnNw
139
- OzxhIGhyZWY9Jy9jb3B5cmlnaHQnPtC00LvRjyDQv9GA0LDQstC+0L7QsdC7
140
- 0LDQtNCw0YLQtdC70LXQuTwvYT48L3NwYW4+DQo8L3RkPjwvdHI+PC90YWJs
141
- ZT4NCg0KPC90ZD48L3RyPg0KPC90YWJsZT4NCg0KPHNjcmlwdCB0eXBlPSd0
142
- ZXh0L2phdmFzY3JpcHQnPg0Kc2V0VGltZW91dChmdW5jdGlvbigpIHsgdmFy
143
- IGUsIGlkID0gMDsgd2hpbGUoZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
144
- KCdhZF9ibG9ja18nICsgKytpZCkpIGlmIChlLnN0eWxlLmRpc3BsYXkgPT0g
145
- J25vbmUnKSBlLnN0eWxlLmRpc3BsYXkgPSAoZS50YWdOYW1lID09ICdUQUJM
146
- RScgPyAndGFibGUnIDogKGUudGFnTmFtZSA9PSAnVFInID8gJ3RhYmxlLXJv
147
- dycgOiAnYmxvY2snKSk7IH0sIDI1MDApOw0KPC9zY3JpcHQ+DQoNCjwvYm9k
148
- eT4NCg0KPC9odG1sPg0K
149
- http_version:
150
- recorded_at: Fri, 16 Aug 2013 09:24:25 GMT
151
- recorded_with: VCR 2.5.0