jaxx 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ log/
data/Guardfile CHANGED
@@ -7,3 +7,8 @@ guard 'rspec' do
7
7
  watch('spec/spec_helper.rb') { "spec" }
8
8
  end
9
9
 
10
+ guard 'cucumber' do
11
+ watch(%r{^features/.+\.feature$})
12
+ watch(%r{^features/support/.+$}) { 'features' }
13
+ watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
14
+ end
data/bin/jaxx-download ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.expand_path('../../lib', __FILE__)
4
+ require 'jaxx/cli'
5
+ Jaxx::CLI.execute(:download, ARGV)
data/bin/jaxx-upload ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.expand_path('../../lib', __FILE__)
4
+ require 'jaxx/cli'
5
+ Jaxx::CLI.execute(:upload, ARGV)
@@ -0,0 +1,26 @@
1
+ Feature: As a CLI user I want to download a file from S3
2
+
3
+ Scenario: Show CLI help with -h
4
+ When I run `jaxx-download -h`
5
+ Then the exit status should be 0
6
+ And the output should contain "jaxx [options]"
7
+
8
+ Scenario: Show CLI help with --help
9
+ When I run `jaxx-download --help`
10
+ Then the exit status should be 0
11
+ And the output should contain "jaxx [options]"
12
+
13
+ Scenario: Downloading a single file with missing bucket
14
+ When I run `jaxx-download --bucket `
15
+ Then the exit status should be 1
16
+ And the output should contain "bucket is required"
17
+
18
+ Scenario: Downloading a single file with missing credentials
19
+ When I run `jaxx-download --bucket foo`
20
+ Then the exit status should be 1
21
+ And the output should contain "credentials for access key and access secret required"
22
+
23
+ Scenario: Downloading a single file with missing file argument
24
+ When I run `jaxx-download --bucket foo`
25
+ Then the exit status should be 1
26
+ And the output should contain "file presence is required"
@@ -0,0 +1,16 @@
1
+ Given /^the local authentication resource is available$/ do
2
+ stub_credentials_service
3
+ Fog.mock!
4
+ end
5
+
6
+ Then /^the access key and access secret should not be empty$/ do
7
+ Jaxx.environment.credentials[:access_key].should_not be_empty
8
+ Jaxx.environment.credentials[:access_secret].should_not be_empty
9
+ end
10
+
11
+ Given /^the file "(.*?)" exists$/ do |f|
12
+ File.open f, 'w+'
13
+ end
14
+
15
+ Then /^the file should be uploaded$/ do
16
+ end
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ $:.unshift File.expand_path('../../../bin', __FILE__)
5
+ $:.unshift File.expand_path('../../../lib', __FILE__)
6
+
7
+ require 'jaxx'
8
+ require 'cucumber'
9
+ require 'aruba'
10
+ require 'aruba/cucumber'
11
+ require 'rspec'
12
+ require 'rspec/core'
13
+ require 'cucumber/rspec/doubles'
14
+ require File.expand_path('../../../spec/helpers/service', __FILE__)
15
+
16
+ World(ServiceHelper)
17
+
18
+ Before do
19
+ @aruba_timeout_seconds = 5
20
+ end
@@ -0,0 +1,31 @@
1
+ Feature: As a CLI user I want to upload a file to S3
2
+
3
+ Scenario: Show CLI help with -h
4
+ When I run `jaxx-upload -h`
5
+ Then the exit status should be 0
6
+ And the output should contain "jaxx [options]"
7
+
8
+ Scenario: Show CLI help with --help
9
+ When I run `jaxx-upload --help`
10
+ Then the exit status should be 0
11
+ And the output should contain "jaxx [options]"
12
+
13
+ Scenario: Uploading a single file with missing bucket
14
+ When I run `jaxx-upload --bucket `
15
+ Then the exit status should be 1
16
+ And the output should contain "bucket is required"
17
+
18
+ Scenario: Uploading a single file non-existing file
19
+ When I run `jaxx-upload --file foo.txt`
20
+ Then the exit status should be 1
21
+ And the output should contain "file exists returned false"
22
+
23
+ Scenario: Uploading a single file with missing file
24
+ When I run `jaxx-upload --file`
25
+ Then the exit status should be 1
26
+ And the output should contain "file presence is required"
27
+
28
+ Scenario: Downloading a single file with missing credentials
29
+ When I run `jaxx-upload --bucket foo`
30
+ Then the exit status should be 1
31
+ And the output should contain "credentials for access key and access secret required"
data/jaxx.gemspec CHANGED
@@ -21,4 +21,7 @@ Gem::Specification.new do |gem|
21
21
  gem.add_development_dependency 'guard-rspec'
22
22
  gem.add_development_dependency 'rspec'
23
23
  gem.add_development_dependency 'fakeweb'
24
+ gem.add_development_dependency 'cucumber'
25
+ gem.add_development_dependency 'aruba'
26
+ gem.add_development_dependency 'guard-cucumber'
24
27
  end
data/lib/jaxx/cli.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'optparse'
2
+ require 'jaxx'
3
+
4
+ module Jaxx
5
+ module CLI
6
+
7
+ def self.execute meth, args
8
+ parser.parse!(args)
9
+ options.empty? ? (STDOUT.write(parser) and exit) : Jaxx.send(meth, options)
10
+ rescue RuntimeError => exc
11
+ exit 1
12
+ end
13
+
14
+ def self.parser
15
+ OptionParser.new do |o|
16
+ o.banner = "jaxx [options]"
17
+
18
+ o.on('-b', '--bucket [BUCKET]') { |b| options['bucket'] = b }
19
+ o.on('-k', '--access-key [ACCESS_KEY]') { |k| options['access_key'] = k }
20
+ o.on('-s', '--access-secret [ACCESS_SECRET]') { |s| options['access_secret'] = s }
21
+ o.on('-f', '--file [FILE]') { |f| options['file'] = f }
22
+ o.on('-p', '--privacy [PRIVACY]') { |p| options['privacy'] = p }
23
+ o.on('-h', '--help') { puts o }
24
+ end
25
+ end
26
+
27
+ def self.options
28
+ @options ||= {}
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ require 'jaxx/process'
2
+
3
+ module Jaxx
4
+ class Download
5
+
6
+ attr_reader :process
7
+
8
+ def initialize args = {}
9
+ @process = Process.new(args)
10
+ end
11
+
12
+ def execute
13
+ process.start do |storage|
14
+ directory = storage.directories.get(process.bucket)
15
+ File.open(File.basename(process.file), 'wb') do |file|
16
+ directory.files.get(process.file) do |chunk, byt_remain, byt_total|
17
+ file.write(chunk)
18
+ complete = (((byt_total-byt_remain).to_f/byt_total) * 100)
19
+ Jaxx.logger.info "Saving file: %.2f percent complete.\r" % complete
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -9,7 +9,7 @@ module Jaxx
9
9
  DEFAULT_ARGS = {
10
10
  'service_domain' => '169.254.169.254',
11
11
  'service_path' => '/latest/meta-data/iam/security-credentials/default',
12
- 'service_timeout' => 5
12
+ 'service_timeout' => 1
13
13
  }
14
14
 
15
15
  attr_reader :service_domain, :service_path, :service_timeout
@@ -25,12 +25,23 @@ module Jaxx
25
25
  def credentials
26
26
  return @credentials unless @credentials.nil?
27
27
 
28
+ response = credential_response
29
+
30
+ @credentials = {
31
+ :access_key => response['AccessKeyId'],
32
+ :access_secret => response['SecretAccessKey'],
33
+ :code => response['Code']
34
+ }
35
+ rescue Errno::EHOSTDOWN, Errno::EHOSTUNREACH, Timeout::Error => exc
36
+ @credentials = { :access_key => nil, :access_secret => nil, :code => 'Failure' }
37
+ end
38
+
39
+ private
40
+
41
+ def credential_response
28
42
  http = Net::HTTP.new service_domain
29
43
  http.open_timeout = http.read_timeout = service_timeout
30
- resp = JSON.parse http.get(service_path).body
31
- @credentials = { :access_key => resp['AccessKeyId'], :access_secret => resp['SecretAccessKey'], :code => resp['Code'] }
32
- rescue Errno::EHOSTDOWN, Errno::EHOSTUNREACH, Timeout::Error
33
- @credentials = { :access_key => nil, :access_secret => nil, :code => 'Failure' }
44
+ JSON.parse http.get(service_path).body
34
45
  end
35
46
  end
36
47
  end
@@ -0,0 +1,89 @@
1
+ require 'fog'
2
+
3
+ module Jaxx
4
+ class Process
5
+
6
+ PRIVACIES = %w[public private]
7
+
8
+ attr_reader :bucket, :access_key, :access_secret, :file, :privacy, :validations
9
+
10
+ def initialize args = {}
11
+ @bucket, @access_key, @access_secret, @file, @privacy = args.values_at 'bucket', 'access_key', 'access_secret', 'file', 'privacy', 'validations'
12
+ @validations = [:bucket, :credentials, :file_presence] + (args['validations'] || [])
13
+ end
14
+
15
+ def privacy
16
+ @privacy || 'private'
17
+ end
18
+
19
+ def private?
20
+ privacy.to_s == 'private'
21
+ end
22
+
23
+ def public?
24
+ !private?
25
+ end
26
+
27
+ def credentials
28
+ return @credentials unless @credentials.nil?
29
+
30
+ key, secret = access_key.to_s, access_secret.to_s
31
+ if (key.empty? or secret.empty?) and Jaxx.environment.ami?
32
+ key, secret = Jaxx.environment.credentials.values_at :access_key, :access_secret
33
+ end
34
+ @credentials = { access_key: key, access_secret: secret }
35
+ end
36
+
37
+ def start &block
38
+ errs = errors
39
+
40
+ ["Unable to process transaction", format_errors(errs)].flatten.each do |msg|
41
+ Jaxx.logger.warn msg
42
+ end and raise(RuntimeError) unless errs.empty?
43
+
44
+ block.call(storage)
45
+ end
46
+
47
+ def validate
48
+ validations.inject({}) do |hsh, name|
49
+ validation = send("validate_#{name}")
50
+ hsh[name] = validation unless validation.nil?
51
+ hsh
52
+ end
53
+ end
54
+
55
+ alias :errors :validate
56
+
57
+ private
58
+
59
+ def storage
60
+ @storage ||= Fog::Storage::AWS.new :aws_access_key_id => credentials[:access_key],
61
+ :aws_secret_access_key => credentials[:access_secret],
62
+ :use_iam_profile => Jaxx.environment.ami?
63
+ end
64
+
65
+ def validate_bucket
66
+ "is required" if bucket.to_s.empty?
67
+ end
68
+
69
+ def validate_file_presence
70
+ "is required" if file.to_s.empty?
71
+ end
72
+
73
+ def validate_file_exists
74
+ "returned false" unless File.exist?(file.to_s)
75
+ end
76
+
77
+ def validate_credentials
78
+ "for access key and access secret required" if credentials[:access_key].empty? or credentials[:access_secret].empty?
79
+ end
80
+
81
+ def validate_privacy
82
+ "#{privacy} is not supported" unless PRIVACIES.include?(privacy.to_s)
83
+ end
84
+
85
+ def format_errors(errs)
86
+ errs.collect {|name, msg| [name.to_s.gsub(/_/, ' '), msg].join(' ') }
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,21 @@
1
+ require 'jaxx/process'
2
+
3
+ module Jaxx
4
+ class Upload
5
+
6
+ attr_reader :process
7
+
8
+ def initialize args = {}
9
+ @process = Process.new(args.merge('validations' => [:privacy, :file_exists]))
10
+ end
11
+
12
+ def execute
13
+ process.start do |storage|
14
+ directory = storage.directories.get(process.bucket)
15
+ directory ||= storage.directories.create(:key => process.bucket, :public => process.public?)
16
+ directory.files.create(:key => File.basename(process.file), :body => File.read(process.file), :public => process.public?)
17
+ end
18
+ end
19
+
20
+ end
21
+ end
data/lib/jaxx/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jaxx
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/jaxx.rb CHANGED
@@ -1,14 +1,26 @@
1
1
  require "jaxx/version"
2
- require "jaxx/transaction"
3
2
  require "jaxx/environment"
3
+ require "jaxx/upload"
4
+ require "jaxx/download"
5
+ require "logger"
4
6
 
5
7
  module Jaxx
6
8
 
7
- def self.save args = {}
8
- Jaxx::Transaction.new(args).process
9
+ def self.upload args = {}
10
+ Jaxx::Upload.new(args).execute
11
+ end
12
+
13
+ def self.download args = {}
14
+ Jaxx::Download.new(args).execute
9
15
  end
10
16
 
11
17
  def self.environment
12
18
  @environment ||= Environment.new
13
19
  end
20
+
21
+ def self.logger log = nil
22
+ @logger = log if log
23
+ @logger ||= Logger.new(STDOUT)
24
+ @logger
25
+ end
14
26
  end
@@ -1,3 +1,5 @@
1
+ require 'fakeweb'
2
+
1
3
  module ServiceHelper
2
4
 
3
5
  def stub_credentials_service
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'fog/aws/models/storage/directories'
3
+
4
+ module Jaxx
5
+ describe Download do
6
+
7
+ describe "#process" do
8
+ let(:args) { ({ 'access_key' => 'foo', 'access_secret' => 'bar', 'file' => File.expand_path('bar.txt', __FILE__), 'bucket' => 'temp' }) }
9
+
10
+ subject { described_class.new(args) }
11
+
12
+ it "sends file to storage" do
13
+ Fog.mock!
14
+
15
+ directory = double('directory', :files => double('files'))
16
+ directory.files.should_receive(:get).with(args['file'])
17
+ Fog::Storage::AWS::Directories.any_instance.stub(:get).with(args['bucket']).and_return(directory)
18
+
19
+ subject.execute
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -2,10 +2,10 @@ require 'spec_helper'
2
2
  require 'fog/aws/models/storage/directory'
3
3
 
4
4
  module Jaxx
5
- describe Transaction do
5
+ describe Process do
6
6
 
7
7
  it "raises RuntimeError on invalid process" do
8
- -> { described_class.new.process }.should raise_error(RuntimeError)
8
+ -> { described_class.new.start }.should raise_error(RuntimeError)
9
9
  end
10
10
 
11
11
  it "accepts bucket" do
@@ -32,31 +32,39 @@ module Jaxx
32
32
  end
33
33
 
34
34
  context "passing a file path" do
35
-
35
+ let(:file) { nil }
36
+
37
+ subject { described_class.new('file' => file) }
38
+
36
39
  it "raises error on missing file" do
37
- described_class.new.errors.should include(:file => "given cannot be processed")
40
+ subject.errors.should include(:file_presence => "is required")
38
41
  end
39
42
 
40
43
  it "includes error when file does not exist" do
41
44
  file = "foo"
42
- described_class.new('file' => file).errors.should include(:file => "given cannot be processed")
45
+ subject.errors.should include(:file_presence => "is required")
43
46
  end
44
47
 
45
48
  it "includes error when path is empty" do
46
- described_class.new('file' => "").errors.should include(:file => "given cannot be processed")
49
+ file = ""
50
+ subject.errors.should include(:file_presence => "is required")
47
51
  end
48
52
  end
49
53
 
50
- it "accepts privacy level" do
51
- described_class.new('privacy' => 'private').privacy.should == 'private'
52
- end
54
+ describe "privacy" do
53
55
 
54
- it "defaults privacy level to private" do
55
- described_class.new.privacy.should == 'private'
56
- end
56
+ it "accepts privacy level" do
57
+ described_class.new('privacy' => 'public', 'validations' => [:privacy]).privacy.should == 'public'
58
+ end
59
+
60
+ it "defaults privacy level to private" do
61
+ described_class.new('validations' => [:privacy]).privacy.should == 'private'
62
+ end
63
+
64
+ it "raises error on invalid privacy level" do
65
+ described_class.new('privacy' => 'foo', 'validations' => [:privacy]).errors.should include(:privacy => "foo is not supported")
66
+ end
57
67
 
58
- it "raises error on invalid privacy level" do
59
- described_class.new('privacy' => 'foo').errors.should include(:privacy => "foo is not supported")
60
68
  end
61
69
 
62
70
  context "non-ami environment" do
@@ -85,20 +93,5 @@ module Jaxx
85
93
  end
86
94
  end
87
95
 
88
- describe "#process" do
89
- let(:args) { ({ 'access_key' => 'foo', 'access_secret' => 'bar', 'file' => File.expand_path('bar.txt', __FILE__), 'bucket' => 'temp' }) }
90
-
91
- subject { described_class.new(args) }
92
-
93
- it "sends file to storage" do
94
- Fog.mock!
95
-
96
- File.stub(:exist?).with(args['file']).and_return(true)
97
- File.should_receive(:read).with(args['file']).and_return("")
98
- File.should_receive(:basename).with(args['file']).and_return('bar.txt')
99
-
100
- subject.process
101
- end
102
- end
103
96
  end
104
97
  end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ module Jaxx
4
+ describe Upload do
5
+
6
+ describe "#process" do
7
+ let(:args) { ({ 'access_key' => 'foo', 'access_secret' => 'bar', 'file' => File.expand_path('bar.txt', __FILE__), 'bucket' => 'temp' }) }
8
+
9
+ subject { described_class.new(args) }
10
+
11
+ it "sends file to storage" do
12
+ Fog.mock!
13
+
14
+ File.stub(:exist?).with(args['file']).and_return(true)
15
+ File.should_receive(:read).with(args['file']).and_return("")
16
+ File.should_receive(:basename).with(args['file']).and_return('bar.txt')
17
+
18
+ subject.execute
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -1,15 +1,19 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Jaxx do
4
+
5
+ it ".upload" do
6
+ upload = double 'upload'
7
+ Jaxx::Upload.should_receive(:new).and_return(upload)
8
+ upload.should_receive(:execute)
9
+ Jaxx.upload
10
+ end
4
11
 
5
- describe ".save" do
6
-
7
- it "creates a new transaction" do
8
- trans = double 'trans', :process => true
9
- Jaxx::Transaction.should_receive(:new).and_return(trans)
10
- Jaxx.save
11
- end
12
-
12
+ it ".upload" do
13
+ download = double 'download'
14
+ Jaxx::Download.should_receive(:new).and_return(download)
15
+ download.should_receive(:execute)
16
+ Jaxx.download
13
17
  end
14
18
 
15
19
  describe ".environment" do
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,15 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
- require 'fakeweb'
3
+
4
4
  $:.unshift File.expand_path('../lib', __FILE__)
5
5
  require 'jaxx'
6
+ require 'rspec'
6
7
 
7
8
  require_relative 'helpers/service'
8
9
 
10
+ Jaxx.logger Logger.new('log/test.log')
11
+
9
12
  RSpec.configure do |c|
10
13
  c.include ServiceHelper
11
- c.after(:each) do
12
- FakeWeb.clean_registry
13
- end
14
+ c.after(:each) { FakeWeb.clean_registry }
14
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jaxx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-18 00:00:00.000000000 Z
12
+ date: 2013-01-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -107,11 +107,60 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: cucumber
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: aruba
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: guard-cucumber
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
110
158
  description: Command line wrapper for pushing files to S3
111
159
  email:
112
160
  - marcky.sharky@googlemail.com
113
161
  executables:
114
- - jaxx
162
+ - jaxx-download
163
+ - jaxx-upload
115
164
  extensions: []
116
165
  extra_rdoc_files: []
117
166
  files:
@@ -122,15 +171,25 @@ files:
122
171
  - LICENSE
123
172
  - README.md
124
173
  - Rakefile
125
- - bin/jaxx
174
+ - bin/jaxx-download
175
+ - bin/jaxx-upload
176
+ - features/download.feature
177
+ - features/step_definitions/global_steps.rb
178
+ - features/support/env.rb
179
+ - features/upload.feature
126
180
  - jaxx.gemspec
127
181
  - lib/jaxx.rb
182
+ - lib/jaxx/cli.rb
183
+ - lib/jaxx/download.rb
128
184
  - lib/jaxx/environment.rb
129
- - lib/jaxx/transaction.rb
185
+ - lib/jaxx/process.rb
186
+ - lib/jaxx/upload.rb
130
187
  - lib/jaxx/version.rb
131
188
  - spec/helpers/service.rb
189
+ - spec/lib/jaxx/download_spec.rb
132
190
  - spec/lib/jaxx/environment_spec.rb
133
- - spec/lib/jaxx/transaction_spec.rb
191
+ - spec/lib/jaxx/process_spec.rb
192
+ - spec/lib/jaxx/upload_spec.rb
134
193
  - spec/lib/jaxx_spec.rb
135
194
  - spec/spec_helper.rb
136
195
  homepage: https://github.com/marckysharky/jaxx
@@ -147,7 +206,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
206
  version: '0'
148
207
  segments:
149
208
  - 0
150
- hash: -94777366135890808
209
+ hash: -522064426156595131
151
210
  required_rubygems_version: !ruby/object:Gem::Requirement
152
211
  none: false
153
212
  requirements:
@@ -156,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
215
  version: '0'
157
216
  segments:
158
217
  - 0
159
- hash: -94777366135890808
218
+ hash: -522064426156595131
160
219
  requirements: []
161
220
  rubyforge_project:
162
221
  rubygems_version: 1.8.24
@@ -164,8 +223,14 @@ signing_key:
164
223
  specification_version: 3
165
224
  summary: RubyGems to allow any file to be pushed to S3 in the simplist way
166
225
  test_files:
226
+ - features/download.feature
227
+ - features/step_definitions/global_steps.rb
228
+ - features/support/env.rb
229
+ - features/upload.feature
167
230
  - spec/helpers/service.rb
231
+ - spec/lib/jaxx/download_spec.rb
168
232
  - spec/lib/jaxx/environment_spec.rb
169
- - spec/lib/jaxx/transaction_spec.rb
233
+ - spec/lib/jaxx/process_spec.rb
234
+ - spec/lib/jaxx/upload_spec.rb
170
235
  - spec/lib/jaxx_spec.rb
171
236
  - spec/spec_helper.rb
data/bin/jaxx DELETED
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env ruby
2
- #
3
- require 'optparse'
4
- $:.unshift File.expand_path('../../lib', __FILE__)
5
- opts = {}
6
- OptionParser.new do |o|
7
- o.banner = "Jaxx file distributor: jaxx [options]"
8
-
9
- o.on('-b', '--bucket BUCKET') { |b| opts['bucket'] = b }
10
- o.on('-k', '--access-key [ACCESS_KEY]') { |k| opts['access_key'] = k }
11
- o.on('-s', '--access-secret [ACCESS_SECRET]') { |s| opts['access_secret'] = s }
12
- o.on('-f', '--file FILE') { |f| opts['file'] = f }
13
- o.on('-p', '--privacy [PRIVACY]') { |p| opts['privacy'] = p }
14
- o.on('-h', '--help') { puts o; exit }
15
- end.parse!
16
-
17
- require 'jaxx'
18
- Jaxx.save(opts)
@@ -1,85 +0,0 @@
1
- require 'fog'
2
-
3
- module Jaxx
4
-
5
- class Transaction
6
-
7
- PRIVACIES = %w[public private]
8
-
9
- attr_reader :bucket, :access_key, :access_secret, :file, :privacy
10
-
11
- def initialize args = {}
12
- @bucket, @access_key, @access_secret, @file, @privacy = args.values_at 'bucket', 'access_key', 'access_secret', 'file', 'privacy'
13
- end
14
-
15
- def privacy
16
- @privacy || 'private'
17
- end
18
-
19
- def private?
20
- privacy.to_s == 'private'
21
- end
22
-
23
- def public?
24
- !private?
25
- end
26
-
27
- def credentials
28
- return @credentials unless @credentials.nil?
29
-
30
- key, secret = access_key.to_s, access_secret.to_s
31
- if Jaxx.environment.ami? and (key.empty? or secret.empty?)
32
- creds = Jaxx.environment.credentials
33
- key = creds[:access_key]
34
- secret = creds[:access_secret]
35
- end
36
- @credentials = { access_key: key, access_secret: secret }
37
- end
38
-
39
- def process
40
- errs = errors
41
- if errs.empty?
42
- remote_directory.files.create(:key => File.basename(file), :body => File.read(file), :public => public?)
43
- else
44
- raise RuntimeError, "Unable to process transaction: #{errs.inspect}"
45
- end
46
- end
47
-
48
- def validate
49
- err = {}
50
- err[:bucket] = "is required" unless validate_bucket
51
- err[:file] = "given cannot be processed" unless validate_file
52
- err[:credentials] = "for access key and access secret required" unless validate_credentials
53
- err[:privacy] = "#{privacy} is not supported" unless validate_privacy
54
- err
55
- end
56
-
57
- alias :errors :validate
58
-
59
- private
60
-
61
- def remote_directory
62
- s3 = Fog::Storage::AWS.new :aws_access_key_id => credentials[:access_key], :aws_secret_access_key => credentials[:access_secret], :use_iam_profile => Jaxx.environment.ami?
63
- dir = s3.directories.get(bucket)
64
- dir ||= s3.directories.create(:key => bucket, :public => public?)
65
- dir
66
- end
67
-
68
- def validate_bucket
69
- !bucket.to_s.empty?
70
- end
71
-
72
- def validate_file
73
- !file.to_s.empty? and File.exist?(file.to_s)
74
- end
75
-
76
- def validate_credentials
77
- !credentials[:access_key].empty? and !credentials[:access_secret].empty?
78
- end
79
-
80
- def validate_privacy
81
- PRIVACIES.include?(privacy.to_s)
82
- end
83
-
84
- end
85
- end