Hi!<br><br>I am a MSc of Computer Engineering student from Sweden. A frequent reader of python-3000, and an occasional reader of python-dev for about a year now. I have wanted to get involved in the development of python for a while but haven&#39;t found the time before. Now, when I&#39;m in the process of trying to figure out what project to do for my thesis, I have actually found myself having more time than before. Therefore I thought that now is a better time than never to get involved. After that compulsory first-post-introduction of myself, lets get to the reason I choose to send the post at all.
<br><br>I noticed that you wanted Mac OS tests, here are the test results from my Mac OS X (10.4), running on an Intel Core Duo MacBook, using python 2.5:<br><br>FF...F....................................................<br>
======================================================================<br>FAIL: test_absolute (__main__.TestCalculatingPaths)<br>----------------------------------------------------------------------<br>Traceback (most recent call last):
<br>&nbsp; File &quot;./test.py&quot;, line 235, in test_absolute<br>&nbsp;&nbsp;&nbsp; eq(p1, p2)<br>AssertionError: FSPath(&#39;/private/tmp/tmpH9fppC/images&#39;) != FSPath(&#39;/tmp/tmpH9fppC/images&#39;)<br><br>======================================================================
<br>FAIL: test_chdir_absolute_relative (__main__.TestCalculatingPaths)<br>----------------------------------------------------------------------<br>Traceback (most recent call last):<br>&nbsp; File &quot;./test.py&quot;, line 220, in test_chdir_absolute_relative
<br>&nbsp;&nbsp;&nbsp; eq(FSPath.cwd(), self.d)<br>AssertionError: FSPath(&#39;/private/tmp/tmpRJzqbt&#39;) != FSPath(&#39;/tmp/tmpRJzqbt&#39;)<br><br>======================================================================<br>FAIL: test_relative (__main__.TestCalculatingPaths)
<br>----------------------------------------------------------------------<br>Traceback (most recent call last):<br>&nbsp; File &quot;./test.py&quot;, line 240, in test_relative<br>&nbsp;&nbsp;&nbsp; eq(p, &quot;images&quot;)<br>AssertionError: FSPath(&#39;../../../tmp/tmpdw9juF/images&#39;) != &#39;images&#39;
<br><br>----------------------------------------------------------------------<br>Ran 58 tests in 1.587s<br><br><br>Please let me know if there are any further tests or improvements I could help you with.<br><br>/Tobias<br>
<br><div><span class="gmail_quote">On 1/28/07, <b class="gmail_sendername">Mike Orr</b> &lt;<a href="mailto:sluggoster@gmail.com">sluggoster@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I finally finished my path package (Unipath) and put it in the Cheeseshop.<br><a href="http://sluggo.scrapping.cc/python/unipath/">http://sluggo.scrapping.cc/python/unipath/</a><br><br>There&#39;s a Path class for pathname calculations, and a FSPath subclass
<br>for filesystem calls.&nbsp;&nbsp;I&#39;m hoping Path -- or something resembling it<br>-- will find its way into os.path in Python 2.6 or 3.0.&nbsp;&nbsp;FSPath is<br>full of convenience methods so it may not be everybody&#39;s cup of tea,
<br>but perhaps something similar can go into Python in the farther future<br><br>Unipath is an early alpha release so the API may change as it gets<br>more real-world use.&nbsp;&nbsp;There&#39;s an extensive unittest suite, which<br>
passes on Python 2.5 and 2.4.4 on Linux.&nbsp;&nbsp;Windows and Macintosh<br>testers are needed.<br><br>Following are highlights from the python-3000 discussion and deviations from it:<br><br>-&nbsp;&nbsp;Path subclasses unicode, or str if the platform can&#39;t handle
<br>Unicode pathnames.<br><br>- FSPath subclasses Path.&nbsp;&nbsp;This allows you to do &quot;from unipath import<br>FSPath as Path&quot; and pretend there&#39;s only one class.&nbsp;&nbsp;I find this much<br>more convenient in applications, so you don&#39;t have to cast objects
<br>back and forth between the classes.&nbsp;&nbsp;Also, it just became infeasable<br>not to let them inherit, because so many methods call other methods.<br><br>- Nevertheless, you can use Path alone and rest assured it will never
<br>touch the filesystem.&nbsp;&nbsp;You can even use Path objects with os.*<br>functions if you are so heretically inclined.&nbsp;&nbsp;If Path is accepted<br>into the stdlib, FSPath will inherit it from there.<br><br>- I tried splitting FSPath into several mixins according to type of
<br>operation, but the need for methods to call other methods in a<br>different category sabotaged that too.&nbsp;&nbsp;So FSPath proudly has about<br>fifty methods.&nbsp;&nbsp;(Path has 10 public methods and 4 properties.)<br><br>- The dirname property is called .parent.&nbsp;&nbsp;The basename property is
<br>.name.&nbsp;&nbsp;The extension property is .ext.&nbsp;&nbsp;The name without extension is<br>.stem.<br><br>- .components() returns a list of directory components.&nbsp;&nbsp;The first<br>component is &quot;/&quot;, a Windows drive root, a UNC share, or &quot;&quot; for a
<br>relative path.&nbsp;&nbsp;.split_root() returns the root and the rest.<br><br>- PosixPath, NTPath, and MacPath are Path subclasses using a specific<br>path library.&nbsp;&nbsp;This allows you to express non-native paths and convert<br>paths.&nbsp;&nbsp;Passing a relative foreign path to a *Path constructor
<br>converts it to the destination type.&nbsp;&nbsp;Passing an absolute foreign path<br>is an error, because there&#39;s no sane way to interpret &quot;C:\\&quot; on Posix<br>or &quot;/&quot; on Windows.&nbsp;&nbsp;I&#39;m skeptical whether this non-native support is
<br>really worth it, because .norm() and .norm_case() already convert<br>slashes to backslashes (which is what Talin really wanted to do --<br>have Posix paths in a config file and automatically convert them to<br>the native format).&nbsp;&nbsp;And if Python is going to drop Mac OS 9 soon then
<br>MacPath is obsolete.&nbsp;&nbsp;So maybe this non-native path code will prove<br>less than useful and will be deleted.&nbsp;&nbsp;On the other hand, if someone<br>is burning to write a zippath or ftppath library, you can use it with<br>this.
<br><br>- Setting Path.auto_norm to true will automatically normalize all<br>paths on construction.&nbsp;&nbsp;I&#39;m not sure if this should be the default,<br>because normalizing may produce the wrong path (e.g., if it contains a
<br>symlink).&nbsp;&nbsp;You can always pass norm=True or norm=False to the<br>constructor to enable/disable it.<br><br>- p.child(&quot;subdir&quot;, &quot;grandkid&quot;) is Glyph&#39;s favorite &quot;safe join&quot; method<br>that prevents creating a path pointing above &#39;p&#39;.&nbsp;&nbsp;You can use it as a
<br>.joinpath if you don&#39;t mind this restriction.&nbsp;&nbsp;The constructor allows<br>multiple positional arguments, which are joined using os.path.join().<br><br>- Listing is p.listdir(pattern=None, filter=None, names_only=False).
<br>This returns a non-recursive list of paths.&nbsp;&nbsp;If &#39;names_only&#39; is true<br>it returns the same as os.listdir().&nbsp;&nbsp;p.walk(pattern=None,<br>filter=None, top_down=True) is the recursive counterpart, yielding<br>paths.&nbsp;&nbsp;In both cases &#39;pattern&#39; is a glob pattern, and &#39;filter&#39; is one
<br>of the constants (FILES, DIRS, LINKS, FILES_NO_LINKS, DIRS_NO_LINKS,<br>DEAD_LINKS) or a custom boolean function.&nbsp;&nbsp;I spent a lot of time going<br>back and forth between Orendorff&#39;s six listing methods and Raphael&#39;s
<br>one, and finally decided on this, partly because I&#39;m not satisfied<br>with how either Orendorff&#39;s class or Raphael&#39;s or os.walk() handle<br>symlinks -- sometimes you want to ignore the links and then iterate
<br>them separately.<br><br>- .read_file(mode) and .write_file(content, mode) are a compromise<br>between Orendorff&#39;s seven methods and purists&#39; desire for zero<br>methods.<br><br>- .mkdir(), .rmdir(), .rmtree(), .copy(), .copy_stat(), .copy_tree(),
<br>and .move() are more fancy than their stdlib/Orendorff counterparts.<br>They silently succeed if the operation is already done, and have<br>arguments to smartly create/delete intermediate directories, etc.<br><br>- Two extra functions are in &#39;
unipath.tools&#39;.&nbsp;&nbsp;&#39;dict2dir&#39; creates a<br>directory hierarchy modeled after a dict.&nbsp;&nbsp;&#39;dump_path&#39; displays an<br>ASCII tree of a directory hierarchy, with file sizes and symlink<br>targets showing.<br><br>
Enjoy!&nbsp;&nbsp;and please provide feedback.<br><br>--Mike Orr &lt;<a href="mailto:sluggoster@gmail.com">sluggoster@gmail.com</a>&gt;<br>_______________________________________________<br>Python-Dev mailing list<br><a href="mailto:Python-Dev@python.org">
Python-Dev@python.org</a><br><a href="http://mail.python.org/mailman/listinfo/python-dev">http://mail.python.org/mailman/listinfo/python-dev</a><br>Unsubscribe: <a href="http://mail.python.org/mailman/options/python-dev/thobes%40gmail.com">
http://mail.python.org/mailman/options/python-dev/thobes%40gmail.com</a><br></blockquote></div><br>