folio 0.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.
Files changed (207) hide show
  1. data/COPYING +675 -0
  2. data/MANIFEST +234 -0
  3. data/METADATA +8 -0
  4. data/NEWS +9 -0
  5. data/README +69 -0
  6. data/demo/sample1/foo/foo.txt +1 -0
  7. data/demo/sample1/tryme.rb +14 -0
  8. data/doc/rdoc/classes/Folio/BlockDevice.html +117 -0
  9. data/doc/rdoc/classes/Folio/CharacterDevice.html +117 -0
  10. data/doc/rdoc/classes/Folio/Device.html +119 -0
  11. data/doc/rdoc/classes/Folio/Directory.html +420 -0
  12. data/doc/rdoc/classes/Folio/Document.html +261 -0
  13. data/doc/rdoc/classes/Folio/FileNotFound.html +92 -0
  14. data/doc/rdoc/classes/Folio/FileObject.html +1200 -0
  15. data/doc/rdoc/classes/Folio/Link.html +238 -0
  16. data/doc/rdoc/classes/Folio/Pipe.html +131 -0
  17. data/doc/rdoc/classes/Folio/Prompt.html +796 -0
  18. data/doc/rdoc/classes/Folio/Socket.html +115 -0
  19. data/doc/rdoc/classes/Folio.html +148 -0
  20. data/doc/rdoc/created.rid +1 -0
  21. data/doc/rdoc/files/COPYING.html +992 -0
  22. data/doc/rdoc/files/METADATA.html +101 -0
  23. data/doc/rdoc/files/NEWS.html +102 -0
  24. data/doc/rdoc/files/README.html +171 -0
  25. data/doc/rdoc/files/lib/folio/device_rb.html +96 -0
  26. data/doc/rdoc/files/lib/folio/directory_rb.html +96 -0
  27. data/doc/rdoc/files/lib/folio/document_rb.html +96 -0
  28. data/doc/rdoc/files/lib/folio/errors_rb.html +92 -0
  29. data/doc/rdoc/files/lib/folio/fileobject_rb.html +92 -0
  30. data/doc/rdoc/files/lib/folio/link_rb.html +96 -0
  31. data/doc/rdoc/files/lib/folio/pipe_rb.html +96 -0
  32. data/doc/rdoc/files/lib/folio/prompt_rb.html +92 -0
  33. data/doc/rdoc/files/lib/folio/socket_rb.html +96 -0
  34. data/doc/rdoc/files/lib/folio_rb.html +105 -0
  35. data/doc/rdoc/fr_class_index.html +58 -0
  36. data/doc/rdoc/fr_file_index.html +60 -0
  37. data/doc/rdoc/fr_method_index.html +185 -0
  38. data/doc/rdoc/index.html +26 -0
  39. data/doc/rdoc/rdoc-style.css +175 -0
  40. data/doc/ri/Folio/BlockDevice/blockdev%3f-i.yaml +10 -0
  41. data/doc/ri/Folio/BlockDevice/cdesc-BlockDevice.yaml +18 -0
  42. data/doc/ri/Folio/CharacterDevice/cdesc-CharacterDevice.yaml +18 -0
  43. data/doc/ri/Folio/CharacterDevice/chardev%3f-i.yaml +10 -0
  44. data/doc/ri/Folio/Device/cdesc-Device.yaml +18 -0
  45. data/doc/ri/Folio/Device/new-c.yaml +10 -0
  46. data/doc/ri/Folio/Directory/%2b-i.yaml +12 -0
  47. data/doc/ri/Folio/Directory/%2f-i.yaml +13 -0
  48. data/doc/ri/Folio/Directory/cd-i.yaml +12 -0
  49. data/doc/ri/Folio/Directory/cdesc-Directory.yaml +49 -0
  50. data/doc/ri/Folio/Directory/chdir-i.yaml +11 -0
  51. data/doc/ri/Folio/Directory/chmod_r-i.yaml +10 -0
  52. data/doc/ri/Folio/Directory/chown_r-i.yaml +12 -0
  53. data/doc/ri/Folio/Directory/chroot-i.yaml +10 -0
  54. data/doc/ri/Folio/Directory/cp_r-i.yaml +12 -0
  55. data/doc/ri/Folio/Directory/delete-i.yaml +12 -0
  56. data/doc/ri/Folio/Directory/directory%3f-i.yaml +10 -0
  57. data/doc/ri/Folio/Directory/entries-i.yaml +12 -0
  58. data/doc/ri/Folio/Directory/foreach-i.yaml +10 -0
  59. data/doc/ri/Folio/Directory/new-c.yaml +10 -0
  60. data/doc/ri/Folio/Directory/paths-i.yaml +12 -0
  61. data/doc/ri/Folio/Directory/rm_r-i.yaml +10 -0
  62. data/doc/ri/Folio/Directory/rm_rf-i.yaml +10 -0
  63. data/doc/ri/Folio/Directory/rmdir-i.yaml +13 -0
  64. data/doc/ri/Folio/Directory/unlink-i.yaml +12 -0
  65. data/doc/ri/Folio/Document/cdesc-Document.yaml +34 -0
  66. data/doc/ri/Folio/Document/delete-i.yaml +10 -0
  67. data/doc/ri/Folio/Document/executable%3f-i.yaml +10 -0
  68. data/doc/ri/Folio/Document/executable_real%3f-i.yaml +10 -0
  69. data/doc/ri/Folio/Document/file%3f-i.yaml +10 -0
  70. data/doc/ri/Folio/Document/intialize-i.yaml +10 -0
  71. data/doc/ri/Folio/Document/open-i.yaml +10 -0
  72. data/doc/ri/Folio/Document/read-i.yaml +10 -0
  73. data/doc/ri/Folio/Document/readlines-i.yaml +10 -0
  74. data/doc/ri/Folio/Document/truncate-i.yaml +10 -0
  75. data/doc/ri/Folio/Document/unlink-i.yaml +12 -0
  76. data/doc/ri/Folio/FileNotFound/cdesc-FileNotFound.yaml +15 -0
  77. data/doc/ri/Folio/FileObject/%3c%3d%3e-i.yaml +10 -0
  78. data/doc/ri/Folio/FileObject/%3d%3d-i.yaml +10 -0
  79. data/doc/ri/Folio/FileObject/%5b%5d-c.yaml +12 -0
  80. data/doc/ri/Folio/FileObject/atime-i.yaml +10 -0
  81. data/doc/ri/Folio/FileObject/basename-i.yaml +10 -0
  82. data/doc/ri/Folio/FileObject/blockdev%3f-i.yaml +10 -0
  83. data/doc/ri/Folio/FileObject/cdesc-FileObject.yaml +154 -0
  84. data/doc/ri/Folio/FileObject/chardev%3f-i.yaml +10 -0
  85. data/doc/ri/Folio/FileObject/chmod-i.yaml +10 -0
  86. data/doc/ri/Folio/FileObject/chown-i.yaml +10 -0
  87. data/doc/ri/Folio/FileObject/cp-i.yaml +12 -0
  88. data/doc/ri/Folio/FileObject/ctime-i.yaml +10 -0
  89. data/doc/ri/Folio/FileObject/delete-i.yaml +12 -0
  90. data/doc/ri/Folio/FileObject/delete_force-i.yaml +12 -0
  91. data/doc/ri/Folio/FileObject/directory%3f-i.yaml +10 -0
  92. data/doc/ri/Folio/FileObject/dirname-i.yaml +10 -0
  93. data/doc/ri/Folio/FileObject/exist%3f-i.yaml +13 -0
  94. data/doc/ri/Folio/FileObject/exists%3f-i.yaml +12 -0
  95. data/doc/ri/Folio/FileObject/extname-i.yaml +10 -0
  96. data/doc/ri/Folio/FileObject/file%3f-i.yaml +10 -0
  97. data/doc/ri/Folio/FileObject/fnmatch%3f-i.yaml +12 -0
  98. data/doc/ri/Folio/FileObject/fnmatch-i.yaml +11 -0
  99. data/doc/ri/Folio/FileObject/grpowned%3f-i.yaml +10 -0
  100. data/doc/ri/Folio/FileObject/identical%3f-i.yaml +10 -0
  101. data/doc/ri/Folio/FileObject/inspect-i.yaml +12 -0
  102. data/doc/ri/Folio/FileObject/install-i.yaml +12 -0
  103. data/doc/ri/Folio/FileObject/link-i.yaml +11 -0
  104. data/doc/ri/Folio/FileObject/link_force-i.yaml +11 -0
  105. data/doc/ri/Folio/FileObject/ln-i.yaml +12 -0
  106. data/doc/ri/Folio/FileObject/ln_f-i.yaml +12 -0
  107. data/doc/ri/Folio/FileObject/ln_s-i.yaml +12 -0
  108. data/doc/ri/Folio/FileObject/ln_sf-i.yaml +12 -0
  109. data/doc/ri/Folio/FileObject/mtime-i.yaml +10 -0
  110. data/doc/ri/Folio/FileObject/mv-i.yaml +12 -0
  111. data/doc/ri/Folio/FileObject/new-c.yaml +10 -0
  112. data/doc/ri/Folio/FileObject/owned%3f-i.yaml +10 -0
  113. data/doc/ri/Folio/FileObject/pipe%3f-i.yaml +10 -0
  114. data/doc/ri/Folio/FileObject/readable%3f-i.yaml +10 -0
  115. data/doc/ri/Folio/FileObject/readable_real%3f-i.yaml +10 -0
  116. data/doc/ri/Folio/FileObject/relative-i.yaml +12 -0
  117. data/doc/ri/Folio/FileObject/rename-i.yaml +11 -0
  118. data/doc/ri/Folio/FileObject/restat-i.yaml +13 -0
  119. data/doc/ri/Folio/FileObject/rm-i.yaml +12 -0
  120. data/doc/ri/Folio/FileObject/rm_f-i.yaml +12 -0
  121. data/doc/ri/Folio/FileObject/setgid%3f-i.yaml +10 -0
  122. data/doc/ri/Folio/FileObject/setuid%3f-i.yaml +10 -0
  123. data/doc/ri/Folio/FileObject/size%3f-i.yaml +10 -0
  124. data/doc/ri/Folio/FileObject/size-i.yaml +10 -0
  125. data/doc/ri/Folio/FileObject/socket%3f-i.yaml +10 -0
  126. data/doc/ri/Folio/FileObject/split-i.yaml +12 -0
  127. data/doc/ri/Folio/FileObject/stat%21-i.yaml +12 -0
  128. data/doc/ri/Folio/FileObject/stat-i.yaml +12 -0
  129. data/doc/ri/Folio/FileObject/sticky%3f-i.yaml +10 -0
  130. data/doc/ri/Folio/FileObject/symlink-i.yaml +11 -0
  131. data/doc/ri/Folio/FileObject/symlink_force-i.yaml +11 -0
  132. data/doc/ri/Folio/FileObject/to_s-i.yaml +12 -0
  133. data/doc/ri/Folio/FileObject/touch-i.yaml +10 -0
  134. data/doc/ri/Folio/FileObject/unlink-i.yaml +15 -0
  135. data/doc/ri/Folio/FileObject/unlink_force-i.yaml +13 -0
  136. data/doc/ri/Folio/FileObject/util-i.yaml +10 -0
  137. data/doc/ri/Folio/FileObject/utime-i.yaml +10 -0
  138. data/doc/ri/Folio/FileObject/writable%3f-i.yaml +10 -0
  139. data/doc/ri/Folio/FileObject/writable_real%3f-i.yaml +10 -0
  140. data/doc/ri/Folio/FileObject/zero%3f-i.yaml +10 -0
  141. data/doc/ri/Folio/Link/cdesc-Link.yaml +29 -0
  142. data/doc/ri/Folio/Link/lchmod-i.yaml +10 -0
  143. data/doc/ri/Folio/Link/lchown-i.yaml +10 -0
  144. data/doc/ri/Folio/Link/link%3f-i.yaml +10 -0
  145. data/doc/ri/Folio/Link/lstat-i.yaml +10 -0
  146. data/doc/ri/Folio/Link/method_missing-i.yaml +11 -0
  147. data/doc/ri/Folio/Link/new-c.yaml +10 -0
  148. data/doc/ri/Folio/Link/readlink-i.yaml +10 -0
  149. data/doc/ri/Folio/Link/symlink%3f-i.yaml +10 -0
  150. data/doc/ri/Folio/Pipe/cdesc-Pipe.yaml +17 -0
  151. data/doc/ri/Folio/Pipe/new-c.yaml +10 -0
  152. data/doc/ri/Folio/Pipe/pipe%3f-i.yaml +10 -0
  153. data/doc/ri/Folio/Prompt/%2b-i.yaml +13 -0
  154. data/doc/ri/Folio/Prompt/%2f-i.yaml +12 -0
  155. data/doc/ri/Folio/Prompt/%5b%5d-c.yaml +10 -0
  156. data/doc/ri/Folio/Prompt/cd-i.yaml +10 -0
  157. data/doc/ri/Folio/Prompt/cdesc-Prompt.yaml +89 -0
  158. data/doc/ri/Folio/Prompt/chmod-i.yaml +10 -0
  159. data/doc/ri/Folio/Prompt/chmod_r-i.yaml +10 -0
  160. data/doc/ri/Folio/Prompt/chown-i.yaml +12 -0
  161. data/doc/ri/Folio/Prompt/chown_r-i.yaml +10 -0
  162. data/doc/ri/Folio/Prompt/cp-i.yaml +12 -0
  163. data/doc/ri/Folio/Prompt/cp_r-i.yaml +12 -0
  164. data/doc/ri/Folio/Prompt/directories-i.yaml +12 -0
  165. data/doc/ri/Folio/Prompt/entries-i.yaml +13 -0
  166. data/doc/ri/Folio/Prompt/file-i.yaml +12 -0
  167. data/doc/ri/Folio/Prompt/files-i.yaml +12 -0
  168. data/doc/ri/Folio/Prompt/fileutils-i.yaml +10 -0
  169. data/doc/ri/Folio/Prompt/glob-i.yaml +12 -0
  170. data/doc/ri/Folio/Prompt/install-i.yaml +10 -0
  171. data/doc/ri/Folio/Prompt/ln-i.yaml +12 -0
  172. data/doc/ri/Folio/Prompt/ln_s-i.yaml +12 -0
  173. data/doc/ri/Folio/Prompt/ln_sf-i.yaml +10 -0
  174. data/doc/ri/Folio/Prompt/localize-i.yaml +10 -0
  175. data/doc/ri/Folio/Prompt/ls-i.yaml +12 -0
  176. data/doc/ri/Folio/Prompt/mkdir-i.yaml +10 -0
  177. data/doc/ri/Folio/Prompt/mkdir_p-i.yaml +10 -0
  178. data/doc/ri/Folio/Prompt/mode-i.yaml +12 -0
  179. data/doc/ri/Folio/Prompt/mv-i.yaml +12 -0
  180. data/doc/ri/Folio/Prompt/new-c.yaml +11 -0
  181. data/doc/ri/Folio/Prompt/paths-i.yaml +12 -0
  182. data/doc/ri/Folio/Prompt/pwd-i.yaml +10 -0
  183. data/doc/ri/Folio/Prompt/rm-i.yaml +10 -0
  184. data/doc/ri/Folio/Prompt/rm_r-i.yaml +10 -0
  185. data/doc/ri/Folio/Prompt/rm_rf-i.yaml +10 -0
  186. data/doc/ri/Folio/Prompt/rmdir-i.yaml +10 -0
  187. data/doc/ri/Folio/Prompt/to_s-i.yaml +10 -0
  188. data/doc/ri/Folio/Prompt/touch-i.yaml +12 -0
  189. data/doc/ri/Folio/Socket/cdesc-Socket.yaml +16 -0
  190. data/doc/ri/Folio/Socket/new-c.yaml +10 -0
  191. data/doc/ri/Folio/cdesc-Folio.yaml +15 -0
  192. data/doc/ri/created.rid +1 -0
  193. data/lib/folio/device.rb +29 -0
  194. data/lib/folio/directory.rb +83 -0
  195. data/lib/folio/document.rb +66 -0
  196. data/lib/folio/errors.rb +7 -0
  197. data/lib/folio/fileobject.rb +242 -0
  198. data/lib/folio/link.rb +49 -0
  199. data/lib/folio/pipe.rb +16 -0
  200. data/lib/folio/prompt.rb +239 -0
  201. data/lib/folio/socket.rb +14 -0
  202. data/lib/folio.rb +79 -0
  203. data/test/fixture/bar.txt +0 -0
  204. data/test/fixture/foo.txt +0 -0
  205. data/test/test_folio.rb +28 -0
  206. data/test/test_helper.rb +7 -0
  207. metadata +300 -0
@@ -0,0 +1,10 @@
1
+ --- !ruby/object:RI::MethodDescription
2
+ aliases: []
3
+
4
+ block_params:
5
+ comment:
6
+ full_name: Folio::Prompt#rm_rf
7
+ is_singleton: false
8
+ name: rm_rf
9
+ params: (list, options)
10
+ visibility: public
@@ -0,0 +1,10 @@
1
+ --- !ruby/object:RI::MethodDescription
2
+ aliases: []
3
+
4
+ block_params:
5
+ comment:
6
+ full_name: Folio::Prompt#rmdir
7
+ is_singleton: false
8
+ name: rmdir
9
+ params: (dir, options)
10
+ visibility: public
@@ -0,0 +1,10 @@
1
+ --- !ruby/object:RI::MethodDescription
2
+ aliases: []
3
+
4
+ block_params:
5
+ comment:
6
+ full_name: Folio::Prompt#to_s
7
+ is_singleton: false
8
+ name: to_s
9
+ params: ()
10
+ visibility: public
@@ -0,0 +1,12 @@
1
+ --- !ruby/object:RI::MethodDescription
2
+ aliases: []
3
+
4
+ block_params:
5
+ comment:
6
+ - !ruby/struct:SM::Flow::P
7
+ body: alias_method :chown_R, :chown_r
8
+ full_name: Folio::Prompt#touch
9
+ is_singleton: false
10
+ name: touch
11
+ params: (list, options)
12
+ visibility: public
@@ -0,0 +1,16 @@
1
+ --- !ruby/object:RI::ClassDescription
2
+ attributes: []
3
+
4
+ class_methods:
5
+ - !ruby/object:RI::MethodSummary
6
+ name: new
7
+ comment:
8
+ constants: []
9
+
10
+ full_name: Folio::Socket
11
+ includes: []
12
+
13
+ instance_methods: []
14
+
15
+ name: Socket
16
+ superclass: FileObject
@@ -0,0 +1,10 @@
1
+ --- !ruby/object:RI::MethodDescription
2
+ aliases: []
3
+
4
+ block_params:
5
+ comment:
6
+ full_name: Folio::Socket::new
7
+ is_singleton: true
8
+ name: new
9
+ params: (path)
10
+ visibility: public
@@ -0,0 +1,15 @@
1
+ --- !ruby/object:RI::ClassDescription
2
+ attributes: []
3
+
4
+ class_methods: []
5
+
6
+ comment:
7
+ constants: []
8
+
9
+ full_name: Folio
10
+ includes: []
11
+
12
+ instance_methods: []
13
+
14
+ name: Folio
15
+ superclass:
@@ -0,0 +1 @@
1
+ Thu, 21 Aug 2008 15:20:49 -0400
@@ -0,0 +1,29 @@
1
+ require 'folio/fileobject'
2
+
3
+ module Folio
4
+
5
+ # Device base class
6
+ class Device < FileObject
7
+
8
+ def initialize(path)
9
+ raise 'Devices not yet supported.'
10
+ end
11
+
12
+ end
13
+
14
+ # Character device
15
+ class CharacterDevice < Device
16
+
17
+ def chardev? ; true ; end
18
+
19
+ end
20
+
21
+ # Block device
22
+ class BlockDevice < Device
23
+
24
+ def blockdev? ; true ; end
25
+
26
+ end
27
+
28
+ end
29
+
@@ -0,0 +1,83 @@
1
+ require 'folio/fileobject'
2
+
3
+ module Folio
4
+
5
+ class Directory < FileObject
6
+
7
+ def initialize(path=nil)
8
+ super(path || Dir.pwd)
9
+ raise FileNotFound unless ::File.directory?(@path)
10
+ end
11
+
12
+ def directory? ; true ; end
13
+
14
+ # We have to use FileUtils here b/c of some obscure
15
+ # secutiry issue.
16
+
17
+ # Copy recursively.
18
+ def cp_r(dest)
19
+ util.cp_r(path, dest)
20
+ end
21
+
22
+ def rmdir
23
+ util.rmdir(path)
24
+ end
25
+ alias_method :unlink, :rmdir
26
+ alias_method :delete, :rmdir
27
+ undef_method :rm
28
+
29
+ def rm_r
30
+ util.rm_r(path)
31
+ end
32
+
33
+ def rm_rf(list)
34
+ util.rm_rf(path)
35
+ end
36
+
37
+ def chmod_r(mode)
38
+ util.chmod_r(mode, path)
39
+ end
40
+ #alias_method :chmod_R, :chmod_r
41
+
42
+ def chown_r(user, group)
43
+ util.chown_r(user, group, path)
44
+ end
45
+ #alias_method :chown_R, :chown_r
46
+
47
+ #--
48
+ # ::Dir
49
+ #++
50
+
51
+ def chdir(&block)
52
+ ::Dir.chdir(path, &block)
53
+ end
54
+ alias_method :cd, :chdir
55
+
56
+ def chroot(&block)
57
+ ::Dir.chroot(path, &block)
58
+ end
59
+
60
+ # Directory entries. This returns a list of file names.
61
+ def entries
62
+ ::Dir.entries(path)
63
+ end
64
+
65
+ def foreach(&block)
66
+ ::Dir.foreach(path, &block)
67
+ end
68
+
69
+ # TODO: use enumerator (?)
70
+ def paths
71
+ (::Dir.entries(path) - ['.', '..']).collect{ |f| FileObject[path, f] }
72
+ end
73
+
74
+ # Join paths.
75
+ def /(fname)
76
+ FileObject[path, fname]
77
+ end
78
+ alias_method :+, :/
79
+
80
+ end
81
+
82
+ end
83
+
@@ -0,0 +1,66 @@
1
+ require 'folio/fileobject'
2
+
3
+ module Folio
4
+
5
+ class Document < FileObject
6
+
7
+ def intialize(path)
8
+ super
9
+ raise FileNotFound unless ::File.file?(@path)
10
+ raise FileNotFound if ::File.symlink?(@path)
11
+ end
12
+
13
+ #--
14
+ # Polymorphism
15
+ #++
16
+
17
+ def file? ; true ; end
18
+
19
+ #--
20
+ # FileTest::
21
+ #++
22
+
23
+ def executable? ; ::FileTest.executable?(path) ; end
24
+ def executable_real? ; ::FileTest.executable_real?(path) ; end
25
+
26
+ #--
27
+ # File::
28
+ #++
29
+
30
+ def read ; ::File.read(path) ; end
31
+
32
+ def readlines ; ::File.readlines(path) ; end
33
+
34
+ # TODO: how to handle unkinking (b/c file no longer exists)
35
+ def unlink ; ::File.unlink(path) ; end
36
+ def delete ; ::File.delete(path) ; end
37
+
38
+ #--
39
+ # File.open
40
+ #++
41
+
42
+ def open(mode, &block)
43
+ ::File.open(path, mode, &block)
44
+ end
45
+
46
+ def truncate(size)
47
+ ::File.open(path, 'w'){|f| f.truncate(size)}
48
+ end
49
+
50
+ #--
51
+ # Can we handle other modes besides read this way?
52
+ #++
53
+
54
+ #flock(mode) ; _file.flock(mode) ; end
55
+
56
+ #def method_missing(s, *a, &b)
57
+ # _file.send(s, *a, &b)
58
+ #end
59
+
60
+ #private
61
+
62
+ #def _file ; @_file ||= ::File.new(path) ; end
63
+ end
64
+
65
+ end
66
+
@@ -0,0 +1,7 @@
1
+ module Folio
2
+
3
+ class FileNotFound < ::IOError
4
+ end
5
+
6
+ end
7
+
@@ -0,0 +1,242 @@
1
+
2
+ module Folio
3
+
4
+ # = File Object
5
+ #
6
+ # Base class for all folio objects.
7
+ #
8
+ class FileObject
9
+
10
+ Separator = ::File::Separator
11
+
12
+ # Factory method.
13
+ def self.[](*path)
14
+ path = ::File.join(*path)
15
+
16
+ raise FileNotFound unless ::File.exist?(path)
17
+
18
+ case ::File.ftype(path)
19
+ when 'file'
20
+ Document.new(path)
21
+ when 'directory'
22
+ Directory.new(path)
23
+ when 'link'
24
+ Link.new(path)
25
+ when 'characterSpecial'
26
+ CharacterDevice.new(path)
27
+ when 'blockSpecial'
28
+ BlockDevice.new(path)
29
+ when 'socket'
30
+ raise TypeError # Socket.new(path) ?
31
+ when 'fifo'
32
+ raise TypeError # Pipe?
33
+ else # 'unknown'
34
+ raise TypeError
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def initialize(path)
41
+ raise FileNotFound unless ::File.exist?(path)
42
+ @relpath = path
43
+ @path = ::File.expand_path(path)
44
+ end
45
+
46
+ public
47
+
48
+ attr :path
49
+ attr :relpath
50
+
51
+ # This will alwasy be true, EXCEPT when
52
+ # #rm, #delete or #unlink have been used.
53
+ def exist?
54
+ ::FileTest.exist?(path)
55
+ end
56
+ alias_method :exists?, :exist?
57
+
58
+ #--
59
+ # File Manipulation
60
+ #++
61
+
62
+ def link(new)
63
+ ::File.ln(path, new)
64
+ end
65
+ alias_method :ln, :link
66
+
67
+ def link_force(new)
68
+ ::File.remove(new)
69
+ link(new)
70
+ end
71
+ alias_method :ln_f, :link_force
72
+
73
+ def symlink(new)
74
+ ::File.symlink(path, new)
75
+ end
76
+ alias_method :ln_s, :symlink
77
+
78
+ def symlink_force(new)
79
+ ::File.remove(new)
80
+ symlink(new)
81
+ end
82
+ alias_method :ln_sf, :symlink_force
83
+
84
+ def rename(dest)
85
+ ::File.rename(path, dest)
86
+ @relpath = dest
87
+ @path = ::File.expand_path(dest)
88
+ end
89
+ alias_method :mv, :rename
90
+
91
+ # how to handle --b/c it disappears?
92
+ def unlink
93
+ ::File.delete(path)
94
+ end
95
+ alias_method :delete, :unlink
96
+ alias_method :rm, :unlink
97
+
98
+ def unlink_force
99
+ ::File.remove(new)
100
+ unlink(path)
101
+ end
102
+ alias_method :delete_force, :unlink_force
103
+ alias_method :rm_f, :unlink_force
104
+
105
+ def chmod(mode)
106
+ ::File.chmod(mode, path)
107
+ end
108
+
109
+ def chown(user, group)
110
+ ::File.chown(user, group, path)
111
+ end
112
+
113
+ def utime(atime, mtime)
114
+ ::File.utime(atime, mtime, path)
115
+ end
116
+
117
+ # Wherever possible we have tried to avoid using
118
+ # FileUtils. Hoever there are a few methods that
119
+ # require it's use becuase of the complications
120
+ # in their implementation. Evenutlly we might port
121
+ # these methods.
122
+
123
+ # Copy file to destination path.
124
+ def cp(dest)
125
+ util.cp(path, dest)
126
+ end
127
+
128
+ # Install file to destination path.
129
+ def install(dest, mode=nil)
130
+ util.install(path, dest, mode)
131
+ end
132
+
133
+ def touch
134
+ util.touch(path)
135
+ end
136
+
137
+ # Status methods. These methods all access a cached
138
+ # ::File::Stat object. You can use #stat! to refresh
139
+ # the status cache.
140
+
141
+ # Get stat and cache it.
142
+ def stat
143
+ @stat ||= File.stat(path)
144
+ end
145
+
146
+ # Refresh status cache.
147
+ def restat
148
+ @stat = File.stat(path)
149
+ end
150
+ alias_method :stat!, :restat
151
+
152
+ def file? ; stat.file? ; end
153
+ def directory? ; stat.directory? ; end
154
+ def blockdev? ; stat.blockdev? ; end
155
+ def chardev? ; stat.chardev? ; end
156
+ def socket? ; stat.socket? ; end
157
+ def pipe? ; stat.pipe? ; end
158
+
159
+ def atime ; stat.atime ; end
160
+ def ctime ; stat.ctime ; end
161
+ def grpowned? ; stat.grpowned? ; end
162
+ def identical? ; stat.identical? ; end
163
+ def mtime ; stat.mtime ; end
164
+ def owned? ; stat.owned? ; end
165
+ def readable? ; stat.readable? ; end
166
+ def readable_real? ; stat.readable_real ; end
167
+ def setgid? ; stat.setgid? ; end
168
+ def setuid? ; stat.setuid? ; end
169
+ def size ; stat.size ; end
170
+ def size? ; stat.size? ; end
171
+ def sticky? ; stat.sticky? ; end
172
+ def writable? ; stat.writable? ; end
173
+ def writable_real? ; stat.writable_real? ; end
174
+ def zero? ; stat.zero? ; end
175
+
176
+ #--
177
+ # Pathname Methods
178
+ #++
179
+
180
+ def basename ; ::File.basename(path) ; end
181
+ def dirname ; ::File.dirname(path) ; end
182
+ def extname ; ::File.extname(path) ; end
183
+
184
+ # TODO: I don't like the name of this.
185
+ def split ; ::File.split(path) ; end
186
+
187
+ # Gives path relative to current working directory.
188
+ # If current is below path one step then it uses '..',
189
+ # further below and it returns the full path.
190
+ def relative
191
+ pwd = Dir.pwd
192
+ pth = path
193
+ if pth.index(pwd) == 0
194
+ r = pth[pwd.size+1..-1]
195
+ r = '.' unless r
196
+ return r
197
+ else
198
+ pwd = File.dirname(pwd)
199
+ if pth.index(pwd) == 0
200
+ r = pth[pwd.size+1..-1]
201
+ return '..' unless r
202
+ return File.join('..', r)
203
+ else
204
+ pth
205
+ end
206
+ end
207
+ end
208
+
209
+ def fnmatch(pattern, flags=0)
210
+ ::File.fnmatch(path, pattern, flags)
211
+ end
212
+ alias_method :fnmatch?, :fnmatch
213
+
214
+ #--
215
+ # Standard Object Methods
216
+ #++
217
+
218
+ # Inspect returns the path string relative to
219
+ # the current working directory.
220
+ def inspect; "#{relative}"; end
221
+
222
+ # Returns the path string.
223
+ def to_s ; path ; end
224
+
225
+ def <=>(other)
226
+ path <=> other.to_s
227
+ end
228
+
229
+ def ==(other)
230
+ path == other.path
231
+ end
232
+
233
+ private
234
+
235
+ def util
236
+ ::FileUtils
237
+ end
238
+
239
+ end
240
+
241
+ end
242
+
data/lib/folio/link.rb ADDED
@@ -0,0 +1,49 @@
1
+ require 'folio/fileobject'
2
+
3
+ module Folio
4
+
5
+ class Link < FileObject
6
+
7
+ def initialize(path)
8
+ super
9
+ raise FileNotFound unless ::File.symlink?(@path)
10
+
11
+ @folio = Folio.new(::File.readlink(path))
12
+ end
13
+
14
+ #--
15
+ # Am I write to think any file object can be linked?
16
+ #++
17
+
18
+ def symlink?
19
+ ::File.symlink(path)
20
+ end
21
+
22
+ def link?
23
+ ::File.link?(path)
24
+ end
25
+
26
+ def readlink
27
+ ::File.readlink(path)
28
+ end
29
+
30
+ def lchmod(mode)
31
+ ::File.lchmod(mode, path)
32
+ end
33
+
34
+ def lchown(own, grp)
35
+ ::File.lchown(own, grp, path)
36
+ end
37
+
38
+ def lstat
39
+ ::File.lstat(path)
40
+ end
41
+
42
+ #
43
+ def method_missing(s, *a, &b)
44
+ @folio.send(s, *a, &b)
45
+ end
46
+
47
+ end
48
+
49
+ end
data/lib/folio/pipe.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'folio/fileobject'
2
+
3
+ module Folio
4
+
5
+ class Pipe < FileObject
6
+
7
+ def initialize(path)
8
+ raise 'Pipes not yet supported.'
9
+ end
10
+
11
+ def pipe? ; true ; end
12
+
13
+ end
14
+
15
+ end
16
+