s3-publisher 0.9.3 → 2.0.0
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/Gemfile.lock +35 -9
- data/README.md +11 -5
- data/lib/s3-publisher.rb +17 -17
- data/s3-publisher.gemspec +5 -3
- data/spec/s3_publisher_spec.rb +6 -13
- data/spec/spec_helper.rb +2 -0
- metadata +26 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c5f5fd908bd87713d65bad6e7429c1090284f35
|
4
|
+
data.tar.gz: d58aabf2f780673028dd3b5e342dbba86aa00b21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5281ecababe99562e4795a2f13072ec5791ba8c0a74f6087a5a298a844c8251208ddd3d3ce2d63779fbc92fa80059339b4e8283b43c4775ec8538e897ea0575f
|
7
|
+
data.tar.gz: 55284b8a3218c84982ad925297cd5fefd9d7d4a7bb59018c883622bf7a73611033cfcabf3286eb31faf34398492d5ffa86a684e45f7d381fbb6f7fe1f4880fa3
|
data/Gemfile.lock
CHANGED
@@ -1,22 +1,48 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
s3-publisher (0.
|
5
|
-
|
6
|
-
|
4
|
+
s3-publisher (2.0.0)
|
5
|
+
aws-sdk (>= 2.0)
|
6
|
+
mime-types
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
aws-sdk (2.2.29)
|
12
|
+
aws-sdk-resources (= 2.2.29)
|
13
|
+
aws-sdk-core (2.2.29)
|
14
|
+
jmespath (~> 1.0)
|
15
|
+
aws-sdk-resources (2.2.29)
|
16
|
+
aws-sdk-core (= 2.2.29)
|
17
|
+
diff-lcs (1.2.5)
|
18
|
+
jmespath (1.1.3)
|
19
|
+
metaclass (0.0.4)
|
20
|
+
mime-types (3.0)
|
21
|
+
mime-types-data (~> 3.2015)
|
22
|
+
mime-types-data (3.2016.0221)
|
23
|
+
mocha (1.1.0)
|
24
|
+
metaclass (~> 0.0.1)
|
25
|
+
rspec (3.4.0)
|
26
|
+
rspec-core (~> 3.4.0)
|
27
|
+
rspec-expectations (~> 3.4.0)
|
28
|
+
rspec-mocks (~> 3.4.0)
|
29
|
+
rspec-core (3.4.4)
|
30
|
+
rspec-support (~> 3.4.0)
|
31
|
+
rspec-expectations (3.4.0)
|
32
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
33
|
+
rspec-support (~> 3.4.0)
|
34
|
+
rspec-mocks (3.4.1)
|
35
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
36
|
+
rspec-support (~> 3.4.0)
|
37
|
+
rspec-support (3.4.1)
|
16
38
|
|
17
39
|
PLATFORMS
|
18
40
|
ruby
|
19
41
|
|
20
42
|
DEPENDENCIES
|
43
|
+
mocha (>= 1.1.0)
|
44
|
+
rspec
|
21
45
|
s3-publisher!
|
22
|
-
|
46
|
+
|
47
|
+
BUNDLED WITH
|
48
|
+
1.11.2
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Quickly pub your data files to S3.
|
4
4
|
|
5
|
+
**This version depends on aws-sdk 2.x. For aws-sdk 1.x projects, use version <= 1.0 of this gem.**
|
6
|
+
|
5
7
|
Reasons you might want to use this instead of aws-sdk directly:
|
6
8
|
|
7
9
|
* parallel uploads using ruby threads. Concurrency defaults to 3 but can be increased.
|
@@ -38,7 +40,7 @@ end
|
|
38
40
|
### Slightly more advanced example:
|
39
41
|
|
40
42
|
```
|
41
|
-
S3Publisher.publish('my-bucket', :
|
43
|
+
S3Publisher.publish('my-bucket', base_path: 'world_cup', region: 'us-west-1') do |p|
|
42
44
|
p.push('events.xml', data: '<xml>...', ttl: 15)
|
43
45
|
end
|
44
46
|
```
|
@@ -55,7 +57,11 @@ See class docs for more options.
|
|
55
57
|
|
56
58
|
Since S3Publisher uses [aws-sdk](https://github.com/aws/aws-sdk-ruby) any of the usual credential stores will work, including:
|
57
59
|
|
58
|
-
* `
|
59
|
-
*
|
60
|
-
*
|
61
|
-
|
60
|
+
* `ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'], ENV['AWS_REGION']`
|
61
|
+
* IAM role
|
62
|
+
* ```
|
63
|
+
Aws.config.update({
|
64
|
+
region: 'us-west-2',
|
65
|
+
credentials: Aws::Credentials.new('akid', 'secret')
|
66
|
+
})
|
67
|
+
```
|
data/lib/s3-publisher.rb
CHANGED
@@ -27,24 +27,19 @@ class S3Publisher
|
|
27
27
|
# @option opts [String] :base_path Path prepended to supplied file_name on upload
|
28
28
|
# @option opts [Integer] :workers Number of threads to use when pushing to S3. Defaults to 3.
|
29
29
|
# @option opts [Object] :logger A logger object to recieve 'uploaded' messages. Defaults to STDOUT.
|
30
|
-
#
|
31
|
-
#
|
32
|
-
# @option opts [String] :region AWS region to use, if different than global
|
30
|
+
#
|
31
|
+
# Additional keys will be passed through to the Aws::S3::Client init, including:
|
32
|
+
# @option opts [String] :region AWS region to use, if different than global Aws config
|
33
|
+
# @option opts [Object] :credentials - :access_key_id, :secret_access_key, and :session_token options, if different than global Aws config
|
34
|
+
# See http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html#initialize-instance_method for full details.
|
33
35
|
|
34
36
|
def initialize bucket_name, opts={}
|
35
37
|
@publish_queue = Queue.new
|
36
|
-
@workers_to_use = opts
|
37
|
-
@logger
|
38
|
-
|
39
|
-
s3_opts = {}
|
40
|
-
s3_opts[:access_key_id] = opts[:access_key_id] if opts.key?(:access_key_id)
|
41
|
-
s3_opts[:secret_access_key] = opts[:secret_access_key] if opts.key?(:secret_access_key)
|
42
|
-
s3_opts[:region] = opts[:region] if opts.key?(:region)
|
43
|
-
|
44
|
-
@s3 = AWS::S3.new(s3_opts)
|
38
|
+
@workers_to_use = opts.delete(:workers) || 3
|
39
|
+
@logger = opts.delete(:logger) || $stdout
|
40
|
+
@bucket_name, @base_path = bucket_name, opts.delete(:base_path)
|
45
41
|
|
46
|
-
@
|
47
|
-
raise ArgumentError, "#{bucket_name} doesn't seem to be a valid bucket on your account" if @s3.buckets[bucket_name].nil?
|
42
|
+
@s3 = Aws::S3::Client.new(opts)
|
48
43
|
end
|
49
44
|
|
50
45
|
# Queues a file to be published.
|
@@ -124,8 +119,6 @@ class S3Publisher
|
|
124
119
|
|
125
120
|
try_count = 0
|
126
121
|
begin
|
127
|
-
obj = @s3.buckets[bucket_name].objects[item[:key_name]]
|
128
|
-
|
129
122
|
gzip = item[:gzip] != false && !item[:write_opts][:content_type].match('image/')
|
130
123
|
|
131
124
|
if gzip
|
@@ -134,7 +127,14 @@ class S3Publisher
|
|
134
127
|
item[:contents] = gzip(gzip_body)
|
135
128
|
end
|
136
129
|
|
137
|
-
|
130
|
+
write_opts = {
|
131
|
+
bucket: bucket_name,
|
132
|
+
key: item[:key_name],
|
133
|
+
body: item[:contents]
|
134
|
+
}
|
135
|
+
write_opts.merge!(item[:write_opts])
|
136
|
+
|
137
|
+
@s3.put_object(write_opts)
|
138
138
|
|
139
139
|
rescue Exception => e # backstop against transient S3 errors
|
140
140
|
raise e if try_count >= 1
|
data/s3-publisher.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "s3-publisher"
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "2.0.0"
|
6
6
|
s.authors = ["Ben Koski"]
|
7
7
|
s.email = "bkoski@nytimes.com"
|
8
8
|
s.summary = "Publish data to S3 for the world to see"
|
@@ -16,7 +16,9 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
|
-
s.
|
20
|
-
s.add_runtime_dependency(%q<aws-sdk>, ["~> 1.0"])
|
19
|
+
s.add_runtime_dependency(%q<aws-sdk>, [">= 2.0"])
|
21
20
|
s.add_runtime_dependency(%q<mime-types>, [">= 0"])
|
21
|
+
|
22
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
23
|
+
s.add_development_dependency(%q<mocha>, [">= 1.1.0"])
|
22
24
|
end
|
data/spec/s3_publisher_spec.rb
CHANGED
@@ -4,16 +4,16 @@ describe S3Publisher do
|
|
4
4
|
describe "#push" do
|
5
5
|
|
6
6
|
describe "file_name" do
|
7
|
-
it "prepends base_path if provided" do
|
7
|
+
it "prepends base_path if provided", focus: true do
|
8
8
|
set_put_expectation(key_name: 'world_cup_2010/events.xml')
|
9
|
-
p = S3Publisher.new('test-bucket', :
|
9
|
+
p = S3Publisher.new('test-bucket', logger: Logger.new(nil), base_path: 'world_cup_2010')
|
10
10
|
p.push('events.xml', data: '1234')
|
11
11
|
p.run
|
12
12
|
end
|
13
13
|
|
14
14
|
it "passes name through unaltered if base_path not specified" do
|
15
15
|
set_put_expectation(key_name: 'events.xml')
|
16
|
-
p = S3Publisher.new('test-bucket', :
|
16
|
+
p = S3Publisher.new('test-bucket', logger: Logger.new(nil))
|
17
17
|
p.push('events.xml', data: '1234')
|
18
18
|
p.run
|
19
19
|
end
|
@@ -92,10 +92,6 @@ describe S3Publisher do
|
|
92
92
|
# * :data
|
93
93
|
# * :content_type, :cache_control, :content_encoding
|
94
94
|
def set_put_expectation opts
|
95
|
-
s3_stub = mock()
|
96
|
-
bucket_stub = mock()
|
97
|
-
object_stub = mock()
|
98
|
-
|
99
95
|
key_name = opts[:key_name] || 'myfile.txt'
|
100
96
|
|
101
97
|
expected_entries = {}
|
@@ -111,12 +107,9 @@ describe S3Publisher do
|
|
111
107
|
expected_contents = anything
|
112
108
|
end
|
113
109
|
|
114
|
-
|
110
|
+
expected_entries.merge!(bucket: 'test-bucket', key: key_name, body: expected_contents)
|
115
111
|
|
116
|
-
|
117
|
-
bucket_stub.stubs(:objects).returns({ key_name => object_stub })
|
118
|
-
|
119
|
-
AWS::S3.stubs(:new).returns(s3_stub)
|
112
|
+
Aws::S3::Client.any_instance.expects(:put_object).with(has_entries(expected_entries))
|
120
113
|
end
|
121
114
|
|
122
115
|
def gzip data
|
@@ -130,7 +123,7 @@ describe S3Publisher do
|
|
130
123
|
end
|
131
124
|
|
132
125
|
def push_test_data file_name, opts
|
133
|
-
p = S3Publisher.new('test-bucket', :
|
126
|
+
p = S3Publisher.new('test-bucket', logger: Logger.new(nil))
|
134
127
|
p.push(file_name, opts)
|
135
128
|
p.run
|
136
129
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,6 +7,8 @@
|
|
7
7
|
|
8
8
|
require File.expand_path('../lib/s3-publisher.rb', File.dirname(__FILE__))
|
9
9
|
|
10
|
+
ENV['AWS_REGION'] = 'us-east-1'
|
11
|
+
|
10
12
|
RSpec.configure do |config|
|
11
13
|
# Limit the spec run to only specs with the focus metadata. If no specs have
|
12
14
|
# the filtering metadata and `run_all_when_everything_filtered = true` then
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: s3-publisher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Koski
|
@@ -11,47 +11,61 @@ cert_chain: []
|
|
11
11
|
date: 2016-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: aws-sdk
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: mime-types
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
|
-
type: :
|
48
|
+
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mocha
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.1.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.1.0
|
55
69
|
description: Publish data to S3 for the world to see
|
56
70
|
email: bkoski@nytimes.com
|
57
71
|
executables: []
|