ghaki-ext-file 2011.12.01.1 → 2011.12.03.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,6 @@
1
+ require 'stringio'
2
+ require 'ghaki/core_ext/file/with_temp'
3
+
1
4
  module Ghaki #:nodoc:
2
5
  module CoreExt #:nodoc:
3
6
  module File #:nodoc:
@@ -6,9 +9,8 @@ module SpecHelper #:nodoc:
6
9
  module FakeTemp
7
10
 
8
11
  def setup_fake_tempfile
9
- @fake_tempfile = stub_everything()
10
- File.stubs(:with_opened_temp).yields(@fake_tempfile)
11
- File.stubs(:with_named_temp).yields(@fake_tempfile)
12
+ @fake_tempfile = StringIO.new()
13
+ ::File.stubs(:with_opened_temp).yields(@fake_tempfile)
12
14
  end
13
15
 
14
16
  end
@@ -5,29 +5,34 @@ module File #:nodoc:
5
5
  # Helpers dealing with auto-cleaning up temp files.
6
6
  module WithTemp
7
7
 
8
- # Calls block with temp filename then overwrites target filename if no exceptions occur.
9
- def with_named_temp final_name
10
- tmp_name = ::File.dirname(final_name) +
8
+ # Generate temp filename from given filename.
9
+ def make_temp_name final_name
10
+ ::File.dirname(final_name) +
11
11
  ::File::Separator + '_tmp_' + $$.to_s + '.' +
12
12
  ::File.basename(final_name)
13
+ end
14
+
15
+ # Calls block with temp filename then overwrites target filename if no exceptions occur.
16
+ def with_named_temp final_name
17
+ tmp_name = make_temp_name(final_name)
13
18
  yield tmp_name
14
- ::File.rename tmp_name, final_name
19
+ ::File.rename tmp_name, final_name if ::File.exists?(tmp_name)
15
20
  ensure
16
21
  ::File.unlink tmp_name if ::File.exists?(tmp_name)
17
22
  end
18
23
 
19
24
  # Opens writable temp file, renames to proper name if no exceptions.
20
- def with_opened_temp final_name, mode='w', perm=nil
25
+ def with_opened_temp final_name, mode='w', *args
21
26
  with_named_temp final_name do |tmp_name|
22
- ::File.open(tmp_name,mode) do |tmp_file|
27
+ ::File.open(tmp_name,mode,*args) do |tmp_file|
23
28
  yield tmp_file
24
29
  end
25
30
  end
26
31
  end
27
32
 
28
33
  # Simple helper for dumping a string to an output file using a temp.
29
- def dump_via_temp data_str, final_name, mode='w', perm=nil
30
- with_opened_temp final_name, mode, perm do |tmp_file|
34
+ def dump_via_temp data_str, final_name, mode='w', *args
35
+ with_opened_temp final_name, mode, *args do |tmp_file|
31
36
  tmp_file.puts data_str
32
37
  end
33
38
  end
@@ -0,0 +1,48 @@
1
+ require 'ghaki/core_ext/file/spec_helper/fake_temp'
2
+
3
+ describe Ghaki::CoreExt::File::SpecHelper::FakeTemp do
4
+ include Ghaki::CoreExt::File::SpecHelper::FakeTemp
5
+
6
+ subject { self }
7
+ it { should respond_to :setup_fake_tempfile }
8
+
9
+ before(:each) do
10
+ setup_fake_tempfile
11
+ end
12
+
13
+ let(:final_name) { 'fake-final-name' }
14
+ let(:dump_data) { 'testing-data' }
15
+
16
+ describe 'setup_fake_tempfile' do
17
+ it 'creates fake temp file' do
18
+ @fake_tempfile.should be_kind_of(StringIO)
19
+ end
20
+ end
21
+
22
+ describe 'File#with_opened_temp' do
23
+ it 'does not open temp file' do
24
+ File.expects(:open).never
25
+ File.with_opened_temp final_name do |put_file|
26
+ # do nothing
27
+ end
28
+ end
29
+ it 'yields fake temp file' do
30
+ File.with_opened_temp final_name do |put_file|
31
+ put_file.should == @fake_tempfile
32
+ end
33
+ end
34
+ end
35
+
36
+ describe 'File#dump_via_temp' do
37
+ it 'does not open temp file' do
38
+ File.expects(:open).never
39
+ File.dump_via_temp dump_data, final_name
40
+ end
41
+ it 'writes test data to fake output string' do
42
+ File.dump_via_temp dump_data, final_name
43
+ @fake_tempfile.rewind
44
+ @fake_tempfile.string.chomp.should == dump_data
45
+ end
46
+ end
47
+
48
+ end
@@ -1,12 +1,103 @@
1
1
  require 'ghaki/core_ext/file/with_temp'
2
+ require 'stringio'
2
3
 
3
4
  describe Ghaki::CoreExt::File::WithTemp do
4
5
 
5
6
  context 'using extended File' do
6
7
  subject { File }
7
- it { should respond_to :with_named_temp }
8
- it { should respond_to :with_opened_temp }
9
- it { should respond_to :dump_via_temp }
8
+ it { should be_kind_of(Ghaki::CoreExt::File::WithTemp) }
9
+ end
10
+
11
+ let(:final_name) { File.join(File.dirname(__FILE__), 'my-fake-file' ) }
12
+ let(:temp_name) { File.join(File.dirname(__FILE__), 'my-fake-temp' ) }
13
+
14
+ describe '#make_temp_name' do
15
+ subject { File.make_temp_name(final_name) }
16
+
17
+ it 'uses same dirname' do
18
+ File.dirname(subject).should == File.dirname(final_name)
19
+ end
20
+ it 'uses different basename' do
21
+ File.basename(subject).should_not == File.basename(final_name)
22
+ end
23
+ end
24
+
25
+ describe '#with_named_temp' do
26
+
27
+ before(:each) do
28
+ File.expects(:make_temp_name).returns(temp_name).once
29
+ end
30
+
31
+ it 'renames temp to final when successful' do
32
+ File.expects(:exists?).with(temp_name).returns(true,false).twice
33
+ File.expects(:rename).with(temp_name,final_name).once
34
+ File.expects(:unlink).never
35
+ File.with_named_temp final_name do
36
+ # do nothing
37
+ end
38
+ end
39
+
40
+ it 'calls unlink on temp after failure' do
41
+ File.expects(:exists?).with(temp_name).
42
+ returns(true).once
43
+ File.expects(:unlink).with(temp_name).once
44
+ File.expects(:rename).never
45
+ lambda do
46
+ File.with_named_temp final_name do
47
+ raise RuntimeError, 'testing'
48
+ end
49
+ end.should raise_error(RuntimeError)
50
+ end
51
+ end
52
+
53
+
54
+ describe '#with_opened_temp' do
55
+
56
+ before(:each) do
57
+ File.expects(:make_temp_name).returns(temp_name).once
58
+ end
59
+
60
+ it 'renames temp to final when successful' do
61
+ File.expects(:exists?).with(temp_name).returns(true,false).at_most(2)
62
+ File.expects(:rename).with(temp_name,final_name).once
63
+ File.expects(:open).with(temp_name,'w').once
64
+ File.with_opened_temp final_name do
65
+ # doing nothing
66
+ end
67
+ end
68
+
69
+ it 'opens temp file for writing' do
70
+ File.expects(:exists?).with(temp_name).returns(false).at_most(2)
71
+ File.expects(:open).with(temp_name,'w').once
72
+ File.with_opened_temp final_name do
73
+ # doing nothing
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ describe '#dump_via_temp' do
80
+
81
+ let(:dump_data) { 'data-to-dump' }
82
+
83
+ before(:each) do
84
+ File.expects(:make_temp_name).returns(temp_name).once
85
+ @tmp_file = StringIO.new
86
+ @tmp_file.expects(:puts).with(dump_data).once
87
+ File.expects(:open).with(temp_name,'w').yields(@tmp_file).once
88
+ end
89
+
90
+ it 'renames temp to final when successful' do
91
+ File.expects(:exists?).with(temp_name).returns(true,false).at_most(2)
92
+ File.expects(:rename).with(temp_name,final_name).once
93
+ File.dump_via_temp dump_data, final_name
94
+ end
95
+
96
+ it 'dumps data to opened temp file' do
97
+ File.expects(:exists?).with(temp_name).returns(false).at_most(2)
98
+ File.dump_via_temp dump_data, final_name
99
+ end
100
+
10
101
  end
11
102
 
12
103
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghaki-ext-file
3
3
  version: !ruby/object:Gem::Version
4
- version: 2011.12.01.1
4
+ version: 2011.12.03.1
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: 2011-12-02 00:00:00.000000000Z
12
+ date: 2011-12-03 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &84806470 !ruby/object:Gem::Requirement
16
+ requirement: &72774220 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.4.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *84806470
24
+ version_requirements: *72774220
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rdoc
27
- requirement: &84806240 !ruby/object:Gem::Requirement
27
+ requirement: &72773990 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.9.4
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *84806240
35
+ version_requirements: *72773990
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mocha
38
- requirement: &84806010 !ruby/object:Gem::Requirement
38
+ requirement: &72773760 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 0.9.12
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *84806010
46
+ version_requirements: *72773760
47
47
  description: Collection of extensions for the core File class
48
48
  email: gerald@kalafut.org
49
49
  executables: []
@@ -55,6 +55,7 @@ files:
55
55
  - lib/ghaki/core_ext/file/with_temp.rb
56
56
  - README
57
57
  - LICENSE
58
+ - spec/ghaki/core_ext/file/spec_helper/fake_temp_spec.rb
58
59
  - spec/ghaki/core_ext/file/with_temp_spec.rb
59
60
  - spec/spec_helper.rb
60
61
  homepage: http://github.com/ghaki
@@ -82,5 +83,6 @@ signing_key:
82
83
  specification_version: 3
83
84
  summary: Core File extensions
84
85
  test_files:
86
+ - spec/ghaki/core_ext/file/spec_helper/fake_temp_spec.rb
85
87
  - spec/ghaki/core_ext/file/with_temp_spec.rb
86
88
  - spec/spec_helper.rb