puppet-library 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +7 -7
  2. data/CHANGELOG.yml +1 -0
  3. data/README.md +9 -4
  4. data/Rakefile +44 -23
  5. data/TODO.yml +3 -4
  6. data/config.ru +28 -3
  7. data/lib/puppet_library/forge/cache.rb +19 -0
  8. data/lib/puppet_library/forge/directory.rb +16 -0
  9. data/lib/puppet_library/forge/git_repository.rb +57 -49
  10. data/lib/puppet_library/forge/proxy.rb +18 -4
  11. data/lib/puppet_library/forge/source.rb +10 -0
  12. data/lib/puppet_library/puppet_library.rb +1 -1
  13. data/lib/puppet_library/server.rb +12 -3
  14. data/lib/puppet_library/util/git.rb +103 -0
  15. data/lib/puppet_library/util/patches.rb +104 -0
  16. data/lib/puppet_library/util/temp_dir.rb +42 -0
  17. data/lib/puppet_library/util.rb +4 -70
  18. data/lib/puppet_library/version.rb +1 -1
  19. data/spec/archive/archive_reader_spec.rb +9 -2
  20. data/spec/archive/archiver_spec.rb +4 -0
  21. data/spec/forge/cache_spec.rb +4 -0
  22. data/spec/forge/directory_spec.rb +4 -0
  23. data/spec/forge/git_repository_spec.rb +5 -2
  24. data/spec/forge/source_spec.rb +4 -0
  25. data/spec/integration_test_helper.rb +42 -0
  26. data/spec/util/git_spec.rb +143 -0
  27. data/spec/util/patches_spec.rb +86 -0
  28. data/spec/util/temp_dir_spec.rb +35 -0
  29. data/test/directory_forge_integration_test.rb +96 -0
  30. data/test/offline_git_repo_forge_integration_test.rb +122 -0
  31. data/test/offline_proxy_forge_integration_test.rb +126 -0
  32. data/test/online_git_repo_forge_integration_test.rb +89 -0
  33. data/test/online_proxy_forge_integration_test.rb +93 -0
  34. data/test/source_forge_integration_test.rb +96 -0
  35. metadata +292 -118
  36. data/spec/util_spec.rb +0 -43
  37. data/test/librarian_puppet_integration_test.rb +0 -349
@@ -0,0 +1,104 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Puppet Library
3
+ # Copyright (C) 2014 drrb
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require 'rubygems/package'
19
+
20
+ # Early versions of Rubygems have problems with version numbers with dashes
21
+ # (e.g. "1.0.0-rc1"). This adds the behaviour or new RG versions to all
22
+ # versions, hopefully without breaking newer versions. In most cases we want to
23
+ # fail silently with bad version numbers so that we don't crash the server
24
+ # because of weird stuff from a remote forge or elsewhere.
25
+ module Gem
26
+ def Version.new(version)
27
+ super(version.to_s.gsub("-",".pre."))
28
+ rescue ArgumentError
29
+ # If it starts with numbers, use those
30
+ if version =~ /^\d+(\.\d+)*/
31
+ super(version[/^\d+(\.\d+)*/])
32
+ # Somebody's really made a mess of this version number
33
+ else
34
+ super("0")
35
+ end
36
+ end
37
+
38
+ def Dependency.new(name, spec)
39
+ super(name, spec.to_s.gsub("-", ".pre."))
40
+ rescue ArgumentError
41
+ # If it starts with numbers, use those
42
+ if spec =~ /^([~><= ]+)?\d+(\.\d+)*/
43
+ super(name, spec[/^([~><= ]+)?\d+(\.\d+)*/])
44
+ # Somebody's really made a mess of this version number
45
+ else
46
+ super(name, ">= 0")
47
+ end
48
+ end
49
+ end
50
+
51
+ class Array
52
+ # Like 'uniq' with a block, but also works on Ruby < 1.9
53
+ def unique_by
54
+ attr_to_element = {}
55
+ select do |element|
56
+ attribute = yield(element)
57
+ is_duplicate = attr_to_element.include? attribute
58
+ unless is_duplicate
59
+ attr_to_element[attribute] = element
60
+ end
61
+ !is_duplicate
62
+ end
63
+ end
64
+
65
+ def version_sort
66
+ version_sort_by { |e| e }
67
+ end
68
+
69
+ def version_sort_by
70
+ sort_by do |element|
71
+ version = yield(element)
72
+ Gem::Version.new(version)
73
+ end
74
+ end
75
+
76
+ def deep_merge
77
+ inject({}) do |merged, map|
78
+ merged.deep_merge(map)
79
+ end
80
+ end
81
+ end
82
+
83
+ class Hash
84
+ def deep_merge(other)
85
+ merge(other) do |key, old_val, new_val|
86
+ if old_val.instance_of? Array
87
+ old_val + new_val
88
+ else
89
+ new_val
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ class Gem::Package::TarReader
96
+ # Old versions of RubyGems don't include Enumerable in here
97
+ def find
98
+ each do |entry|
99
+ if yield(entry)
100
+ return entry
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,42 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Puppet Library
3
+ # Copyright (C) 2014 drrb
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require 'fileutils'
19
+
20
+ module PuppetLibrary::Util
21
+ class TempDir
22
+ attr_reader :path
23
+
24
+ def self.use(name, &block)
25
+ path = create(name)
26
+ Dir.chdir(path, &block)
27
+ ensure
28
+ FileUtils.rm_rf path
29
+ end
30
+
31
+ def self.create(name)
32
+ TempDir.new(name).path
33
+ end
34
+
35
+ def initialize(name)
36
+ file = Tempfile.new(name)
37
+ @path = file.path
38
+ file.unlink
39
+ FileUtils.mkdir @path
40
+ end
41
+ end
42
+ end
@@ -15,75 +15,9 @@
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
 
18
- require 'rubygems/package'
19
-
20
- module Gem
21
- def Version.new(version)
22
- begin
23
- super(version.to_s.gsub("-",".pre."))
24
- rescue ArgumentError => e
25
- # If it starts with numbers, use those
26
- if version =~ /^\d+(\.\d+)*/
27
- super(version[/^\d+(\.\d+)*/])
28
- # Somebody's really made a mess of this version number
29
- else
30
- super("0")
31
- end
32
- end
33
- end
18
+ module PuppetLibrary::Util
34
19
  end
35
20
 
36
- class Array
37
- # Like 'uniq' with a block, but also works on Ruby < 1.9
38
- def unique_by
39
- attr_to_element = {}
40
- select do |element|
41
- attribute = yield(element)
42
- is_duplicate = attr_to_element.include? attribute
43
- unless is_duplicate
44
- attr_to_element[attribute] = element
45
- end
46
- !is_duplicate
47
- end
48
- end
49
-
50
- def version_sort
51
- version_sort_by { |e| e }
52
- end
53
-
54
- def version_sort_by
55
- sort_by do |element|
56
- version = yield(element)
57
- Gem::Version.new(version)
58
- end
59
- end
60
-
61
- def deep_merge
62
- inject({}) do |merged, map|
63
- merged.deep_merge(map)
64
- end
65
- end
66
- end
67
-
68
- class Hash
69
- def deep_merge(other)
70
- merge(other) do |key, old_val, new_val|
71
- if old_val.instance_of? Array
72
- old_val + new_val
73
- else
74
- new_val
75
- end
76
- end
77
- end
78
- end
79
-
80
- class Gem::Package::TarReader
81
- # Old versions of RubyGems don't include Enumerable in here
82
- def find
83
- each do |entry|
84
- if yield(entry)
85
- return entry
86
- end
87
- end
88
- end
89
- end
21
+ require 'puppet_library/util/git'
22
+ require 'puppet_library/util/patches'
23
+ require 'puppet_library/util/temp_dir'
@@ -16,5 +16,5 @@
16
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
 
18
18
  module PuppetLibrary
19
- VERSION = "0.9.1"
19
+ VERSION = "0.10.0"
20
20
  end
@@ -22,9 +22,12 @@ module PuppetLibrary::Archive
22
22
  ArchiveReader.new(archive)
23
23
  end
24
24
 
25
+ let :source_dir do
26
+ Tempdir.create("zipping")
27
+ end
28
+
25
29
  let :archive do
26
- dir = Tempdir.create("zipping")
27
- archive = File.join(dir, "archive.tgz")
30
+ archive = File.join(source_dir, "archive.tgz")
28
31
  write_tar_gzip!(archive) do |zip|
29
32
  zip.add_file("arrive.txt", 0644) { |entry| entry.write "say hello" }
30
33
  zip.add_file("later/depart.txt", 0644) { |entry| entry.write "say bye" }
@@ -32,6 +35,10 @@ module PuppetLibrary::Archive
32
35
  archive
33
36
  end
34
37
 
38
+ after do
39
+ rm_rf source_dir
40
+ end
41
+
35
42
  def write_tar_gzip!(file_name)
36
43
  tar = StringIO.new
37
44
 
@@ -34,6 +34,10 @@ module PuppetLibrary::Archive
34
34
  write_file! "later/depart.txt", "say bye"
35
35
  end
36
36
 
37
+ after do
38
+ rm_rf dir
39
+ end
40
+
37
41
  it "tars and gzips a directory and its contents" do
38
42
  buffer = Archiver.archive_dir(dir, "todo")
39
43
 
@@ -23,6 +23,10 @@ module PuppetLibrary::Forge
23
23
  let(:http_client) { double(PuppetLibrary::Http::HttpClient) }
24
24
  let(:forge) { Cache.new("http://forge.example.com", cache_dir, http_client) }
25
25
 
26
+ after do
27
+ rm_rf cache_dir
28
+ end
29
+
26
30
  it "is a proxy" do
27
31
  expect(forge).to be_a Proxy
28
32
  end
@@ -45,6 +45,10 @@ module PuppetLibrary::Forge
45
45
  chmod 0400, module_dir
46
46
  end
47
47
 
48
+ after do
49
+ chmod 0777, module_dir
50
+ end
51
+
48
52
  it "raises an error" do
49
53
  expect {
50
54
  Directory.new(module_dir)
@@ -52,7 +52,10 @@ module PuppetLibrary::Forge
52
52
  rm_rf @@repo_path
53
53
  end
54
54
 
55
- let(:forge) { GitRepository.new("puppetlabs", "apache", /[0-9.]+/, @@repo_path) }
55
+ let(:forge) { GitRepository.new(@@repo_path, /[0-9.]+/) }
56
+ after do
57
+ forge.destroy!
58
+ end
56
59
 
57
60
  describe "#get_module" do
58
61
  context "when the requested author is different from the configured author" do
@@ -115,7 +118,7 @@ module PuppetLibrary::Forge
115
118
 
116
119
  describe "#get_all_metadata" do
117
120
  it "generates the metadata for the each version" do
118
- metadata = forge.get_metadata("puppetlabs", "apache")
121
+ metadata = forge.get_all_metadata
119
122
  expect(metadata).to have(3).versions
120
123
  expect(metadata.first["name"]).to eq "puppetlabs-apache"
121
124
  expect(metadata.first["version"]).to eq "0.9.0"
@@ -69,6 +69,10 @@ module PuppetLibrary::Forge
69
69
  chmod 0400, module_dir
70
70
  end
71
71
 
72
+ after do
73
+ chmod 0777, module_dir
74
+ end
75
+
72
76
  it "raises an error" do
73
77
  expect {
74
78
  Source.new(module_dir)
@@ -0,0 +1,42 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Puppet Library
3
+ # Copyright (C) 2014 drrb
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ RSpec::Matchers.define :be_cached do
19
+ match do |mod_file|
20
+ ! Dir[File.join(cache_dir, mod_file)].empty?
21
+ end
22
+ end
23
+
24
+ RSpec::Matchers.define :be_installed do
25
+ match do |mod_name|
26
+ File.directory?(File.join(project_dir, "modules", mod_name))
27
+ end
28
+ end
29
+
30
+ def write_puppetfile(content)
31
+ File.open("#{project_dir}/Puppetfile", "w") do |puppetfile|
32
+ puppetfile.puts content
33
+ end
34
+ end
35
+
36
+
37
+ module Ports
38
+ def self.next!
39
+ @port ||= 9000
40
+ @port += 1
41
+ end
42
+ end
@@ -0,0 +1,143 @@
1
+ # Puppet Library
2
+ # Copyright (C) 2014 drrb
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'spec_helper'
18
+
19
+ module PuppetLibrary::Util
20
+ describe Git do
21
+ @@repo_path = Tempdir.create("git-repo")
22
+ @@tags = [ "0.9.0", "1.0.0-rc1", "1.0.0", "xxx" ]
23
+
24
+ before :all do
25
+ def git(command)
26
+ git_command = "git --git-dir=#{@@repo_path}/.git --work-tree=#{@@repo_path} #{command}"
27
+ `#{git_command}`
28
+ unless $?.success?
29
+ raise "Failed to run command: \"#{git_command}\""
30
+ end
31
+ end
32
+
33
+ git "init"
34
+ git "config user.name tester"
35
+ git "config user.email tester@example.com"
36
+ @@tags.each do |tag|
37
+ File.open(File.join(@@repo_path, "Modulefile"), "w") do |modulefile|
38
+ modulefile.write <<-MODULEFILE
39
+ name 'puppetlabs-apache'
40
+ version '#{tag}'
41
+ author 'puppetlabs'
42
+ MODULEFILE
43
+ end
44
+ git "add ."
45
+ git "commit --message='Tagging #{tag}'"
46
+ git "tag #{tag}"
47
+ end
48
+ end
49
+
50
+ after :all do
51
+ rm_rf @@repo_path
52
+ end
53
+
54
+ let(:git) { Git.new(@@repo_path, cache_path) }
55
+ let(:cache_path) { Tempdir.create("git-cache") }
56
+
57
+ after do
58
+ git.clear_cache!
59
+ end
60
+
61
+ describe "#tags" do
62
+ it "lists the tags" do
63
+ @@tags.each { |tag| expect(git.tags).to include tag }
64
+ end
65
+ end
66
+
67
+ describe "#on_tag" do
68
+ it "yields to the block in a directory containing the tag" do
69
+ git.on_tag("1.0.0") do
70
+ expect(File.read("Modulefile")).to include "version '1.0.0'"
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "#read_file" do
76
+ it "returns the content of the specified file as it was at the specified tag" do
77
+ expect(git.read_file("Modulefile", "0.9.0")).to include "version '0.9.0'"
78
+ end
79
+ end
80
+
81
+ describe "#update_cache!" do
82
+ it "clones the git repository to the cache directory" do
83
+ git.update_cache!
84
+
85
+ expect(`git --git-dir #{cache_path}/.git remote -v`).to include @@repo_path
86
+ end
87
+
88
+ it "creates Git's .git/FETCH_HEAD file so that we know that the cache was recently created" do
89
+ git.update_cache!
90
+
91
+ expect(File.exist?(File.join(cache_path, ".git", "FETCH_HEAD"))).to be_true
92
+ end
93
+
94
+ it "copes with a missing .git/FETCH_HEAD file" do
95
+ fetch_file = File.join(cache_path, ".git", "FETCH_HEAD")
96
+ git.update_cache!
97
+ rm fetch_file
98
+
99
+ git.update_cache!
100
+
101
+ expect(File.exist? fetch_file).to be_true
102
+ end
103
+
104
+ it "doesn't update the cache if it was recently updated" do
105
+ git.update_cache!
106
+ new_head = Dir.chdir(@@repo_path) do
107
+ touch "xxx"
108
+ `git add xxx`
109
+ `git commit --message='Added file'`
110
+ `git rev-parse HEAD`
111
+ end
112
+
113
+ git.update_cache!
114
+
115
+ expect(`git --git-dir #{cache_path}/.git rev-parse HEAD`).not_to eq new_head
116
+ end
117
+
118
+ it "updates the cache if it's been long enough" do
119
+ git.update_cache!
120
+ git = Git.new(@@repo_path, cache_path, 0) # zero second cache TTL
121
+ new_head = Dir.chdir(@@repo_path) do
122
+ touch "xxx"
123
+ `git add xxx`
124
+ `git commit --message='Added file'`
125
+ `git rev-parse HEAD`
126
+ end
127
+
128
+ git.update_cache!
129
+
130
+ expect(`git --git-dir #{cache_path}/.git rev-parse HEAD`).to eq new_head
131
+ end
132
+ end
133
+
134
+ describe "#clear_cache!" do
135
+ it "deletes the cache directory" do
136
+ git.update_cache!
137
+ git.clear_cache!
138
+
139
+ expect(File.exist? cache_path).to be_false
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,86 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Puppet Library
3
+ # Copyright (C) 2014 drrb
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require 'spec_helper'
19
+
20
+ describe 'patches' do
21
+ describe Gem::Version do
22
+ describe "#new" do
23
+ context "when the version number contains a dash" do
24
+ it "replaces the dash with '.pre.'" do
25
+ expect(Gem::Version.new("1.0.0-rc1")).to eq Gem::Version.new("1.0.0.pre.rc1")
26
+ end
27
+ end
28
+ context "when the version number has trailing garbage" do
29
+ it "uses the numbers at the beginning" do
30
+ expect(Gem::Version.new("123 xyz")).to eq Gem::Version.new("123")
31
+ end
32
+ end
33
+ context "when the version is completely garbage" do
34
+ it "pretends the version number is zero" do
35
+ expect(Gem::Version.new("xyz")).to eq Gem::Version.new("0")
36
+ end
37
+ end
38
+ end
39
+ end
40
+ describe Gem::Dependency do
41
+ describe "#new" do
42
+ context "when the version contains a dash" do
43
+ it "replaces the dash with '.pre.'" do
44
+ expect(Gem::Dependency.new("x", "1.0.0-rc1")).to eq Gem::Dependency.new("x", "1.0.0.pre.rc1")
45
+ end
46
+ end
47
+ context "when the version number has trailing garbage" do
48
+ it "uses the numbers at the beginning" do
49
+ [ "", "~>", "<", ">", ">=", "<=", "=" ].each do |operator|
50
+ expect(Gem::Dependency.new("x", " #{operator} 123 xyz")).to eq Gem::Dependency.new("x", "#{operator} 123")
51
+ end
52
+ end
53
+ end
54
+ context "when the version is completely garbage" do
55
+ it "pretends the version number is greater than or equal zero" do
56
+ [ "", "<", ">", ">=", "<=", "=" ].each do |operator|
57
+ expect(Gem::Dependency.new("x", " #{operator} xyz")).to eq Gem::Dependency.new("x", ">= 0")
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ describe Array do
65
+ describe "#unique_by" do
66
+ it "behaves like #uniq with a block, but works with Ruby < 1.9" do
67
+ son = { "name" => "john", "age" => 10 }
68
+ dad = { "name" => "john", "age" => 40 }
69
+ mom = { "name" => "jane", "age" => 40 }
70
+
71
+ family = [son, dad, mom]
72
+ expect(family.unique_by {|p| p["name"]}).to eq [son, mom]
73
+ end
74
+ end
75
+
76
+ describe "#version_sort" do
77
+ it "sorts according to version numbers" do
78
+ expect(["2.0.0", "1.10.0", "1.2.0"].version_sort).to eq ["1.2.0", "1.10.0", "2.0.0"]
79
+ end
80
+
81
+ it "copes with odd versions" do
82
+ expect(["1.10.0-badprerelease", "1.3", "1.10.0", "xxx", "1.10.0.rc1", "1.2.0"].version_sort).to eq ["xxx", "1.2.0", "1.3", "1.10.0-badprerelease", "1.10.0.rc1", "1.10.0"]
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # Puppet Library
3
+ # Copyright (C) 2014 drrb
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require 'spec_helper'
19
+
20
+ module PuppetLibrary::Util
21
+ describe TempDir do
22
+ describe "#use" do
23
+ it "creates a directory and changes to it for the life of the block" do
24
+ dir_path = nil
25
+ dir_existed_in_block = false
26
+ TempDir.use("xxx") do |path|
27
+ dir_existed_in_block = File.directory? path
28
+ dir_path = path
29
+ end
30
+ expect(dir_existed_in_block).to be_true
31
+ expect(File.exist? dir_path).to be_false
32
+ end
33
+ end
34
+ end
35
+ end