dirtravel 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/dirtravel.rb +233 -0
  2. metadata +65 -0
data/lib/dirtravel.rb ADDED
@@ -0,0 +1,233 @@
1
+ # DirTravel is a library for getting information about files and
2
+ # directories recursively to a tree structure. This library extends
3
+ # the RubyTree classes to include directory and files info. Please
4
+ # refer to RubyTree documentation for RubyTree related features.
5
+ #
6
+ # A proxy object "DirTravel::Travel" is used to gather the directory
7
+ # content. The "filetree" class method provides interface for getting
8
+ # the content with few options (see: DirTravel::Travel.filetree for
9
+ # details).
10
+ #
11
+ # Examples:
12
+ # require 'dirtravel'
13
+ #
14
+ # # Collect all entries under '.'
15
+ # d = DirTravel::Travel.filetree( '.' )
16
+ #
17
+ # # Display names of the entries in the hierarhcy.
18
+ # d.children.each do |i|
19
+ # puts i.name
20
+ # end
21
+ #
22
+ # # Display absolute path for file (leaf level) entries.
23
+ # d.each_leaf do |i|
24
+ # puts i.abspath
25
+ # end
26
+ #
27
+ # # Get MP3 files and create a list of all album directories
28
+ # # (assuming "...<album>/<song>" hierarhcy).
29
+ # d = DirTravel::Travel.filetree( '.', { :suffix => '.mp3' } )
30
+ # albums = d.select_level( d.node_height - 1 )
31
+ #
32
+
33
+ module DirTravel
34
+
35
+ require 'rubytree'
36
+
37
+
38
+ # Extend RubyTree base class with file and directory features.
39
+ class Entry < Tree::TreeNode
40
+ attr_accessor :name
41
+
42
+ def initialize( name )
43
+ super( name, nil )
44
+ end
45
+
46
+
47
+ # Return path components as Array.
48
+ #
49
+ # @param basedir [Entry] Starting level for the hierarchy.
50
+ # @return [Array] Array of names in hierarchy.
51
+ def pathArray( basedir = self )
52
+ parents = []
53
+ while basedir
54
+ parents.push basedir.name
55
+ basedir = basedir.parent
56
+ end
57
+ parents.reverse
58
+ end
59
+
60
+ # Relative path.
61
+ def path
62
+ pathArray.join( '/' )
63
+ end
64
+
65
+ # Relative path under root.
66
+ def subpath
67
+ pathArray[ 1 .. -1 ].join( '/' )
68
+ end
69
+
70
+ # Absolute path.
71
+ def abspath
72
+ File.absolute_path( path )
73
+ end
74
+
75
+ # Return containing directory name.
76
+ #
77
+ # @param basedir [Entry] Starting level for the hierarchy.
78
+ # @return [String] Containing directory.
79
+ def dir( basedir = self )
80
+ pathArray( basedir.parent ).join( '/' )
81
+ end
82
+
83
+ # Select all siblings from given node depth.
84
+ #
85
+ # @param level [Integer] Selected level in hierachy. Level is
86
+ # number of step down in hierarhcy.
87
+ # @return [Array] Array of siblings in selected hierarchy.
88
+ def select_level( level )
89
+ select do |i| i.node_depth == level; end
90
+ end
91
+
92
+ # Return all file entries in hierarchy.
93
+ def files
94
+ select do |i| i.kind_of?( FileEntry ) end
95
+ end
96
+
97
+ # File.stat data for the Entry.
98
+ def stat
99
+ File.stat( path )
100
+ end
101
+ end
102
+
103
+
104
+ # Directory type entry.
105
+ class DirEntry < Entry
106
+ def initialize( name )
107
+ super( name )
108
+ end
109
+ end
110
+
111
+
112
+ # File type entry.
113
+ class FileEntry < Entry
114
+ attr_reader :suffix, :basename
115
+
116
+ def initialize( name )
117
+ super( name )
118
+ @suffix = File.extname( name )
119
+ @basename = File.basename( name, @suffix )
120
+ end
121
+
122
+ end
123
+
124
+
125
+ # Create directory recursion tree (with
126
+ # Travel.filetree). Optionally filter with suffix and modify
127
+ # tree building with options Hash (see below).
128
+ #
129
+ # == Parameters:
130
+ # sort::
131
+ # Sort directory entries (default: false).
132
+ # suffix::
133
+ # Limit search to files with "suffix" (default: nil).
134
+ # files::
135
+ # Include files to search (default: true).
136
+ #
137
+ # Example:
138
+ # d1 = DirTravel::Travel.filetree( dir1, { :sort => true, :suffix => '.mp3' } )
139
+
140
+ class Travel
141
+
142
+ # Root DirEntry of Travel.
143
+ attr_accessor :root
144
+
145
+ # Default options for Travel.
146
+ attr_accessor :defaults
147
+
148
+ # Starting directory for Travel
149
+ attr_accessor :basedir
150
+
151
+ # Create directory recursion tree.
152
+ # @param basedir [String] Starting directory (top).
153
+ # @param options [Hash] Hash optionally including keys: :sort, :suffix, :files.
154
+ # @return [DirEntry] Root item of the file system hierarchy.
155
+ def Travel.filetree( basedir = '.', options = {} )
156
+ r = Travel.new( basedir, options )
157
+ r.travel
158
+ r.root
159
+ end
160
+
161
+
162
+ def initialize( basedir = '.', options = {} )
163
+ @basedir = basedir
164
+
165
+ @defaults = {
166
+ :suffix => nil,
167
+ :sort => false,
168
+ :files => true,
169
+ }
170
+
171
+ @defaults.merge!( options )
172
+
173
+ @root = DirEntry.new( @basedir )
174
+ end
175
+
176
+
177
+ # Recursively get all files with suffix. Ignore suffix if
178
+ # suffix is nil.
179
+ def travel( suffix = @defaults[ :suffix ] )
180
+ entriesIn( @basedir, @root, suffix )
181
+ end
182
+
183
+
184
+ private
185
+
186
+ # Recursively get all files with suffix. Ignore suffix if
187
+ # suffix is nil.
188
+ def entriesIn( dir, node, suffix = nil )
189
+
190
+ list = entries( dir )
191
+
192
+ list.each do |i|
193
+
194
+ if File.file?( dir + '/' + i )
195
+
196
+ # File entry.
197
+
198
+ if ( !suffix || suffix == File.extname( i ) ) &&
199
+ @defaults[ :files ]
200
+ node.add( FileEntry.new( i ) )
201
+ end
202
+
203
+ else
204
+
205
+ # Dir entry.
206
+
207
+ newNode = DirEntry.new( i )
208
+ node.add( newNode )
209
+ entriesIn( dir + '/' + i, newNode, suffix )
210
+
211
+ end
212
+
213
+ end
214
+
215
+ self
216
+ end
217
+
218
+ # Directory entries with dot entries filtered out.
219
+ def entries( dir )
220
+ entries = Dir.entries( dir ).select do |i| nonDotEntry( i ); end
221
+ entries.sort! if @defaults[ :sort ]
222
+ entries
223
+ end
224
+
225
+ # Test for non-dot-entry.
226
+ def nonDotEntry( name )
227
+ ( name != '.' && name != '..' )
228
+ end
229
+
230
+ end
231
+
232
+
233
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dirtravel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tero Isannainen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rubytree
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.8.3
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.8.3
30
+ description: DirTravel provides content of filesystem directories by recursively travelling
31
+ the directory hierarchy. The content is organized in RubyTree structure which overloaded
32
+ directory entry methods.
33
+ email: tero.isannainen@gmail.com
34
+ executables: []
35
+ extensions: []
36
+ extra_rdoc_files: []
37
+ files:
38
+ - lib/dirtravel.rb
39
+ homepage:
40
+ licenses:
41
+ - Ruby
42
+ post_install_message: Check README...
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: 1.9.3
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubyforge_project:
60
+ rubygems_version: 1.8.23
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: Small and simple library for accessing filesystem directories.
64
+ test_files: []
65
+ has_rdoc: