fileturn 0.0.2

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.
Files changed (45) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +107 -0
  6. data/Rakefile +1 -0
  7. data/fileturn.gemspec +27 -0
  8. data/lib/fileturn/exceptions.rb +30 -0
  9. data/lib/fileturn/http_client.rb +49 -0
  10. data/lib/fileturn/resources/account.rb +46 -0
  11. data/lib/fileturn/resources/file.rb +112 -0
  12. data/lib/fileturn/resources/notification.rb +16 -0
  13. data/lib/fileturn/resources/resource.rb +17 -0
  14. data/lib/fileturn/resources/upload.rb +77 -0
  15. data/lib/fileturn/version.rb +3 -0
  16. data/lib/fileturn.rb +19 -0
  17. data/spec/.DS_Store +0 -0
  18. data/spec/data/.DS_Store +0 -0
  19. data/spec/data/testfile.docx +0 -0
  20. data/spec/fileturn_spec.rb +16 -0
  21. data/spec/fixtures/vcr_cassettes/account_info.yml +47 -0
  22. data/spec/fixtures/vcr_cassettes/file_all.yml +60 -0
  23. data/spec/fixtures/vcr_cassettes/file_all_notifications.yml +60 -0
  24. data/spec/fixtures/vcr_cassettes/file_convert_no_params.yml +44 -0
  25. data/spec/fixtures/vcr_cassettes/file_convert_success.yml +46 -0
  26. data/spec/fixtures/vcr_cassettes/file_doesnt_upload_since_too_big.yml +46 -0
  27. data/spec/fixtures/vcr_cassettes/file_failed_.yml +133 -0
  28. data/spec/fixtures/vcr_cassettes/file_notifications.yml +46 -0
  29. data/spec/fixtures/vcr_cassettes/file_queued_.yml +133 -0
  30. data/spec/fixtures/vcr_cassettes/file_reload.yml +89 -0
  31. data/spec/fixtures/vcr_cassettes/file_success.yml +46 -0
  32. data/spec/fixtures/vcr_cassettes/file_success_.yml +133 -0
  33. data/spec/fixtures/vcr_cassettes/file_time_taken.yml +133 -0
  34. data/spec/fixtures/vcr_cassettes/file_unauthorized.yml +44 -0
  35. data/spec/fixtures/vcr_cassettes/file_upload_doc_queued.yml +739 -0
  36. data/spec/fixtures/vcr_cassettes/file_upload_not_enough_credits.yml +87 -0
  37. data/spec/fixtures/vcr_cassettes/file_upload_queued.yml +160 -0
  38. data/spec/fixtures/vcr_cassettes/upload_all.yml +46 -0
  39. data/spec/fixtures/vcr_cassettes/upload_one.yml +46 -0
  40. data/spec/fixtures/vcr_cassettes/upload_refetch.yml +89 -0
  41. data/spec/resources/account_spec.rb +31 -0
  42. data/spec/resources/file_spec.rb +184 -0
  43. data/spec/resources/upload_spec.rb +41 -0
  44. data/spec/spec_helper.rb +19 -0
  45. metadata +198 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NDM5ODQ3OTRjNzQ1YTczNDViZDIzNTJjNjkzZWQ0MjUyMmU3NDQxNw==
5
+ data.tar.gz: !binary |-
6
+ NmU0OGY3MTg4ZDQyMmUxMmY0ZTMwNGZkNDc3ZTA4NTRjN2FhYzY3ZQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MzBkYmNlOGY1MDY4ZTk5ZmRlNjVlZGU5M2M0NWI0YzMxNTk2OWJkYmRkZjAw
10
+ OGM0MDIzNjYxNzE3MTQ0ODJhMjJmMzJiODVlOWE2NDJhMDdmNzc3MWM4OGNj
11
+ MTQyOWNjZjJmM2NmOTRkMTFiNjIwN2RiOTJhYWFjNWQ5MTU0NTY=
12
+ data.tar.gz: !binary |-
13
+ MzIzYWYyOGViYTExOTFjZjI4MmQ2YzAxMDViYWY3MjkwNmUxNDVhMzk0NTYw
14
+ MjU5OGI5NmI5ZGQ0MGRkYTBkMjkzMmIzZDI2ZTE0NzBiODkzNWNlMmMwOGQ0
15
+ MzdhMWJiY2RlMzAxMzExYTJmNWNiMDgwMGEyZGQ5N2ZkODQ1ZGM=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fileturn.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Nisarg Shah
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # Fileturn
2
+
3
+ Ruby Gem Support for [FileTurn](http://fileturn.net/) Api. FileTurn converts your files to different formats.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'fileturn'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install fileturn
18
+
19
+ ## Configuration
20
+
21
+ Retrieve your API Key from [Dashboard](http://fileturn.net/dashboard/api_token).
22
+
23
+ FileTurn.configure(:api_key => "[YOUR KEY]")
24
+
25
+ Thats it - now you are ready to use FileTurn.
26
+
27
+ ## Usage
28
+
29
+ ### Converting your files
30
+
31
+ There are multiple ways to convert a file. If your file is public, we can fetch the file and you just need to specify the url.
32
+
33
+ file = FileTurn::File.convert(
34
+ :url => "http://crypto.stanford.edu/DRM2002/darknet5.doc",
35
+ :convert_to => :pdf
36
+ )
37
+
38
+ unless file.errors
39
+ # Woot done!
40
+ end
41
+
42
+ If your file is stored locally, you can use
43
+
44
+ file = FileTurn::File.convert(
45
+ :file => File.open("localfile.doc"),
46
+ :convert_to => :txt
47
+ )
48
+
49
+ Thats all you have to do to convert files. Upon calling that, your file will be queued for converting.
50
+
51
+ ### How will i know when my file is done?
52
+
53
+ #### File Object
54
+
55
+ There are few ways to check if your file is done. You can repeatedly call one of these:
56
+
57
+ file.reload.queued?
58
+ file.reload.success?
59
+ file.reload.failed?
60
+
61
+ When your file is done, the file object will store a download link
62
+
63
+ while(file.reload.queued?)
64
+ sleep(5000)
65
+ end
66
+
67
+ if file.success?
68
+ download_url = file.download_url
69
+ time_taken_for_conversion = file.time_taken
70
+ end
71
+
72
+ In the case you get a failure, you can retrieve the details using
73
+
74
+ if(file.reload.failed?)
75
+ file.notifications.last.details
76
+ end
77
+
78
+ #### Notifications
79
+
80
+ You can also request notification to be sent to you whenver the status of a file changes. Go into your [Dashboard](http://fileturn.net/dashboard/notifications) and specify a notification url.
81
+
82
+ We will hit this notification url with the new status of the file and the file_id.
83
+
84
+
85
+ ## Other File Options
86
+
87
+ You can fetch information of a single file using the file_id.
88
+
89
+ FileTurn::File.find(file_id)
90
+
91
+ Or all the files
92
+
93
+ FileTurn::File.all
94
+
95
+
96
+ ## Account Details
97
+
98
+ You can also fetch account details like how much credit you have.
99
+
100
+ FileTurn::Account.load # fetch data from server
101
+ FileTurn::Account.credits
102
+
103
+ Or you can use
104
+
105
+ FileTurn::Account.load.credits
106
+
107
+ Thanks!
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/fileturn.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fileturn/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "fileturn"
8
+ spec.version = Fileturn::VERSION
9
+ spec.authors = ["Nisarg Shah"]
10
+ spec.email = ["nisargshah100@gmail.com"]
11
+ spec.description = %q{FileTurn Client}
12
+ spec.summary = %q{FileTurn Client}
13
+ spec.homepage = ""
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "faraday"
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "vcr"
26
+ spec.add_development_dependency "webmock"
27
+ end
@@ -0,0 +1,30 @@
1
+ module FileTurn
2
+
3
+ class FileTurnException < Exception
4
+ attr_reader :resp
5
+ def initialize(resp)
6
+ @resp = resp
7
+ end
8
+
9
+ def to_s
10
+ resp
11
+ end
12
+ end
13
+
14
+ class UnauthorizedException < FileTurnException; end;
15
+ class InternalServerException < FileTurnException; end;
16
+
17
+ class UnprocessableEntityException < FileTurnException
18
+ attr_reader :parsed_response
19
+
20
+ def initialize(resp)
21
+ super(resp)
22
+ @parsed_response = OpenStruct.new(JSON.parse(resp.body))
23
+ end
24
+
25
+ def to_s
26
+ @parsed_response.to_s
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,49 @@
1
+ require 'faraday'
2
+ require 'json'
3
+ require 'ostruct'
4
+
5
+ module FileTurn
6
+ class HttpClient
7
+
8
+ def self.conn
9
+ @conn ||= Faraday.new(:url => 'http://fileturn.net/')
10
+ end
11
+
12
+ def self.get(url, params, status_codes, &block)
13
+ make_call(:get, url, params, status_codes, &block)
14
+ end
15
+
16
+ def self.post(url, params, status_codes, &block)
17
+ make_call(:post , url, params, status_codes, &block)
18
+ end
19
+
20
+
21
+ def self.make_call(type, url, params, status_codes, &block)
22
+ params = setup_params(params)
23
+ resp = conn.send(type, "api/#{url}") { |req| req.params = params }
24
+ if Array(status_codes).include?(resp.status)
25
+ block.call(JSON.parse(resp.body))
26
+ else
27
+ handle_error(resp)
28
+ end
29
+ end
30
+
31
+ def self.setup_params(params)
32
+ params['token'] = FileTurn.api_key
33
+ params
34
+ end
35
+
36
+ def self.handle_error(resp)
37
+ case resp.status
38
+ when 401
39
+ raise FileTurn::UnauthorizedException.new(resp)
40
+ when 500
41
+ raise FileTurn::InternalServerException.new(resp)
42
+ when 422
43
+ OpenStruct.new(JSON.parse(resp.body))
44
+ else
45
+ nil
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,46 @@
1
+ module FileTurn
2
+ class Account < Resource
3
+
4
+ class << self
5
+ @account = OpenStruct.new()
6
+
7
+ def load
8
+ conn.get("/users.json", {}, 200) do |params|
9
+ params['created_at'] = DateTime.parse(params['created_at'])
10
+ @account = OpenStruct.new(params)
11
+ self
12
+ end
13
+ end
14
+
15
+ def load_only_if_not_loaded
16
+ load if @account.nil? || @account.id.nil?
17
+ self
18
+ end
19
+
20
+ def id
21
+ @account.id
22
+ end
23
+
24
+ def credits
25
+ @account.credits
26
+ end
27
+
28
+ def created_at
29
+ @account.created_at
30
+ end
31
+
32
+ def notification_url
33
+ @account.notification_url
34
+ end
35
+
36
+ def time_zone
37
+ @account.time_zone
38
+ end
39
+
40
+ def max_file_size_in_bytes
41
+ @account.max_file_size_in_bytes
42
+ end
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,112 @@
1
+ module FileTurn
2
+ class File < Resource
3
+
4
+ # class
5
+ class << self
6
+
7
+ def find(id, &block)
8
+ conn.get("/files/#{id}.json", {}, 200) do |params|
9
+ block ? block.call(params) : File.new(params)
10
+ end
11
+ end
12
+
13
+ def all
14
+ conn.get("files.json", {}, 200) do |params|
15
+ files = Array(params['files']).map { |p| File.new(p) }
16
+ OpenStruct.new(
17
+ :files => files,
18
+ :total_files => params['total_files'],
19
+ :current_page => params['current_page'],
20
+ :per_page => params['per_page'],
21
+ :total_pages => params['total_pages']
22
+ )
23
+ end
24
+ end
25
+
26
+ def convert(params)
27
+ file = params['file'] || params[:file]
28
+ return upload_file(file, params) unless file.nil?
29
+
30
+ conn.post("files.json", params, 201) do |params|
31
+ File.new(params)
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def upload_file(file, params)
38
+ evaluate_file_size = FileTurn::Upload.send(:evaluate_file_size, file)
39
+ return evaluate_file_size unless evaluate_file_size.nil?
40
+
41
+ signed_params = FileTurn::Upload.send(:signed_upload_url, file)
42
+ return signed_params if signed_params.errors
43
+
44
+ faraday = Faraday.new(:url => signed_params.url) do |conn|
45
+ conn.request :multipart
46
+ conn.adapter :net_http
47
+ end
48
+
49
+ response = faraday.post '/', {
50
+ :policy => signed_params.policy,
51
+ :signature => signed_params.signature,
52
+ 'AWSAccessKeyId' => signed_params.aws_access_key_id,
53
+ :key => signed_params.key,
54
+ :file => Faraday::UploadIO.new(file.path, '')
55
+ }
56
+
57
+ if response.status == 204
58
+ params[:file] = params['file'] = nil
59
+ params['url'] = "#{signed_params.url}/#{signed_params.key}"
60
+ params['file_type'] = signed_params.file_type
61
+ params['upload_id'] = signed_params.id
62
+ convert(params)
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+ #vars
69
+ attr_accessor :id, :url, :convert_to, :created_at, :status,
70
+ :download_url, :notifications, :params
71
+
72
+ # instance
73
+ def initialize(params={})
74
+ parse_json_params(params)
75
+ end
76
+
77
+ def success?
78
+ status == 'processed'
79
+ end
80
+
81
+ def failed?
82
+ status == 'failed'
83
+ end
84
+
85
+ def queued?
86
+ status == 'queued'
87
+ end
88
+
89
+ def reload
90
+ File.find(id) { |params| parse_json_params(params) }
91
+ self
92
+ end
93
+
94
+ def time_taken
95
+ notifications.last && notifications.last.time_taken
96
+ end
97
+
98
+ private
99
+
100
+ def parse_json_params(params)
101
+ @params = params
102
+ @id = params['id']
103
+ @url = params['url']
104
+ @convert_to = params['convert_to']
105
+ @created_at = DateTime.parse(params['created_at'])
106
+ @status = params['status']
107
+ @download_url = params['download_url']
108
+ @notifications = Array(params['notifications']).map { |p| Notification.new(p) }
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,16 @@
1
+ module FileTurn
2
+ class Notification < Resource
3
+ attr_reader :id, :details, :parsed_time, :status, :time_taken,
4
+ :file_id, :params
5
+
6
+ def initialize(params)
7
+ @params = params
8
+ @id = params['id']
9
+ @details = params['details']
10
+ @parsed_time = DateTime.parse(params['parsed_time']) if params['parsed_time']
11
+ @status = params['status']
12
+ @time_taken = params['time_taken'].to_f if params['time_taken']
13
+ @file_id = params['doc_id']
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module FileTurn
2
+ class Resource
3
+
4
+ # class
5
+ class << self
6
+ def conn
7
+ FileTurn::HttpClient
8
+ end
9
+ end
10
+
11
+ # instance
12
+ def errors
13
+ false
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,77 @@
1
+ module FileTurn
2
+ class Upload < Resource
3
+
4
+ # class
5
+ class << self
6
+
7
+ def find(id, &block)
8
+ conn.get("/uploads/#{id}.json", {}, 200) do |params|
9
+ block ? block.call(params) : Upload.new(params)
10
+ end
11
+ end
12
+
13
+ def all
14
+ conn.get("uploads.json", {}, 200) do |params|
15
+ uploads = Array(params['uploads']).map { |p| Upload.new(p) }
16
+ OpenStruct.new(
17
+ :uploads => uploads,
18
+ :total_uploads => params['total_uploads'],
19
+ :current_page => params['current_page'],
20
+ :per_page => params['per_page'],
21
+ :total_pages => params['total_pages']
22
+ )
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def signed_upload_url(file)
29
+ file_type = file.class.extname(file.path).gsub('.', '')
30
+ file_type = 'unknown' if file_type == ''
31
+ file_size = file.class.size(file.path)
32
+
33
+ conn.post('files/upload.json', { content_type: file_type, content_length: file_size }, 201) do |params|
34
+ params['file_type'] = file_type
35
+ params['file_size'] = file_size
36
+ OpenStruct.new(params)
37
+ end
38
+ end
39
+
40
+ def evaluate_file_size(file)
41
+ max_size = Account.load_only_if_not_loaded.max_file_size_in_bytes
42
+ if file.size > max_size
43
+ OpenStruct.new(:errors => {"file_size"=>["is too big"]})
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ #vars
50
+ attr_accessor :id, :url, :policy, :signature, :aws_access_key_id, :key,
51
+ :params
52
+
53
+ # instance
54
+ def initialize(params={})
55
+ parse_json_params(params)
56
+ end
57
+
58
+ def reload
59
+ Upload.find(id) { |params| parse_json_params(params) }
60
+ self
61
+ end
62
+
63
+ private
64
+
65
+ def parse_json_params(params)
66
+ @params = params
67
+ @id = params['id']
68
+ @url = params['url']
69
+ @policy = params['policy']
70
+ @signature = params['signature']
71
+ @aws_access_key_id = params['aws_access_key_id']
72
+ @key = params['key']
73
+ @url = params['url']
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,3 @@
1
+ module Fileturn
2
+ VERSION = "0.0.2"
3
+ end
data/lib/fileturn.rb ADDED
@@ -0,0 +1,19 @@
1
+ module FileTurn
2
+ extend self
3
+
4
+ attr_reader :api_key
5
+
6
+ def configure(params={})
7
+ raise ArgumentError, "missing params (api_key)" if params[:api_key].nil?
8
+ @api_key = params[:api_key]
9
+ end
10
+ end
11
+
12
+ require 'date'
13
+ require "fileturn/exceptions"
14
+ require "fileturn/http_client"
15
+ require "fileturn/resources/resource"
16
+ require "fileturn/resources/account"
17
+ require "fileturn/resources/upload"
18
+ require "fileturn/resources/notification"
19
+ require "fileturn/resources/file"
data/spec/.DS_Store ADDED
Binary file
Binary file
Binary file
@@ -0,0 +1,16 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe FileTurn do
4
+
5
+ describe '#configure' do
6
+ it 'sets up api key' do
7
+ FileTurn.configure(:api_key => "123")
8
+ FileTurn.api_key.should == "123"
9
+ end
10
+
11
+ it 'raises exception if not api key is passed' do
12
+ expect { FileTurn.configure({}) }.to raise_error
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,47 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://localhost:3000/api/users.json?token=67sFfjudMpXxJeioQcPSppYkoVdQD1oetqPWzMAh
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.8.7
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - ! '*/*'
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: ! 'OK '
20
+ headers:
21
+ Content-Type:
22
+ - application/json; charset=utf-8
23
+ X-Ua-Compatible:
24
+ - IE=Edge
25
+ Etag:
26
+ - ! '"108135fed6135342e058ab4865b5301f"'
27
+ Cache-Control:
28
+ - max-age=0, private, must-revalidate
29
+ X-Request-Id:
30
+ - 3f36878be082fdb201b2015c688aa367
31
+ X-Runtime:
32
+ - '0.112629'
33
+ Server:
34
+ - WEBrick/1.3.1 (Ruby/1.9.3/2012-11-10)
35
+ Date:
36
+ - Sun, 07 Jul 2013 22:46:58 GMT
37
+ Content-Length:
38
+ - '177'
39
+ Connection:
40
+ - Keep-Alive
41
+ body:
42
+ encoding: US-ASCII
43
+ string: ! '{"id":8,"created_at":"2013-07-05T22:14:10Z","credits":27836,"notification_url":"http://localhost:3000","time_zone":"Eastern
44
+ Time (US & Canada)","max_file_size_in_bytes":1048576}'
45
+ http_version:
46
+ recorded_at: Sun, 07 Jul 2013 22:46:58 GMT
47
+ recorded_with: VCR 2.4.0