tupper 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/tupper.rb CHANGED
@@ -1,25 +1,34 @@
1
1
  # -*- coding: utf-8 -*-
2
- require "tupper/version"
2
+ require_relative "tupper/version"
3
+ require_relative "tupper/errors"
3
4
  require 'json'
4
5
 
5
6
  class Tupper
6
- DEFAULT_TMP_DIR = File.join(%w{ / tmp tupper })
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
- @session = session
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 RuntimeError.new('invalid session data')
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.copy(file_info[:tempfile], uploaded_file)
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],
@@ -0,0 +1,5 @@
1
+ # -*- coding: utf-8 -*-
2
+ class Tupper
3
+ class SessionError < StandardError ; end
4
+ class FileSizeError < StandardError ; end
5
+ end
@@ -1,3 +1,3 @@
1
1
  class Tupper
2
- VERSION = "1.0.3"
2
+ VERSION = "1.1.0"
3
3
  end
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
- tupper.upload params[:dummy_file]
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
 
@@ -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 { expect { Tupper.new(Tupper::SESSION_STORE_KEY.to_s => 'invalid json') }.to raise_error RuntimeError }
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.3
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-25 00:00:00.000000000 Z
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: &70105249702040 !ruby/object:Gem::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: *70105249702040
24
+ version_requirements: *70092750614260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fakefs
27
- requirement: &70105249701620 !ruby/object:Gem::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: *70105249701620
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: 568310382185945559
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: 568310382185945559
80
+ hash: -4287074134393921615
80
81
  requirements: []
81
82
  rubyforge_project:
82
83
  rubygems_version: 1.8.10