tupper 1.0.3 → 1.1.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.
- data/lib/tupper.rb +20 -6
- data/lib/tupper/errors.rb +5 -0
- data/lib/tupper/version.rb +1 -1
- data/sample/sample.rb +5 -1
- data/sample/views/form.erb +1 -0
- data/spec/tupper_spec.rb +47 -1
- metadata +9 -8
data/lib/tupper.rb
CHANGED
@@ -1,25 +1,34 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
|
2
|
+
require_relative "tupper/version"
|
3
|
+
require_relative "tupper/errors"
|
3
4
|
require 'json'
|
4
5
|
|
5
6
|
class Tupper
|
6
|
-
DEFAULT_TMP_DIR
|
7
|
+
DEFAULT_TMP_DIR = File.join(%w{ / tmp tupper })
|
8
|
+
DEFAULT_MAX_SIZE = 8 # MB
|
7
9
|
SESSION_STORE_KEY = 'tupper_file_info'
|
8
10
|
|
9
|
-
attr_reader :file_info
|
11
|
+
attr_reader :temp_dir, :file_info
|
12
|
+
attr_accessor :max_size
|
10
13
|
|
11
14
|
def initialize session
|
12
|
-
@
|
15
|
+
@max_size = DEFAULT_MAX_SIZE
|
16
|
+
@session = session
|
13
17
|
unless ((json = @session.fetch(SESSION_STORE_KEY, '')).empty?)
|
14
18
|
begin
|
15
19
|
@file_info = JSON.parse(json)
|
16
20
|
rescue
|
17
21
|
@session.delete(SESSION_STORE_KEY)
|
18
|
-
raise
|
22
|
+
raise Tupper::SessionError.new('invalid session data')
|
19
23
|
end
|
20
24
|
end
|
21
25
|
end
|
22
26
|
|
27
|
+
def configure &block
|
28
|
+
yield self
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
23
32
|
def temp_dir= temp_dir
|
24
33
|
FileUtils.mkdir_p temp_dir
|
25
34
|
@temp_dir = temp_dir
|
@@ -38,9 +47,14 @@ class Tupper
|
|
38
47
|
self.temp_dir = DEFAULT_TMP_DIR
|
39
48
|
end
|
40
49
|
|
50
|
+
if (file_size = File.size(file_info[:tempfile])) > max_size * 1024 * 1024
|
51
|
+
cleanup
|
52
|
+
raise FileSizeError.new("Uploaded file was too large. uploaded_size: #{file_size} bytes / max_size: #{max_size} MB")
|
53
|
+
end
|
54
|
+
|
41
55
|
file_hash = "#{Time.now.to_i}_#{Digest::MD5.hexdigest(file_info[:filename]).slice(0, 8)}"
|
42
56
|
uploaded_file = File.join(temp_dir, file_hash + File.extname(file_info[:filename]))
|
43
|
-
FileUtils.
|
57
|
+
FileUtils.cp(file_info[:tempfile], uploaded_file)
|
44
58
|
@file_info = {
|
45
59
|
'uploaded_file' => uploaded_file,
|
46
60
|
'original_file' => file_info[:filename],
|
data/lib/tupper/version.rb
CHANGED
data/sample/sample.rb
CHANGED
@@ -10,7 +10,11 @@ class Sample < Sinatra::Base
|
|
10
10
|
|
11
11
|
post '/upload' do
|
12
12
|
tupper = Tupper.new session
|
13
|
-
|
13
|
+
begin
|
14
|
+
tupper.upload params[:dummy_file]
|
15
|
+
rescue Tupper::FileSizeError
|
16
|
+
halt 500, 'uploaded file is too large.'
|
17
|
+
end
|
14
18
|
redirect '/', 302
|
15
19
|
end
|
16
20
|
|
data/sample/views/form.erb
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
<% if tupper.has_uploaded_file? %>
|
8
8
|
<hr>
|
9
9
|
<p>file <%= tupper.uploaded_file %> is uploaded.</p>
|
10
|
+
<p>original filename was <%= tupper.original_file %>.</p>
|
10
11
|
<p><a href="show_size">show size</a></p>
|
11
12
|
<form method="POST" action="/cleanup">
|
12
13
|
<input type="submit" value="cleanup">
|
data/spec/tupper_spec.rb
CHANGED
@@ -3,6 +3,7 @@ require 'bundler'
|
|
3
3
|
Bundler.setup(:default, :test)
|
4
4
|
require 'fakefs/spec_helpers'
|
5
5
|
require 'tupper'
|
6
|
+
require 'tupper/errors'
|
6
7
|
|
7
8
|
describe Tupper do
|
8
9
|
include FakeFS::SpecHelpers
|
@@ -21,10 +22,16 @@ describe Tupper do
|
|
21
22
|
Dir.exists?(@tupper.temp_dir).should be_true
|
22
23
|
@tupper.temp_dir.should == '/tmp/tupper'
|
23
24
|
end
|
25
|
+
it "should initialize max_size by default" do
|
26
|
+
@tupper.max_size.should == 8
|
27
|
+
end
|
24
28
|
end
|
25
29
|
|
26
30
|
context 'with invalid session data' do
|
27
|
-
specify {
|
31
|
+
specify {
|
32
|
+
expect { Tupper.new(Tupper::SESSION_STORE_KEY.to_s => 'invalid json') }
|
33
|
+
.to raise_error Tupper::SessionError
|
34
|
+
}
|
28
35
|
end
|
29
36
|
|
30
37
|
context 'with valid session data' do
|
@@ -33,6 +40,18 @@ describe Tupper do
|
|
33
40
|
end
|
34
41
|
end
|
35
42
|
|
43
|
+
describe '#configure' do
|
44
|
+
subject {
|
45
|
+
Tupper.new({}).configure do |tupper|
|
46
|
+
tupper.max_size = 16
|
47
|
+
tupper.temp_dir = '/tmp/hoge/piyo'
|
48
|
+
end
|
49
|
+
}
|
50
|
+
its(:max_size) { should == 16 }
|
51
|
+
its(:temp_dir) { should == '/tmp/hoge/piyo' }
|
52
|
+
specify { Dir.exists? '/tmp/hoge/piyo' }
|
53
|
+
end
|
54
|
+
|
36
55
|
describe '#temp_dir=' do
|
37
56
|
before do
|
38
57
|
@tupper = Tupper.new({})
|
@@ -52,6 +71,33 @@ describe Tupper do
|
|
52
71
|
end
|
53
72
|
end
|
54
73
|
|
74
|
+
describe '#upload' do
|
75
|
+
let(:test_dir) { '/tmp' }
|
76
|
+
let(:test_file) { File.join(test_dir, 'test_file') }
|
77
|
+
before do
|
78
|
+
@tupper = Tupper.new({}).configure { |t| t.max_size = 1 }
|
79
|
+
FileUtils.mkdir_p(test_dir)
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'file that smaller than or equal max size was uploaded' do
|
83
|
+
before do
|
84
|
+
File.open(test_file, 'w') { |f| f.write('*' * 1024 * 1024) }
|
85
|
+
@tupper.upload(tempfile: test_file, filename: 'dummy.txt')
|
86
|
+
end
|
87
|
+
specify { @tupper.should have_uploaded_file }
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'file that lager than max size was uploaded' do
|
91
|
+
before do
|
92
|
+
File.open(test_file, 'w') { |f| f.write('*' * 1024 * (1024 + 1)) }
|
93
|
+
end
|
94
|
+
specify {
|
95
|
+
expect { @tupper.upload(tempfile: test_file, filename: 'too_large_file.txt') }
|
96
|
+
.to raise_error Tupper::FileSizeError
|
97
|
+
}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
55
101
|
describe '#has_uploaded_file?' do
|
56
102
|
context 'before upload' do
|
57
103
|
subject { Tupper.new({}) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tupper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70092750614260 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70092750614260
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: fakefs
|
27
|
-
requirement: &
|
27
|
+
requirement: &70092750613820 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70092750613820
|
36
36
|
description: Tupper is a helper for processing uploaded file via web form.
|
37
37
|
email:
|
38
38
|
- kwappa.856@gmail.com
|
@@ -46,6 +46,7 @@ files:
|
|
46
46
|
- README.md
|
47
47
|
- Rakefile
|
48
48
|
- lib/tupper.rb
|
49
|
+
- lib/tupper/errors.rb
|
49
50
|
- lib/tupper/version.rb
|
50
51
|
- sample/Gemfile
|
51
52
|
- sample/config.ru
|
@@ -67,7 +68,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
67
68
|
version: '0'
|
68
69
|
segments:
|
69
70
|
- 0
|
70
|
-
hash:
|
71
|
+
hash: -4287074134393921615
|
71
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
73
|
none: false
|
73
74
|
requirements:
|
@@ -76,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
77
|
version: '0'
|
77
78
|
segments:
|
78
79
|
- 0
|
79
|
-
hash:
|
80
|
+
hash: -4287074134393921615
|
80
81
|
requirements: []
|
81
82
|
rubyforge_project:
|
82
83
|
rubygems_version: 1.8.10
|