yanker 0.0.3

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 13887aa6fa62ccf09e53e0248663081bad125814
4
+ data.tar.gz: d93cb5185b8a74c0cf432e9aaad6b5228ea869c2
5
+ SHA512:
6
+ metadata.gz: 539b675e7e949de24edf700e672264d1e12ced4f775465d344df2396e28684b1356d0cd099cb4e29593e619da4c017bfffb763c6cc457bacbc9036d46b60cece
7
+ data.tar.gz: c6ac8603280bf4508f35dca515a29233bffc00c82a92407c97f0f3011a24d7f82eb99b356981cd1e6fa89bfaadbc4632402fc6d414b1f1a2a243a79457c5bae4
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ s3.yaml
2
+ Gemfile.lock
3
+ coverage/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ script: "rake"
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'http://rubygems.org'
2
+
3
+ group :test do
4
+ gem 'rake'
5
+ gem 'rspec'
6
+ gem 'simplecov'
7
+ gem 'ZenTest'
8
+ gem 'autotest-fsevent'
9
+ gem 'debugger'
10
+ gem 'coveralls', :require => false
11
+ end
12
+
13
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Noah Chase
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ Dwemthy's Cloud File Uploader
2
+ =============================
3
+
4
+ A simple file uploader that uses Amazon S3 for remote storage.
5
+
6
+ [![Build Status](https://travis-ci.org/nchase/file_uploader.png?branch=master)](https://travis-ci.org/nchase/file_uploader) [![Coverage Status](https://coveralls.io/repos/nchase/file_uploader/badge.png?branch=master)](https://coveralls.io/r/nchase/file_uploader)
7
+
8
+
9
+ Be sure to run and use the specs! autotest has been included if you're into that kind of thing.
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require 'rake/testtask'
2
+ require 'rspec/core/rake_task'
3
+ require 'bundler'
4
+
5
+ task :default => :spec
6
+
7
+ Rake::TestTask.new do |task|
8
+ task.libs << "test"
9
+ task.test_files = FileList['test/test*.rb']
10
+ task.verbose = true
11
+ end
12
+
13
+ RSpec::Core::RakeTask.new(:spec)
14
+
15
+ task :coverage do
16
+ `rake spec`
17
+ `open coverage/index.html`
18
+ end
19
+
20
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1 @@
1
+ Autotest.add_discovery { "rspec2" }
data/bin/upload.rb ADDED
@@ -0,0 +1,10 @@
1
+ require_relative '../lib/resource'
2
+
3
+
4
+ if (!ARGV[0].match(/^http/))
5
+ resource = FileUploader::Resource.create(File.open(ARGV[0]))
6
+ else
7
+ resource = FileUploader::Resource.create(ARGV[0])
8
+ end
9
+
10
+ resource.send
data/config/s3.yaml ADDED
@@ -0,0 +1,3 @@
1
+ access_key_id: <your_key>
2
+ secret_access_key: <your_secret>
3
+ bucket: <your_bucket>
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'file_uploader/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "yanker"
8
+ spec.version = FileUploader::VERSION
9
+ spec.authors = ["Noah Chase"]
10
+ spec.email = ["nchase@gmail.com"]
11
+ spec.description = %q{a little file uploader}
12
+ spec.summary = %q{uploads files}
13
+ spec.homepage = "http://github.com/nchase/file_uploader"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'mime-types'
22
+ spec.add_dependency 'aws-s3'
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ end
@@ -0,0 +1,3 @@
1
+ module FileUploader
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "file_uploader/version"
2
+ require "resource"
3
+
4
+ module FileUploader
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,47 @@
1
+ module FileUploader
2
+ class Resource
3
+ include S3Resource
4
+
5
+ require 'mime-types'
6
+ require 'digest/md5'
7
+ require 'fileutils'
8
+
9
+ attr_accessor :tempfile
10
+
11
+ def self.create(resource)
12
+ if resource.class == File
13
+ return FileUploader::FileResource.new(resource)
14
+ end
15
+
16
+ FileUploader::HTTPResource.new(resource)
17
+ end
18
+
19
+ def initialize(resource)
20
+ @file = resource
21
+ end
22
+
23
+ def extension
24
+ self.uri.chomp.downcase.gsub(/.*\./o, '')
25
+ end
26
+
27
+ def path
28
+ @file.path
29
+ end
30
+
31
+ def uri
32
+ @file
33
+ end
34
+
35
+ def mime_type(uri)
36
+ clean_uri = uri.split("?").first
37
+
38
+ MIME::Types.type_for(clean_uri).first
39
+ end
40
+
41
+ def destroy
42
+ # destroys local temporary file
43
+
44
+ FileUtils.rm(self.tempfile)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,19 @@
1
+ module FileUploader
2
+ class FileResource < Resource
3
+ def initialize(resource)
4
+ super
5
+
6
+ FileUtils.copy(self.uri, self.basename)
7
+
8
+ self.tempfile = File.open(self.basename)
9
+ end
10
+
11
+ def uri
12
+ self.path
13
+ end
14
+
15
+ def basename
16
+ File.basename(@file)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ module FileUploader
2
+ class HTTPResource < Resource
3
+ require 'net/http'
4
+
5
+ def initialize(resource)
6
+ super
7
+
8
+ status, file = Net::HTTP.get_response(URI.parse(self.uri))
9
+
10
+ File.open(self.basename, 'wb') do |open_file|
11
+ open_file.print(file)
12
+ end
13
+
14
+ self.tempfile = File.open(self.basename)
15
+ end
16
+
17
+ def basename
18
+ File.basename(self.uri)
19
+ end
20
+
21
+ def path
22
+ File.realdirpath(self.tempfile)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,36 @@
1
+ require 'aws/s3'
2
+ require 'yaml'
3
+
4
+ module S3Resource
5
+ S3_CONFIG = YAML.load_file(File.expand_path('../../../config/s3.yaml', __FILE__))
6
+ S3_KEY = S3_CONFIG['access_key_id']
7
+ S3_SECRET = S3_CONFIG['secret_access_key']
8
+ S3_BUCKET = S3_CONFIG['bucket']
9
+
10
+ class S3Object < AWS::S3::S3Object
11
+ set_current_bucket_to S3_BUCKET
12
+ end
13
+
14
+ def destroy_s3
15
+ S3Object.delete(self.basename)
16
+ end
17
+
18
+ def send(arguments = {})
19
+ key = arguments[:key] || S3_KEY
20
+ secret = arguments[:secret] || S3_SECRET
21
+ bucket = arguments[:bucket] || S3_BUCKET
22
+
23
+ AWS::S3::Base.establish_connection!(
24
+ :access_key_id => key,
25
+ :secret_access_key => secret
26
+ )
27
+
28
+ S3Object.store(
29
+ self.basename,
30
+ File.open(self.path),
31
+ S3_BUCKET,
32
+ :access => :public_read,
33
+ :use_virtual_directories => true
34
+ )
35
+ end
36
+ end
data/lib/resource.rb ADDED
@@ -0,0 +1,4 @@
1
+ require_relative 'resource/resource_s3'
2
+ require_relative 'resource/resource'
3
+ require_relative 'resource/resource_file'
4
+ require_relative 'resource/resource_http'
@@ -0,0 +1,77 @@
1
+ require 'debugger'
2
+ require 'resource'
3
+
4
+ describe FileUploader::Resource do
5
+ FILENAME = "c43a8cbe52fecbe6fa25f0b85abb44f6_o.jpg"
6
+ PARAM = "?#{Time.now.to_i}&whyisthisurlsoLong=true&thisistotallyaRealURI.bleh"
7
+
8
+ before(:each) do
9
+ resource_file = File.open(File.expand_path("../../test/fixtures/#{FILENAME}", __FILE__))
10
+ resource_url = "http://content.internetvideoarchive.com/content/photos/6894/28955235_.jpg"
11
+
12
+ @resource_file = FileUploader::Resource.create(resource_file)
13
+ @resource_url = FileUploader::Resource.create(resource_url)
14
+ @resources = [@resource_file, @resource_url]
15
+ end
16
+
17
+ after(:each) do
18
+ @resources.each { |resource| resource.destroy }
19
+ end
20
+
21
+ it "knows its extension" do
22
+ @resources.each { |resource|
23
+ expect(resource.extension).to eq('jpg')
24
+ }
25
+ end
26
+
27
+ it "even knows its extension when URL has fairly-funky params" do
28
+ @resources.each { |resource|
29
+ expect(paramify(resource.extension).split("?").first.match(/(\?|\.|&)/)).to be_nil
30
+ }
31
+ end
32
+
33
+ it "knows its mimetype" do
34
+ @resources.each { |resource|
35
+ expect(resource.mime_type(paramify(resource.uri))).to eq("image/jpeg")
36
+ }
37
+ end
38
+
39
+ it "has a reasonable basename, no matter where it's from" do
40
+ @resources.each { |resource|
41
+ expect(resource.basename).to be_a_kind_of(String)
42
+ }
43
+ end
44
+
45
+ it "generates a local tempfile, no matter where it's from" do
46
+ @resources.each { |resource|
47
+ expect(File.exist?(resource.basename)).to be_true
48
+ }
49
+ end
50
+
51
+ it "knows it's local path" do
52
+ expect(@resource_url.path).to eq(File.realdirpath(@resource_url.tempfile))
53
+ end
54
+
55
+ it "mock-sends to the datastore" do
56
+ stub_const("S3_KEY", "your_key")
57
+ stub_const("S3_SECRET", "your_secret")
58
+ stub_const("S3_BUCKET", "your_bucketname")
59
+
60
+ class S3Object < AWS::S3::S3Object
61
+ set_current_bucket_to S3_BUCKET
62
+ end
63
+
64
+ @resources.each { |resource|
65
+ resource.stub(:send).and_return(true)
66
+ resource.send(S3_KEY, S3_SECRET, S3_BUCKET)
67
+
68
+ S3Object.stub(:exists?).and_return(true)
69
+
70
+ expect(S3Object.exists?(resource.basename)).to be_true
71
+ }
72
+ end
73
+
74
+ def paramify(string)
75
+ string + PARAM
76
+ end
77
+ end
@@ -0,0 +1,4 @@
1
+ require 'coveralls'
2
+ require 'simplecov'
3
+ Coveralls.wear!
4
+ SimpleCov.start
Binary file
@@ -0,0 +1,66 @@
1
+ require 'test/unit'
2
+ require 'debugger'
3
+
4
+ require_relative '../lib/resource'
5
+
6
+ class TestResource < Test::Unit::TestCase
7
+ FILENAME = "c43a8cbe52fecbe6fa25f0b85abb44f6_o.jpg"
8
+ PARAM = "?#{Time.now.to_i}&whyisthisurlsoLong=true&thisistotallyaRealURI.bleh"
9
+
10
+ def setup
11
+ resource_file = File.open(File.expand_path("../../test/fixtures/#{FILENAME}", __FILE__))
12
+ resource_url = "http://content.internetvideoarchive.com/content/photos/6894/28955235_.jpg"
13
+
14
+ @resource_file = FileUploader::Resource.create(resource_file)
15
+ @resource_url = FileUploader::Resource.create(resource_url)
16
+ @resources = [@resource_file, @resource_url]
17
+ end
18
+
19
+ def teardown
20
+ @resources.each { |resource| resource.destroy }
21
+ end
22
+ end
23
+
24
+ class TestBaseMethods < TestResource
25
+ def test_uri_is_string
26
+ @resources.each { |resource|
27
+ assert_equal(resource.uri.class, String, "test uri is a string")
28
+ }
29
+ end
30
+
31
+ def test_additional_uri_params
32
+ @resources.each { |resource|
33
+ assert_equal(nil, paramify(resource.extension).split("?").first.match(/(\?|\.|&)/), "uri is properly split on extension")
34
+ }
35
+ end
36
+
37
+ def test_extension
38
+ @resources.each { |resource|
39
+ assert_equal("jpg", resource.extension, "resource knows its extension")
40
+ }
41
+ end
42
+
43
+ def test_uri_mimetype_is_expected
44
+ @resources.each { |resource|
45
+ assert_equal(resource.mime_type(paramify(@resource_file.uri)), "image/jpeg")
46
+ }
47
+ end
48
+
49
+ def test_uuid_is_expected
50
+ # note: this might not actually be globally unique.
51
+ # figure out whether or not this is true and improve
52
+ # if necessary.
53
+
54
+ assert_equal("4381aa9d0489dc3bd0096bfac7364629", @resource_file.pseudo_uuid)
55
+ # we need another test here for http resources.
56
+ end
57
+
58
+ def test_file_basename_is_correct
59
+ assert_equal(FILENAME, @resource_file.basename)
60
+ end
61
+
62
+ def paramify(string)
63
+ string + PARAM
64
+ end
65
+ end
66
+
@@ -0,0 +1,27 @@
1
+ require_relative 'test_resource'
2
+
3
+ class TestDataStore < TestResource
4
+ S3_CONFIG = YAML.load_file(File.expand_path('../../config/s3.yaml', __FILE__))
5
+ S3_KEY = S3_CONFIG['access_key_id']
6
+ S3_SECRET = S3_CONFIG['secret_access_key']
7
+ S3_BUCKET = S3_CONFIG['bucket']
8
+
9
+ class S3Object < AWS::S3::S3Object
10
+ set_current_bucket_to S3_BUCKET
11
+ end
12
+
13
+ def teardown
14
+ @resources.each { |resource|
15
+ resource.destroy
16
+ resource.destroy_s3
17
+ }
18
+ end
19
+
20
+ def test_sends_to_datastore
21
+ @resources.each { |resource|
22
+ resource.send(S3_KEY, S3_SECRET, S3_BUCKET)
23
+
24
+ assert(S3Object.exists?(resource.basename))
25
+ }
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'test_resource'
2
+
3
+ class TestTempFiles < TestResource
4
+ def test_temp_files_for_local
5
+ assert(File.exist?(@resource_file.basename))
6
+ end
7
+
8
+ def test_temp_files_for_http
9
+ assert(File.exist?(@resource_url.basename))
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yanker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Noah Chase
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mime-types
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-s3
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'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: a little file uploader
70
+ email:
71
+ - nchase@gmail.com
72
+ executables:
73
+ - upload.rb
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - .rspec
79
+ - .travis.yml
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - autotest/discover.rb
85
+ - bin/upload.rb
86
+ - config/s3.yaml
87
+ - file_uploader.gemspec
88
+ - lib/file_uploader.rb
89
+ - lib/file_uploader/version.rb
90
+ - lib/resource.rb
91
+ - lib/resource/resource.rb
92
+ - lib/resource/resource_file.rb
93
+ - lib/resource/resource_http.rb
94
+ - lib/resource/resource_s3.rb
95
+ - spec/resource_spec.rb
96
+ - spec/spec_helper.rb
97
+ - test/fixtures/Videodrome_poster.jpg
98
+ - test/fixtures/c43a8cbe52fecbe6fa25f0b85abb44f6_o.jpg
99
+ - test/fixtures/tumblr_mkbbve8idF1ry4cgeo1_1280.jpg
100
+ - test/test_resource.rb
101
+ - test/test_send_to_datastore.rb
102
+ - test/test_temp_files.rb
103
+ homepage: http://github.com/nchase/file_uploader
104
+ licenses:
105
+ - MIT
106
+ metadata: {}
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubyforge_project:
123
+ rubygems_version: 2.0.3
124
+ signing_key:
125
+ specification_version: 4
126
+ summary: uploads files
127
+ test_files:
128
+ - spec/resource_spec.rb
129
+ - spec/spec_helper.rb
130
+ - test/fixtures/Videodrome_poster.jpg
131
+ - test/fixtures/c43a8cbe52fecbe6fa25f0b85abb44f6_o.jpg
132
+ - test/fixtures/tumblr_mkbbve8idF1ry4cgeo1_1280.jpg
133
+ - test/test_resource.rb
134
+ - test/test_send_to_datastore.rb
135
+ - test/test_temp_files.rb