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

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_cacheObject

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.expand_path(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