import py, itertools |
from py.__.path import common |
|
COUNTER = itertools.count() |
|
class RemotePath(common.FSPathBase): |
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 get(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() |
|