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.