Class: Rake::FileList
Overview
######################################################################### A FileList is essentially an array with a few helper methods defined to make file manipulation a bit easier.
FileLists are lazy. When given a list of glob patterns for possible files to be included in the file list, instead of searching the file structures to find the files, a FileList holds the pattern for latter use.
This allows us to define a number of FileList to match any number of files, but only search out the actual files when then FileList itself is actually used. The key is that the first time an element of the FileList/Array is requested, the pending patterns are resolved into a real list of file names.
Constant Summary collapse
- ARRAY_METHODS =
List of array methods (that are not in
Object) that need to be delegated. (Array.instance_methods - Object.instance_methods).map { |n| n.to_s }
- MUST_DEFINE =
List of additional methods that must be delegated.
%w[to_a inspect]
- MUST_NOT_DEFINE =
List of methods that should not be delegated here (we define special versions of them explicitly below).
%w[to_a to_ary partition *]
- SPECIAL_RETURN =
List of delegated methods that return new array values which need wrapping.
%w[ map collect sort sort_by select find_all reject grep compact flatten uniq values_at + - & | ]
- DELEGATING_METHODS =
(ARRAY_METHODS + MUST_DEFINE - MUST_NOT_DEFINE).collect{ |s| s.to_s }.sort.uniq
- DEFAULT_IGNORE_PATTERNS =
[ /(^|[\/\\])CVS([\/\\]|$)/, /(^|[\/\\])\.svn([\/\\]|$)/, /\.bak$/, /~$/ ]
- DEFAULT_IGNORE_PROCS =
[ proc { |fn| fn =~ /(^|[\/\\])core$/ && ! File.directory?(fn) } ]
Class Method Summary collapse
-
.[](*args) ⇒ Object
Create a new file list including the files listed.
Instance Method Summary collapse
-
#*(other) ⇒ Object
Redefine * to return either a string or a new file list.
-
#==(array) ⇒ Object
Define equality.
- #calculate_exclude_regexp ⇒ Object
-
#clear_exclude ⇒ Object
Clear all the exclude patterns so that we exclude nothing.
-
#egrep(pattern, *options) ⇒ Object
Grep each of the files in the filelist using the given pattern.
-
#exclude(*patterns, &block) ⇒ Object
Register a list of file name patterns that should be excluded from the list.
-
#exclude?(fn) ⇒ Boolean
Should the given file name be excluded?.
-
#existing ⇒ Object
Return a new file list that only contains file names from the current file list that exist on the file system.
-
#existing! ⇒ Object
Modify the current file list so that it contains only file name that exist on the file system.
-
#ext(newext = '') ⇒ Object
Return a new FileList with
String#extmethod applied to each member of the array. -
#gsub(pat, rep) ⇒ Object
Return a new FileList with the results of running
gsubagainst each element of the original list. -
#gsub!(pat, rep) ⇒ Object
Same as
gsubexcept that the original file list is modified. -
#import(array) ⇒ Object
@exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup.
-
#include(*filenames) ⇒ Object
(also: #add)
Add file names defined by glob patterns to the file list.
-
#initialize(*patterns) {|_self| ... } ⇒ FileList
constructor
Create a file list from the globbable patterns given.
-
#is_a?(klass) ⇒ Boolean
(also: #kind_of?)
Lie about our class.
-
#partition(&block) ⇒ Object
FileList version of partition.
-
#pathmap(spec = nil) ⇒ Object
Apply the pathmap spec to each of the included file names, returning a new file list with the modified paths.
-
#resolve ⇒ Object
Resolve all the pending adds now.
-
#sub(pat, rep) ⇒ Object
Return a new FileList with the results of running
subagainst each element of the oringal list. -
#sub!(pat, rep) ⇒ Object
Same as
subexcept that the oringal file list is modified. -
#to_a ⇒ Object
Return the internal array object.
-
#to_ary ⇒ Object
Return the internal array object.
-
#to_s ⇒ Object
Convert a FileList to a string by joining all elements with a space.
Methods included from Cloneable
Constructor Details
#initialize(*patterns) {|_self| ... } ⇒ FileList
1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 |
# File 'lib/rake.rb', line 1291 def initialize(*patterns) @pending_add = [] @pending = false @exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup @exclude_procs = DEFAULT_IGNORE_PROCS.dup @exclude_re = nil @items = [] patterns.each { |pattern| include(pattern) } yield self if block_given? end |
Class Method Details
Instance Method Details
#*(other) ⇒ Object
Redefine * to return either a string or a new file list.
1386 1387 1388 1389 1390 1391 1392 1393 1394 |
# File 'lib/rake.rb', line 1386 def *(other) result = @items * other case result when Array FileList.new.import(result) else result end end |
#==(array) ⇒ Object
Define equality.
1364 1365 1366 |
# File 'lib/rake.rb', line 1364 def ==(array) to_ary == array end |
#calculate_exclude_regexp ⇒ Object
1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 |
# File 'lib/rake.rb', line 1407 def calculate_exclude_regexp ignores = [] @exclude_patterns.each do |pat| case pat when Regexp ignores << pat when /[*?]/ Dir[pat].each do |p| ignores << p end else ignores << Regexp.quote(pat) end end if ignores.empty? @exclude_re = /^$/ else re_str = ignores.collect { |p| "(" + p.to_s + ")" }.join("|") @exclude_re = Regexp.new(re_str) end end |
#clear_exclude ⇒ Object
Clear all the exclude patterns so that we exclude nothing.
1356 1357 1358 1359 1360 1361 |
# File 'lib/rake.rb', line 1356 def clear_exclude @exclude_patterns = [] @exclude_procs = [] calculate_exclude_regexp if ! @pending self end |
#egrep(pattern, *options) ⇒ Object
Grep each of the files in the filelist using the given pattern. If a block is given, call the block on each matching line, passing the file name, line number, and the matching line of text. If no block is given, a standard emac style file:linenumber:line message will be printed to standard out.
1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 |
# File 'lib/rake.rb', line 1502 def egrep(pattern, *) each do |fn| open(fn, "rb", *) do |inf| count = 0 inf.each do |line| count += 1 if pattern.match(line) if block_given? yield fn, count, line else puts "#{fn}:#{count}:#{line}" end end end end end end |
#exclude(*patterns, &block) ⇒ Object
Register a list of file name patterns that should be excluded from the list. Patterns may be regular expressions, glob patterns or regular strings. In addition, a block given to exclude will remove entries that return true when given to the block.
Note that glob patterns are expanded against the file system. If a file is explicitly added to a file list, but does not exist in the file system, then an glob pattern in the exclude list will not exclude the file.
Examples:
FileList['a.c', 'b.c'].exclude("a.c") => ['b.c']
FileList['a.c', 'b.c'].exclude(/^a/) => ['b.c']
If “a.c” is a file, then …
FileList['a.c', 'b.c'].exclude("a.*") => ['b.c']
If “a.c” is not a file, then …
FileList['a.c', 'b.c'].exclude("a.*") => ['a.c', 'b.c']
1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 |
# File 'lib/rake.rb', line 1343 def exclude(*patterns, &block) patterns.each do |pat| @exclude_patterns << pat end if block_given? @exclude_procs << block end resolve_exclude if ! @pending self end |
#exclude?(fn) ⇒ Boolean
Should the given file name be excluded?
1560 1561 1562 1563 |
# File 'lib/rake.rb', line 1560 def exclude?(fn) calculate_exclude_regexp unless @exclude_re fn =~ @exclude_re || @exclude_procs.any? { |p| p.call(fn) } end |
#existing ⇒ Object
Return a new file list that only contains file names from the current file list that exist on the file system.
1522 1523 1524 |
# File 'lib/rake.rb', line 1522 def existing select { |fn| File.exist?(fn) } end |
#existing! ⇒ Object
Modify the current file list so that it contains only file name that exist on the file system.
1528 1529 1530 1531 1532 |
# File 'lib/rake.rb', line 1528 def existing! resolve @items = @items.select { |fn| File.exist?(fn) } self end |
#ext(newext = '') ⇒ Object
Return a new FileList with String#ext method applied to each member of the array.
This method is a shortcut for:
array.collect { |item| item.ext(newext) }
ext is a user added method for the Array class.
1492 1493 1494 |
# File 'lib/rake.rb', line 1492 def ext(newext='') collect { |fn| fn.ext(newext) } end |
#gsub(pat, rep) ⇒ Object
Return a new FileList with the results of running gsub against each element of the original list.
Example:
FileList['lib/test/file', 'x/y'].gsub(/\//, "\\")
=> ['lib\\test\\file', 'x\\y']
1461 1462 1463 |
# File 'lib/rake.rb', line 1461 def gsub(pat, rep) inject(FileList.new) { |res, fn| res << fn.gsub(pat,rep) } end |
#gsub!(pat, rep) ⇒ Object
Same as gsub except that the original file list is modified.
1472 1473 1474 1475 |
# File 'lib/rake.rb', line 1472 def gsub!(pat, rep) each_with_index { |fn, i| self[i] = fn.gsub(pat,rep) } self end |
#import(array) ⇒ Object
@exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup
1576 1577 1578 1579 |
# File 'lib/rake.rb', line 1576 def import(array) @items = array self end |
#include(*filenames) ⇒ Object Also known as: add
Add file names defined by glob patterns to the file list. If an array is given, add each element of the array.
Example:
file_list.include("*.java", "*.cfg")
file_list.include %w( math.c lib.h *.o )
1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 |
# File 'lib/rake.rb', line 1309 def include(*filenames) # TODO: check for pending filenames.each do |fn| if fn.respond_to? :to_ary include(*fn.to_ary) else @pending_add << fn end end @pending = true self end |
#is_a?(klass) ⇒ Boolean Also known as: kind_of?
Lie about our class.
1380 1381 1382 |
# File 'lib/rake.rb', line 1380 def is_a?(klass) klass == Array || super(klass) end |
#partition(&block) ⇒ Object
FileList version of partition. Needed because the nested arrays should be FileLists in this version.
1536 1537 1538 1539 1540 1541 1542 1543 |
# File 'lib/rake.rb', line 1536 def partition(&block) # :nodoc: resolve result = @items.partition(&block) [ FileList.new.import(result[0]), FileList.new.import(result[1]), ] end |
#pathmap(spec = nil) ⇒ Object
Apply the pathmap spec to each of the included file names, returning a new file list with the modified paths. (See String#pathmap for details.)
1480 1481 1482 |
# File 'lib/rake.rb', line 1480 def pathmap(spec=nil) collect { |fn| fn.pathmap(spec) } end |
#resolve ⇒ Object
Resolve all the pending adds now.
1397 1398 1399 1400 1401 1402 1403 1404 1405 |
# File 'lib/rake.rb', line 1397 def resolve if @pending @pending = false @pending_add.each do |fn| resolve_add(fn) end @pending_add = [] resolve_exclude end self end |
#sub(pat, rep) ⇒ Object
Return a new FileList with the results of running sub against each element of the oringal list.
Example:
FileList['a.c', 'b.c'].sub(/\.c$/, '.o') => ['a.o', 'b.o']
1450 1451 1452 |
# File 'lib/rake.rb', line 1450 def sub(pat, rep) inject(FileList.new) { |res, fn| res << fn.sub(pat,rep) } end |
#sub!(pat, rep) ⇒ Object
Same as sub except that the oringal file list is modified.
1466 1467 1468 1469 |
# File 'lib/rake.rb', line 1466 def sub!(pat, rep) each_with_index { |fn, i| self[i] = fn.sub(pat,rep) } self end |
#to_a ⇒ Object
Return the internal array object.
1369 1370 1371 1372 |
# File 'lib/rake.rb', line 1369 def to_a resolve @items end |
#to_ary ⇒ Object
Return the internal array object.
1375 1376 1377 |
# File 'lib/rake.rb', line 1375 def to_ary to_a end |
#to_s ⇒ Object
Convert a FileList to a string by joining all elements with a space.
1546 1547 1548 1549 |
# File 'lib/rake.rb', line 1546 def to_s resolve self.join(' ') end |