Index: trunk/Nebulous-Server/Build.PL
===================================================================
--- trunk/Nebulous-Server/Build.PL	(revision 16184)
+++ trunk/Nebulous-Server/Build.PL	(revision 16203)
@@ -80,15 +80,16 @@
     create_makefile_pl  => 'passthrough',
     requires            => {
+        'Class::Accessor::Fast' => 0,
         'Config::YAML'          => '1.42',
+        'DBD::mysql'            => '3.0007',
+        'DBI'                   => '1.53',
+        'File::ExtAttr'         => '1.03',
+        'File::Spec::Functions' => 0,
+        'Log::Log4perl'         => '0.48',
+        'Net::Server::Daemonize'=> '0.05',
+        'Params::Validate'      => '0.73',
+        'SOAP::Lite'            => '0.69',
+        'Sys::Statistics::Linux::DiskUsage' => '0.02',
         'URI'                   => '1.30',
-        'SOAP::Lite'            => '0.69',
-        'Log::Log4perl'         => '0.48',
-        'DBI'                   => '1.53',
-        'DBD::mysql'            => '3.0007',
-        'Class::Accessor::Fast' => 0,
-        'Params::Validate'      => '0.73',
-        'Net::Server::Daemonize'=> '0.05',
-        'Sys::Statistics::Linux::DiskUsage' => '0.02',
-        'File::ExtAttr'         => '1.03',
     },
     build_requires      => {
Index: trunk/Nebulous-Server/Changes
===================================================================
--- trunk/Nebulous-Server/Changes	(revision 16184)
+++ trunk/Nebulous-Server/Changes	(revision 16203)
@@ -2,4 +2,5 @@
 
 0.06
+    - add Nebulous::Util::parse_neb_key()
     - change bin/* scripts to conistently use --volume instead of --node,
       etc.
Index: trunk/Nebulous-Server/MANIFEST
===================================================================
--- trunk/Nebulous-Server/MANIFEST	(revision 16184)
+++ trunk/Nebulous-Server/MANIFEST	(revision 16203)
@@ -110,4 +110,5 @@
 t/63_client_stat.t
 t/64_client_find_objects.t
+t/75_parse_neb_key.t
 t/90_nebclient.t
 t/TEST.PL
Index: trunk/Nebulous-Server/t/75_parse_neb_key.t
===================================================================
--- trunk/Nebulous-Server/t/75_parse_neb_key.t	(revision 16203)
+++ trunk/Nebulous-Server/t/75_parse_neb_key.t	(revision 16203)
@@ -0,0 +1,170 @@
+#!/usr/bin/perl
+
+# Copryight (C) 2004-2005  Joshua Hoblitt
+#
+# $Id: 75_parse_neb_key.t,v 1.1 2008-01-23 22:27:51 jhoblitt Exp $
+
+use strict;
+use warnings FATAL => qw( all );
+
+use Test::More;
+
+plan tests => 36;
+
+use lib qw( ./t ./lib );
+
+use Nebulous::Util qw( :standard );
+use Test::Nebulous;
+
+# neb://<volume name>/...
+# neb:path...
+# neb:/path... (same as neb:path, leading '/' is stripped)
+# neb:///path... (same as neb:path)
+
+# key
+{
+    my ($path, $volume) = parse_neb_key('foo/bar/baz/quix');
+
+    is($path, 'foo/bar/baz/quix', 'path');
+    is($volume, undef, 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('/foo/bar/baz/quix');
+
+    is($path, 'foo/bar/baz/quix', 'path');
+    is($volume, undef, 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('//foo/bar/baz/quix');
+
+    is($path, 'foo/bar/baz/quix', 'path');
+    is($volume, undef, 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('///foo/bar/baz/quix');
+
+    is($path, 'foo/bar/baz/quix', 'path');
+    is($volume, undef, 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('foo////bar/baz/quix');
+
+    is($path, 'foo/bar/baz/quix', 'path');
+    is($volume, undef, 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('foo/bar/baz/quix/');
+
+    is($path, 'foo/bar/baz/quix', 'path');
+    is($volume, undef, 'volume name');
+}
+
+
+# URI w/ volume name
+{
+    my ($path, $volume) = parse_neb_key('neb://foo/bar/baz/quix');
+
+    is($path, 'bar/baz/quix', 'path');
+    is($volume, 'foo', 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('neb://foo//bar/baz/quix');
+
+    is($path, 'bar/baz/quix', 'path');
+    is($volume, 'foo', 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('neb://foo///bar/baz/quix');
+
+    is($path, 'bar/baz/quix', 'path');
+    is($volume, 'foo', 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('neb://foo/bar///baz/quix');
+
+    is($path, 'bar/baz/quix', 'path');
+    is($volume, 'foo', 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('neb://foo/bar/baz/quix/');
+
+    is($path, 'bar/baz/quix', 'path');
+    is($volume, 'foo', 'volume name');
+}
+
+
+# URI w/o volume name
+
+{
+    my ($path, $volume) = parse_neb_key('neb:/foo/bar/baz/quix');
+
+    is($path, 'foo/bar/baz/quix', 'path');
+    is($volume, undef, 'volume name');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('neb:///foo/bar/baz/quix');
+
+    is($volume, undef, 'volume name');
+    is($path, 'foo/bar/baz/quix', 'path');
+}
+
+{
+    my ($path, $volume) = parse_neb_key('neb://///foo/bar/baz/quix');
+
+    is($path, 'foo/bar/baz/quix', 'path');
+    is($volume, undef, 'volume name');
+}
+
+# key w/ whitespace
+eval {
+    parse_neb_key('/ foo/bar/baz/quix');
+};
+like( $@, qr/may not contain whitespace/, "whitespace" );
+
+eval {
+    parse_neb_key(' /foo/bar/baz/quix');
+};
+like( $@, qr/may not contain whitespace/, "whitespace" );
+
+eval {
+    parse_neb_key('/foo/bar/baz/quix ');
+};
+like( $@, qr/may not contain whitespace/, "whitespace" );
+
+# URI w/ whitespace
+
+eval {
+    parse_neb_key('neb ://foo/bar/baz/quix');
+};
+like( $@, qr/may not contain whitespace/, "whitespace" );
+
+eval {
+    parse_neb_key('neb:// foo/bar/baz/quix');
+};
+like( $@, qr/may not contain whitespace/, "whitespace" );
+
+eval {
+    parse_neb_key(' neb://foo/bar/baz/quix');
+};
+like( $@, qr/may not contain whitespace/, "whitespace" );
+
+eval {
+    parse_neb_key('neb://foo/bar/baz/quix ');
+};
+like( $@, qr/may not contain whitespace/, "whitespace" );
+
+# URI w/o volume requires leading slash
+eval {
+    my ($path, $volume) = parse_neb_key('neb:foo/bar/baz/quix');
+};
+like( $@, qr/requires a leading slash/, "leading slash" );
