azure-contrib 0.0.2 → 0.0.3
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 +4 -4
- data/.gitignore +2 -0
- data/azure-contrib.gemspec +1 -0
- data/azure-contrib.iml +23 -0
- data/lib/azure/blob_service.rb +93 -0
- data/lib/azure/contrib/version.rb +1 -1
- data/lib/azure/contrib.rb +3 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59524c3c741127e9245d85ccec4ec4cd9f03fce4
|
4
|
+
data.tar.gz: 6dbcae31f84dea2d866683b45ddd7f2c36293d55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c078b3c1a21432ab1c5a005d71d4e670993f04584da898f107271c5c7f7e9f43d4fa8d053aa41c59cb9666be45bd078b2ffbae796dcf3d2bc121741acbf21a24
|
7
|
+
data.tar.gz: 6eff77bffe8cb298521f03003db4003fd65b6b82bbc52e3b36a2e5ebee1fac2cf5338a262b85c1ff8bd0f6912b28f19cef1aeea0fbc2e5cfecec42ac90ecc8aa
|
data/.gitignore
CHANGED
data/azure-contrib.gemspec
CHANGED
data/azure-contrib.iml
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
3
|
+
<component name="CompassSettings">
|
4
|
+
<option name="compassSupportEnabled" value="true" />
|
5
|
+
</component>
|
6
|
+
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
7
|
+
<exclude-output />
|
8
|
+
<content url="file://$MODULE_DIR$" />
|
9
|
+
<orderEntry type="jdk" jdkName="RVM: ruby-2.1.1" jdkType="RUBY_SDK" />
|
10
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
11
|
+
<orderEntry type="library" scope="PROVIDED" name="addressable (v2.3.6, RVM: ruby-2.1.1) [gem]" level="application" />
|
12
|
+
<orderEntry type="library" scope="PROVIDED" name="azure (v0.6.4, RVM: ruby-2.1.1) [gem]" level="application" />
|
13
|
+
<orderEntry type="library" scope="PROVIDED" name="hashie (v3.1.0, RVM: ruby-2.1.1) [gem]" level="application" />
|
14
|
+
<orderEntry type="library" scope="PROVIDED" name="macaddr (v1.7.1, RVM: ruby-2.1.1) [gem]" level="application" />
|
15
|
+
<orderEntry type="library" scope="PROVIDED" name="mime-types (v1.25.1, RVM: ruby-2.1.1) [gem]" level="application" />
|
16
|
+
<orderEntry type="library" scope="PROVIDED" name="mini_portile (v0.6.0, RVM: ruby-2.1.1) [gem]" level="application" />
|
17
|
+
<orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.6.2.1, RVM: ruby-2.1.1) [gem]" level="application" />
|
18
|
+
<orderEntry type="library" scope="PROVIDED" name="rake (v10.3.2, RVM: ruby-2.1.1) [gem]" level="application" />
|
19
|
+
<orderEntry type="library" scope="PROVIDED" name="systemu (v2.6.4, RVM: ruby-2.1.1) [gem]" level="application" />
|
20
|
+
<orderEntry type="library" scope="PROVIDED" name="uuid (v2.3.7, RVM: ruby-2.1.1) [gem]" level="application" />
|
21
|
+
</component>
|
22
|
+
</module>
|
23
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# This code requires Ruby 2.0+ ... it's 2014, people
|
2
|
+
|
3
|
+
# Make sure the original is included
|
4
|
+
require 'azure/blob/blob_service'
|
5
|
+
require 'celluloid'
|
6
|
+
require 'timeout'
|
7
|
+
|
8
|
+
class ::File
|
9
|
+
def each_chunk(chunk_size=2**20)
|
10
|
+
yield read(chunk_size) until eof?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# The maximum size for a block blob is 200 GB, and a block blob can include no more than 50,000 blocks.
|
15
|
+
# http://msdn.microsoft.com/en-us/library/azure/ee691964.aspx
|
16
|
+
|
17
|
+
class BlockActor
|
18
|
+
include Celluloid
|
19
|
+
|
20
|
+
def initialize(service, container, blob, options = {})
|
21
|
+
@service, @container, @blob, @options = service, container, blob, options
|
22
|
+
end
|
23
|
+
|
24
|
+
def upload(block_id, chunk, retries = 0)
|
25
|
+
Timeout::timeout(@options[:timeout] || 60){
|
26
|
+
log "Uploading block #{block_id}"
|
27
|
+
options = @options.dup
|
28
|
+
options[:content_md5] = Base64.strict_encode64(Digest::MD5.digest(chunk))
|
29
|
+
content_md5 = @service.create_blob_block(@container, @blob, block_id, chunk, options)
|
30
|
+
log "Done uploading block #{block_id} #{content_md5}"
|
31
|
+
[block_id, :uncommitted]
|
32
|
+
}
|
33
|
+
rescue Timeout::Error, Azure::Core::Error => e
|
34
|
+
log "Failed to upload #{block_id}: #{e.class} #{e.message}"
|
35
|
+
if retries < 5
|
36
|
+
log "Retrying upload (#{retries})"
|
37
|
+
upload(block_id, chunk, retries += 1)
|
38
|
+
else
|
39
|
+
log "Complete failure to upload #{retries} retries"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def log(message)
|
44
|
+
puts message
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module Azure
|
49
|
+
module BlobServiceExtensions
|
50
|
+
def create_block_blob(container, blob, content_or_filepath, options={})
|
51
|
+
chunking = options.delete(:chunking)
|
52
|
+
if chunking
|
53
|
+
filepath = content_or_filepath
|
54
|
+
block_list = upload_chunks(container, blob, filepath, options)
|
55
|
+
|
56
|
+
return false unless block_list
|
57
|
+
|
58
|
+
puts "Done uploading #{block_list.size} blocks, committing ..."
|
59
|
+
options[:blob_content_type] = options[:content_type]
|
60
|
+
commit_blob_blocks(container, blob, block_list, options)
|
61
|
+
puts "done."
|
62
|
+
else
|
63
|
+
content = content_or_filepath
|
64
|
+
super(container, blob, content, options)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# The maximum size for a block blob is 200 GB, and a block blob can include no more than 50,000 blocks.
|
69
|
+
# http://msdn.microsoft.com/en-us/library/azure/ee691964.aspx
|
70
|
+
def upload_chunks(container, blob, filepath, options = {})
|
71
|
+
counter = 1
|
72
|
+
futures = []
|
73
|
+
pool = BlockActor.pool(size: 20, args: [self, container, blob, options])
|
74
|
+
|
75
|
+
open(filepath, 'rb') do |f|
|
76
|
+
f.each_chunk() {|chunk|
|
77
|
+
block_id = counter.to_s.rjust(5, '0')
|
78
|
+
futures << pool.future.upload(block_id, chunk)
|
79
|
+
counter += 1
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
block_list = futures.map(&:value)
|
84
|
+
pool.terminate
|
85
|
+
return block_list
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Why alias_method chain when Ruby gives you a more reasonable way to do this
|
90
|
+
class BlobService
|
91
|
+
prepend BlobServiceExtensions
|
92
|
+
end
|
93
|
+
end
|
data/lib/azure/contrib.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'azure'
|
1
2
|
require "azure/contrib/version"
|
2
3
|
|
3
4
|
|
@@ -7,4 +8,5 @@ module Azure
|
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
|
-
require "azure/contrib/auth/shared_access_signature"
|
11
|
+
require "azure/contrib/auth/shared_access_signature"
|
12
|
+
require File.join(File.dirname(__FILE__), 'blob_service')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: azure-contrib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Michael
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: celluloid
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
description: Extensions to the Azure Ruby SDK - specifically SAS
|
84
98
|
email:
|
85
99
|
- david.michael@giantmachines.com
|
@@ -93,6 +107,8 @@ files:
|
|
93
107
|
- README.md
|
94
108
|
- Rakefile
|
95
109
|
- azure-contrib.gemspec
|
110
|
+
- azure-contrib.iml
|
111
|
+
- lib/azure/blob_service.rb
|
96
112
|
- lib/azure/contrib.rb
|
97
113
|
- lib/azure/contrib/auth/shared_access_signature.rb
|
98
114
|
- lib/azure/contrib/version.rb
|