initial import

--HG--
branch : aspn
This commit is contained in:
andreas
2007-12-12 21:47:01 +00:00
parent dffd62df21
commit f7dee97328
6 changed files with 620 additions and 0 deletions

View File

@@ -0,0 +1,102 @@
# Object adaptor for the client
import communication
from socket import *
class ObjectAdaptor(object):
def __init__(self, ip, port):
self.ip = ip
self.port = port
def send(self, *args):
communication.send(self.channel, args)
def receive(self):
return communication.receive(self.channel)
def remoteInvoke(self, fun, *args):
method = (fun.func_name, ) + args
self.channel = socket(AF_INET, SOCK_STREAM, 0)
self.channel.connect((self.ip, self.port))
self.send(*method)
result = self.receive()
self.channel.close()
return result[0]
# Object server for the actual object
import communication
import types
from socket import *
class ObjectServer(object):
def __init__(self, ip, port):
self.channel = socket(AF_INET, SOCK_STREAM, 0)
self.channel.bind((ip, port))
self.channel.listen(50)
self.info = self.channel.getsockname()
def send(self, client, *args):
communication.send(client, args)
def receive(self, client):
return communication.receive(client)
def getInfo(self):
return self.info
def dispatch(self, invoke, client):
dict = self.__class__.__dict__
method = invoke[0]
if (method in dict.keys() and type(dict[method]) == types.FunctionType):
method = dict[method]
params = invoke[1:]
result = method(self, *params)
self.send(client, result)
def start(self):
while (1):
client = self.channel.accept()[0]
invoke = self.receive(client)
self.dispatch(invoke, client)
# Communication code (the import communcation statements)
from socket import htonl, ntohl
import cPickle
import struct
marshall = cPickle.dumps
unmarshall = cPickle.loads
def send(channel, *args):
buf = marshall(args)
value = htonl(len(buf))
size = struct.pack("L", value)
channel.send(size)
channel.send(buf)
def receive(channel):
size = struct.calcsize("L")
size = channel.recv(size)
size = ntohl(struct.unpack("L", size)[0])
buf = ""
while len(buf) < size:
buf = channel.recv(size - len(buf))
return unmarshall(buf)[0]
# Echo server sample
class EchoServer(ObjectServer):
def __init__(self, ip, port):
ObjectServer.__init__(self, ip, port)
def echo(self, msg):
return "Message received: %s" % msg
es = EchoServer("127.0.0.1", 10000)
es.start()
# Echo client sample
class EchoClient(ObjectAdaptor):
def __init__(self, ip, port):
ObjectAdaptor.__init__(self, ip, port)
def echo(self, msg):
return self.remoteInvoke(self.echo, msg)
ec = EchoClient("127.0.0.1", 10000)
print ec.echo("Hello World!")

96
src/bag.py Normal file
View File

@@ -0,0 +1,96 @@
from operator import itemgetter
from heapq import nlargest
class bag(object):
def __init__(self, iterable=()):
self._data = {}
self._len = 0
self.update(iterable)
def update(self, iterable):
if isinstance(iterable, dict):
for elem, n in iterable.iteritems():
self[elem] += n
else:
for elem in iterable:
self[elem] += 1
def __contains__(self, elem):
return elem in self._data
def __getitem__(self, elem):
return self._data.get(elem, 0)
def __setitem__(self, elem, n):
self._len += n - self[elem]
self._data[elem] = n
if n == 0:
del self._data[elem]
def __delitem__(self, elem):
self._len -= self[elem]
del self._data[elem]
def __len__(self):
assert self._len == sum(self._data.itervalues())
return self._len
def __eq__(self, other):
if not isinstance(other, bag):
return False
return self._data == other._data
def __ne__(self, other):
if not isinstance(other, bag):
return True
return self._data != other._data
def __hash__(self):
raise TypeError
def __repr__(self):
return 'bag(%r)' % self._data
def copy(self):
return self.__class__(self)
__copy__ = copy # For the copy module
def __deepcopy__(self, memo):
from copy import deepcopy
result = self.__class__()
memo[id(self)] = result
data = result._data
result._data = deepcopy(self._data, memo)
result._len = self._len
return result
def __getstate__(self):
return self._data.copy(), self._len
def __setstate__(self, data):
self._data = data[0].copy()
self._len = data[1]
def clear(self):
self._data.clear()
self._len = 0
def __iter__(self):
for elem, cnt in self._data.iteritems():
for i in xrange(cnt):
yield elem
def iterunique(self):
return self._data.iterkeys()
def itercounts(self):
return self._data.iteritems()
def mostcommon(self, n=None):
if n is None:
return sorted(self.itercounts(), key=itemgetter(1), reverse=True)
it = enumerate(self.itercounts())
nl = nlargest(n, ((cnt, i, elem) for (i, (elem, cnt)) in it))
return [(elem, cnt) for cnt, i, elem in nl]

52
src/enum.py Normal file
View File

@@ -0,0 +1,52 @@
def Enum(*names):
##assert names, "Empty enums are not supported" # <- Don't like empty enums? Uncomment!
class EnumClass(object):
__slots__ = names
def __iter__(self): return iter(constants)
def __len__(self): return len(constants)
def __getitem__(self, i): return constants[i]
def __repr__(self): return 'Enum' + str(names)
def __str__(self): return 'enum ' + str(constants)
class EnumValue(object):
__slots__ = ('__value')
def __init__(self, value): self.__value = value
Value = property(lambda self: self.__value)
EnumType = property(lambda self: EnumType)
def __hash__(self): return hash(self.__value)
def __cmp__(self, other):
# C fans might want to remove the following assertion
# to make all enums comparable by ordinal value {;))
assert self.EnumType is other.EnumType, "Only values from the same enum are comparable"
return cmp(self.__value, other.__value)
def __invert__(self): return constants[maximum - self.__value]
def __nonzero__(self): return bool(self.__value)
def __repr__(self): return str(names[self.__value])
maximum = len(names) - 1
constants = [None] * len(names)
for i, each in enumerate(names):
val = EnumValue(i)
setattr(EnumClass, each, val)
constants[i] = val
constants = tuple(constants)
EnumType = EnumClass()
return EnumType
if __name__ == '__main__':
print '\n*** Enum Demo ***'
print '--- Days of week ---'
Days = Enum('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su')
print Days
print Days.Mo
print Days.Fr
print Days.Mo < Days.Fr
print list(Days)
for each in Days:
print 'Day:', each
print '--- Yes/No ---'
Confirmation = Enum('No', 'Yes')
answer = Confirmation.No
print 'Your answer is not', ~answer

158
src/grabYahooDataMt.py Normal file
View File

@@ -0,0 +1,158 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'gian paolo ciceri <gp.ciceri@gmail.com>'
__version__ = '0.1'
__date__ = '20070401'
__credits__ = "queue and MT code was shamelessly stolen from pycurl example retriever-multi.py"
#
# Usage: python grabYahooDataMt.py -h
#
#
# for selecting tickers and starting date it uses an input file of this format
# <ticker> <fromdate as YYYYMMDD>
# like
# ^GSPC 19500103 # S&P 500
# ^N225 19840104 # Nikkei 225
import sys, threading, Queue, datetime
import urllib
from optparse import OptionParser
# this thread ask the queue for job and does it!
class WorkerThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while 1:
try:
# fetch a job from the queue
ticker, fromdate, todate = self.queue.get_nowait()
except Queue.Empty:
raise SystemExit
if ticker[0] == "^":
tick = ticker[1:]
else:
tick = ticker
filename = downloadTo + "%s_%s.csv" % (tick, todate)
fp = open(filename, "wb")
if options.verbose:
print "last date asked:", todate, todate[0:4], todate[4:6], todate[6:8]
print "first date asked:", fromdate, fromdate[0:4], fromdate[4:6], fromdate[6:8]
quote = dict()
quote['s'] = ticker
quote['d'] = str(int(todate[4:6]) - 1)
quote['e'] = str(int(todate[6:8]))
quote['f'] = str(int(todate[0:4]))
quote['g'] = "d"
quote['a'] = str(int(fromdate[4:6]) - 1)
quote['b'] = str(int(fromdate[6:8]))
quote['c'] = str(int(fromdate[0:4]))
#print quote
params = urllib.urlencode(quote)
params += "&ignore=.csv"
url = "http://ichart.yahoo.com/table.csv?%s" % params
if options.verbose:
print "fetching:", url
try:
f = urllib.urlopen(url)
fp.write(f.read())
except:
import traceback
traceback.print_exc(file=sys.stderr)
sys.stderr.flush()
fp.close()
if options.verbose:
print url, "...fetched"
else:
sys.stdout.write(".")
sys.stdout.flush()
if __name__ == '__main__':
# today is
today = datetime.datetime.now().strftime("%Y%m%d")
# parse arguments
parser = OptionParser()
parser.add_option("-f", "--file", dest="tickerfile", action="store", default = "./tickers.txt",
help="read ticker list from file, it uses ./tickers.txt as default")
parser.add_option("-c", "--concurrent", type="int", dest="connections", default = 10, action="store",
help="# of concurrent connections")
parser.add_option("-d", "--dir", dest="downloadTo", action="store", default = "./rawdata/",
help="save date to this directory, it uses ./rawdata/ as default")
parser.add_option("-t", "--todate", dest="todate", default = today, action="store",
help="most recent date needed")
parser.add_option("-v", "--verbose",
action="store_true", dest="verbose")
parser.add_option("-q", "--quiet",
action="store_false", dest="verbose")
(options, args) = parser.parse_args()
tickerfile = options.tickerfile
downloadTo = options.downloadTo
connections = options.connections
today = options.todate
# get input list
try:
tickers = open(tickerfile).readlines()
except:
parser.error("ticker file %s not found" % (tickerfile,))
raise SystemExit
# build a queue with (ticker, fromdate, todate) tuples
queue = Queue.Queue()
for tickerRow in tickers:
#print tickerRow
tickerRow = tickerRow.strip()
if not tickerRow or tickerRow[0] == "#":
continue
tickerSplit = tickerRow.split()
# ticker, fromdate, todate
queue.put((tickerSplit[0], tickerSplit[1], today))
# Check args
assert queue.queue, "no Tickers given"
numTickers = len(queue.queue)
connections = min(connections, numTickers)
assert 1 <= connections <= 255, "too much concurrent connections asked"
if options.verbose:
print "----- Getting", numTickers, "Tickers using", connections, "simultaneous connections -----"
# start a bunch of threads, passing them the queue of jobs to do
threads = []
for dummy in range(connections):
t = WorkerThread(queue)
t.start()
threads.append(t)
# wait for all threads to finish
for thread in threads:
thread.join()
sys.stdout.write("\n")
sys.stdout.flush()
# tell something to the user before exiting
if options.verbose:
print "all threads are finished - goodbye."

129
src/heapq.py Normal file
View File

@@ -0,0 +1,129 @@
import heapq
class Heap(list):
"""This is a wrapper class for the heap functions provided by the heapq module """
__slots__ = ()
def __init__(self, t=[]):
self.extend(t)
self.heapify()
push = heapq.heappush
popmin = heapq.heappop
replace = heapq.heapreplace
heapify = heapq.heapify
def pushpop(self, item):
"Push the item onto the heap and then pop the smallest value"
if self and self[0] < item:
return heapq.heapreplace(self, item)
return item
def __iter__(self):
"Return a destructive iterator over the heap's elements"
try:
while True:
yield self.popmin()
except IndexError:
pass
def reduce(self, pos, newitem):
"Replace self[pos] with a lower value item and then reheapify"
while pos > 0:
parentpos = (pos - 1) >> 1
parent = self[parentpos]
if parent <= newitem:
break
self[pos] = parent
pos = parentpos
self[pos] = newitem
def is_heap(self):
"Return True if the heap has the heap property; False otherwise"
n = len(self)
# The largest index there's any point to looking at
# is the largest with a child index in-range, so must have 2*i + 1 < n,
# or i < (n-1)/2. If n is even = 2*j, this is (2*j-1)/2 = j-1/2 so
# j-1 is the largest, which is n//2 - 1. If n is odd = 2*j+1, this is
# (2*j+1-1)/2 = j so j-1 is the largest, and that's again n//2-1.
try:
for i in xrange(n//2):
if self[i] > self[2*i+1]: return False
if self[i] > self[2*i+2]: return False
except IndexError:
pass
return True
def heapsort(seq):
return [x for x in Heap(seq)]
if __name__ == '__main__':
from random import randint, shuffle
# generate a random test case
n = 15
data = [randint(1,n) for i in xrange(n)]
shuffle(data)
print data
# test the constructor
heap = Heap(data)
print heap, heap.is_heap()
# test popmin
sorted = []
while heap:
sorted.append(heap.popmin())
data.sort()
print heap, heap.is_heap()
print data == sorted
# test 2
shuffle(data)
print data
# test push
for item in data:
heap.push(item)
print heap, heap.is_heap()
# test __iter__
sorted = [x for x in heap]
data.sort()
print data == sorted
# test 3
shuffle(data)
print data
heap = Heap(data)
print heap, heap.is_heap()
# test reduce
for i in range(5):
pos = randint(0,n-1)
decr = randint(1,10)
item = heap[pos] - decr
heap.reduce(pos, item)
# test is_heap
heap = Heap(data)
count = 0
while 1:
shuffle(heap)
if heap.is_heap():
print heap
break
else:
count += 1
print 'It took', count, 'tries to find a heap by chance.'
print heapsort(data)
try:
heap.x = 5
except AttributeError:
print "Can't add attributes."

83
src/proxy_server.py Normal file
View File

@@ -0,0 +1,83 @@
import asynchat
import asyncore
import socket
import string
class proxy_server (asyncore.dispatcher):
def __init__ (self, host, port):
asyncore.dispatcher.__init__ (self)
self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.there = (host, port)
here = ('', port + 8000)
self.bind (here)
self.listen (5)
def handle_accept (self):
proxy_receiver (self, self.accept())
class proxy_sender (asynchat.async_chat):
def __init__ (self, receiver, address):
asynchat.async_chat.__init__ (self)
self.receiver = receiver
self.set_terminator (None)
self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
self.buffer = ''
self.set_terminator ('\n')
self.connect (address)
def handle_connect (self):
print 'Connected'
def collect_incoming_data (self, data):
self.buffer = self.buffer + data
def found_terminator (self):
data = self.buffer
self.buffer = ''
print '==> (%d) %s' % (self.id, repr(data))
self.receiver.push (data + '\n')
def handle_close (self):
self.receiver.close()
self.close()
class proxy_receiver (asynchat.async_chat):
channel_counter = 0
def __init__ (self, server, (conn, addr)):
asynchat.async_chat.__init__ (self, conn)
self.set_terminator ('\n')
self.server = server
self.id = self.channel_counter
self.channel_counter = self.channel_counter + 1
self.sender = proxy_sender (self, server.there)
self.sender.id = self.id
self.buffer = ''
def collect_incoming_data (self, data):
self.buffer = self.buffer + data
def found_terminator (self):
data = self.buffer
self.buffer = ''
print '<== (%d) %s' % (self.id, repr(data))
self.sender.push (data + '\n')
def handle_close (self):
print 'Closing'
self.sender.close()
self.close()
if __name__ == '__main__':
import sys
import string
if len(sys.argv) < 3:
print 'Usage: %s <server-host> <server-port>' % sys.argv[0]
else:
ps = proxy_server (sys.argv[1], string.atoi (sys.argv[2]))
asyncore.loop()