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 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