# HG changeset patch # User Atul Varma # Date 1275328401 25200 # Node ID b653b7beec1ab1188367f037c30a84edd0980842 # Parent ebeab25bca5077c5b0f81760d95909d1c9d312a7 moved Boxes from server module to box module diff -r ebeab25bca50 -r b653b7beec1a example.py --- a/example.py Mon May 31 10:29:25 2010 -0700 +++ b/example.py Mon May 31 10:53:21 2010 -0700 @@ -4,12 +4,15 @@ import sjsbox.server import sjsbox.fs +import sjsbox.box if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + directory = sjsbox.fs.Dir(os.path.abspath('./boxes')) - logging.basicConfig(level=logging.DEBUG) - boxes = sjsbox.server.Boxes(directory) + boxes = sjsbox.box.Boxes(directory) app = sjsbox.server.App(boxes) + port = 8000 httpd = make_server('', port, app) print "serving on port %d" % port diff -r ebeab25bca50 -r b653b7beec1a sjsbox/box.py --- a/sjsbox/box.py Mon May 31 10:29:25 2010 -0700 +++ b/sjsbox/box.py Mon May 31 10:53:21 2010 -0700 @@ -57,3 +57,43 @@ logging.info('child process shut down: %s' % self.file) self.child_pipe = None self.child = None + +class Boxes(object): + def __init__(self, directory, boxfactory=BoxParent): + self.boxfactory = boxfactory + self.dir = directory + self.boxes = {} + self.box_mtimes = {} + self.update() + + def shutdown(self): + for box in self.boxes.itervalues(): + box.shutdown() + + def update(self): + visited = {} + for f in self.dir: + boxname = f.name.rsplit('.', 1)[0] + if boxname not in self.boxes: + logging.info('creating box %s' % boxname) + self.box_mtimes[boxname] = f.mtime + self.boxes[boxname] = self.boxfactory(f) + else: + box_mtime = f.mtime + if box_mtime > self.box_mtimes[boxname]: + self.box_mtimes[boxname] = box_mtime + self.boxes[boxname].restart() + logging.info('updated box %s' % boxname) + visited[boxname] = True + to_destroy = [boxname for boxname in self.boxes + if boxname not in visited] + for boxname in to_destroy: + logging.info('destroying box %s' % boxname) + self.boxes[boxname].shutdown() + del self.boxes[boxname] + + def __contains__(self, name): + return name in self.boxes + + def __getitem__(self, name): + return self.boxes[name] diff -r ebeab25bca50 -r b653b7beec1a sjsbox/server.py --- a/sjsbox/server.py Mon May 31 10:29:25 2010 -0700 +++ b/sjsbox/server.py Mon May 31 10:53:21 2010 -0700 @@ -5,48 +5,6 @@ except ImportError: import simplejson as json -from sjsbox.box import BoxParent - -class Boxes(object): - def __init__(self, directory, boxfactory=BoxParent): - self.boxfactory = boxfactory - self.dir = directory - self.boxes = {} - self.box_mtimes = {} - self.update() - - def shutdown(self): - for box in self.boxes.itervalues(): - box.shutdown() - - def update(self): - visited = {} - for f in self.dir: - boxname = f.name.rsplit('.', 1)[0] - if boxname not in self.boxes: - logging.info('creating box %s' % boxname) - self.box_mtimes[boxname] = f.mtime - self.boxes[boxname] = self.boxfactory(f) - else: - box_mtime = f.mtime - if box_mtime > self.box_mtimes[boxname]: - self.box_mtimes[boxname] = box_mtime - self.boxes[boxname].restart() - logging.info('updated box %s' % boxname) - visited[boxname] = True - to_destroy = [boxname for boxname in self.boxes - if boxname not in visited] - for boxname in to_destroy: - logging.info('destroying box %s' % boxname) - self.boxes[boxname].shutdown() - del self.boxes[boxname] - - def __contains__(self, name): - return name in self.boxes - - def __getitem__(self, name): - return self.boxes[name] - class App(object): JSON_TYPE = 'text/plain' diff -r ebeab25bca50 -r b653b7beec1a tests/test_box.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_box.py Mon May 31 10:53:21 2010 -0700 @@ -0,0 +1,38 @@ +import unittest + +import sjsbox.box +from sjsbox.bunch import Bunch + +class BoxesTests(unittest.TestCase): + def setUp(self): + self.foo = Bunch( + mtime = 0, + name = 'foo.js', + contents = 'function handle() { return 404; }' + ) + self.dir = [self.foo] + self.boxes = sjsbox.box.Boxes(self.dir) + self.assertEqual(self.boxes['foo'].handle('GET', '/'), + 404) + + def tearDown(self): + self.boxes.shutdown() + + def test_contains_works(self): + self.assertTrue('foo' in self.boxes) + + def test_update_works(self): + self.boxes.update() + self.assertEqual(self.boxes['foo'].handle('GET', '/'), + 404) + + self.foo.mtime = 1 + self.foo.contents = 'function handle() { return "yo"; }'; + self.boxes.update() + self.assertEqual(self.boxes['foo'].handle('GET', '/'), + u'yo') + + def test_remove_works(self): + self.dir[:] = [] + self.boxes.update() + self.assertFalse('foo' in self.boxes) diff -r ebeab25bca50 -r b653b7beec1a tests/test_server.py --- a/tests/test_server.py Mon May 31 10:29:25 2010 -0700 +++ b/tests/test_server.py Mon May 31 10:53:21 2010 -0700 @@ -1,41 +1,4 @@ -import unittest - import sjsbox.server -from sjsbox.bunch import Bunch - -class BoxesTests(unittest.TestCase): - def setUp(self): - self.foo = Bunch( - mtime = 0, - name = 'foo.js', - contents = 'function handle() { return 404; }' - ) - self.dir = [self.foo] - self.boxes = sjsbox.server.Boxes(self.dir) - self.assertEqual(self.boxes['foo'].handle('GET', '/'), - 404) - - def tearDown(self): - self.boxes.shutdown() - - def test_contains_works(self): - self.assertTrue('foo' in self.boxes) - - def test_update_works(self): - self.boxes.update() - self.assertEqual(self.boxes['foo'].handle('GET', '/'), - 404) - - self.foo.mtime = 1 - self.foo.contents = 'function handle() { return "yo"; }'; - self.boxes.update() - self.assertEqual(self.boxes['foo'].handle('GET', '/'), - u'yo') - - def test_remove_works(self): - self.dir[:] = [] - self.boxes.update() - self.assertFalse('foo' in self.boxes) def test_app(): sjsbox.server.App(None)