vagrant-fog-box-storage 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +58 -0
- data/README.md +43 -0
- data/Rakefile +15 -0
- data/lib/vagrant-fog-box-storage.rb +3 -0
- data/lib/vagrant-fog-box-storage/config.rb +82 -0
- data/lib/vagrant-fog-box-storage/version.rb +3 -0
- data/lib/vagrant_init.rb +6 -0
- data/test/test_helper.rb +36 -0
- data/test/vagrant-fog-box-storage/config_test.rb +69 -0
- data/vagrant-fog-box-storage.gemspec +26 -0
- data/vagrant-fog-box-storage.rb +3 -0
- metadata +104 -66
- checksums.yaml +0 -7
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
vagrant-fog-box-storage (0.0.1)
|
5
|
+
fog (~> 1.0)
|
6
|
+
vagrant (~> 1.0.6)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
archive-tar-minitar (0.5.2)
|
12
|
+
builder (3.2.0)
|
13
|
+
childprocess (0.3.9)
|
14
|
+
ffi (~> 1.0, >= 1.0.11)
|
15
|
+
erubis (2.7.0)
|
16
|
+
excon (0.19.5)
|
17
|
+
ffi (1.4.0)
|
18
|
+
fog (1.9.0)
|
19
|
+
builder
|
20
|
+
excon (~> 0.14)
|
21
|
+
formatador (~> 0.2.0)
|
22
|
+
mime-types
|
23
|
+
multi_json (~> 1.0)
|
24
|
+
net-scp (~> 1.0.4)
|
25
|
+
net-ssh (>= 2.1.3)
|
26
|
+
nokogiri (~> 1.5.0)
|
27
|
+
ruby-hmac
|
28
|
+
formatador (0.2.4)
|
29
|
+
i18n (0.6.4)
|
30
|
+
json (1.5.5)
|
31
|
+
log4r (1.1.10)
|
32
|
+
mime-types (1.21)
|
33
|
+
mocha (0.9.12)
|
34
|
+
multi_json (1.6.1)
|
35
|
+
net-scp (1.0.4)
|
36
|
+
net-ssh (>= 1.99.1)
|
37
|
+
net-ssh (2.2.2)
|
38
|
+
nokogiri (1.5.6)
|
39
|
+
protest (0.4.2)
|
40
|
+
ruby-hmac (0.4.0)
|
41
|
+
vagrant (1.0.6)
|
42
|
+
archive-tar-minitar (= 0.5.2)
|
43
|
+
childprocess (~> 0.3.1)
|
44
|
+
erubis (~> 2.7.0)
|
45
|
+
i18n (~> 0.6.0)
|
46
|
+
json (~> 1.5.1)
|
47
|
+
log4r (~> 1.1.9)
|
48
|
+
net-scp (~> 1.0.4)
|
49
|
+
net-ssh (~> 2.2.2)
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
ruby
|
53
|
+
|
54
|
+
DEPENDENCIES
|
55
|
+
bundler (>= 1.0.0)
|
56
|
+
mocha (~> 0.9.8)
|
57
|
+
protest (~> 0.4.0)
|
58
|
+
vagrant-fog-box-storage!
|
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# vagrant-fog-box-storage
|
2
|
+
|
3
|
+
Use the [fog](http://fog.io/) gem to get the authenticated url of a box to download from your favorite
|
4
|
+
cloud storage jawn.
|
5
|
+
|
6
|
+
The use case is if you have a vagrant box, stored on S3 (or another storage
|
7
|
+
provider supported by fog) that you don't want to be downloadable publicly that
|
8
|
+
you need to authenticate somehow to get at.
|
9
|
+
|
10
|
+
Note that this doesn't actually add an additional vagrant downloader class, but instead
|
11
|
+
grabs the authenticated url and uses ```Vagrant::Downloaders::HTTP``` to fetch
|
12
|
+
the box.
|
13
|
+
|
14
|
+
Example:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
require 'vagrant-fog-box-storage'
|
18
|
+
|
19
|
+
Vagrant::Config.run do |config|
|
20
|
+
config.vm.define :app do |app_config|
|
21
|
+
app_config.fog_box_storage.provider = 'AWS'
|
22
|
+
app_config.fog_box_storage.access_key_id = "AAAAAAAAAAAAAAA"
|
23
|
+
app_config.fog_box_storage.secret_access_key = "XXXXXXXXXXXXXXXXXXXXXXXXX"
|
24
|
+
app_config.fog_box_storage.bucket_name = "awesome-secret-bukkit"
|
25
|
+
app_config.fog_box_storage.box_file_name = "secret-linux.box"
|
26
|
+
|
27
|
+
app_config.vm.box_url = app_config.fog_box_storage.box_url
|
28
|
+
|
29
|
+
app_config.vm.box = "secret-linux"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
```
|
34
|
+
|
35
|
+
## TODO
|
36
|
+
|
37
|
+
Not sure if there's a way to reach in and set ```vm.box_url``` from within the
|
38
|
+
plugin instead of having to call the ```#box_url``` method from the plugin from
|
39
|
+
the Vagrantfile.
|
40
|
+
|
41
|
+
## What else?
|
42
|
+
|
43
|
+
I've only used this with S3.
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'bundler/setup'
|
4
|
+
Bundler::GemHelper.install_tasks
|
5
|
+
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc "Run the test suite."
|
9
|
+
task :test do
|
10
|
+
$:.unshift File.expand_path("../test", __FILE__)
|
11
|
+
|
12
|
+
Dir["test/**/*_test.rb"].each do |f|
|
13
|
+
load f
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'vagrant/config'
|
2
|
+
|
3
|
+
|
4
|
+
module VagrantFogBoxStorage
|
5
|
+
|
6
|
+
class CloudStorageBoxNotFound < Exception ; end
|
7
|
+
class CloudStorageBucketNotFound < Exception ; end
|
8
|
+
|
9
|
+
class Config < Vagrant::Config::Base
|
10
|
+
def self.key_names
|
11
|
+
[
|
12
|
+
:provider,
|
13
|
+
:access_key_id,
|
14
|
+
:secret_access_key,
|
15
|
+
:bucket_name,
|
16
|
+
:box_file_name
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
20
|
+
self.key_names.each do |name|
|
21
|
+
attr_accessor name
|
22
|
+
end
|
23
|
+
|
24
|
+
def is_used?
|
25
|
+
self.class.key_names.any? do |name|
|
26
|
+
!self.send(name).nil?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def cloud_storage
|
31
|
+
if is_used?
|
32
|
+
provider_name = self.provider.to_s.downcase
|
33
|
+
|
34
|
+
@cloud_storage ||= Fog::Storage.new({
|
35
|
+
:provider => self.provider,
|
36
|
+
:"#{provider_name}_access_key_id" => self.access_key_id,
|
37
|
+
:"#{provider_name}_secret_access_key" => self.secret_access_key
|
38
|
+
})
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def cloud_directories
|
43
|
+
cloud_storage.directories
|
44
|
+
end
|
45
|
+
|
46
|
+
def box_directory
|
47
|
+
directory = cloud_directories.get(self.bucket_name)
|
48
|
+
|
49
|
+
raise CloudStorageBucketNotFound.new("#{self.bucket_name} does not exist") if !directory
|
50
|
+
|
51
|
+
directory
|
52
|
+
end
|
53
|
+
|
54
|
+
def directory_files
|
55
|
+
directory = box_directory()
|
56
|
+
|
57
|
+
directory.files
|
58
|
+
end
|
59
|
+
|
60
|
+
def expiry_time
|
61
|
+
Time.now + 3600
|
62
|
+
end
|
63
|
+
|
64
|
+
def box_url
|
65
|
+
files = directory_files()
|
66
|
+
|
67
|
+
url = files.get_https_url(self.box_file_name, expiry_time)
|
68
|
+
|
69
|
+
url
|
70
|
+
end
|
71
|
+
|
72
|
+
def validate(env, errors)
|
73
|
+
if is_used?
|
74
|
+
errors.add('missing provider') if !self.provider
|
75
|
+
errors.add('missing access_key_id') if !self.access_key_id
|
76
|
+
errors.add('missing secret_access_key') if !self.secret_access_key
|
77
|
+
errors.add('missing bucket_name') if !self.bucket_name
|
78
|
+
errors.add('missing box_file_name') if !self.box_file_name
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/vagrant_init.rb
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
require "test/unit/assertions"
|
3
|
+
require "protest"
|
4
|
+
require "mocha"
|
5
|
+
require "vagrant-fog-box-storage"
|
6
|
+
|
7
|
+
class Protest::TestCase
|
8
|
+
include Test::Unit::Assertions
|
9
|
+
include Mocha::API
|
10
|
+
include Vagrant::TestHelpers
|
11
|
+
|
12
|
+
# Get Mocha integrated properly into the tests
|
13
|
+
alias :original_run :run
|
14
|
+
def run(report)
|
15
|
+
original_run(report)
|
16
|
+
mocha_verify
|
17
|
+
ensure
|
18
|
+
mocha_teardown
|
19
|
+
end
|
20
|
+
|
21
|
+
# Helper to silence streams, courtesy of Ruby Facets library.
|
22
|
+
def silence_stream(*streams) #:yeild:
|
23
|
+
on_hold = streams.collect{ |stream| stream.dup }
|
24
|
+
streams.each do |stream|
|
25
|
+
stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
|
26
|
+
stream.sync = true
|
27
|
+
end
|
28
|
+
yield
|
29
|
+
ensure
|
30
|
+
streams.each_with_index do |stream, i|
|
31
|
+
stream.reopen(on_hold[i])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
Protest.report_with(:documentation)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("Configuration class") do
|
4
|
+
setup do
|
5
|
+
Fog.mock!
|
6
|
+
|
7
|
+
@klass = VagrantFogBoxStorage::Config
|
8
|
+
@instance = @klass.new
|
9
|
+
@errors = Vagrant::Config::ErrorRecorder.new
|
10
|
+
@env = mock('Vagrant::Environment')
|
11
|
+
end
|
12
|
+
|
13
|
+
should "be valid by default" do
|
14
|
+
@instance.validate(@env, @errors)
|
15
|
+
assert @errors.errors.empty?
|
16
|
+
end
|
17
|
+
|
18
|
+
should "be invalid if any one key is set and another is not" do
|
19
|
+
@instance.provider = :aws
|
20
|
+
@instance.validate(@env, @errors)
|
21
|
+
|
22
|
+
assert !@errors.errors.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
should "be is_used? if all keys are set" do
|
26
|
+
@instance.provider = :aws
|
27
|
+
@instance.access_key_id = "1Z"
|
28
|
+
@instance.secret_access_key = "1Z"
|
29
|
+
@instance.bucket_name = "bukkit"
|
30
|
+
@instance.box_file_name = "awesome.box"
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with all keys set' do
|
34
|
+
setup do
|
35
|
+
@instance.provider = :aws
|
36
|
+
@instance.access_key_id = "1Z"
|
37
|
+
@instance.secret_access_key = "1Z"
|
38
|
+
@instance.bucket_name = "bukkit"
|
39
|
+
@instance.box_file_name = "awesome.box"
|
40
|
+
end
|
41
|
+
|
42
|
+
context "#box_directory" do
|
43
|
+
should "get the directory using bucket_name" do
|
44
|
+
@instance.stubs(:cloud_directories).returns(dirs = [])
|
45
|
+
dirs.expects(:get).with('bukkit').returns(mock('FogDirectory'))
|
46
|
+
|
47
|
+
@instance.box_directory()
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "#box_url" do
|
52
|
+
context "when box is found" do
|
53
|
+
setup do
|
54
|
+
@instance.stubs(:directory_files).returns(@files = mock('Files'))
|
55
|
+
@instance.stubs(:expiry_time).returns(@expires = Time.now)
|
56
|
+
end
|
57
|
+
|
58
|
+
should "return url for box" do
|
59
|
+
@files.expects(:get_https_url).with(@instance.box_file_name, @expires).
|
60
|
+
returns("http://example.com/files.gz")
|
61
|
+
|
62
|
+
|
63
|
+
assert_equal "http://example.com/files.gz", @instance.box_url
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path("../lib/vagrant-fog-box-storage/version", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "vagrant-fog-box-storage"
|
6
|
+
s.version = VagrantFogBoxStorage::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Nat Lownes"]
|
9
|
+
s.email = ["nat.lownes@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/natlownes/vagrant-fog-box-storage"
|
11
|
+
s.summary = "The use case is if you have a vagrant box, stored on S3 (or another storage provider supported by fog) that you don't want to be downloadable publicly that you need to authenticate somehow to get at."
|
12
|
+
s.description = ""
|
13
|
+
|
14
|
+
s.required_rubygems_version = ">= 1.3.6"
|
15
|
+
|
16
|
+
s.add_dependency "vagrant" , "~> 1.0.6"
|
17
|
+
s.add_dependency "fog" , "~> 1.0"
|
18
|
+
|
19
|
+
s.add_development_dependency "protest" , "~> 0.4.0"
|
20
|
+
s.add_development_dependency "mocha" , "~> 0.9.8"
|
21
|
+
s.add_development_dependency "bundler" , ">= 1.0.0"
|
22
|
+
|
23
|
+
s.files = `git ls-files`.split("\n")
|
24
|
+
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
25
|
+
s.require_path = 'lib'
|
26
|
+
end
|
metadata
CHANGED
@@ -1,103 +1,141 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-fog-box-storage
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Nat Lownes
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-03-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
15
|
name: vagrant
|
16
|
-
|
17
|
-
|
18
|
-
requirements:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
19
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
20
|
+
- !ruby/object:Gem::Version
|
21
21
|
version: 1.0.6
|
22
22
|
type: :runtime
|
23
|
-
version_requirements: *id001
|
24
|
-
- !ruby/object:Gem::Dependency
|
25
|
-
name: fog
|
26
23
|
prerelease: false
|
27
|
-
|
28
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.6
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: fog
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
29
35
|
- - ~>
|
30
|
-
- !ruby/object:Gem::Version
|
31
|
-
version:
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.0'
|
32
38
|
type: :runtime
|
33
|
-
version_requirements: *id002
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: protest
|
36
39
|
prerelease: false
|
37
|
-
|
38
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: protest
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
39
51
|
- - ~>
|
40
|
-
- !ruby/object:Gem::Version
|
52
|
+
- !ruby/object:Gem::Version
|
41
53
|
version: 0.4.0
|
42
54
|
type: :development
|
43
|
-
version_requirements: *id003
|
44
|
-
- !ruby/object:Gem::Dependency
|
45
|
-
name: mocha
|
46
55
|
prerelease: false
|
47
|
-
|
48
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
49
59
|
- - ~>
|
50
|
-
- !ruby/object:Gem::Version
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.4.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: mocha
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
51
69
|
version: 0.9.8
|
52
70
|
type: :development
|
53
|
-
version_requirements: *id004
|
54
|
-
- !ruby/object:Gem::Dependency
|
55
|
-
name: bundler
|
56
71
|
prerelease: false
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.9.8
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: bundler
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
61
85
|
version: 1.0.0
|
62
86
|
type: :development
|
63
|
-
|
64
|
-
|
65
|
-
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.0.0
|
94
|
+
description: ''
|
95
|
+
email:
|
66
96
|
- nat.lownes@gmail.com
|
67
97
|
executables: []
|
68
|
-
|
69
98
|
extensions: []
|
70
|
-
|
71
99
|
extra_rdoc_files: []
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
100
|
+
files:
|
101
|
+
- .gitignore
|
102
|
+
- CHANGELOG.md
|
103
|
+
- Gemfile
|
104
|
+
- Gemfile.lock
|
105
|
+
- README.md
|
106
|
+
- Rakefile
|
107
|
+
- lib/vagrant-fog-box-storage.rb
|
108
|
+
- lib/vagrant-fog-box-storage/config.rb
|
109
|
+
- lib/vagrant-fog-box-storage/version.rb
|
110
|
+
- lib/vagrant_init.rb
|
111
|
+
- test/test_helper.rb
|
112
|
+
- test/vagrant-fog-box-storage/config_test.rb
|
113
|
+
- vagrant-fog-box-storage.gemspec
|
114
|
+
- vagrant-fog-box-storage.rb
|
115
|
+
homepage: https://github.com/natlownes/vagrant-fog-box-storage
|
76
116
|
licenses: []
|
77
|
-
|
78
|
-
metadata: {}
|
79
|
-
|
80
117
|
post_install_message:
|
81
118
|
rdoc_options: []
|
82
|
-
|
83
|
-
require_paths:
|
119
|
+
require_paths:
|
84
120
|
- lib
|
85
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
94
132
|
version: 1.3.6
|
95
133
|
requirements: []
|
96
|
-
|
97
134
|
rubyforge_project:
|
98
|
-
rubygems_version:
|
135
|
+
rubygems_version: 1.8.25
|
99
136
|
signing_key:
|
100
|
-
specification_version:
|
101
|
-
summary:
|
137
|
+
specification_version: 3
|
138
|
+
summary: The use case is if you have a vagrant box, stored on S3 (or another storage
|
139
|
+
provider supported by fog) that you don't want to be downloadable publicly that
|
140
|
+
you need to authenticate somehow to get at.
|
102
141
|
test_files: []
|
103
|
-
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA512:
|
3
|
-
metadata.gz: 8cc3d8717f76f33f7b55dfed6e327eadfffcab97f6ab0334e4797a06796eea11c77a8fa979aa016ec9ab30981b8bc21fa49a58e1551707796261624e8b369a8d
|
4
|
-
data.tar.gz: c17469a29ccc9be165acbc9f608513c7be13ffc3130b556ee3df44fc0e7796f502a5d701cc740d4568ec4d7e841235362e48d88c2f790c2ad003a24da5219e6a
|
5
|
-
SHA1:
|
6
|
-
metadata.gz: 2a8eb0a161234ae4b5aea7ad29640c5cc1a7dd6b
|
7
|
-
data.tar.gz: 01bf75f6ca5f109de13b5f074d650db109a26298
|