rubycut-babushka 0.10.6

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.
Files changed (171) hide show
  1. data/Gemfile +8 -0
  2. data/Gemfile.lock +31 -0
  3. data/README.markdown +246 -0
  4. data/Rakefile +26 -0
  5. data/bin/babushka +11 -0
  6. data/deps/babushka.rb +101 -0
  7. data/deps/dev.rb +12 -0
  8. data/deps/fhs.rb +31 -0
  9. data/deps/git.rb +29 -0
  10. data/deps/homebrew.rb +30 -0
  11. data/deps/os_x.rb +33 -0
  12. data/deps/packages.rb +22 -0
  13. data/deps/pkg_managers.rb +110 -0
  14. data/deps/ruby.rb +23 -0
  15. data/deps/rubygems.rb +24 -0
  16. data/deps/system.rb +10 -0
  17. data/deps/templates/app.rb +68 -0
  18. data/deps/templates/external.rb +12 -0
  19. data/deps/templates/installer.rb +31 -0
  20. data/deps/templates/managed.rb +105 -0
  21. data/deps/templates/ppa.rb +24 -0
  22. data/deps/templates/src.rb +42 -0
  23. data/deps/templates/tmbundle.rb +15 -0
  24. data/lib/babushka.rb +28 -0
  25. data/lib/babushka/accepts_block_for.rb +72 -0
  26. data/lib/babushka/accepts_list_for.rb +49 -0
  27. data/lib/babushka/accepts_value_for.rb +24 -0
  28. data/lib/babushka/base.rb +78 -0
  29. data/lib/babushka/bug_reporter.rb +55 -0
  30. data/lib/babushka/cmdline.rb +133 -0
  31. data/lib/babushka/cmdline/handler.rb +41 -0
  32. data/lib/babushka/cmdline/helpers.rb +127 -0
  33. data/lib/babushka/cmdline/parser.rb +69 -0
  34. data/lib/babushka/colorizer.rb +59 -0
  35. data/lib/babushka/core_patches/array.rb +171 -0
  36. data/lib/babushka/core_patches/blank.rb +22 -0
  37. data/lib/babushka/core_patches/bytes.rb +52 -0
  38. data/lib/babushka/core_patches/hash.rb +107 -0
  39. data/lib/babushka/core_patches/hashish.rb +14 -0
  40. data/lib/babushka/core_patches/integer.rb +25 -0
  41. data/lib/babushka/core_patches/io.rb +8 -0
  42. data/lib/babushka/core_patches/numeric.rb +16 -0
  43. data/lib/babushka/core_patches/object.rb +27 -0
  44. data/lib/babushka/core_patches/string.rb +116 -0
  45. data/lib/babushka/core_patches/symbol.rb +12 -0
  46. data/lib/babushka/core_patches/try.rb +15 -0
  47. data/lib/babushka/core_patches/uri.rb +24 -0
  48. data/lib/babushka/dep.rb +470 -0
  49. data/lib/babushka/dep_context.rb +18 -0
  50. data/lib/babushka/dep_definer.rb +115 -0
  51. data/lib/babushka/dep_pool.rb +49 -0
  52. data/lib/babushka/dep_runner.rb +85 -0
  53. data/lib/babushka/dsl.rb +26 -0
  54. data/lib/babushka/git_repo.rb +185 -0
  55. data/lib/babushka/helpers/git_helpers.rb +32 -0
  56. data/lib/babushka/helpers/log_helpers.rb +176 -0
  57. data/lib/babushka/helpers/path_helpers.rb +34 -0
  58. data/lib/babushka/helpers/run_helpers.rb +145 -0
  59. data/lib/babushka/helpers/shell_helpers.rb +229 -0
  60. data/lib/babushka/helpers/suggest_helpers.rb +16 -0
  61. data/lib/babushka/helpers/uri_helpers.rb +36 -0
  62. data/lib/babushka/ip.rb +160 -0
  63. data/lib/babushka/lambda_chooser.rb +40 -0
  64. data/lib/babushka/levenshtein.rb +125 -0
  65. data/lib/babushka/meta_dep.rb +65 -0
  66. data/lib/babushka/meta_dep_context.rb +15 -0
  67. data/lib/babushka/parameter.rb +143 -0
  68. data/lib/babushka/pkg_helper.rb +81 -0
  69. data/lib/babushka/pkg_helpers/apt_helper.rb +61 -0
  70. data/lib/babushka/pkg_helpers/base_helper.rb +19 -0
  71. data/lib/babushka/pkg_helpers/binpkgsrc_helper.rb +48 -0
  72. data/lib/babushka/pkg_helpers/binports_helper.rb +34 -0
  73. data/lib/babushka/pkg_helpers/brew_helper.rb +110 -0
  74. data/lib/babushka/pkg_helpers/gem_helper.rb +120 -0
  75. data/lib/babushka/pkg_helpers/macports_helper.rb +22 -0
  76. data/lib/babushka/pkg_helpers/npm_helper.rb +45 -0
  77. data/lib/babushka/pkg_helpers/pacman_helper.rb +27 -0
  78. data/lib/babushka/pkg_helpers/pip_helper.rb +45 -0
  79. data/lib/babushka/pkg_helpers/src_helper.rb +16 -0
  80. data/lib/babushka/pkg_helpers/yum_helper.rb +25 -0
  81. data/lib/babushka/popen.rb +40 -0
  82. data/lib/babushka/prompt.rb +176 -0
  83. data/lib/babushka/renderable.rb +67 -0
  84. data/lib/babushka/resource.rb +215 -0
  85. data/lib/babushka/run_reporter.rb +60 -0
  86. data/lib/babushka/shell.rb +108 -0
  87. data/lib/babushka/source.rb +216 -0
  88. data/lib/babushka/source_pool.rb +146 -0
  89. data/lib/babushka/system_definitions.rb +97 -0
  90. data/lib/babushka/system_profile.rb +210 -0
  91. data/lib/babushka/task.rb +142 -0
  92. data/lib/babushka/vars.rb +108 -0
  93. data/lib/babushka/version_of.rb +65 -0
  94. data/lib/babushka/version_str.rb +57 -0
  95. data/lib/babushka/xml_string.rb +28 -0
  96. data/lib/components.rb +82 -0
  97. data/lib/fancypath/fancypath.rb +200 -0
  98. data/lib/inkan/inkan.rb +76 -0
  99. data/spec/acceptance/acceptance.rb +43 -0
  100. data/spec/acceptance_helper.rb +113 -0
  101. data/spec/archives/Blah.app.zip +0 -0
  102. data/spec/archives/archive.tar +0 -0
  103. data/spec/archives/archive.tar.bz2 +0 -0
  104. data/spec/archives/archive.tar.gz +0 -0
  105. data/spec/archives/archive.tbz2 +0 -0
  106. data/spec/archives/archive.tgz +0 -0
  107. data/spec/archives/archive.zip +0 -0
  108. data/spec/archives/content.txt +5 -0
  109. data/spec/archives/invalid_archive +5 -0
  110. data/spec/archives/nested archive/content.txt +5 -0
  111. data/spec/archives/nested_archive.tar +0 -0
  112. data/spec/archives/really_a_gzip.zip +0 -0
  113. data/spec/archives/test-0.3.1.tgz +0 -0
  114. data/spec/archives/tgz_archive +0 -0
  115. data/spec/archives/zip_without_extension +0 -0
  116. data/spec/babushka/accepts_for_spec.rb +174 -0
  117. data/spec/babushka/accepts_for_support.rb +72 -0
  118. data/spec/babushka/cmdline/console_spec.rb +11 -0
  119. data/spec/babushka/cmdline/help_spec.rb +61 -0
  120. data/spec/babushka/cmdline/version_spec.rb +10 -0
  121. data/spec/babushka/core_patches_spec.rb +171 -0
  122. data/spec/babushka/dep_context_spec.rb +58 -0
  123. data/spec/babushka/dep_definer_spec.rb +152 -0
  124. data/spec/babushka/dep_definer_support.rb +36 -0
  125. data/spec/babushka/dep_spec.rb +567 -0
  126. data/spec/babushka/dep_support.rb +29 -0
  127. data/spec/babushka/deps_spec.rb +113 -0
  128. data/spec/babushka/gem_helper_spec.rb +90 -0
  129. data/spec/babushka/git_repo_spec.rb +396 -0
  130. data/spec/babushka/ip_spec.rb +131 -0
  131. data/spec/babushka/lambda_chooser_spec.rb +115 -0
  132. data/spec/babushka/meta_dep_definer_spec.rb +127 -0
  133. data/spec/babushka/meta_dep_wrapper_spec.rb +32 -0
  134. data/spec/babushka/parameter_spec.rb +135 -0
  135. data/spec/babushka/path_helpers_spec.rb +102 -0
  136. data/spec/babushka/prompt_spec.rb +188 -0
  137. data/spec/babushka/renderable_spec.rb +100 -0
  138. data/spec/babushka/resource_spec.rb +141 -0
  139. data/spec/babushka/run_helpers_spec.rb +26 -0
  140. data/spec/babushka/shell_helpers_spec.rb +244 -0
  141. data/spec/babushka/shell_spec.rb +19 -0
  142. data/spec/babushka/source_pool_spec.rb +320 -0
  143. data/spec/babushka/source_pool_support.rb +31 -0
  144. data/spec/babushka/source_spec.rb +382 -0
  145. data/spec/babushka/source_support.rb +17 -0
  146. data/spec/babushka/system_profile_spec.rb +61 -0
  147. data/spec/babushka/task_spec.rb +141 -0
  148. data/spec/babushka/uri_spec.rb +13 -0
  149. data/spec/babushka/vars_spec.rb +59 -0
  150. data/spec/babushka/version_of_spec.rb +110 -0
  151. data/spec/babushka/version_str_spec.rb +130 -0
  152. data/spec/babushka/version_str_support.rb +37 -0
  153. data/spec/babushka/xml_string_spec.rb +98 -0
  154. data/spec/deps/bad/broken.rb +7 -0
  155. data/spec/deps/bad/working.rb +3 -0
  156. data/spec/deps/good/meta.rb +14 -0
  157. data/spec/deps/good/test.rb +11 -0
  158. data/spec/deps/outer/deps.rb +19 -0
  159. data/spec/deps/outer/more deps.rb +11 -0
  160. data/spec/deps/params/params.rb +10 -0
  161. data/spec/fancypath/fancypath_spec.rb +272 -0
  162. data/spec/fancypath_support.rb +10 -0
  163. data/spec/inkan/inkan_spec.rb +217 -0
  164. data/spec/renderable/different_example.conf.erb +4 -0
  165. data/spec/renderable/example.conf.erb +3 -0
  166. data/spec/renderable/example.sh +6 -0
  167. data/spec/renderable/with_binding.conf.erb +4 -0
  168. data/spec/renderable/xml_example.conf.erb +8 -0
  169. data/spec/repos/remote.git.tgz +0 -0
  170. data/spec/spec_helper.rb +87 -0
  171. metadata +238 -0
@@ -0,0 +1,37 @@
1
+ def pairs
2
+ [
3
+ %w[0.3.1 0.3.1],
4
+ %w[0.3.1 0.3.2],
5
+ %w[0.3.1 0.3.1.10],
6
+ %w[0.3.1.1 0.3.1.10],
7
+ %w[0.3.1.9 0.3.1.10],
8
+ %w[0.3.1.9 0.3.0.10],
9
+ %w[0.3.1 0.3.0.10],
10
+ %w[0.3.1.9 1],
11
+ %w[0.3.1.9 0.4],
12
+ %w[0.3.1.9 0.3.2],
13
+ %w[0.3.1.9 0.3.0],
14
+ %w[1 0.3.1.9],
15
+ %w[0.4 0.3.1.9],
16
+ %w[0.3.2 0.3.1.9],
17
+ %w[0.3.2 0.3.1],
18
+ %w[0.3.1.10 0.3.1.9],
19
+ %w[0.3.1 0.3],
20
+ %w[0.3.1 0.4],
21
+ ]
22
+ end
23
+
24
+ def t; true end
25
+ def f; false end
26
+
27
+ def results
28
+ {
29
+ "==" => [t, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f],
30
+ "!=" => [f, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t],
31
+ ">" => [f, f, f, f, f, t, t, f, f, f, t, t, t, t, t, t, t, f],
32
+ "<" => [f, t, t, t, t, f, f, t, t, t, f, f, f, f, f, f, f, t],
33
+ ">=" => [t, f, f, f, f, t, t, f, f, f, t, t, t, t, t, t, t, f],
34
+ "<=" => [t, t, t, t, t, f, f, t, t, t, f, f, f, f, f, f, f, t],
35
+ "~>" => [t, f, f, f, f, f, f, f, f, f, t, f, f, f, t, t, t, f]
36
+ }
37
+ end
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+
3
+ describe XMLString do
4
+ it "should parse xml like a son of a bitch" do
5
+ sample_xml.val_for('CFBundleShortVersionString').should == '5.0.310.0'
6
+ sample_xml.val_for('CFBundleSignature').should == 'Cr24 Example String'
7
+ sample_xml.val_for('SVNRevision').should == '37609'
8
+ end
9
+ end
10
+
11
+ def sample_xml
12
+ XMLString.new %Q{
13
+ <?xml version="1.0" encoding="UTF-8"?>
14
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
15
+ <plist version="1.0">
16
+ <dict>
17
+ <key>CFBundleExecutable</key>
18
+ <string>Chromium</string>
19
+ <key>CFBundleIconFile</key>
20
+ <string>app.icns</string>
21
+ <key>CFBundleIdentifier</key>
22
+ <string>org.chromium.Chromium</string>
23
+ <key>CFBundleInfoDictionaryVersion</key>
24
+ <string>6.0</string>
25
+ <key>CFBundleName</key>
26
+ <string>Chromium</string>
27
+ <key>CFBundlePackageType</key>
28
+ <string>APPL</string>
29
+ <key>CFBundleShortVersionString</key>
30
+ <string>5.0.310.0</string>
31
+ <key>CFBundleSignature</key>
32
+ <string>Cr24 Example String</string>
33
+ <key>CFBundleURLTypes</key>
34
+ <array>
35
+ <dict>
36
+ <key>CFBundleURLName</key>
37
+ <string>Web site URL</string>
38
+ <key>CFBundleURLSchemes</key>
39
+ <array>
40
+ <string>http</string>
41
+ <string>https</string>
42
+ </array>
43
+ </dict>
44
+ <dict>
45
+ <key>CFBundleURLName</key>
46
+ <string>FTP site URL</string>
47
+ <key>CFBundleURLSchemes</key>
48
+ <array>
49
+ <string>ftp</string>
50
+ </array>
51
+ </dict>
52
+ <dict>
53
+ <key>CFBundleURLName</key>
54
+ <string>Local file URL</string>
55
+ <key>CFBundleURLSchemes</key>
56
+ <array>
57
+ <string>file</string>
58
+ </array>
59
+ </dict>
60
+ </array>
61
+ <key>CFBundleVersion</key>
62
+ <string>310.0</string>
63
+ <key>LSFileQuarantineEnabled</key>
64
+ <true/>
65
+ <key>LSHasLocalizedDisplayName</key>
66
+ <string>1</string>
67
+ <key>LSMinimumSystemVersion</key>
68
+ <string>10.5.0</string>
69
+ <key>NSAppleScriptEnabled</key>
70
+ <true/>
71
+ <key>SVNPath</key>
72
+ <string>/trunk/src</string>
73
+ <key>SVNRevision</key>
74
+ <string>37609</string>
75
+ <key>UTExportedTypeDeclarations</key>
76
+ <array>
77
+ <dict>
78
+ <key>UTTypeConformsTo</key>
79
+ <array>
80
+ <string>public.data</string>
81
+ </array>
82
+ <key>UTTypeDescription</key>
83
+ <string>Chromium Extra</string>
84
+ <key>UTTypeIdentifier</key>
85
+ <string>org.chromium.extension</string>
86
+ <key>UTTypeTagSpecification</key>
87
+ <dict>
88
+ <key>public.filename-extension</key>
89
+ <array>
90
+ <string>crx</string>
91
+ </array>
92
+ </dict>
93
+ </dict>
94
+ </array>
95
+ </dict>
96
+ </plist>
97
+ }
98
+ end
@@ -0,0 +1,7 @@
1
+ dep 'broken test dep 1' do
2
+ syntax error
3
+ end
4
+
5
+ dep 'test dep 2' do
6
+
7
+ end
@@ -0,0 +1,3 @@
1
+ dep 'test dep 1' do
2
+
3
+ end
@@ -0,0 +1,14 @@
1
+ meta :test_template do
2
+ accepts_list_for :uri
3
+ template {
4
+ requires 'test dep 1'
5
+ }
6
+ end
7
+
8
+ dep 'option-templated dep', :template => 'test_template' do
9
+ uri 'http://option.test.org'
10
+ end
11
+
12
+ dep 'suffix-templated dep.test_template' do
13
+ uri 'http://suffix.test.org'
14
+ end
@@ -0,0 +1,11 @@
1
+ meta 'test_meta_1' do
2
+
3
+ end
4
+
5
+ dep 'test dep 1' do
6
+
7
+ end
8
+
9
+ dep 'test dep 2' do
10
+
11
+ end
@@ -0,0 +1,19 @@
1
+ dep 'test dep 1' do
2
+
3
+ end
4
+
5
+ dep 'externally templated', :template => 'nested source:test_template' do
6
+
7
+ end
8
+
9
+ meta 'local_template' do
10
+ accepts_list_for :uri
11
+ end
12
+
13
+ dep 'locally templated', :template => 'local_template' do
14
+ uri 'http://local.test.org'
15
+ end
16
+
17
+ dep 'locally templated.local_template' do
18
+ uri 'http://local.test.org'
19
+ end
@@ -0,0 +1,11 @@
1
+ meta 'another_local_template' do
2
+ accepts_list_for :uri
3
+ end
4
+
5
+ dep 'separate file', :template => 'another_local_template' do
6
+ uri 'http://option.local.test.org'
7
+ end
8
+
9
+ dep 'separate file.another_local_template' do
10
+ uri 'http://suffix.local.test.org'
11
+ end
@@ -0,0 +1,10 @@
1
+ dep 'top-level dep with params', :param do
2
+ requires 'a dep without params'
3
+ requires 'another dep with params'.with(param)
4
+ end
5
+
6
+ dep 'a dep without params' do
7
+ end
8
+
9
+ dep 'another dep with params', :param do
10
+ end
@@ -0,0 +1,272 @@
1
+ require 'fancypath_support'
2
+
3
+ describe Fancypath do
4
+ before do
5
+ TMP_DIR.rmtree if TMP_DIR.exist?
6
+ TMP_DIR.mkpath
7
+ @file = TMP_DIR.to_fancypath/'testfile'
8
+ @dir = TMP_DIR.to_fancypath/'testdir'
9
+ end
10
+ after { TMP_DIR.rmtree }
11
+
12
+ describe '#==' do
13
+ it "should compare properly with other fancypaths" do
14
+ Fancypath('test').should == Fancypath('test')
15
+ Fancypath('test').should_not == Fancypath('test2')
16
+ end
17
+ it "should compare properly with strings" do
18
+ Fancypath('test').should == 'test'
19
+ Fancypath('test').should_not == 'test2'
20
+ end
21
+ it "should compare in reverse with strings" do
22
+ 'test'.should == Fancypath('test')
23
+ 'test2'.should_not == Fancypath('test')
24
+ end
25
+ end
26
+
27
+ describe '#length' do
28
+ it "should calculate the length" do
29
+ @file.length.should == @file.to_s.length
30
+ @file.length.should == File.join(TMP_DIR, 'testfile').length
31
+ @dir.length.should == File.join(TMP_DIR, 'testdir').length
32
+ end
33
+ end
34
+
35
+ describe '#hypothetically_writable?' do
36
+ it "initial conditions" do
37
+ @file.should_not be_exists
38
+ @dir.should_not be_exists
39
+ @dir.parent.should be_exists
40
+ @dir.parent.should be_writable
41
+ end
42
+ it "returns true for writable paths" do
43
+ @file.stub!(:writable?).and_return(true)
44
+
45
+ @file.should be_hypothetically_writable
46
+ end
47
+ it "returns false for existing, nonwritable paths" do
48
+ @file.stub!(:exists?).and_return(true)
49
+ @file.stub!(:writable?).and_return(false)
50
+
51
+ @file.should_not be_hypothetically_writable
52
+ end
53
+ it "returns true for nonexistent paths when the parent is writable" do
54
+ @file.stub(:parent).and_return(@dir)
55
+ @dir.stub!(:writable?).and_return(true)
56
+ dir_parent = @dir.parent
57
+ dir_parent.stub!(:hypothetically_writable?).and_return(false)
58
+ @dir.stub!(:parent).and_return(dir_parent)
59
+
60
+ subfile = @file / 'subfile'
61
+ subfile.stub!(:parent).and_return(@file)
62
+
63
+ @file.should be_hypothetically_writable
64
+ subfile.should be_hypothetically_writable
65
+ end
66
+ it "returns false for nonexistent paths when the parent isn't writable" do
67
+ @file.stub(:parent).and_return(@dir)
68
+ @dir.stub!(:exists?).and_return(true)
69
+ @dir.stub!(:writable?).and_return(false)
70
+
71
+ subfile = @file / 'subfile'
72
+ subfile.stub!(:parent).and_return(@file)
73
+
74
+ @file.should_not be_hypothetically_writable
75
+ subfile.should_not be_hypothetically_writable
76
+ end
77
+ it "works for the root" do
78
+ @root = '/'.p
79
+ @root.stub!(:writable?).and_return(false)
80
+ @root.should_not be_hypothetically_writable
81
+ end
82
+ end
83
+
84
+ describe '#join', 'aliased to #/' do
85
+ it('returns a Fancypath') { (@dir/'somefile').class.should == Fancypath }
86
+ it('joins paths') { (@dir/'somefile').to_s.should =~ /\/somefile$/ }
87
+ it('joins absolute paths') { (@dir/'/somefile').to_s.should == File.join(@dir, 'somefile') }
88
+ end
89
+
90
+ describe '#parent' do
91
+ it('returns parent') { @file.parent.should == TMP_DIR.to_fancypath }
92
+ it('returns Fancypath') { @file.parent.should be_instance_of(Fancypath) }
93
+ end
94
+
95
+ describe '#touch', 'file does not exist' do
96
+ it('returns self') { @file.touch.should == @file }
97
+ it('returns a Fancypath') { @file.touch.should be_instance_of(Fancypath) }
98
+ it('creates file') { @file.touch.should be_file }
99
+ end
100
+
101
+ describe '#create', 'dir does not exist' do
102
+ it('returns self') { @dir.create.should == @dir }
103
+ it('returns a Fancypath') { @dir.create.should be_instance_of(Fancypath) }
104
+ it('creates directory') { @dir.create.should be_directory }
105
+ end
106
+
107
+ describe '#remove' do
108
+ it('returns self') { @file.remove.should == @file }
109
+ it('returns a Fancypath') { @file.remove.should be_instance_of(Fancypath) }
110
+ it('removes file') { @file.touch.remove.should_not exist }
111
+ it('removes directory') { @dir.create.remove.should_not exist }
112
+ end
113
+
114
+ describe '#readlink' do
115
+ before {
116
+ @file.touch
117
+ @dir.mkdir
118
+ Dir.chdir @dir do
119
+ `ln -s ../testfile testlink_relative`
120
+ `ln -s /bin/bash testlink_absolute`
121
+ end
122
+ @relative_link = @dir/'testlink_relative'
123
+ @absolute_link = @dir/'testlink_absolute'
124
+ }
125
+ it('returns self for non-symlinks') { @file.readlink.should == @file }
126
+ it('returns the target for relative symlinks') { @relative_link.readlink.should == @file }
127
+ it('returns the target for absolute symlinks') { @absolute_link.readlink.should == '/bin/bash' }
128
+ end
129
+
130
+ describe '#mkdir' do
131
+ before {
132
+ @mkdir = Fancypath(TMP_DIR/'nested/mkdir')
133
+ }
134
+ it "should create directories" do
135
+ @mkdir.exists?.should == false
136
+ @mkdir.mkdir
137
+ @mkdir.exists?.should == true
138
+ end
139
+ end
140
+
141
+ describe '#glob' do
142
+ before {
143
+ @dir.create_dir
144
+ @file.touch
145
+ }
146
+ it "should glob" do
147
+ TMP_DIR.glob('**/*').should =~ ['tmp/fancypath/testdir'.p.to_s, 'tmp/fancypath/testfile'.p.to_s]
148
+ end
149
+ it "should glob with no args" do
150
+ (TMP_DIR / '**/*').glob.should =~ ['tmp/fancypath/testdir'.p.to_s, 'tmp/fancypath/testfile'.p.to_s]
151
+ end
152
+ it "should be case insensitive" do
153
+ TMP_DIR.glob('**/TEST*').should =~ ['tmp/fancypath/testdir'.p.to_s, 'tmp/fancypath/testfile'.p.to_s]
154
+ end
155
+ end
156
+
157
+ describe '#write' do
158
+ it('returns self') { @file.write('').should == @file }
159
+ it('returns a Fancypath') { @file.write('').should be_instance_of(Fancypath) }
160
+ it('writes contents to file') { @file.write('test').read.should == 'test' }
161
+ end
162
+
163
+ describe '#copy' do
164
+ before { @file.touch }
165
+ it('returns a Fancypath') { @file.copy(TMP_DIR/'foo').should be_instance_of(Fancypath) }
166
+ it('creates a new file') { @file.copy(TMP_DIR/'foo').should exist }
167
+ it('keeps the original') { @file.copy(TMP_DIR/'foo'); @file.should exist }
168
+ it('copies the contents') { @file.copy(TMP_DIR/'foo').read.should == @file.read }
169
+ end
170
+
171
+ describe '#copy on a directory' do
172
+ before {
173
+ @dir.mkdir
174
+ (@dir / 'testfile').touch
175
+ }
176
+ it('returns a Fancypath') { @dir.copy(TMP_DIR/'foo').should be_instance_of(Fancypath) }
177
+ it('creates a new dir with a file in it') {
178
+ @dir.copy(TMP_DIR/'foo')
179
+ (TMP_DIR/'foo').should exist
180
+ (TMP_DIR/'foo/testfile').should exist
181
+ }
182
+ it('keeps the original') { @dir.copy(TMP_DIR/'foo'); @dir.should exist }
183
+ it('copies the contents') { @dir.copy(TMP_DIR/'foo'); (TMP_DIR/'foo/testfile').read.should == (@dir/'testfile').read }
184
+ end
185
+
186
+ describe '#set_extension' do
187
+ example "file without extension" do
188
+ Fancypath('/tmp/foo').set_extension('rb').should == Fancypath('/tmp/foo.rb')
189
+ end
190
+ example "single extension" do
191
+ Fancypath('/tmp/foo.py').set_extension('rb').should == Fancypath('/tmp/foo.rb')
192
+ end
193
+ example "multi extension" do
194
+ Fancypath('/tmp/foo.py.z').set_extension('rb').should == Fancypath('/tmp/foo.py.rb')
195
+ end
196
+ end
197
+
198
+ describe '#move' do
199
+ example "destination has the file contents, source does not exist" do
200
+ @file.write('foo')
201
+ dest = TMP_DIR/'newfile'
202
+ @file.move( dest )
203
+ @file.should_not exist
204
+ dest.read.should == 'foo'
205
+ end
206
+ end
207
+
208
+ describe '#has_extension?' do
209
+ example do
210
+ Fancypath('/tmp/foo.bar').has_extension?('bar').should be_true
211
+ end
212
+ example do
213
+ Fancypath('/tmp/foo.bar').has_extension?('foo').should be_false
214
+ end
215
+ end
216
+
217
+ describe '#select' do
218
+ example 'with symbol' do
219
+ @dir.create_dir
220
+ %W(a.jpg b.jpg c.gif).each { |f| (@dir/f).touch }
221
+ @dir.select(:jpg).should =~ [@dir/'a.jpg', @dir/'b.jpg']
222
+ end
223
+
224
+ example 'with glob' do
225
+ @dir.create_dir
226
+ %W(a.jpg b.jpg c.gif).each { |f| (@dir/f).touch }
227
+ @dir.select("*.jpg").should =~ [@dir/'a.jpg', @dir/'b.jpg']
228
+ end
229
+
230
+ example 'with regex' do
231
+ @dir.create_dir
232
+ %W(a.jpg b.jpg c.gif 1.jpg).each { |f| (@dir/f).touch }
233
+ @dir.select(/[^\d]\.(jpg|gif)$/).should =~ [@dir/'a.jpg', @dir/'b.jpg', @dir/'c.gif']
234
+ end
235
+
236
+ example 'with multiple args' do
237
+ @dir.create_dir
238
+ %W(a.jpg b.jpg c.gif).each { |f| (@dir/f).touch }
239
+ @dir.select(:jpg, '*.gif').should =~ [@dir/'a.jpg', @dir/'b.jpg', @dir/'c.gif']
240
+ end
241
+
242
+ # todo: with block
243
+ end
244
+
245
+ describe '#empty?' do
246
+ example 'with empty file' do
247
+ @file.touch
248
+ @file.empty?.should be_true
249
+ end
250
+ example 'with non-empty file' do
251
+ @file.write 'foo'
252
+ @file.empty?.should be_false
253
+ end
254
+ example 'with empty dir' do
255
+ @dir.create_dir
256
+ @dir.empty?.should be_true
257
+ end
258
+ example 'with non-empty dir' do
259
+ @dir.create_dir
260
+ (@dir/'foo').touch
261
+ @dir.empty?.should be_false
262
+ end
263
+ end
264
+ end #/Fancypath
265
+
266
+ describe "String#to_fancypath" do
267
+ it('returns a Fancypath') { 'test'.to_fancypath.should be_instance_of(Fancypath) }
268
+ end
269
+
270
+ describe "Pathname#to_fancypath" do
271
+ it('returns a Fancypath') { Fancypath.new('/').to_fancypath.should be_instance_of(Fancypath) }
272
+ end