breadbox 0.9.2 → 1.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 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: