A class for representing directory search paths.
Create a new Arrow::Path object for the specified path, which can be either a String containing directory names separated by File::PATH_SEPARATOR, an Array of directory names, or an object which returns such an Array when #to_a is called on it. If cache_lifespan is non-zero, the Array of valid directories will be cached for cache_lifespan seconds to save calls to stat().
     # File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 112
112:         def initialize( path=[], cache_lifespan=DefaultCacheLifespan )
113:             @dirs = case path
114:                     when Array
115:                         path.flatten
116:                     when String
117:                         path.split(Separator)
118:                     else
119:                         path.to_a.flatten
120:                     end
121: 
122:             @dirs.each {|dir| dir.untaint}
123: 
124:             @valid_dirs = []
125:             @cache_lifespan = cache_lifespan
126:             @last_stat = Time.at(0)
127:         end
	          		Enumerable interface method. Iterate over the list of valid dirs in this path, calling the specified block for each.
     # File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 191
191:         def each( &block )
192:             self.valid_dirs.each( &block )
193:         end
	          		Return the path as a PathSeparator-separated String.
     # File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 197
197:         def to_s
198:             return self.valid_dirs.join( Separator )
199:         end
	          		Return the path as YAML text
     # File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 203
203:         def to_yaml( opts={} )
204:             require 'yaml'
205:             YAML.quick_emit( self.object_id, opts ) {|out|
206:                 out.seq( self.class.to_yaml_type ){|seq|
207:                     seq.add( self.dirs )
208:                 }
209:             }
210:         end
	          		Fetch the list of directories in the search path, vetted to only contain existent and readable ones. All the enumeration methods use this list.
     # File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 146
146:         def valid_dirs
147:             if ( @cache_lifespan.nonzero? &&
148:                  ((Time.now - @last_stat) < @cache_lifespan) )
149:                 self.log.debug "Returning cached dirs."
150:                 return @valid_dirs
151:             end
152: 
153:             @valid_dirs = @dirs.find_all do |dir|
154:                 if dir.tainted?
155:                     self.log.info "Discarding tainted directory entry %p" % [ dir ]
156:                     next
157:                 end
158: 
159:                 begin
160:                     stat = File.stat(dir)
161:                     if stat.directory? && stat.readable?
162:                         true
163:                     else
164:                         self.log.debug "Discarded unreadable or non-directory %s" %
165:                             dir
166:                         false
167:                     end
168:                 rescue Errno::ENOENT => err
169:                     self.log.notice "Discarded invalid directory %p: %s" %
170:                         [ dir, err.message ]
171:                     false
172:                 rescue ::SecurityError => err
173:                     self.log.error "Discarded unsafe directory %p: %s" %
174:                         [ dir, err.message ]
175:                 end
176:             end
177:             @last_stat = Time.now
178: 
179:             return @valid_dirs
180:         end
	          		--- SEC00186
--- ""
--- 
- name: cache_lifespan
  rw: RW
  a_desc: |+
    
    How long (in seconds) to cache the list of good directories. Setting this
    to 0 turns off caching.
    
- name: dirs
  rw: RW
  a_desc: |+
    
    The raw list of directories contained in the path, including invalid
    (non-existent or unreadable) ones.
    
		--- 
- methods: 
  - visibility: public
    aref: M000008
    name: new
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 112</span>\n\
      112:         <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">path</span>=[], <span class=\"ruby-identifier\">cache_lifespan</span>=<span class=\"ruby-constant\">DefaultCacheLifespan</span> )\n\
      113:             <span class=\"ruby-ivar\">@dirs</span> = <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">path</span>\n\
      114:                     <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Array</span>\n\
      115:                         <span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">flatten</span>\n\
      116:                     <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">String</span>\n\
      117:                         <span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">split</span>(<span class=\"ruby-constant\">Separator</span>)\n\
      118:                     <span class=\"ruby-keyword kw\">else</span>\n\
      119:                         <span class=\"ruby-identifier\">path</span>.<span class=\"ruby-identifier\">to_a</span>.<span class=\"ruby-identifier\">flatten</span>\n\
      120:                     <span class=\"ruby-keyword kw\">end</span>\n\
      121: \n\
      122:             <span class=\"ruby-ivar\">@dirs</span>.<span class=\"ruby-identifier\">each</span> {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">dir</span><span class=\"ruby-operator\">|</span> <span class=\"ruby-identifier\">dir</span>.<span class=\"ruby-identifier\">untaint</span>}\n\
      123: \n\
      124:             <span class=\"ruby-ivar\">@valid_dirs</span> = []\n\
      125:             <span class=\"ruby-ivar\">@cache_lifespan</span> = <span class=\"ruby-identifier\">cache_lifespan</span>\n\
      126:             <span class=\"ruby-ivar\">@last_stat</span> = <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">at</span>(<span class=\"ruby-value\">0</span>)\n\
      127:         <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Create a <a href="Path.html#M000008">new</a> <a
      href="Path.html">Arrow::Path</a> object for the specified <tt>path</tt>,
      which can be either a String containing directory names separated by
      File::PATH_SEPARATOR, an Array of directory names, or an object which
      returns such an Array when #to_a is called on it. If
      <tt>cache_lifespan</tt> is non-zero, the Array of valid directories will be
      cached for <tt>cache_lifespan</tt> seconds to save calls to stat().
      </p>
    params: ( path=[], cache_lifespan=DefaultCacheLifespan )
  - visibility: public
    aref: M000007
    name: to_yaml_type
    sourcecode: "    <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 97</span>\n\
      97:         <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">to_yaml_type</span>\n\
      98:             <span class=\"ruby-value str\">"!%s/arrowPath"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">YAML_DOMAIN</span>\n\
      99:         <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Return the YAML type for this class
      </p>
    params: ()
  category: Class
  type: Public
- methods: 
  - visibility: public
    aref: M000010
    name: each
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 191</span>\n\
      191:         <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">each</span>( <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">block</span> )\n\
      192:             <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">valid_dirs</span>.<span class=\"ruby-identifier\">each</span>( <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">block</span> )\n\
      193:         <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Enumerable interface method. Iterate over the list of valid dirs in this
      path, calling the specified block for <a href="Path.html#M000010">each</a>.
      </p>
    params: ( &block )
  - visibility: public
    aref: M000011
    name: to_s
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 197</span>\n\
      197:         <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">to_s</span>\n\
      198:             <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">valid_dirs</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-constant\">Separator</span> )\n\
      199:         <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Return the path as a <tt>PathSeparator</tt>-separated String.
      </p>
    params: ()
  - visibility: public
    aref: M000012
    name: to_yaml
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 203</span>\n\
      203:         <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">to_yaml</span>( <span class=\"ruby-identifier\">opts</span>={} )\n\
      204:             <span class=\"ruby-identifier\">require</span> <span class=\"ruby-value str\">'yaml'</span>\n\
      205:             <span class=\"ruby-constant\">YAML</span>.<span class=\"ruby-identifier\">quick_emit</span>( <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">object_id</span>, <span class=\"ruby-identifier\">opts</span> ) {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">out</span><span class=\"ruby-operator\">|</span>\n\
      206:                 <span class=\"ruby-identifier\">out</span>.<span class=\"ruby-identifier\">seq</span>( <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">to_yaml_type</span> ){<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">seq</span><span class=\"ruby-operator\">|</span>\n\
      207:                     <span class=\"ruby-identifier\">seq</span>.<span class=\"ruby-identifier\">add</span>( <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">dirs</span> )\n\
      208:                 }\n\
      209:             }\n\
      210:         <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Return the path as YAML text
      </p>
    params: ( opts={} )
  - visibility: public
    aref: M000009
    name: valid_dirs
    sourcecode: "     <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/utils.rb, line 146</span>\n\
      146:         <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">valid_dirs</span>\n\
      147:             <span class=\"ruby-keyword kw\">if</span> ( <span class=\"ruby-ivar\">@cache_lifespan</span>.<span class=\"ruby-identifier\">nonzero?</span> <span class=\"ruby-operator\">&&</span>\n\
      148:                  ((<span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span> <span class=\"ruby-operator\">-</span> <span class=\"ruby-ivar\">@last_stat</span>) <span class=\"ruby-operator\"><</span> <span class=\"ruby-ivar\">@cache_lifespan</span>) )\n\
      149:                 <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Returning cached dirs."</span>\n\
      150:                 <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@valid_dirs</span>\n\
      151:             <span class=\"ruby-keyword kw\">end</span>\n\
      152: \n\
      153:             <span class=\"ruby-ivar\">@valid_dirs</span> = <span class=\"ruby-ivar\">@dirs</span>.<span class=\"ruby-identifier\">find_all</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">dir</span><span class=\"ruby-operator\">|</span>\n\
      154:                 <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">dir</span>.<span class=\"ruby-identifier\">tainted?</span>\n\
      155:                     <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">"Discarding tainted directory entry %p"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">dir</span> ]\n\
      156:                     <span class=\"ruby-keyword kw\">next</span>\n\
      157:                 <span class=\"ruby-keyword kw\">end</span>\n\
      158: \n\
      159:                 <span class=\"ruby-keyword kw\">begin</span>\n\
      160:                     <span class=\"ruby-identifier\">stat</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">stat</span>(<span class=\"ruby-identifier\">dir</span>)\n\
      161:                     <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">stat</span>.<span class=\"ruby-identifier\">directory?</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-identifier\">stat</span>.<span class=\"ruby-identifier\">readable?</span>\n\
      162:                         <span class=\"ruby-keyword kw\">true</span>\n\
      163:                     <span class=\"ruby-keyword kw\">else</span>\n\
      164:                         <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Discarded unreadable or non-directory %s"</span> <span class=\"ruby-operator\">%</span>\n\
      165:                             <span class=\"ruby-identifier\">dir</span>\n\
      166:                         <span class=\"ruby-keyword kw\">false</span>\n\
      167:                     <span class=\"ruby-keyword kw\">end</span>\n\
      168:                 <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-constant\">Errno</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">ENOENT</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">err</span>\n\
      169:                     <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">notice</span> <span class=\"ruby-value str\">"Discarded invalid directory %p: %s"</span> <span class=\"ruby-operator\">%</span>\n\
      170:                         [ <span class=\"ruby-identifier\">dir</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span> ]\n\
      171:                     <span class=\"ruby-keyword kw\">false</span>\n\
      172:                 <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">SecurityError</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">err</span>\n\
      173:                     <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">"Discarded unsafe directory %p: %s"</span> <span class=\"ruby-operator\">%</span>\n\
      174:                         [ <span class=\"ruby-identifier\">dir</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span> ]\n\
      175:                 <span class=\"ruby-keyword kw\">end</span>\n\
      176:             <span class=\"ruby-keyword kw\">end</span>\n\
      177:             <span class=\"ruby-ivar\">@last_stat</span> = <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span>\n\
      178: \n\
      179:             <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@valid_dirs</span>\n\
      180:         <span class=\"ruby-keyword kw\">end</span>"
    m_desc: |-
      <p>
      Fetch the list of directories in the search path, vetted to only contain
      existent and readable ones. All the enumeration methods use this list.
      </p>
    params: ()
  category: Instance
  type: Public
		---
--- 
- name: SVNRev
  desc: |+
    
    SVN Revision
    
  value: "%q$Rev: 437 $"
- name: SVNId
  desc: |+
    
    SVN Id
    
  value: "%q$Id: utils.rb 437 2008-03-28 00:49:20Z deveiant $"
- name: Separator
  desc: |+
    
    The character to split path Strings on, and join on when converting back to
    a String.
    
  value: File::PATH_SEPARATOR
- name: DefaultCacheLifespan
  desc: |+
    
    How many seconds to cache directory stat information, in seconds.
    
  value: "1.5"
		Generated with the Darkfish Rdoc Generator.