48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
import py, itertools
|
|
from py.impl.path import common
|
|
|
|
COUNTER = itertools.count()
|
|
|
|
class RemotePath(common.PathBase):
|
|
sep = '/'
|
|
|
|
def __init__(self, channel, id, basename=None):
|
|
self._channel = channel
|
|
self._id = id
|
|
self._basename = basename
|
|
self._specs = {}
|
|
|
|
def __del__(self):
|
|
self._channel.send(('DEL', self._id))
|
|
|
|
def __repr__(self):
|
|
return 'RemotePath(%s)' % self.basename
|
|
|
|
def listdir(self, *args):
|
|
self._channel.send(('LIST', self._id) + args)
|
|
return [RemotePath(self._channel, id, basename)
|
|
for (id, basename) in self._channel.receive()]
|
|
|
|
def dirpath(self):
|
|
id = ~COUNTER.next()
|
|
self._channel.send(('DIRPATH', self._id, id))
|
|
return RemotePath(self._channel, id)
|
|
|
|
def join(self, *args):
|
|
id = ~COUNTER.next()
|
|
self._channel.send(('JOIN', self._id, id) + args)
|
|
return RemotePath(self._channel, id)
|
|
|
|
def _getbyspec(self, spec):
|
|
parts = spec.split(',')
|
|
ask = [x for x in parts if x not in self._specs]
|
|
if ask:
|
|
self._channel.send(('GET', self._id, ",".join(ask)))
|
|
for part, value in zip(ask, self._channel.receive()):
|
|
self._specs[part] = value
|
|
return [self._specs[x] for x in parts]
|
|
|
|
def read(self):
|
|
self._channel.send(('READ', self._id))
|
|
return self._channel.receive()
|