breadbox 0.9.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d5f3fd7c28ced546435f0248c2415e11043c180
4
- data.tar.gz: 31039b8604609f6adb917a59a1cf57c1b12dd7cf
3
+ metadata.gz: 2fc8f406d6187e2707ac993a2fd6d5d4e7ad8d56
4
+ data.tar.gz: 6c05dbdaa8a962b0489350230aa445765913e188
5
5
  SHA512:
6
- metadata.gz: 7834d4b353de3bd9d493095aa003094a13c00afd9bec864907a569bf3c7daf79c54e359c9a472b2a8097dc4c0ff9a8eaa98a497bb6e582308f75ac44d49b1137
7
- data.tar.gz: 3958b639e54960a795dad713996b402e1bdb5be51db3a64e613ee759f31a3524329751b63d7bb814688426776d41381d8980bac5ea099eb6926e8bbf7f80b2ba
6
+ metadata.gz: 1104d3d4ea17ccba451682038a59041c9e566960733f52cfae89c41e252250f6019f56fb836aabb7fca7bcb0508c17b227d619c5d1a8fe499290afc3f1cc9232
7
+ data.tar.gz: 9b64da8f50ac9cb7d6bede77baec4dc1d9000ffe26efd9c018694968ea9ce115a1129a266fabfa56eae59ef54945bd867d3103bf5e8e0f9a62e4c3bdf73e8b03
data/README.md CHANGED
@@ -21,7 +21,8 @@ Or install it yourself as:
21
21
 
22
22
  $ gem install breadbox
23
23
 
24
- ## Usage
24
+ ---
25
+ ## Setup for Dropbox
25
26
 
26
27
  ### 1. Get a [Dropbox Access Token](https://www.dropbox.com/developers/blog/94/generate-an-access-token-for-your-own-account)
27
28
  ### 2. Add to your initializers:
@@ -31,28 +32,48 @@ Or install it yourself as:
31
32
 
32
33
  Breadbox.configure do |config|
33
34
  config.dropbox_access_token = xxxxxxx # THIS IS REQUIRED
35
+ config.provider = :dropbox # THIS IS REQUIRED
34
36
  end
35
37
  ```
36
38
 
37
- ### 3. Configure your root directory for uploading files (Optional)
39
+ --
40
+ ## Setup for S3
41
+
42
+ ### 1. Get your [AWS Credentials](http://infinitewp.com/knowledge-base/where-are-my-amazon-s3-credentials/)
43
+ ### 2. [Create or find a bucket](http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)
44
+ ### 3. Add to your initializers
38
45
 
39
- > By default - the root path will be the root directory of your DropBox folder.
40
- You can, however, change the root path to be anything you want (inside of Dropbox).
46
+ ```ruby
47
+ # config/initializers/breadbox.rb
41
48
 
42
- **Note: You have to prefix the folder you wnt with a `/`, ex: `/uploads/my-files`**
49
+ Breadbox.configure do |config|
50
+ config.s3_bucket = "name of the bucket" # THIS IS REQUIRED
51
+ config.s3_secret_access_key = xxxxxx # THIS IS REQUIRED
52
+ config.s3_access_key_id = xxxxxxx # THIS IS REQUIRED
53
+ config.provider = :s3 # THIS IS REQUIRED
54
+ end
55
+ ```
56
+
57
+ ### (Optional) Configure your root directory for uploading files
58
+
59
+ > By default - the root path will be the root directory of your [DropBox folder or S3 Bucket].
60
+ You can, however, change the root path to be anything you want.
61
+
62
+ **Note: You have to prefix the folder you want with a `/`, ex: `/uploads/my-files`**
43
63
 
44
64
  ```ruby
45
65
  # config/initializers/breadbox.rb
46
66
 
47
67
  Breadbox.configure do |config|
48
- config.dropbox_access_token = xxxxxxx # THIS IS REQUIRED
49
68
  config.root_path = "/uploads/my-files"
69
+
70
+ # ... more configurations ...
50
71
  end
51
72
  ```
52
73
 
53
- ### 4. Use it! :)
74
+ ## Usage
54
75
 
55
- #### Parameters:
76
+ ### Parameters:
56
77
 
57
78
  - `path`: defaults to `nil`, but this is where you put a custom folder if you so wish (in relation
58
79
  to your `root_path`, which if you didn't configure in your initializer, will be your root Dropbox
@@ -62,7 +83,7 @@ end
62
83
  to DropBox
63
84
 
64
85
  ```ruby
65
- # to upload a file to Dropbox/uploads/my-cool-file.jpg
86
+ # to upload a file to [Dropbox Folder or S3 Bucket]/uploads/my-cool-file.jpg
66
87
  # and remove it after upload
67
88
 
68
89
  file = File.open("./tmp/my-cool-file.jpg")
data/breadbox.gemspec CHANGED
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Breadbox::VERSION
9
9
  spec.authors = ["Nathaniel Watts"]
10
10
  spec.email = ["reg@nathanielwatts.com"]
11
- spec.summary = "A simple wrapper interface for the DropBox SDK gem."
12
- spec.description = "This gem is just to provide some niceties for interfacing with the DropBox SDK."
13
- spec.homepage = "https://github.com/ovenbits"
11
+ spec.summary = "An interface for uploading to Dropbox or Amazon S3."
12
+ spec.description = "This gem is just to provide some niceties for uploading with the DropBox and Amazon SDKs."
13
+ spec.homepage = "https://github.com/ovenbits/breadbox"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "dropbox-sdk", "~> 1.6"
22
+ spec.add_dependency "aws-sdk"
22
23
 
23
24
  spec.add_development_dependency "bundler", "~> 1.6"
24
25
  spec.add_development_dependency "rake"
@@ -1,35 +1,42 @@
1
- require "dropbox_sdk"
1
+ require "breadbox/null_configuration"
2
2
 
3
3
  module Breadbox
4
4
  class Client
5
- attr_reader :client, :root_path, :token
5
+ attr_reader :configuration
6
6
 
7
- def initialize(options = {})
8
- @token = options[:token]
9
- @root_path = options[:root_path]
10
- @client = new_client_from_token
7
+ def initialize(configuration = nil)
8
+ @configuration = configuration || NullConfiguration.new
9
+ post_initialize
11
10
  end
12
11
 
13
- def upload(path: nil, file: nil)
14
- filepath = filepath_from_paths_and_file(root_path, path, file)
15
- client.put_file(filepath, file)
12
+ def client
13
+ @client ||= new_client_from_configuration
14
+ end
15
+
16
+ def root_path
17
+ configuration.root_path
18
+ end
19
+
20
+ def upload(*)
21
+ not_implemented
16
22
  end
17
23
 
18
24
  protected
19
25
 
20
26
  def filepath_from_paths_and_file(root_path, path, file)
21
27
  filename = File.basename(file)
22
- [root_path, path, filename].join("/").gsub(/\/{2,}/, '/')
28
+ [root_path, path, filename].join("/").gsub(/\/{2,}/, "/")
23
29
  end
24
30
 
25
- def new_client_from_token
26
- if token.nil? || token.empty?
27
- raise MissingAccessToken, "You need a Dropbox Access Token."
28
- else
29
- DropboxClient.new(token)
30
- end
31
+ def new_client_from_configuration
32
+ not_implemented
31
33
  end
34
+
35
+ def not_implemented
36
+ raise NotImplementedError,
37
+ "has not been implemented on #{ self.class }"
38
+ end
39
+
40
+ def post_initialize; end
32
41
  end
33
42
  end
34
-
35
- class MissingAccessToken < Exception; end
@@ -0,0 +1,34 @@
1
+ require "breadbox/dropbox_client"
2
+ require "breadbox/s3_client"
3
+ require "breadbox/null_configuration"
4
+
5
+ module Breadbox
6
+ class ClientBuilder
7
+ attr_reader :configuration
8
+
9
+ def initialize(configuration = nil)
10
+ @configuration = configuration || null_configuration
11
+ end
12
+
13
+ def build
14
+ case configuration.provider
15
+ when :dropbox
16
+ DropboxClient.new(configuration)
17
+ when :s3
18
+ S3Client.new(configuration)
19
+ else
20
+ null_configuration.provider
21
+ end
22
+ end
23
+
24
+ def self.build(configuration)
25
+ new(configuration).build
26
+ end
27
+
28
+ protected
29
+
30
+ def null_configuration
31
+ NullConfiguration.new
32
+ end
33
+ end
34
+ end
@@ -1,15 +1,38 @@
1
1
  module Breadbox
2
2
  class Configuration
3
- attr_accessor :dropbox_access_token, :root_path
3
+ attr_accessor :s3_bucket,
4
+ :s3_access_key_id,
5
+ :s3_secret_access_key,
6
+ :dropbox_access_token,
7
+ :provider,
8
+ :root_path
4
9
 
5
10
  def initialize
6
11
  @root_path = default_root_path
7
12
  end
8
13
 
14
+ def provider=(candidate)
15
+ if valid_provider?(candidate)
16
+ @provider = candidate
17
+ else
18
+ raise InvalidBreadboxProvider, "must use a valid provider."
19
+ end
20
+ end
21
+
9
22
  protected
10
23
 
11
24
  def default_root_path
12
25
  "/"
13
26
  end
27
+
28
+ def valid_provider?(candidate)
29
+ valid_providers.include?(candidate.to_sym)
30
+ end
31
+
32
+ def valid_providers
33
+ [:s3, :dropbox]
34
+ end
14
35
  end
15
36
  end
37
+
38
+ class InvalidBreadboxProvider < Exception; end
@@ -0,0 +1,37 @@
1
+ require "dropbox_sdk"
2
+ require "breadbox/client"
3
+
4
+ module Breadbox
5
+ class DropboxClient < Client
6
+ def access_token
7
+ configuration.dropbox_access_token
8
+ end
9
+
10
+ def upload(path: nil, file: nil)
11
+ filepath = filepath_from_paths_and_file(root_path, path, file)
12
+ client.put_file(filepath, file)
13
+ end
14
+
15
+ protected
16
+
17
+ def missing_access_token
18
+ raise MissingDropboxAccessToken, "You need a Dropbox Access Token."
19
+ end
20
+
21
+ def new_client_from_configuration
22
+ ::DropboxClient.new(access_token)
23
+ end
24
+
25
+ def post_initialize
26
+ validate_access_token
27
+ end
28
+
29
+ def validate_access_token
30
+ if configuration.dropbox_access_token.to_s.empty?
31
+ missing_access_token
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ class MissingDropboxAccessToken < Exception; end
@@ -0,0 +1,11 @@
1
+ require "breadbox/configuration"
2
+
3
+ module Breadbox
4
+ class NullConfiguration < Configuration
5
+ def provider
6
+ raise MissingBreadboxProvider, "must provide a valid provider."
7
+ end
8
+ end
9
+ end
10
+
11
+ class MissingBreadboxProvider < Exception; end
@@ -0,0 +1,57 @@
1
+ require "aws"
2
+ require "breadbox/client"
3
+
4
+ module Breadbox
5
+ class S3Client < Client
6
+ def bucket
7
+ configuration.s3_bucket
8
+ end
9
+
10
+ def s3_bucket_object
11
+ @bucket ||= AWS::S3.new.buckets[bucket]
12
+ end
13
+
14
+ def upload(path: nil, file: nil)
15
+ filepath = filepath_from_paths_and_file(root_path, path, file)[1..-1]
16
+ s3_bucket_object.objects[filepath].write(file)
17
+ end
18
+
19
+ protected
20
+
21
+ def post_initialize
22
+ validate_bucket
23
+ validate_tokens
24
+ setup_s3
25
+ end
26
+
27
+ def setup_s3
28
+ AWS.config(
29
+ access_key_id: configuration.s3_access_key_id,
30
+ secret_access_key: configuration.s3_secret_access_key
31
+ )
32
+ end
33
+
34
+ def validate_bucket
35
+ if configuration.s3_bucket.to_s.empty?
36
+ raise MissingS3Bucket,
37
+ "You need to provide an AWS::S3 Bucket"
38
+ end
39
+ end
40
+
41
+ def validate_tokens
42
+ if configuration.s3_access_key_id.to_s.empty?
43
+ raise MissingS3AccessKeyId,
44
+ "You need to provide an AWS::S3 Access Key ID"
45
+ end
46
+
47
+ if configuration.s3_secret_access_key.to_s.empty?
48
+ raise MissingS3SecretAccessKey,
49
+ "You need to provide an AWS::S3 Secret Access Key"
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ class MissingS3AccessKeyId < Exception; end
56
+ class MissingS3Bucket < Exception; end
57
+ class MissingS3SecretAccessKey < Exception; end
@@ -1,3 +1,3 @@
1
1
  module Breadbox
2
- VERSION = "0.9.2"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/breadbox.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "breadbox/version"
2
2
  require "breadbox/configuration"
3
3
  require "breadbox/client"
4
+ require "breadbox/client_builder"
4
5
 
5
6
  begin
6
7
  require "pry"
@@ -19,10 +20,7 @@ module Breadbox
19
20
  end
20
21
 
21
22
  def self.client
22
- @client ||= Client.new(
23
- root_path: configuration.root_path,
24
- token: configuration.dropbox_access_token,
25
- )
23
+ @client ||= ClientBuilder.build(configuration)
26
24
  end
27
25
 
28
26
  def self.configuration
@@ -41,6 +39,7 @@ module Breadbox
41
39
  def self.upload(path: nil, file: nil, cleanup: false)
42
40
  if client.upload(path: path, file: file)
43
41
  cleanup(file: file, cleanup: cleanup)
42
+ true
44
43
  end
45
44
  end
46
45
  end
@@ -0,0 +1,61 @@
1
+ require "spec_helper"
2
+ require "./lib/breadbox/client_builder"
3
+ require "./lib/breadbox/configuration"
4
+
5
+ module Breadbox
6
+ describe ClientBuilder do
7
+ let(:builder) { ClientBuilder.new(configuration) }
8
+ let(:configuration) { Breadbox::Configuration.new }
9
+
10
+ it "initializes with a configuration object" do
11
+ expect(builder.configuration).to eq configuration
12
+ end
13
+
14
+ describe "#build" do
15
+ let(:configuration) { Breadbox::Configuration.new }
16
+
17
+ context "for a dropbox client" do
18
+ before { configuration.provider = :dropbox }
19
+
20
+ it "will delegate to a Breadbox::DropBoxClient" do
21
+ expect(Breadbox::DropboxClient).to receive(:new).with(configuration)
22
+ builder.build
23
+ end
24
+ end
25
+
26
+ context "for an s3 client" do
27
+ before { configuration.provider = :s3 }
28
+
29
+ it "will delegate to a Breadbox::AwsClient" do
30
+ expect(Breadbox::S3Client).to receive(:new).with(configuration)
31
+ builder.build
32
+ end
33
+ end
34
+
35
+ context "configuration provider is not valid (nil, empty, etc)" do
36
+ it "will raise a MissingBreadboxProvider error" do
37
+ expect { builder.build }.to raise_error MissingBreadboxProvider
38
+ end
39
+ end
40
+
41
+ context "without a configuration" do
42
+ let(:configuration) { nil }
43
+
44
+ it "will raise a MissingBreadboxProvider error" do
45
+ expect { builder.build }.to raise_error MissingBreadboxProvider
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "::build" do
51
+ it "delegates to an instance of itself, and calls #build" do
52
+ builder = instance_double(ClientBuilder)
53
+ allow(ClientBuilder).to receive(:new).with(configuration)
54
+ .and_return(builder)
55
+ expect(builder).to receive(:build)
56
+
57
+ ClientBuilder.build(configuration)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,42 +1,33 @@
1
1
  require "spec_helper"
2
+ require "./lib/breadbox/client"
2
3
 
3
4
  module Breadbox
4
5
  describe Client do
5
- it "should be a Dropbox client" do
6
- client = Client.new(token: "12345").client
7
- expect(client).to be_kind_of DropboxClient
8
- end
6
+ let(:configuration) { double }
9
7
 
10
- it "should raise an exception if token is missing" do
11
- expect{ Client.new }.to raise_exception(MissingAccessToken)
12
- end
8
+ describe "#initialize" do
9
+ it "initializes with a configuration" do
10
+ client = Client.new(configuration)
11
+ expect(client.configuration).to eq configuration
12
+ end
13
13
 
14
- it "should raise an exception if the token is empty" do
15
- expect{ Client.new(token: "") }.to raise_exception(MissingAccessToken)
14
+ it "configuration defaults to a NullConfiguration" do
15
+ client = Client.new
16
+ expect(client.configuration).to be_kind_of NullConfiguration
17
+ end
16
18
  end
17
19
 
18
- describe "#upload" do
19
- before { FileUtils.touch("./tmp/new-file.jpg") }
20
- after { File.delete("./tmp/new-file.jpg") }
21
-
22
- it "tells the client to put_file from a full_filepath and file" do
23
- file = File.open("./tmp/new-file.jpg")
24
- client = Client.new(token: "12345", root_path: "/")
25
- dropbox_client = instance_double(DropboxClient)
26
- allow(client).to receive(:client).and_return(dropbox_client)
27
- expect(dropbox_client).to receive(:put_file).with("/new-file.jpg", file)
28
-
29
- client.upload(path: "/", file: file)
20
+ describe "#client" do
21
+ it "is not defined on this class" do
22
+ client = Client.new
23
+ expect { client.client }.to raise_error NotImplementedError
30
24
  end
25
+ end
31
26
 
32
- it "tells the client to put_file from a full_filepath and file" do
33
- file = File.open("./tmp/new-file.jpg")
34
- client = Client.new(token: "12345", root_path: "/")
35
- dropbox_client = instance_double(DropboxClient)
36
- allow(client).to receive(:client).and_return(dropbox_client)
37
- expect(dropbox_client).to receive(:put_file).with("/images/new-file.jpg", file)
38
-
39
- client.upload(path: "images", file: file)
27
+ describe "#upload" do
28
+ it "is not defined on this class" do
29
+ client = Client.new
30
+ expect { client.upload }.to raise_error NotImplementedError
40
31
  end
41
32
  end
42
33
  end
@@ -1,37 +1,101 @@
1
1
  require "spec_helper"
2
+ require "./lib/breadbox/configuration"
2
3
 
3
4
  module Breadbox
4
5
  describe Configuration do
6
+ let(:config) { Configuration.new }
7
+
5
8
  describe "#root_path" do
6
9
  it "defaults to /breadbox" do
7
- config = Configuration.new
8
10
  expect(config.root_path).to eq "/"
9
11
  end
10
12
  end
11
13
 
12
14
  describe "#root_path=" do
13
15
  it "assigns a root directory" do
14
- config = Configuration.new
15
16
  new_dir = "/my-favorite-directory"
16
17
  config.root_path = new_dir
17
18
  expect(config.root_path).to eq new_dir
18
19
  end
19
20
  end
20
21
 
22
+ describe "#s3_bucket" do
23
+ it "defaults to nil" do
24
+ expect(config.s3_bucket).to be nil
25
+ end
26
+ end
27
+
28
+ describe "#s3_access_key_id" do
29
+ it "defaults to nil" do
30
+ expect(config.s3_access_key_id).to be nil
31
+ end
32
+ end
33
+
34
+ describe "#s3_access_key_id=" do
35
+ it "assigns the bucket" do
36
+ access_key_id = "my-access_key_id"
37
+ config.s3_access_key_id = access_key_id
38
+ expect(config.s3_access_key_id).to eq access_key_id
39
+ end
40
+ end
41
+
42
+ describe "#s3_secret_access_key" do
43
+ it "defaults to nil" do
44
+ expect(config.s3_secret_access_key).to be nil
45
+ end
46
+ end
47
+
48
+ describe "#s3_secret_access_key=" do
49
+ it "assigns the bucket" do
50
+ secret_access_key = "my-secret_access_key"
51
+ config.s3_secret_access_key = secret_access_key
52
+ expect(config.s3_secret_access_key).to eq secret_access_key
53
+ end
54
+ end
55
+
56
+ describe "#s3_bucket=" do
57
+ it "assigns the bucket" do
58
+ bucket = "my-bucket"
59
+ config.s3_bucket = bucket
60
+ expect(config.s3_bucket).to eq bucket
61
+ end
62
+ end
63
+
21
64
  describe "#dropbox_access_token" do
22
65
  it "defaults to nil" do
23
- config = Configuration.new
24
66
  expect(config.dropbox_access_token).to eq nil
25
67
  end
26
68
  end
27
69
 
28
70
  describe "#dropbox_access_token=" do
29
71
  it "assigns the access token" do
30
- config = Configuration.new
31
72
  access_token = "12345"
32
73
  config.dropbox_access_token = access_token
33
74
  expect(config.dropbox_access_token).to eq access_token
34
75
  end
35
76
  end
77
+
78
+ describe "#provider" do
79
+ it "defaults to nil" do
80
+ expect(config.provider).to eq nil
81
+ end
82
+ end
83
+
84
+ describe "#provider=" do
85
+ it "assigns the provider" do
86
+ provider = :dropbox
87
+ config.provider = provider
88
+ expect(config.provider).to eq provider
89
+ end
90
+
91
+ it "requires the provider to be in the available providers" do
92
+ providers = [:aws, :dropbox]
93
+ allow(config).to receive(:available_providers).and_return(providers)
94
+
95
+ expect {
96
+ config.provider = :not_in_the_list
97
+ }.to raise_error InvalidBreadboxProvider
98
+ end
99
+ end
36
100
  end
37
101
  end
@@ -0,0 +1,67 @@
1
+ require "spec_helper"
2
+ require "./lib/breadbox/configuration"
3
+ require "./lib/breadbox/dropbox_client"
4
+
5
+ module Breadbox
6
+ describe DropboxClient do
7
+ let(:configuration) { Breadbox::Configuration.new }
8
+
9
+ before { configuration.dropbox_access_token = "12345" }
10
+
11
+ it "is a Breadbox::Client" do
12
+ expect(DropboxClient).to be < Breadbox::Client
13
+ end
14
+
15
+ describe "without valid configuration settings" do
16
+ it "raises a MissingDropboxAccessToken error without a token" do
17
+ configuration.dropbox_access_token = nil
18
+ expect {
19
+ DropboxClient.new(configuration)
20
+ }.to raise_error MissingDropboxAccessToken
21
+ end
22
+
23
+ it "raises a MissingDropboxAccessToken if configuration is nil" do
24
+ expect {
25
+ DropboxClient.new(nil)
26
+ }.to raise_error MissingDropboxAccessToken
27
+ end
28
+
29
+ it "raises a MissingDropboxAccessToken if not given a configuration" do
30
+ expect {
31
+ DropboxClient.new
32
+ }.to raise_error MissingDropboxAccessToken
33
+ end
34
+ end
35
+
36
+ describe "#client" do
37
+ it "is a ::DropboxClient (from the Dropbox SDK) client" do
38
+ client = DropboxClient.new(configuration).client
39
+ expect(client).to be_kind_of ::DropboxClient
40
+ end
41
+ end
42
+
43
+ describe "#update" do
44
+ before { FileUtils.touch("./tmp/new-file.jpg") }
45
+ after { File.delete("./tmp/new-file.jpg") }
46
+
47
+ let(:access_token) { "12345" }
48
+ let(:configuration) {
49
+ config = Breadbox::Configuration.new
50
+ config.provider = :dropbox
51
+ config.dropbox_access_token = access_token
52
+ config.root_path = "/"
53
+ config
54
+ }
55
+
56
+ it "tells the client to put_file from a full_filepath and file" do
57
+ file = File.open("./tmp/new-file.jpg")
58
+ client = DropboxClient.new(configuration)
59
+ dropbox_client = instance_double(::DropboxClient)
60
+ allow(client).to receive(:client).and_return(dropbox_client)
61
+ expect(dropbox_client).to receive(:put_file).with("/new-file.jpg", file)
62
+
63
+ client.upload(path: "/", file: file)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,86 @@
1
+ require "spec_helper"
2
+ require "./lib/breadbox/s3_client"
3
+ require "./lib/breadbox/configuration"
4
+
5
+ module Breadbox
6
+ describe S3Client do
7
+ let(:configuration) { Breadbox::Configuration.new }
8
+
9
+ before {
10
+ configuration.s3_bucket = "my-bucket"
11
+ configuration.s3_access_key_id = "12345"
12
+ configuration.s3_secret_access_key = "abc123"
13
+ }
14
+
15
+ it "is a Breadbox::Client" do
16
+ expect(S3Client).to be < Breadbox::Client
17
+ end
18
+
19
+ describe "without valid configuration settings" do
20
+ it "raises a MissingS3Bucket error without a bucket" do
21
+ configuration.s3_bucket = nil
22
+ expect {
23
+ S3Client.new(configuration)
24
+ }.to raise_error MissingS3Bucket
25
+ end
26
+
27
+ it "raises a MissingS3AccessKeyId error without a bucket" do
28
+ configuration.s3_access_key_id = nil
29
+ expect {
30
+ S3Client.new(configuration)
31
+ }.to raise_error MissingS3AccessKeyId
32
+ end
33
+
34
+ it "raises a MissingS3SecretAccessKey error without a bucket" do
35
+ configuration.s3_secret_access_key = nil
36
+ expect {
37
+ S3Client.new(configuration)
38
+ }.to raise_error MissingS3SecretAccessKey
39
+ end
40
+
41
+ it "raises a MissingS3Bucket if configuration is nil" do
42
+ expect {
43
+ S3Client.new(nil)
44
+ }.to raise_error MissingS3Bucket
45
+ end
46
+
47
+ it "raises a MissingS3Bucket if no configuration" do
48
+ expect {
49
+ S3Client.new
50
+ }.to raise_error MissingS3Bucket
51
+ end
52
+ end
53
+
54
+ describe "with valid configuration settings" do
55
+ it "assigns the AccessKeyId and SecretAccessKey to AWS::S3" do
56
+ options = {
57
+ access_key_id: configuration.s3_access_key_id,
58
+ secret_access_key: configuration.s3_secret_access_key,
59
+ }
60
+ expect(AWS).to receive(:config).with(options)
61
+ S3Client.new(configuration)
62
+ end
63
+ end
64
+
65
+ describe "#s3_bucket_object" do
66
+ it "returns a new bucket object from AWS::S3" do
67
+ client = S3Client.new(configuration)
68
+ bucket_object = client.s3_bucket_object
69
+ expect(bucket_object).to be_kind_of AWS::S3::Bucket
70
+ end
71
+ end
72
+
73
+ describe "#upload" do
74
+ before { FileUtils.touch("./tmp/new-file.jpg") }
75
+ after { File.delete("./tmp/new-file.jpg") }
76
+
77
+ let(:client) { S3Client.new(configuration) }
78
+
79
+ it "writes a file to an S3 Bucket Object" do
80
+ file = File.open("./tmp/new-file.jpg")
81
+ expect_any_instance_of(AWS::S3::S3Object).to receive(:write).with(file)
82
+ client.upload(path: "/", file: file)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -1,4 +1,5 @@
1
1
  require "spec_helper"
2
+ require "./lib/breadbox"
2
3
 
3
4
  describe Breadbox do
4
5
  describe "::configure" do
@@ -6,6 +7,7 @@ describe Breadbox do
6
7
  Breadbox.configure do |config|
7
8
  config.dropbox_access_token = "12345"
8
9
  config.root_path = "/my-new-root"
10
+ config.provider = :dropbox
9
11
  end
10
12
  end
11
13
 
@@ -24,6 +26,7 @@ describe Breadbox do
24
26
  before do
25
27
  Breadbox.configure do |config|
26
28
  config.dropbox_access_token = "12345"
29
+ config.provider = :dropbox
27
30
  end
28
31
  end
29
32
 
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
- require "breadbox"
1
+ require "pry"
2
+
2
3
  # This file was generated by the `rspec --init` command. Conventionally, all
3
4
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
5
  # The generated `.rspec` file contains `--require spec_helper` which will cause this
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: breadbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathaniel Watts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-08 00:00:00.000000000 Z
11
+ date: 2014-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dropbox-sdk
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,8 +94,8 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
- description: This gem is just to provide some niceties for interfacing with the DropBox
84
- SDK.
97
+ description: This gem is just to provide some niceties for uploading with the DropBox
98
+ and Amazon SDKs.
85
99
  email:
86
100
  - reg@nathanielwatts.com
87
101
  executables: []
@@ -97,13 +111,20 @@ files:
97
111
  - breadbox.gemspec
98
112
  - lib/breadbox.rb
99
113
  - lib/breadbox/client.rb
114
+ - lib/breadbox/client_builder.rb
100
115
  - lib/breadbox/configuration.rb
116
+ - lib/breadbox/dropbox_client.rb
117
+ - lib/breadbox/null_configuration.rb
118
+ - lib/breadbox/s3_client.rb
101
119
  - lib/breadbox/version.rb
120
+ - spec/breadbox/client_builder_spec.rb
102
121
  - spec/breadbox/client_spec.rb
103
122
  - spec/breadbox/configuration_spec.rb
123
+ - spec/breadbox/dropbox_client_spec.rb
124
+ - spec/breadbox/s3_client_spec.rb
104
125
  - spec/breadbox_spec.rb
105
126
  - spec/spec_helper.rb
106
- homepage: https://github.com/ovenbits
127
+ homepage: https://github.com/ovenbits/breadbox
107
128
  licenses:
108
129
  - MIT
109
130
  metadata: {}
@@ -126,10 +147,13 @@ rubyforge_project:
126
147
  rubygems_version: 2.2.2
127
148
  signing_key:
128
149
  specification_version: 4
129
- summary: A simple wrapper interface for the DropBox SDK gem.
150
+ summary: An interface for uploading to Dropbox or Amazon S3.
130
151
  test_files:
152
+ - spec/breadbox/client_builder_spec.rb
131
153
  - spec/breadbox/client_spec.rb
132
154
  - spec/breadbox/configuration_spec.rb
155
+ - spec/breadbox/dropbox_client_spec.rb
156
+ - spec/breadbox/s3_client_spec.rb
133
157
  - spec/breadbox_spec.rb
134
158
  - spec/spec_helper.rb
135
159
  has_rdoc: