Module: LineCache
- Defined in:
- lib/linecache.rb
Overview
module LineCache
Module caching lines of a file
Defined Under Namespace
Classes: LineCacheInfo
Constant Summary collapse
- @@file_cache =
the cache
{}
Class Method Summary collapse
-
.checkcache(filename = nil) ⇒ Object
Discard cache entries that are out of date.
-
.clear_file_cache ⇒ Object
Clear the file cache entirely.
-
.getline(filename, lineno) ⇒ Object
Get line
linenofrom file namedfilename. -
.getlines(filename) ⇒ Object
Read lines of
filenameand cache the results. -
.update_cache(filename) ⇒ Object
Update a cache entry and return its list of lines.
Class Method Details
.checkcache(filename = nil) ⇒ Object
Discard cache entries that are out of date. If filename is nil all entries in the file cache @@file_cache are checked.
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/linecache.rb', line 107 def checkcache(filename=nil) if !filename filenames = @@file_cache.keys() elsif @@file_cache.member?(filename) filenames = [filename] else return nil end for filename in filenames next unless @@file_cache.member?(filename) fullname = @@file_cache[filename].fullname if File.exist?(fullname) cache_info = @@file_cache[filename] stat = File.stat(fullname) if cache_info.size != stat.size or cache_info.mtime != stat.mtime @@file_cache.delete(filename) end else @@file_cache.delete(filename) end end end |
.clear_file_cache ⇒ Object
Clear the file cache entirely.
87 88 89 |
# File 'lib/linecache.rb', line 87 def clear_file_cache() @@file_cache = {} end |
.getline(filename, lineno) ⇒ Object
Get line lineno from file named filename. Return nil if there was a problem. If a file named filename is not found, the function will look for it in the $: path array.
Examples:
lines = LineCache::getline('/tmp/myfile.rb)
# Same as above
$: << '/tmp'
lines = Dir.chdir('/tmp') do
lines = LineCache::getlines ('myfile.rb')
end
73 74 75 76 77 78 79 80 |
# File 'lib/linecache.rb', line 73 def getline(filename, lineno) lines = getlines(filename) if (1..lines.size) === lineno return lines[lineno-1] else return nil end end |
.getlines(filename) ⇒ Object
Read lines of filename and cache the results. However filename was previously cached use the results from the cache.
95 96 97 98 99 100 101 |
# File 'lib/linecache.rb', line 95 def getlines(filename) if @@file_cache.member?(filename) return @@file_cache[filename].lines else return update_cache(filename) end end |
.update_cache(filename) ⇒ Object
Update a cache entry and return its list of lines. if something’s wrong, discard the cache entry, and return an empty list.
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/linecache.rb', line 136 def update_cache(filename) return [] unless filename @@file_cache.delete(filename) fullname = File.(filename) if File.exist?(fullname) stat = File.stat(fullname) else basename = File.basename(filename) # try looking through the search path. stat = nil for dirname in $: fullname = File.join(dirname, basename) if File.exist?(fullname) stat = File.stat(fullname) break end end return [] unless stat end begin fp = File.open(fullname, 'r') lines = fp.readlines() fp.close() rescue ## print '*** cannot open', fullname, ':', msg return [] end @@file_cache[filename] = LineCacheInfo.new(File.stat(fullname), lines, fullname) return lines end |