48 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
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()
 |