Source

circuits / docs / ChangeLog.wiki

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
= !ChangeLog =

[[TOC]]

== 1.1 ==
 Released:: ... (''...'')
 Revision:: [916]

 * In [261]: tests.test_workers: Fixed test by waiting until worker has finished
 * In [262]: Ignore tmp
 * In [263]: circuits: Updated sample example in main docstring - simplified.
 * In [264]: core: Removed unused Registered Event
 * In [265]: drivers: New drivers module importing from lib.drivers.*
 * In [266]: lib.drivers: New drivers package. New PyGameDriver
 * In [267]: lib.pygamepump: Removed - Moved to circuits.lib.drivers.pygame_driver as PyGameDriver
 * In [268]: lib.web: Removed - Moved to circuits.lib.web
 * In [269]: lib.http: Removed - Moved to circuits.lib.web
 * In [270]: web: New web module importing from lib.web.*
 * In [271]: lib.sockets: Refactored close, write and shutdown events
 * In [272]: examples/echoserver.py: Fixed tabs. Simplified read event
 * In [273]: core: Allow send(...) to actually return a value if required
 * In [274]: sockets: Removed useless header line (Filename)
 * In [275]: circuits.web: NEW refactored Web Components (100% event driven), no external dependencies
 * In [276]: examples/simpleweb.py: Fixed
 * In [277]: lib.web.dispatchers: Minor simplificiation
 * In [278]: lib.sockets: send Shutdown events
 * In [279]: lib.web.core: Removed unused imported modules
 * In [280]: lib.web.http: Simplified simple and httperror handlers
 * In [281]: lib.web.http: Adapted dispatcher code to iter through possible request handlers - request handlers only need to return now
 * In [282]: lib.web.dispatcher: Fixed channel http errors go to
 * In [283]: lib.web.servers: Added base() to return the base url the server listens on.
 * In [284]: lib.web.servers: Pass a copy of BaseServer to HTTP for reference
 * In [285]: lib.web.webob: Added server attribute to store a reference to the underlying server component (servers.BaseServer
)
 * In [286]: lib.web.http: Store server. Pass a copy to reach webob.Request object created for reference.
 * In [287]: lib.web.utils: Added url() function to calculate an absolute url given a request object and optional parameters
 * In [288]: lib.web.http: Get a list of all non None objects from iterating trough all possible request handlers. Only set response.body if the first result is a string
 * In [289]: lib.web.errors: Error module implementing error objects that modify response objects
 * In [290]: lib.web: Added import of error.Redirect
 * In [291]: lib.sockets: Added ssl (unused) attribute to Server base component
 * In [292]: lib.web.dispatchers: Get a list of all non None objects from iterating trough all possible request handlers. Only set response.body if the first result is a string
 * In [293]: lib.web.core: Added redirect() method to Controller component
 * In [294]: lib.web: Greatly improved error template and handlnig
 * In [295]: lib.web: Import Logger
 * In [296]: lib.web.tools: New tools modules
 * In [297]: lib.web.wsgi: Forgot to import Dispatcher
 * In [298]: lib.web.webob: Forgot to import BUFFER_SIZE
 * In [299]: lib.web.webob: Added request as an attribute of Response
 * In [300]: lib.web.utils: Added valid_status() and get_ranges() functions - borrowed from CherryPy-3.1
 * In [301]: lib.web.constants: As taken from CherryPy-3.1, removed RESPONSESin favor of importing and copying from BaseHTTPServer
 * In [302]: lib.web.errors: Added __nonzero__(), Always defaults to False for any error (subclass of BaseError).
 * In [303]: lib.web.errors: Added NotFound error.
 * In [304]: lib.web.http: Set response.request to request - keeping a copy of the original request in response
 * In [305]: lib.web.loggers: Log the response instead of the request
 * In [306]: lib.web.dispatchers: Added FileServer/FileDispatcher. Return responses - Don't send as this is done by HTTP.
 * In [307]: lib.web.servers: Use Dispatcher (alias of DefaultDispatcher)
 * In [308]: lib.web: import FileServer (from dispatchers)
 * In [309]: lib.web.errors: Fixed HTTPError
 * In [310]: lib.web.http: Use errors.HTTPError to build the actual error resposne.
 * In [311]: Added copy of LICENSE
 * In [312]: Added MANIFEST.in to include other files for distribution
 * In [313]: lib.web.tests: Added test suite. Added one test.
 * In [314]: workers: isAlive() should evaluate: self.running and self.thread.isAlive() - Call self.thread.join() after setting self.running to False.
 * In [315]: lib.web.constants: protocol should be tuple (major, minor).
 * In [316]: lib.web.webob: Use self.request.protocol
 * In [317]: lib.web.webob: Fixed protocol attributes and repr.
 * In [318]: lib.web.servers: Added poll() in BaseServer
 * In [319]: lib.web.http: Fixed doc.
 * In [320]: lib.web.http: Fixed protocol.
 * In [321]: lib.web.http: Fixed checking for "Conenction" "close" header and setting "Connection" "close" response headers.
 * In [322]: workers: Added join() method - Removed self.thread.join() from stop() - causes problems :)
 * In [323]: tests/tests_workers: Fixed test
 * In [324]: Added test suite for sockets - Fixed channels in sockets
 * In [325]: lib.web.servers: Added address and port propertoes.
 * In [326]: lib.web.http: Set webob.Request local_host and remote_host appropriately.
 * In [327]: examples/ircbot.py: Fixed event handlers
 * In [328]: lib.irc; Forgot to call parent constructor :/
 * In [329]: lib.web.errors: Fixed status in HTTPError response output.
 * In [330]: lib.web.errors: Added Forbidden error class.
 * In [331]: lib.web.core: Added forbidden() and notfound() methods.
 * In [332]: lib.web.core: Created BaseController - moved convenience methods to BaseController - cleaning up Controller.
 * In [333]: lib.web.dispatchers: Return a list of all possible responses that are not None - allowing for Error responses which evaluate to False. Also return the first item regardless
 * In [334]: lib.web.http: Return a list of all possible responses that are not None - allowing for Error responses which evaluate to False.
 * In [335]: lib.web.tests.test_core: Fixed name of test case. Fixed tearDown to join and wait for server to finish
 * In [336]: lib.web.errors: Allow a custom message to be passed for NotFound errors.
 * In [337]: lib.web.core: Allow a custom message to be passed.
 * In [338]: lib.web.errors: Set status's message to short, not message which may be longer or custom
 * In [339]: Respect unique channels allowing mixing with other componets with similar events
 * In [340]: examples/ircbot: Integrated circuits.web just as a show-off demo of circuits and circutis.web capability
 * In [341]: lib.web.dispatchers: Dispatcher doesn't need to iterate through Controller based web requests by respecting the channel the Controller is registered with
 * In [342]: core: Modifed repr of Event objects - channels are in [ ]
 * In [343]: tests.test_core: Fixed testing of Event repr due to 67a17a037fe7
 * In [344]: core: Removed Error exception type. Use Exception as subclass for InvalidHandler exception.
 * In [345]: core: Added Error Event class for pushing exceptions that occur in event handlers.
 * In [346]: core: Raise TypeError instead.
 * In [347]: core: try/except calls to handlers. If an Exception occurs, push the exception to the global "error" channel and continue on...
 * In [348]: lib.sockets: Retabbed
 * In [349]: lib.sockets: Moved Client and Server class attributes into __init__. Class attributes are bad when using multiple instances I've discovered :)
 * In [350]: examples/ircbot.py: Modified to demonstrate multiple bots (2 or more) plus web server all at teh same time
 * In [351]: lib.web.servers: Forgot to import os
 * In [352]: core: Push the actual type, value and treaceback (from sys) o fhte exception that occured.
 * In [353]: debugger: Retabbed and added error handler
 * In [354]: core: Use partial function calling. Greatly simplifies listener and send/iter.
 * In [355]: core: If kwarg _raiseErrors is passed and True, re-raise the exception.
 * In [356]: lib.web.core: Updated expose decorator to match listener change in circuits.core @ 893e0b9862ac
 * In [357]: lib.web.dispatchers: Renamed methods for readability.
 * In [358]: lib.web.dispatchers: Minor optimizations.
 * In [359]: lib.web.dispatchers: Fixed expiry.
 * In [360]: lib.web.dispatchers: Rewrote to use self.send vs. self.iter
 * In [361]: lib.web.http: Rewrote to use self.send vs. self.iter
 * In [362]: lib.web.http: raise will do.
 * In [363]: lib.web.http: str.split is faster than re.split
 * In [364]: examples/helloweb.py: Simplified and added psyco
 * In [365]: examples/simpleweb.py: Retabbed and added psyco
 * In [366]: examples/echoserver.py: Removed unused imports and use of Manager
 * In [367]: Fixed unused imports and undefined names as found by pyflaes
 * In [368]: lib.drivers.pygame_driver: Fixed call to super __new__
 * In [369]: lib.sockets: Renamed connected attribute to _connected and added isConnected() method - Having 'connected' would conflict with the event handler 'connected'.
 * In [370]: Fixed unused imports and undefined names as found by pyflaes
 * In [371]: lib.web.servers: Removed docroot kw, can be put in kwargs
 * In [372]: lib.web.tools: Use hashlib.md5 (md5 is deprecated).
 * In [373]: lib.web.tools: Fixed import of Redirect.
 * In [374]: lib.web.utils: Fixed import of _urljoin
 * In [375]: Just showing off Manager's __add__ features
 * In [376]: lib.web.dispatchers: Fixed setting of docroot and defaults
 * In [377]: Use isConnected() - connected attribute is deprecated
 * In [378]: lib.web.errors: Return True when evaluated as a bool (__nonzero__)
 * In [379]: lib.web.errors: Set response.close = True for errors
 * In [380]: core: Simplified forcing send to raise errors. Changed keyword to 'errors'. (Defaults to False)
 * In [381]: core: Deprecated iter()
 * In [382]: tests.test_core: iter() is deprecated - removing test
 * In [383]: core: Fixed calling manager.send - Passed in wrong arg
 * In [384]: debugger: This event handler doesn't need to be a filter. Refactored to handle any generic event thrown at it, but specifically this only handles exception erros that pass a tuple of length 3, (type, value, traceback).
 * In [385]: debugger: Renamed event handler to 'event'.
 * In [386]: lib.web.wsgi: Fixed import of HTTPError
 * In [387]: lib.web.wsgi: Fixed tabs. Some minor fixed (untested)
 * In [388]: lib.web.webob: Added done attribute to Response to indicate whether the response has been written and -is- done.
 * In [389]: lib.web.http: Set response.done when the response has been completely written.
 * In [390]: lib.web.errors: Improved BaseError, and mvoed some of HTTPError code to BaseError. Added appropriate __repr__ methods for BaseError and HTTPError. Fixed subclass of Redirect to be HTTPError.
 * In [391]: lib.web.dispatchers: Fixed call to use proper keyword argument of 'erros'
 * In [392]: lib.web.events: Renamed "HTTP Error" event to Error.
 * In [393]: lib.web.events: Error (was HTTPError) event now only contains a single argument: An error object (errors.BaseError instance).
 * In [394]: lib.web.servers: Moved docroot out of kwargs to make it more obvious.
 * In [395]: lib.web.servers: Check if we have a 'server' attribute first.
 * In [396]: lib.web.http: Refactored error handling.
 * In [397]: lib.web.http: Fixed requestline by strippig any left over whitespace
 * In [398]: debugger: Improved constructor allowing logging of errors/events to be toggled
 * In [399]: core: Push the error first then check of errors=True and re-raise.
 * In [400]: core: Removed __new__ from Event class, changed to __init__. Moved class attributes to __init__.
 * In [401]: core: Simplified __eq__ by using all()
 * In [402]: lib.web.events: Removed Error event - deprecated
 * In [403]: lib.web.errors: BaseError deprecated. HTTPError is now an Event. Tidied up constructor
 * In [404]: lib.web.core: Moved setting attributes into try/finally. Tidied up. Added session support if available.
 * In [405]: lib.web.http: BaseError deprecated. Use HTTPError. Changed channel back to 'httperror' and update HTTP Erorr Event Handler
 * In [406]: lib.web: Import loggers, sessions and dispatchers but just the modules. Import all errors.
 * In [407]: lib.web.sessions: New sessions module adding very basic (optional) session handling
 * In [408]: core: Only log errors if log=True (Default: True). Use sys.exc_info() to get the exception's type, value and traceback.
 * In [409]: core: If errors is not True, clear exception.
 * In [410]: lib.web.dispatcher: Raise errors, but don't log
 * In [411]: lib.web.http: Raise errors, but don't log
 * In [412]: tests.test_sockets: Fixed Manager by not calling isConnected on client which may be a Server component that doesn't have isConnected
 * In [413]: tests.test_debugger: enabled attribute changed to events. Fixed tests.
 * In [414]: tests.tests_core: This test no longer applies - removed.
 * In [415]: Added tag 1.0b1 for changeset eabf5dd3bdf8
 * In [416]: docs/ChangeLog: Fixed 1.0b1 release and release date
 * In [417]: docs/ChangeLog: Updated ChnageLog for 1.0b1
 * In [418]: circuits: Updated CopyRight year to include 2009.
 * In [419]: docs/ChangeLog: Ordered entries for 1.0b1
 * In [420]: workers: Python 2.5.x compatibility with the backported processing package
 * In [421]: lib.log: Removed redundant @listener defs and simplified
 * In [422]: examples/simpleweb.py: Reverted back to it's simplest form. Try to import psyco, if this fails, do nothing.
 * In [423]: examples/simpleweb.py: Removed Debugger, Sessions and Admin
 * In [424]: examples/simpleweb.py: Fixed typo in try/except
 * In [425]: version: Possible fix, fixing bug when creating version information the first time
 * In [426]: tools.bench: Only import hotshot if we can and only try to profile if hotshot is available, otherwise print a warning
 * In [427]: lib.web.tools: Import hashlib and use hashlib.md5 instead of importing the md5 function.
 * In [428]: lib.web.tools: Removed unused imports.
 * In [429]: lib.web.core: Added tools serve_file, serve_download and expires to Controller
 * In [430]: lib.web.dispatchers: Renamed _getParams t _parseBody and modified to pass in params dict from _parseQueryString and update it, return if an error response was returned (return is False).
 * In [431]: lib.web.dispatchers: Just update params with dictform(form) in all cases.
 * In [432]: lib.web.dispatchers: If form.file, set request.body to file.form otherwise update params.
 * In [433]: examples/helloweb.py: Try to import psyco, if it fails do nothing.
 * In [434]: lib.web.wsgi: Removed *args, **kwargs from request handler - they aren't needed.
 * In [435]: lib.web.wsgi: Just return the response string, no need to "send" a Response event anymore.
 * In [436]: lib.web.webob: Removed app attribute.
 * In [437]: lib.web.webob: Renamed and reordered Request default class attributes.
 * In [438]: lib.web.webob: Added sock and scheme to Request constructor.
 * In [439]: lib.web.webob: Added sock, scheme as attributes. Reordered and fixed names of other attributes.
 * In [440]: lib.web.webob: Set self.base of the request when setting headers.
 * In [441]: lib.web.loggers: request.remote_host renamed to request.remote
 * In [442]: lib.web.loggers: Rebuild requestline from request's method, path and scheme.
 * In [443]: lib.web.tools: Fixed names of request attributes
 * In [444]: lib.web.utils: Fixed names of request attributes.
 * In [445]: lib.web.utils: Removed use of request.app as there is no request.app for url()
 * In [446]: lib.web.servers: Set Request.server and Request.local upon BaseServer creation
 * In [447]: lib.web.dispatchers: Pass in request to _getChannel (instead of request.path and request.method.upper()), extract them instead. Set request.index if path ends with a '/'.
 * In [448]: lib.web.http: No need for elif because if stream we return.
 * In [449]: lib.web.http: Use map to extract requested protocol. Pass in sock and scheme to Request(...)
 * In [450]: lib.web.http: These attributes are not needed anymore or already set elsewhere.
 * In [451]: lib.web.http: Use map to build atams.
 * In [452]: lib.web.webob: Fixed docstring for Request
 * In [453]: lib.web.webob: Pass in request object into Response. Response(sock, reqeust)
 * In [454]: lib.web.http: Updated docstring of HTTP
 * In [455]: lib.web.http: Use a slice to get to the protocol (1.1 or 1.0) part.
 * In [456]: lib.web.http: Pass in requeset to Response(...)
 * In [457]: lib.web.http: Removed local var atoms and merged into a single path = "".join(...)
 * In [458]: lib.web.http: Removed local vars rp, sp.
 * In [459]: core: Added start/stop/_run to Manager (starts the Component in a thread). Added run (starts the Component in the main thread and blocks). Components -now- have the capability of running by themselves without any boilerplate.
 * In [460]: lib.sockets: Added tick attributes/methods pointing to poll(...)
 * In [461]: lib.web.servers: Removed poll() and run() - These are now handled automagically
 * In [462]: lib.web.tests.test_core: Don't need the TestServer(Thread) component anymore - just start the (Server(...) + Root(...)) component.
 * In [463]: core: Renamed handlers(...) to _getHandlers
 * In [464]: core: Renamed add(...) to _add
 * In [465]: core: Renamed remove(...) to _remove
 * In [466]: core: Import sys.exc_info and sys.exc-clear as _exc_info and _exc_clear respectively
 * In [467]: tests.test_core: Fixed test to match Manager.add and Manager.remove changes to _add and _remove
 * In [468]: lib.pollers: Added read, write, all properties to access _fds. This uses bitwise flags to determine if a fd is to be polled for reading or writing or both.
 * In [469]: lib.pollers: Set tick to poll(...)
 * In [470]: lib.pollers: Retabbed
 * In [471]: lib.pollers: Import select.select as _select
 * In [472]: core: Give component threads started by start(...) the name of the class
 * In [473]: tools.sniffer: Use Manager.run(...) to run the system
 * In [474]: tools.sniffer: Fixed tabs
 * In [475]: core: Fixed minor typos in Error's codstring
 * In [476]: Retabbed
 * In [477]: core: Set Component _run(...) threads to daemons so they die at system exit.
 * In [478]: core: Termiante run(...) loop on SystemExit as well.
 * In [479]: debugger: CHeck if self.logger is not None (which is correct)
 * In [480]: bridge: If event can't be pickled, don't attempt to send it
 * In [481]: core: Use shorter variable names (k, v) for iterating through the dct (HandlersType meteclass).
 * In [482]: core: Manager attribute changes; Added _components. Renamed channels to _channels.
 * In [483]: core: Removed __getitem__ (useless). Use self.channels
 * In [484]: core: Renamed _getHandlers(...) to handlers(...)
 * In [485]: core: Added properties for components and channels.
 * In [486]: core: Fixed use of private _channels attribute.
 * In [487]: core: Fixed call to _getHandlers - was renamed to handlers(...)
 * In [488]: core: Reorganized run and _run methods. Implemented _calls method which returns a generator of all component instances' __tick__ methods in the current component that is being run.
 * In [489]: core: Simplified getting list of handlers to register
 * In [490]: core: When registering a component with a manager, add the component to the manager's list of component it -has- registered.
 * In [491]: core: Removed component from components list upon unregistration
 * In [492]: core: (NEW) If a Component A subclasses B, and both define an identically bound event handler (by the same attribute name), when B is created, the event handlers from A that are also found in B (of the same binding/attribute) are rebound to B with the prefix of 'A_'... This means ... Event Handlers are automatically inherited (to a depth of 1).
 * In [493]: tests.test_core: Fixed tests as Manager.__getitem__ has been deprecated in favor of using .channels
 * In [494]: lib.pollers: Added __tick__ method (was tick)
 * In [495]: lib.pollers: Added __tick__ method (was tick)
 * In [496]: core: Check if component has __tick__ attribute before yielding it (some may not have)
 * In [497]: core: In Runnable Components and their 'run' loops, collect and call the 'tick' (__tick__) functions of not just components bound to the current component (self.foo) but also ones registered to the current component/manager.
 * In [498]: timers: Added tick (__tick__) functions for Timers and Timer.
 * In [499]: tools.bench: Added -q/--quiet and -o/--output options to bench tool.
 * In [500]: core: Added _hidden attribute to Manager.
 * In [501]: core: Moved bulk of send(...) to _send. If we have hidden components, iterate through and call ._send on each for this event.
 * In [502]: core: Build a list of hidden components for the component being registered and pass this to manager._hidden updatnig the set.
 * In [503]: core: object has no __init__, no need to call super(Manager, self).__init__(...) here.
 * In [504]: core: Implemented a workaround for Python bug: http://bugs.python.org/issue5322
 * In [505]: tools: Added graph function to return a string representing the structure of registered components
 * In [506]: core: Moved calls to registered/unregistered to BaseComponent (where they should have been). Added _updateHidden function to update the set of hidden components.
 * In [507]: core: Use values(...) to get the bound values of a component instead of itervalues - as it may change while we're iterating
 * In [508]: lib.ann: Refactored. Removd use of @listener. Node is now a plain old Component (not a Thread), use Runnable Components' .start() instead. Merged Neuron Type Classes into Neuron itself as methods (_compute is set dynamically).
 * In [509]: core: Deprecated InvalidHandler exception. It's the caller's responsibility to ensure they are -actually- adding Event Handlers defined by @listener to a Manager/Component.
 * In [510]: core: Moved _send back into send. We're not calling _send on _hidden components anymore ... Instead we're registering hidden components (once only).
 * In [511]: core: New Manager attribute _ticks. Used in _run(...) and run(...) - Copied in case it changes during the run cycles. (Runnable Components0.
 * In [512]: core: Renamed Component's _updateHidden to _registerHidden. We're not registering hidden components. Implemented _getTicks to collect and update the manager's _ticks set (This collects tick functions from the component being registered, any components bound to it and any hidden components).
 * In [513]: tools.bench: Start the Bridge if in bridge mdoe
 * In [514]: core: Also collect tick functions from any hidden components
 * In [515]: tests.test_core: Testing for InvalidHandler exception is deprecated.
 * In [516]: tests.test_core: Use a few auto-generated event handlers for good measure.
 * In [517]: lib.sockets: Fixed Client/TCPClient so that we don't poll the socket for write unless we -actually- have data to write (reduces cpu usage as select returns too quickly otherwise)
 * In [518]: lib.sockets: Fixed removal of Client _sock on shutdown
 * In [519]: lib.web.core: Added filter attribute to wrapper (automagically exposed methods of a Controller). This was a recent change in circuits.core' @listener decorator @ 906403be1f6d
 * In [520]: tests.test_sockets: Refactored these tests to not use a Manager or seprate channels. Created generic Server/Client components that accept any of the socket components as their first argument
 * In [521]: lib.sockets: Delete inherited event handler onSEND from base Server component (UDPServer needs one that is entirely different)
 * In [522]: docs/graphs/circuits.pdf: Updated
 * In [523]: docs/graphs/lib.pdf: Updated
 * In [524]: docs/graphs/tests.pdf: Updated
 * In [525]: docs/graphs: New graph web.pdf (graph of circuits.web)
 * In [526]: examples/ircbot.py: Just use manager.run() now
 * In [527]: core: Rewrote _updateTicks as _getTIcks to fix a memory leak with references to old/unused tick functions being left in the manager.
 * In [528]: lib.irc; Added Pong (PONG) event support.
 * In [529]: core: Added an optional sleep argument to start(...) and run(...). If given (a float), will sleep after each cycle. Useful in situations where you have very few pollers (I/O calls).
 * In [530]: core: Return self._components, not a copy of it.
 * In [531]: lib.drivers.pygame_driver: Added tick function
 * In [532]: tools: Store the depth (d) on the stack and restore when backtracking
 * In [533]: core: raise KeyboardInterrupt or SystemExit -always-.
 * In [534]: timers: Deprecated Timers. This is not needed anymore as -any- Component/Manager can manage a set of Timer instances
 * In [535]: circuits: Timers is deprecated
 * In [536]: tests.test_timers: Timers is deprecated. Start the Manager in each test case.
 * In [537]: core: Removed source, ignore from Event object (used by the Bridge). The Bridge can set and test for these itself\!
 * In [538]: bridge: When testing to see if we need to ignore an event, check if the event has been set with the 'ignore' attribute
 * In [539]: tests.test_core: _ignore attribute of Event object deprecated.
 * In [540]: core: Removed old useless docstring.
 * In [541]: core: Documented (Optional) but convenient operator functions.
 * In [542]: core: Improved __repr__ of Manager and BaseComponent to include the no. of channels it has as well as the running state. Added running state property.
 * In [543]: core: Delete channels that are empty when removing event handlers.
 * In [544]: tests.test_core: Fixed repr tests
 * In [545]: core: Added multiprocessing support to Runnable Components. Call start with process=True (default: False). NB: This -will- start the Manager/Component and all it's associated Components in the new process - detaching itself from the parent process.
 * In [546]: core: Fixed (Optional) __iadd__ and __add__ to register y with self rather than self.manager.
 * In [547]: debugger: Added custom file support. Can change the file (defaults to sys.stderr) that we log to.
 * In [548]: lib.sockets: IF we get an EAGAIN error while trying to accept and create a new socket, ignore it and continue (we'll try again later).
 * In [549]: core: Use self._running to check the running state during the run loop. (publicly you should use the .running property - this is internal only).
 * In [550]: core: Remove the hidden (registered) components from the manager's list of components - The manager only needs thei registration, and they only need listed in the _hidden set. This fixes the graphing.
 * In [551]: core: Added (as an experiment) __call__ to the BaseComponent. This creates a new Event object out of the args and kwargs passed to the call, sends the event and returns the result.
 * In [552]: workers: Use _running to set running state of Thread worker. Set Thread instance as _thread.
 * In [553]: workers: Deprecated isAlive function in favour of alive property.
 * In [554]: tests.test_workers: Fixed usage of isAlive() -> alive
 * In [555]: examples/filewatch.py: New example to watch the contents of a file. Basically a tail clone
 * In [556]: workers: Set HAS_MULTIPROCESSING constant appropriately as we try to import multiprocessing or processing (python-2.5). Only build the Process component if we have any kind of multiprocessing support
 * In [557]: core: Start in process mode if we have multiprocessing support, otherwise ignore process=True and start in thread mode
 * In [558]: tests.test_timers: Wait longer for this test - timing on comptuers sucks
 * In [559]: circuits: Don't import Proess from workers if it doesn't exist
 * In [560]: docs: Updaetd overview. Added HelloWorld example. Updated links to the core library
 * In [561]: docs/DownloadInstall: Fixed spelling errors
 * In [562]: docs/License: Updated copyright year
 * In [563]: docs/License: Removed BOM marker
 * In [564]: docs/GeneralPerformance: Renamed to docs/Performance
 * In [565]: docs/QuickStart: Removed
 * In [566]: docs: Removed link to QuickStart, added DevelopersGuide and renamed TutorialHelloWorld to Tutorial
 * In [567]: docs/TutorialHelloWorld: Renamed to docs/Tutorial
 * In [568]: docs/Tutorial: Fixed Status block
 * In [569]: lib.irc; Added User event object.
 * In [570]: lib.irc: Renamed all IRC Command and their Event Handlers (removed use of @listener). Updated any calls to IRC Commands.
 * In [571]: lib.irc; Removed use of @listener for (Default) Event Handlers.
 * In [572]: lib.sockets: Added Connect event object.
 * In [573]: lib.sockets: Deprecated isConnected() call in favor of a property. Use .connected property isntead.
 * In [574]: lib.sockets: Removed "open" function and moved into TCPClient's constructor (__init__). TCPClient now takes a host, port and optional ssl and bind keyword arguments. Added "connect" event handler for initiating new connections (defaults to the host, port settings provided by the TCPClient constructor).
 * In [575]: examples/ircbot.py: Simplified and fixed up
 * In [576]: examples/telnet.py: Fixed and simplieifed
 * In [577]: core: Improved send so that the default target is now either the target given (if it doesn't evaluate to False), or it's the channel of the Component/Manager managing events. (This simplifies a lot of code making it almost unnecessary to specify targets)
 * In [578]: examples/ircbot.py: Don't need to specifty target - defaults nicely
 * In [579]: examples/ircbot.py: Don't need to specifty target - defaults nicely
 * In [580]: lib.io: Retabbed
 * In [581]: core: Renamed *args to *channels in listener decorator to be more clear.
 * In [582]: core: Fixed setting of target. Set target to given target (if not None or False), set to self.channel (if available), defaulting back to None.
 * In [583]: lib.io: Added tick function
 * In [584]: lib.io: Simplified constuctor for Stdin component.
 * In [585]: tests.test_sockets: Client.open is deprcated, use connect instead (which is also an event handler)
 * In [586]: tests.test_bridge: Retabbed
 * In [587]: tools: Remove StringIO import. Use a simple list to build up the output and return .join(s)
 * In [588]: core: Fixed the order that events come off the queue. (I can't believe the whole time this was LILO rather than FIFO :/)
 * In [589]: drivers: Added a load function to load all available drivers into the drivers namespace as well as their Component
 * In [590]: drivers.inotify_driver: New INotifyDriver using the pyinotify library added
 * In [591]: drivers.pygame_driver: Import pygame into the global namespace. Remove 'Event' from event object names.
 * In [592]: drivers.pygame_driver: Remvoed __new__ from PyGameDriver as this is not needed.
 * In [593]: bridge: Added tick function
 * In [594]: tests.test_bridge: Use wait() function (from tests.test_sockets). Start and stop each manager
 * In [595]: examples/dirwatch.py: New example using the inotify_driver (INotifyDriver) to watch a directory for changes
 * In [596]: lib.drivers.pygame_driver: Forgot to import pygame
 * In [597]: lib.drivers.pygame_driver: Initialize the pygame event system.
 * In [598]: examples/pygameex.py: Simplified
 * In [599]: core: Simplified _getTicks
 * In [600]: core: Added Started "started", Stopped "stopped", Registered "registered" and Unregistered "unregistered" events.
 * In [601]: core: Check our parent manager. If it's not our manager add ourselves as a hidden component to the parent manager.
 * In [602]: tools: Alias s.append as write and use this to write the strings.
 * In [603]: tools: Added an inspect(...) function which takes as a single argument a component x to inspect and print detailed information about.
 * In [604]: core: Added hidden and ticks properties to the Manager.
 * In [605]: core: Use the ticks property during the run cycle of runnable Components.
 * In [606]: core: Use the hidden property when gathering tick functions in _getTIcks of the Component.
 * In [607]: core: @listener is deprecated in favor of @handler (more readable and easier to type) ... -and- they are "Event Handlers".
 * In [608]: core: Updated doc string for @handler
 * In [609]: core: Updated doc string examples for @handler
 * In [610]: core: Event Handlers (created with @handler) now have an attribute 'handler' set to True.
 * In [611]: core: Fixed doc string for @handler
 * In [612]: core: When sorting Event Handlers, use {{{lambda x: not x.filter}}} as the sorting key - this puts Filters first.
 * In [613]: core: Updated doc string of Manager._remove
 * In [614]: core: Fixed Manager._remove so that if no channel is given the handler is removed from -all- channels.
 * In [615]: core: Fixed doc string of Manager.flush
 * In [616]: core: Fixed doc string of Manager.send
 * In [617]: core: Fixed doc string of BaseComponent/Component (they were in the wrong place).
 * In [618]: circuits: Import new @handler decorator into the circuits namespace but leave @listener until 1.2 when it gets deprecated.
 * In [619]: core: Fixed @handler (fubbered up the commit?)
 * In [620]: core: Updated @expose to match @handler in circuits.core
 * In [621]: tests.test_core: Fixed repr tests as there are now "registered" and "unregistered" events that will be in the queue.
 * In [622]: core: Added a new test to test the filter order of Event Handlers.
 * In [623]: tools: New tool reprhandler(x) which returns a nicely formatted string representing the Event Handler given.
 * In [624]: tools: Use new reprhandler(...) to pretty print the Event Handlers found by the inspect tool
 * In [625]: bridge: Fixed registered event handler
 * In [626]: lib.web.servers: Fixed registration event handlers.
 * In [627]: lib.web.wsgi: Fixed registration event handlers.
 * In [628]: examples/circ.py: Fixed registration event handler.
 * In [629]: lib.irc: Added Pass event object.
 * In [630]: core: If target is None, try to get the channel of the current component this event was pushed from, otherwise default back to NOne.
 * In [631]: core: When sending events, if target is None, try to get the channel of the current component, otherwise default back to None.
 * In [632]: core: When setting the actual channel we're sending to, if target is not None and target is an instance of Component, set the target to the Component's channel, otherwise default back to None. When finally setting the channel, ensure that target is of the str type.
 * In [633]: core: Explicitly set the target channel of "registered" and "unregsitered" events.
 * In [634]: tests.test_core: Fixed repr test as an Unregistered event gets pushed when a component is unregistered from a manager
 * In [635]: tests.test_timer: Wait longer before doing teh assertion (timing sucks) :)
 * In [636]: lib.web.servers: Removed registered event handlers - don't need them
 * In [637]: docs/ChangeLog: Completed up to r411
 * In [638]: core: Fixed a bug in setting the correct channel for a handler if handler.target is not None.
 * In [639]: examples/telnet.py: Changed to use new @handler decorator.
 * In [640]: examples/telnet.py: Just register the TCPClient instnace.
 * In [641]: examples/telnet.py: Import Write event from lib.sockets
 * In [642]: core: Ignore any other exception raised if they weren't caught already
 * In [643]: examples/udpserver: Fixed and simplified
 * In [644]: examples/udpserver: Fixed and simplified
 * In [645]: lib.sockets: No need to delete the Server_onSEND as it doesn't exist anymore :)
 * In [646]: examples/filewatch.py: Fixed consturctor
 * In [647]: examples/echoserver.py: Fixed and simplified
 * In [648]: examples/telnet.py: Set unique channel to make read events unique
 * In [649]: core: Try to set the target before doing anything.
 * In [650]: core: Try to set the target before doing anything.
 * In [651]: examples/eventserver.py: Fixed and simplified
 * In [652]: examples/eventclient.py: Fixed and simplified
 * In [653]: examples/ircbot.py: Simplified consturctor
 * In [654]: examples/lniktest.py: Removed this bad example
 * In [655]: examples/loops.py: Removed this bad example
 * In [656]: examples/simpleweb.wsgi: Simplified
 * In [657]: examples/todo: Fixed and simplified
 * In [658]: examples/timers.py: Fixed and simplified
 * In [659]: examples/workertest.py: Removed bad example
 * In [660]: examples/testwsgi.py: Removed bad example
 * In [661]: examples: Removed most @listener. Changed filters to use @handler - This example -is- still broken though :/
 * In [662]: core: Import warnings instead of warn from warnings. Use warnings.warn
 * In [663]: lib.log: Removed unused listener import
 * In [664]: lib.irc; Removed unused listener import
 * In [665]: lib.irc; Corrected doc string of IRC component.
 * In [666]: lib.irc; Removed use of @listener in doc string example.
 * In [667]: lib.drivers: Imported warn as _warn from warnings (forgot to import this).
 * In [668]: lib.drivers.inotifydriver: Removed unused IN_ISDIR import.
 * In [669]: lib.drivers.pygame_driver: Added Unknown event object (forgot to add this).
 * In [670]: lib.web.core: Fixed spelling error of self in serve_file def
 * In [671]: lib.web.http: Removed unsued import of SERVER_PROTOCOL
 * In [672]: lib.web.wsgi: Removed unused import of Response
 * In [673]: lib.web.wsgi: Fixed error handler - code is actually status.
 * In [674]: tools.sniffer: Removed unused import of sys
 * In [675]: tools.sniffer: Removed unused import of listener
 * In [676]: tools.bench: Added import of missing Debugger
 * In [677]: tools.bench: Removed use of @listener, Use @handler for filters. Fixed one use of self.opts.verbose (was opts.verbose :/).
 * In [678]: tools.bench: If in debug mode (opts.debug), add a Debugger instance to the manager.
 * In [679]: examples/todo.py: Removed unused import of listener
 * In [680]: examples/timers.py: Removed unused import of listener
 * In [681]: examples/eventclient.py: Removed unused import of listener
 * In [682]: lib.drivers.inotify_driver: Added _sleep function that the tick function uses to sleep. Basically the driver will sleep max(0, freq - timeout). Renamed self._manager to self._wm.
 * In [683]: lib.sockets: Setting TCP_NODELAY is not necessary after accepting a new server's client socket as the server already has this set.
 * In [684]: lib.sockets: Added some better error handlnig around pollling and accept server clietn sockets
 * In [685]: core: Send ourself (self) the component being registered along with the manager (the Component/Manager being registered with) in the Registered event data.
 * In [686]: core: Send ourself (self) the component being unregistered along with the manager (the Component/Manager being unregistered from) in the Unregistered event data.
 * In [687]: bridge: 'registered' event handlers now get an additional argument, the component being registered with
 * In [688]: lib.web.wsgi: 'registered' event handlers now get an additional argument, the component being registered with
 * In [689]: examples/circ.py: 'registered' event handlers now get an additional argument, the component being registered with
 * In [690]: lib.drivers.inotify_driver: Changed default channel to 'inotify' allowing this to be customized with channel keyword argument
 * In [691]: lib.drivers.pygame_driver: Changed default channel to 'pygame' allowing this to be customized with channel keyword argument
 * In [692]: lib.web.tools: return the response object (isntead of response.body) for serve_file
 * In [693]: lib.web.tools: else return the original response if no redirection was done.
 * In [694]: lib.web.tools: return the response (after flattening).
 * In [695]: lib.web.http: If v (a possible resposne) is an instance of webob.Response, create a new Response event based on v and send it.
 * In [696]: lib.drivers.inotify_driver: Pass dir in as an argument not a keyword argument - requested by hacker_kid
 * In [697]: core: Set Runnable Components' threads as Daemons (they wil automatically terminate when the main thread terminates).
 * In [698]: core: When a Runnable Component terminates: While we still have events in the queue, run tick functions and process events until we either have no more events in the queue or a 3s timeout has expired. (This gives components a chance to cleanup).
 * In [699]: lib.io: Removed useless "# Filename:" header.
 * In [700]: lib.io: Refactored into a reusable File component with three additional convenient components, StdIn, StdOut and StdErr. This also adds initialized instances stdin, stdout and stderr.
 * In [701]: core: Added errors, log arguments to start(...) and run(...) - same as send(...).
 * In [702]: docs/html: Added generated docs by epydoc
 * In [703]: circuits: Updated main doc string
 * In [704]: docs: Updated
 * In [705]: circuits: (docs) Fixed example
 * In [706]: docs: Updated
 * In [707]: tools: Included counts in inspect tool
 * In [708]: docs: Fixed all epydoc warnings and updated some documentation that was a bit oudated
 * In [709]: docs: Updated
 * In [710]: Merged with 709:b6fc98eecc6f
 * In [711]: docs: Updated
 * In [712]: circuits: Updated listed keywords picked up by setuptools.
 * In [713]: core: (docs) Updated module's doc string.
 * In [714]: core: (docs) Updated doc strings for Event
 * In [715]: core: (docs) Updated doc strings for Error Event
 * In [716]: core: (docs) Updated doc strings for Started, Stopped, Registered and Unregistered Events. NEW: Started and Stopped both take 1 argument (component).
 * In [717]: core: (docs) Some minor spelling adjustments of terms used in doc strings.
 * In [718]: core: (docs) Updated doc string of Manager.push
 * In [719]: core: (docs) Updated doc string of Manager.flush
 * In [720]: core: (docs) Updated doc string of Manager.send
 * In [721]: core: Started and Stopped both now take a single argument. (component,) - The component being started/stopped.
 * In [722]: core: (docs) Updated doc string for BaseComponent.unregister
 * In [723]: docs: Updated
 * In [724]: core: (docs) Updated coc string example of handler
 * In [725]: core: (docs) Added deprecated note of the use of type in kwargs for handler(...) - planend to be deprecated in favor of filter in 1.2
 * In [726]: core: (docs) Added deprecated note for the use of listener(...) - planned to be deprecated in 1.2 in favor of handlers
 * In [727]: core: (docs) Updated doc string for HandlersType (metaclass).
 * In [728]: core: (docs) Updated doc string of Manager
 * In [729]: core: (docs) Updated doc string for Manager.__len__
 * In [730]: circuits: Added a sleep of 1s in the main doc string example so that at least it doesn't fail! :)
 * In [731]: core: Renamed Manager.handlers(...) to _getHandlers (no need for a public interface to this).
 * In [732]: core: (docs) Documented the return values and types of the (Optional) operator convenience functions.
 * In [733]: core: (docs) Updated doc string of BaseComponent
 * In [734]: core: (docs) Updated doc string of BaseComponent.__call__
 * In [735]: core: (docs) Updated doc string of BaseComponent.register
 * In [736]: core: (docs) Removed most of the doc string from Component (most of this is already documented).
 * In [737]: core: (docs) Fixed indentation
 * In [738]: core: (docs) Remoevd superfluous documentation on channel.
 * In [739]: docs: Updated
 * In [740]: bridge: (docs) Updated module doc string.
 * In [741]: bridge: Removed __all__ (not needed).
 * In [742]: bridge: Switched to using handler (listener is deprecated).
 * In [743]: core: (docs) Fixed example handler usage in handler doc string.
 * In [744]: docs: Updated
 * In [745]: docs: Updated
 * In [746]: docs: Added missing epydoc generated files
 * In [747]: tools: (docs) Updated doc string for graph(x)
 * In [748]: tools: (docs) Updated doc string for inspect(x)
 * In [749]: tools: (docs) Fixed typo
 * In [750]: docs: Updated
 * In [751]: tools: (docs) Updated doc string for reprhandler
 * In [752]: docs: Updated
 * In [753]: tools: Changed the way graph(x) displays the registered components to look more like a structured wiki list
 * In [754]: docs/Performance: Updated status
 * In [755]: docs/graphs: Updated
 * In [756]: Makefile: Ignore circuits.version in generated docs
 * In [757]: docs: Updated
 * In [758]: circuits: (blanket chnage) Switched to @handler everywhere. Removed import of circuits.core in favor of just circuits (with the exception of lib.web.core which needs access to the core.BaseComponent)
 * In [759]: docs/graphs: Updated
 * In [760]: docs/graphs: Updated
 * In [761]: lib.web.webob: Set scheme to Reqeust.scheme (default: 'http') if an empty scheme is passed in. Possible as a lot of HTTP requests can be a plain old 'GET /'
 * In [762]: lib.web.webob: Set self.remote for Request objects only if self.sock is not None (it's None when dealing with we are served from a WSGI server, eg: Apache + mdo_wsgo).
 * In [763]: lib.web.webob: Set self.script_name to self.base for all Request objects. (I'm not sure if there are any other cases where script_name should be different - except in the case of being served by another WSGI server, eg: Apache + mod_wsgi - but that's handled by the Application Component).
 * In [764]: lib.web.wsgi: Switched to using @handler (@listener is deprecated).
 * In [765]: lib.web.wsgI: Added in extra imports we need.
 * In [766]: lib.web.wsgi: Simplified Component registration in Application Component and removed reference to dispatcher.
 * In [767]: lib.web.wsgI: Parse the SERVER_PROTOCOL, because we get it as 'HTTP/x.y' - we want (x, y). Pass in None for sock to Request object creation.
 * In [768]: lib.web.wsgi: Pass in environ["wsgi.url_scheme"] to Request as the scheme.
 * In [769]: lib.web.wsgI: Pass in the parsed protocol.
 * In [770]: lib.web.wsgi: Build Host object for Request.remote from environ["REMOTE_ADDR"] and environ["REMOTE_PORT"].
 * In [771]: lib.web.wsgi: Fixed creation of Response object (needs a reference to the request object). Added in a default response header 'X-Powered-By'.
 * In [772]: lib.web.wsgi: Fixed Application request/response and error handling. (NOTE: This is almost identical code to that of HTTP's - Should refactor this into a single Component).
 * In [773]: lib.web.wsgi: Pass in SERVER_NAME and SERVER_PORT to Middleware loaded apps.
 * In [774]: lib.web.wsgi: Pass in wsgi.version, wsgi.errors, wsgi.multithread, wsgi.multiprocess, and wsgi.run_once values to the environ for the Middleware loaded app.
 * In [775]: lib.web.wsgi: Fixed typo (weird way of spelling 'status').
 * In [776]: lib.web.servers: Changed default channel for BaseServer (and Server) and child components to 'web'.
 * In [777]: lib.web.servers: Simplified Server properties.
 * In [778]: lib.web: Import wsgi as a module. Import tools too. Removed import of Application, Middleware, Filter from wsgi.
 * In [779]: lib.web.wsgi: Renamed Middleware to Gateway (will deprecated Middlware in 1.2)
 * In [780]: lib.web: Added deprecation note about the direct import of Application, Middleware and Filter into the circuits.web namespace. Post 1.2 this will be deprecated in favour of simply importnig wsgi.
 * In [781]: lib.web.wsgi: Replaced Middleware alias with an equivilant function to display an appropiate warning about the deprecation of Middleware post 1.2
 * In [782]: lib.web.wsgI: Fixed type, it's not Gateway :)
 * In [783]: docs: Updated
 * In [784]: lib.web: Removed Filter. (I'm not sure this Component works, is used or useful!).
 * In [785]: lib.web.wsgi: Removed Filter (I'm not sure this works, is used or is useful!)
 * In [786]: lib.web.dispatchers: Modified the DefaultDispatcher's behavior such that if the channel that was match for a particular URI happens to be a 'request' channel (plain old web request handlers), then create a basic Request Event Object based only on the request and response data (nothing else). Otherwise proceed with the normal behavior of creating a Request Event Object with proper *args, **kwargs.
 * In [787]: lib.web.wsgi: Removed *args, **kwargs from Application constructor (if we need customization in future, we'll add it).
 * In [788]: lib.web.wsgi: As Gateway Components are used in the context of either a BaseServer or Server, it must also listen on teh same default 'web' channel. Correct the channel appropriately if a custom path is given for the WSGI Application to be mounted on.
 * In [789]: lib.web.wsgi: Renamed request, response instance variables to _request and _response respectively (no need for a public interface to these). Renamed event handlers as simply request/response (much more sense).
 * In [790]: Backed out changeset 1123b4e86c96 - I souldn't code on little sleep :)
 * In [791]: Merged with 5f898166ae4f
 * In [792]: lib.web.dispatchers: The channel will in fact end with ":request" not be equal to "request" (targets).
 * In [793]: docs: Updated
 * In [794]: lib.web.utils: Retabbed. Rewrite parseQueryString to use urlparse.parse_qs and use a list comprehension instead of a for loop
 * In [795]: lib.web.dispatchers: Reuse the Request Event rather than recreate a new one.
 * In [796]: lib.web.sessions: Switched to using @handler (@listener is deprecated)
 * In [797]: lib.config: Switched to using @handler (@listener is deprecated)
 * In [798]: lib.env: Switched to using @handler (@listener is deprecated)
 * In [799]: lib.smtp: Switched to using @handler (@listener is deprecated)
 * In [800]: lib.sockets: Switched to using @handler (@listener is deprecated)
 * In [801]: docs: Updated
 * In [802]: debugger: Use type=True (filter=... is deprecated)
 * In [803]: tests.test_core: Use type=True (filter=... is deprecated)
 * In [804]: lib.sockets: Fixed capturing EWOUDLBLOCK and EAGAIN errors
 * In [805]: lib.web.dispatchers: Greatly simplified the DefaultDispatcher's Request Handler to just return the result of sending the dispatched request to Controllers (if any were found). It's ok to return None here or return nothing at all (None) to give other Dispatchers a chance to do something with the request.
 * In [806]: lib.web.dispatchers: Come to think of it, Dispatchers' Request Handlers should probably be filters.
 * In [807]: lib.web.dispatchers: Removed unused imports.
 * In [808]: lib.web.http: Fixed buffering of socket, request and response objects in cases where the entire body hasn't been received yet.
 * In [809]: lib.web.http: Don't try/except th sending of the request, let the outter try do this, just check if v is not NOne, if it is return a 404.
 * In [810]: docs: Updated
 * In [811]: lib.irc: Fixed source so that we send the entire source as split by sourceSplit (nick, ident, host)
 * In [812]: examples/irc.py: Fixed message handler to pass in the correct target (source[0])
 * In [813]: ez_setpu.py: Removed - download the latest version from http://peak.telecommunity.com/dist/ez_setup.py isntead
 * In [814]: lib.web.http: Removed server instance variable from HTTP (not used).
 * In [815]: lib.web.servers: Added 'version' property to BaseServer.
 * In [816]: lib.web.servers: Added ssl, scheme and host properties and rewrite the base property to use these.
 * In [817]: lib.web.webob: Don't set the script_name of the Request object to the base of the server - this is wrong :)
 * In [818]: lib.web.webob: Added 'X-Powered-By' default header to Response objects and changed 'Server' default header to use request.server.version property.
 * In [819]: lib.web.wsgi: Fixed up a few issues with the WSGI environ being created and added a few missing pieces.
 * In [820]: lib.web.wsgi: Removed default 'X-Powered-By' response header here as it's taken care of by the Response object(s).
 * In [821]: lib.web.wsgi: Fixed start_response functions (added keyword argument exc_info).
 * In [822]: lib.web.wsgi: Make 'environ' a private function '_createEnviron' (no need for public interface).
 * In [823]: lib.web.dispatchers: No need to have a special case for channels ending n ":request".
 * In [824]: lib.web.dispatchers: Added 'default' as the last channel to look for.
 * In [825]: lib.web.dispatchers: Raise errors when sending the Request Event so the HTTP Component can pick it up.
 * In [826]: lib.web.servers: Set a default Request.host that it Server.host
 * In [827]: lib.web.webob: Default host for Request is ""
 * In [828]: lib.web.webob: Set Response.cookie to Request.cookie and reuse the object rather than creating a new one to woryr about.
 * In [829]: lib.web.wsgi: Set self.path in Gateway
 * In [830]: lib.web.wsgi: Recalculate Request.script_name and Request.path based on the fact that the WSGI mounted via this Gateway may be mounted and rooted at a specific path. eg: Gateway(app, "/app")
 * In [831]: docs: Updated
 * In [832]: core: Make it possible to 'override' inherited event handlers by specifying override=True in the @handler decorator  when defining custom event handlers.
 * In [833]: lib.pollers: Completed implementation of Select, Poll and EPoll pollers
 * In [834]: lib.sockets: Refactored to use the new Poller Components from lib.pollers
 * In [835]: examples/echoserver.py: Just write the response backk to the client
 * In [836]: examples/ircbot.py: Fixed this example due to lib.sockets refactor and changes in TCPClient (minor).
 * In [837]: examples/telnet.py: Fixed import of stdin (Stdin was deprecated).
 * In [838]: examples/telnet.py: Fixed TCPClient instantiation due to recent changes in lib.sockets.TCPClient (minor) due to new lib.pollers
 * In [839]: examples/telnet.py: Added error handler to print errors, eg: "Connection Refused" :)
 * In [840]: examples/udpclient.py: Fixed import of stdin from lib.io (Stdin was deprecated)
 * In [841]: tests.test_sockets: Fixed TCPServer and TCPCLient test and half fixed UDPServer/UDPClient test (1 failure still :/)
 * In [842]: lib.web.cgifs: readline() doesn't accept any argumetns\!
 * In [843]: errors: Don't set a default 'Close' header for Response object - this is set by the server (and it must not be set for WSGI)
 * In [844]: lib.web.webob: Fixed settnig of server_version in Response object
 * In [845]: docs: Updated
 * In [846]: lib.web.servers: Make it possible to customize other things with the BaseServer and subclasses thereof and it's underlying Componetns (such as the poller used)
 * In [847]: lib.web.utils: Fix for python-2.5 compatibility (2.5's urlparse module doesn't have parse_qs, cgi does though).
 * In [848]: lib.pollers: Fixed epoll for python-2.5 compatibility. (Use the select26 library to get epoll support for 2.5 - otherwise the EPoll component is deleted).
 * In [849]: lib.sockets: Removed unsed import of errno
 * In [850]: lib.sockets: Removed unused import of select. Removed import of Poll and EPoll from lib.pollers (leave the default poller for Client/Server components to be Select).
 * In [851]: lib.web.servers: (python-2.5 compatibility) Fixed docroot property to work with python-2.5 and added some documentation about it.
 * In [852]: docs/html: Updated
 * In [853]: lib.pollers: It's possible that for Poll and EPoll pollers that an incoming event might occur whereby a Client/Server interested in it has already deregistered their interest altogether - So close it and return.
 * In [854]: lib.web: Import the actual Components we want from errors (don't use from ... import *).
 * In [855]: lib.web.dispatchers: Added 'index.xhtml' and 'index.htm" as additional static file defaults to look for in a DefaultDispatcher's docroot.
 * In [856]: lib.web.http: Put an assertion guard around the type of v being returend. This should -never- occur!
 * In [857]: lib.web.wsgi: Added missing import of NotFound from errors.
 * In [858]: lib.web.wsgi: IT's not a WSGI Application'(deployed on another web server), s responsibility to "Close a Connection" by setting the "Close" header.
 * In [859]: lib.web.wsgi: Fixed request and error handlers in wsgi.Application
 * In [860]: lib.web.wsgi: Fixed path (and Component channel) setting in wsgi.Gateway (thanks aa_).
 * In [861]: lib.web.wsgi: Set "wsgi.errors" to a File component that goes to /dev/null (for now) - not sure how to handle errors that occur in WSGI apps mounted via our Gateway :/
 * In [862]: lib.core: Ignore any exceptions that might occur during sleep (eg: KeyboardInterrupt).
 * In [863]: lib.core: Fixed exceptions thrown during shutdown when using processes. Turns out trying to terminate a process within a process isn't a very good idea (self._task will be None! duh!) :)
 * In [864]: lib.pollers: Recreate our poller object if we are part of something that's started in either Process (P) or Thread (T) mode for EPoll.
 * In [865]: core: Added a 2nd argument to the Started Event 'mode'. This is the mode in which the Component was started in. It is one of 'P' for Process mode, 'T' for Thread mode or None for Main/Normal.
 * In [866]: core: Pass in an additional argument to the run function when a Component is started. Set this argument (mode) to 'P' if started in Process mode, 'T' if started in Thread mode, otherwise it defaults to None. Send this as part of the Started Event just before we go into our Event Loop.
 * In [867]: core: (NEW) Added regsitered signal handlers for SIGINT, SIGHUP and SIGTERM. Added a new Event, Signal; which gets sent on any of SIGINT, SIGHUP or SIGTERM signals. If no Event Handler handles or filters the Signal Event, then the system is terminated cleanly. Upon system termination, all child threads and processes are also termianted.
 * In [868]: cire: Set the default join timeout to 3 (when stopping).
 * In [869]: core: Gah I'm an idiot, threads don't have a .stop() :P
 * In [870]: lib.pollers: Fixed Poll/EPoll
 * In [871]: core: Only setup signals when started in non-thread mode (apparently only the main thread can have registered posix signal handlers).
 * In [872]: lib.web.dispatchers: Fixed args given to the Request event from vpath (the left over path).
 * In [873]: lib.web.httpauth: Added HTTP Authentication library (borrowed from Cherrypy - which they borrowed from someone else\!)
 * In [874]: lib.web.errors: Don't clear the response in HTTPError (Bad for Unauthorized error).
 * In [875]: lib.web.errors: Don't need HTTPError or subclasses thereof to evaluate to False.
 * In [876]: lib.web.errors: Added Unauthorized error (sends a 401).
 * In [877]: lib.web.tools: Added basic_auth and digest_auth tools.
 * In [878]: core: (NEW) Added the capability for Event Handlers to be created with a priority. That is, Event Handlers are registered with a Manager/Component and are sorted by their priority, then by whether or not they are a filter.
 * In [879]: core: Preserve the structure of a component tree.
 * In [880]: core: Removed this component from it's manager's parent's set of hidden components if it exists.
 * In [881]: lib.pollers: Changed default TIMEOUT to be 1ms (0.001s). Removed a bit of useless code in Poll/EPoll constructors that multiplied the timeout by 1000 (what the hell for ? - what were those twisted guys smoking ?).
 * In [882]: lib.web.dispatchers: Changed the default channel of the DefaultDispatcher to "web".
 * In [883]: lib.web.http: Changed the default channel of HTTP to be "http". Updated all Events destined for a Server to "server". Set all Request events to go to "web" (by default).
 * In [884]: lib.web.http: Changed TypeError raised for when the type of v is unhandled to an assertion.
 * In [885]: tools: Added kill() function to destroy the entire structure of a component and it's children recursively
 * In [886]: lib.web.servers: Changed the way TCPServer and HTTP get registered to ouse BaseServer (circuits.web).
 * In [887]: Automated merge with http://hg.softcircuit.com.au/projects/circuits/
 * In [888]: lib.web.servers: Forgot to remove this
 * In [889]: lib.web.core: Forgot to update the ExposeType meteclass when 'type' had been deprecated from @handler. The checks were failing :/
 * In [890]: docs/Contributing: Updated
 * In [891]: docs/html: Updated
 * In [892]: core: Fixed sending of Registered and Unregistered evetns
 * In [893]: Backed out changeset 2f6c72536609 (Half asleep here :/)
 * In [894]: tools: (NEW) Added new tools root(x) to find the root of a component - ie: it's actual manager
 * In [895]: lib.web.http: Fixed streaming
 * In [896]: web.constants: Reduced default buffer size to 4KB
 * In [897]: core: Put try/except/pass around exception handlers in Manager.run in case of unclean shutdowns
 * In [898]: drivers: Greatly simplified this package and it's drivers. Removed auto loading crap :) Just load explicity
 * In [899]: net.sockets: Rewrite tools
 * In [900]: tools: Fixed walk and graph functions.
 * In [901]: Imported circuits-dev-973:592956c5f436.patch
 * In [902]: tools: Removed detail about hidden componnets in inspect tool as this is removed now
 * In [903]: core: Fixed Manager._unregisterHandlers (Manager._remove not Manager.remove)
 * In [904]: core: Better register/unregister functionality - ensures we register not only with our manager but the root manager but maintain the structure
 * In [905]: Imported circuits-dev-980:04a88088235d.patch
 * In [906]: core: _handlers may change as we're iterating - iteratore over a copy
 * In [907]: tools: Removed initial component form being printed in detailed inspect report
 * In [908]: core: Fixed sending of Unregistered event
 * In [909]: core: Fixed Manager.unregister in the case where a Component's manager is it fact itself
 * In [910]: tests.test_sockets: Fixed UDP test by fixing the channel
 * In [911]: core: Use values() as the list can changed if we iter over it instead.
 * In [912]: lib.web.tools: Fixed doc string of auth tools
 * In [913]: lib.web: Renamed httpauth modules to _httpauth (excluding this form docs)
 * In [914]: docs/html: Updated
 * In [915]: docs/ChangeLog: Removed BOM markert
 * In [916]: docs/ChangeLog: Up to 414

== 1.0b1 ==
 Released:: 20081231 (''31st December 2008'')
 Revision:: [261]

=== Documentation ===
 * In [208]: [source:circuits/debugger.py debugger]: Removed useless docstring examples/test
 * In [210]: [source:docs/cl docs/cl], Fixed cl script to accept an argument rather than hard coding the revision in
 * In [211]: [source:circuits/core.py core]: Fixed spelling error

=== NEW ===
 * In [225]: [source:circuits/workers.py workers]: Renamed Worket to Thread. Implemented Process component for multiprocessing support - requried multiprocessing module
 * In [243]: [source:circuits/core.py core]: Call "registered" function if available in y (component being registered) when adding (+).
 * In [244]: [source:circuits/core.py core]: Better sub (-) and isub (-=) support; checks if y (component being unregistered) is registered with this manager/component and calls "unregistered" function of y (component being unregistered) if available.
 * In [245]: [source:circuits/timers.py timers]: Added new Timers component to manage Timer (individual) components.
 * In [246]: [source:circuits/__init__.py circuits]: Import new Timers component into circuits namespace.
 * In [253]: [source:circuits/core.py core]: Even though there is 1 error and 1 failure - this is by far the best attempt at merging and deprecating SimpleComponent into Component. Now any method defined (that isn't already an event handler or doesn't start with a _) automatically becomes an event handler listening on a channel that reflects the method's name

=== Enhancements ===
 * In [217]: [source:circuits/core.py core]: Slightly improved performance of handlers function by 2%
 * In [218]: [source:circuits/core.py core]: Slightly improved performance of handlers function by 1%
 * In [219]: [source:circuits/core.py core]: Removed superfluous handler variable - not used anymore
 * In [221]: [source:circuits/core.py core]: Improved event queuing improving performance by 6%
 * In [222]: [source:circuits/core.py core]: Event Handler functions don't need the argspec stored
 * In [223]: [source:circuits/core.py core]: Improved performance by 10% by caching handler branch points for send/iter
 * In [224]: [source:circuits/core.py core]: Simplified no. of brnaches for calling handlers in send/iter
 * In [230]: [source:circuits/core.py core]: Improved performance of flush() by using an iter vs. a while and popping the events
 * Breaks Bridge - test_bridge fails on L71
 * In [249]: [source:circuits/core.py core]: Simplified and flattened handlers()
 * In [251]: [source:circuits/timers.py timers]: Changed add method to addTimer (conflicts with Component class)

=== Fixes ===
 * In [215]: [source:circuits/core.py core]: Fixed defect in handlers for default case - where the handlers for that channel itself were not being picked up (with no target part)
 * In [220]: [source:circuits/core.py core]: Fixed doc string tests - bad indentation
 * In [237]: [source:circuits/workers.py workers]: Fixed Process to share running state properly so the process can be stopped properly
 * In [257]: [source:circuits/workers.py workers]: Fixed Process component and moved Thread that runs the actual function inside the process
 * In [259]: [source:circuits/bridge.py bridge]: Fixed bridge by fixing public methods that were getting confused as existing event handlers

=== Library ===

==== New ====
 * In [233]: [source:circuits/lib/pygamepump.py lib.pygamepump]: Added new PyGamePump component to pump pygame events into a system - See [source:examples/pygameex.py examples/pygamex.py]

==== Updated ====
 * In [207]: [source:circuits/lib/ann.py lib.ann]: Fixed bad import of Worker
 * In [212]: [source:circuits/lib/irc.py lib.irc]: Added event handlers for all implemented irc commands
 * In [226]: [source:circuits/lib/irc.py lib.irc]; Added NAMES command
 * In [227]: [source:circuits/lib/ann.py lib/ann]: Fixed __init__ to properly call their base class
 * In [229]: [source:circuits/lib/ann.py lib.ann]: Fixed bad indentation
 * In [235]: [source:circuits/lib/ann.py lib.ann]: Compatibility fixes
 * In [236]: [source:circuits/lib/web.py lib.web]: Fixed expose decorator to match changes in core's listener changes in 1b08204a9763
 * In [239]: [source:circuits/lib/sockets.py lib].sockets: Documented events
 * In [240]: [source:circuits/lib/irc.py lib.irc]; Documented events
 * In [241]: [source:circuits/lib/irc.py lib.irc]; Added WHOIS command
 * In [250]: [source:circuits/lib/web.py lib.web]: Changed _AutoListener metaclass to ExposeType - Also don't setup previously setup event handlers as exposed handlers
 * In [255]: [source:circuits/lib/web.py lib.web]: Fixed Controller by subclassing BaseComponent instead (fixes metaclass error being thrown)
 * In [256]: [source:circuits/lib/web.py lib.web]: Fixed expose (re-added request, response args - 237 had removed them)

=== Examples ===

==== New ====
 * In [213]: [source:examples/circ.py examples/circ.py]: Added new example circ - An urwid/circuits irc client
 * In [232]: [source:examples/ examples]: New Examples
 * In [234]: [source:examples/ai/ examples/ai/: AI and ANN examples added

==== Updated ====
 * In [258]: [source:examples/workertest.py examples/workertest.py]: Fixed checking of running state (use isAlive())

=== Tools ===

==== New ====

==== Updated ====
 * In [204]: [source:circuits/tools/bench.py tools.bench]: Removed pymills dependancy on misc.duration (imported this function)
 * In [205]: [source:circuits/tools/sniffer.py tools.sniffer]: Fixed improper usage of {{{debugger.Debugger}}}. {{{Debugger.enable()}}} and friends are deprecated.
 * In [242]: [source:circuits/tools/bench.py tools.bench]: Fixed broken condition checking mode. Changed default mode to Speed Test

=== Tests ===
 * In [214]: [source:circuits/tests/tests/test_debugger.py tests.test_debugger]: Fixed Debugger tests
 * In [216]: [source:circuits/tests/tests/test_core.py tests.test_core]: Fixed event handler target test
 * In [228]: [source:circuits/tests/tests/test_workers.py tests.test_workers]: Fixed tests to adapt to recent workers revamp
 * In [247]: [source:circuits/tests/tests.test_timers.py tests.test_timers]: Modified to use new Timers component which in turn uses Timer
 * In [248]: [source:circuits/tests/test_timers.py tests.test_timers]: Fixed indentation
 * In [252]: [source:circuits/tests/tests.test_timers.py tests.test_timers]: Updated to use addTimer method vs. add
 * In [260]: [source:circuits/tests/tests.test_bridge.py tests.test_bridge]: Removed close() - deprecated
 * In [261]: [source:circuits/tests/tests.test_workers.py tests.test_workers]: Fixed test by waiting until worker has finished



 * In [420]: workers: Python 2.5.x compatibility with the backported processing package
 * In [421]: lib.log: Removed redundant @listener defs and simplified
 * In [422]: examples/simpleweb.py: Reverted back to it's simplest form. Try to import psyco, if this fails, do nothing.
 * In [423]: examples/simpleweb.py: Removed Debugger, Sessions and Admin
 * In [424]: examples/simpleweb.py: Fixed typo in try/except
 * In [425]: version: Possible fix, fixing bug when creating version information the first time
 * In [426]: tools.bench: Only import hotshot if we can and only try to profile if hotshot is available, otherwise print a warning
 * In [427]: lib.web.tools: Import hashlib and use hashlib.md5 instead of importing the md5 function.
 * In [428]: lib.web.tools: Removed unused imports.
 * In [429]: lib.web.core: Added tools serve_file, serve_download and expires to Controller
 * In [430]: lib.web.dispatchers: Renamed _getParams t _parseBody and modified to pass in params dict from _parseQueryString and update it, return if an error response was returned (return is False).
 * In [431]: lib.web.dispatchers: Just update params with dictform(form) in all cases.
 * In [432]: lib.web.dispatchers: If form.file, set request.body to file.form otherwise update params.
 * In [433]: examples/helloweb.py: Try to import psyco, if it fails do nothing.
 * In [434]: lib.web.wsgi: Removed *args, **kwargs from request handler - they aren't needed.
 * In [435]: lib.web.wsgi: Just return the response string, no need to "send" a Response event anymore.
 * In [436]: lib.web.webob: Removed app attribute.
 * In [437]: lib.web.webob: Renamed and reordered Request default class attributes.
 * In [438]: lib.web.webob: Added sock and scheme to Request constructor.
 * In [439]: lib.web.webob: Added sock, scheme as attributes. Reordered and fixed names of other attributes.
 * In [440]: lib.web.webob: Set self.base of the request when setting headers.
 * In [441]: lib.web.loggers: request.remote_host renamed to request.remote
 * In [442]: lib.web.loggers: Rebuild requestline from request's method, path and scheme.
 * In [443]: lib.web.tools: Fixed names of request attributes
 * In [444]: lib.web.utils: Fixed names of request attributes.
 * In [445]: lib.web.utils: Removed use of request.app as there is no request.app for url()
 * In [446]: lib.web.servers: Set Request.server and Request.local upon BaseServer creation
 * In [447]: lib.web.dispatchers: Pass in request to _getChannel (instead of request.path and request.method.upper()), extract them instead. Set request.index if path ends with a '/'.
 * In [448]: lib.web.http: No need for elif because if stream we return.
 * In [449]: lib.web.http: Use map to extract requested protocol. Pass in sock and scheme to Request(...)
 * In [450]: lib.web.http: These attributes are not needed anymore or already set elsewhere.
 * In [451]: lib.web.http: Use map to build atams.
 * In [452]: lib.web.webob: Fixed docstring for Request
 * In [453]: lib.web.webob: Pass in request object into Response. Response(sock, reqeust)
 * In [454]: lib.web.http: Updated docstring of HTTP
 * In [455]: lib.web.http: Use a slice to get to the protocol (1.1 or 1.0) part.
 * In [456]: lib.web.http: Pass in requeset to Response(...)
 * In [457]: lib.web.http: Removed local var atoms and merged into a single path = "".join(...)
 * In [458]: lib.web.http: Removed local vars rp, sp.
 * In [459]: core: Added start/stop/_run to Manager (starts the Component in a thread). Added run (starts the Component in the main thread and blocks). Components -now- have the capability of running by themselves without any boilerplate.
 * In [460]: lib.sockets: Added tick attributes/methods pointing to poll(...)
 * In [461]: lib.web.servers: Removed poll() and run() - These are now handled automagically
 * In [462]: lib.web.tests.test_core: Don't need the TestServer(Thread) component anymore - just start the (Server(...) + Root(...)) component.
 * In [463]: core: Renamed handlers(...) to _getHandlers
 * In [464]: core: Renamed add(...) to _add
 * In [465]: core: Renamed remove(...) to _remove
 * In [466]: core: Import sys.exc_info and sys.exc-clear as _exc_info and _exc_clear respectively
 * In [467]: tests.test_core: Fixed test to match Manager.add and Manager.remove changes to _add and _remove
 * In [468]: lib.pollers: Added read, write, all properties to access _fds. This uses bitwise flags to determine if a fd is to be polled for reading or writing or both.
 * In [469]: lib.pollers: Set tick to poll(...)
 * In [470]: lib.pollers: Retabbed
 * In [471]: lib.pollers: Import select.select as _select
 * In [472]: core: Give component threads started by start(...) the name of the class
 * In [473]: tools.sniffer: Use Manager.run(...) to run the system
 * In [474]: tools.sniffer: Fixed tabs
 * In [475]: core: Fixed minor typos in Error's codstring
 * In [476]: Retabbed
 * In [477]: core: Set Component _run(...) threads to daemons so they die at system exit.
 * In [478]: core: Termiante run(...) loop on SystemExit as well.
 * In [479]: debugger: CHeck if self.logger is not None (which is correct)
 * In [480]: bridge: If event can't be pickled, don't attempt to send it
 * In [481]: core: Use shorter variable names (k, v) for iterating through the dct (HandlersType meteclass).
 * In [482]: core: Manager attribute changes; Added _components. Renamed channels to _channels.
 * In [483]: core: Removed __getitem__ (useless). Use self.channels
 * In [484]: core: Renamed _getHandlers(...) to handlers(...)
 * In [485]: core: Added properties for components and channels.
 * In [486]: core: Fixed use of private _channels attribute.
 * In [487]: core: Fixed call to _getHandlers - was renamed to handlers(...)
 * In [488]: core: Reorganized run and _run methods. Implemented _calls method which returns a generator of all component instances' __tick__ methods in the current component that is being run.
 * In [489]: core: Simplified getting list of handlers to register
 * In [490]: core: When registering a component with a manager, add the component to the manager's list of component it -has- registered.
 * In [491]: core: Removed component from components list upon unregistration
 * In [492]: core: (NEW) If a Component A subclasses B, and both define an identically bound event handler (by the same attribute name), when B is created, the event handlers from A that are also found in B (of the same binding/attribute) are rebound to B with the prefix of 'A_'... This means ... Event Handlers are automatically inherited (to a depth of 1).
 * In [493]: tests.test_core: Fixed tests as Manager.__getitem__ has been deprecated in favor of using .channels
 * In [494]: lib.pollers: Added __tick__ method (was tick)
 * In [495]: lib.pollers: Added __tick__ method (was tick)
 * In [496]: core: Check if component has __tick__ attribute before yielding it (some may not have)
 * In [497]: core: In Runnable Components and their 'run' loops, collect and call the 'tick' (__tick__) functions of not just components bound to the current component (self.foo) but also ones registered to the current component/manager.
 * In [498]: timers: Added tick (__tick__) functions for Timers and Timer.
 * In [499]: tools.bench: Added -q/--quiet and -o/--output options to bench tool.
 * In [500]: core: Added _hidden attribute to Manager.
 * In [501]: core: Moved bulk of send(...) to _send. If we have hidden components, iterate through and call ._send on each for this event.
 * In [502]: core: Build a list of hidden components for the component being registered and pass this to manager._hidden updatnig the set.
 * In [503]: core: object has no __init__, no need to call super(Manager, self).__init__(...) here.
 * In [504]: core: Implemented a workaround for Python bug: http://bugs.python.org/issue5322
 * In [505]: tools: Added graph function to return a string representing the structure of registered components
 * In [506]: core: Moved calls to registered/unregistered to BaseComponent (where they should have been). Added _updateHidden function to update the set of hidden components.
 * In [507]: core: Use values(...) to get the bound values of a component instead of itervalues - as it may change while we're iterating
 * In [508]: lib.ann: Refactored. Removd use of @listener. Node is now a plain old Component (not a Thread), use Runnable Components' .start() instead. Merged Neuron Type Classes into Neuron itself as methods (_compute is set dynamically).
 * In [509]: core: Deprecated InvalidHandler exception. It's the caller's responsibility to ensure they are -actually- adding Event Handlers defined by @listener to a Manager/Component.
 * In [510]: core: Moved _send back into send. We're not calling _send on _hidden components anymore ... Instead we're registering hidden components (once only).
 * In [511]: core: New Manager attribute _ticks. Used in _run(...) and run(...) - Copied in case it changes during the run cycles. (Runnable Components0.
 * In [512]: core: Renamed Component's _updateHidden to _registerHidden. We're not registering hidden components. Implemented _getTicks to collect and update the manager's _ticks set (This collects tick functions from the component being registered, any components bound to it and any hidden components).
 * In [513]: tools.bench: Start the Bridge if in bridge mdoe
 * In [514]: core: Also collect tick functions from any hidden components
 * In [515]: tests.test_core: Testing for InvalidHandler exception is deprecated.
 * In [516]: tests.test_core: Use a few auto-generated event handlers for good measure.
 * In [517]: lib.sockets: Fixed Client/TCPClient so that we don't poll the socket for write unless we -actually- have data to write (reduces cpu usage as select returns too quickly otherwise)
 * In [518]: lib.sockets: Fixed removal of Client _sock on shutdown
 * In [519]: lib.web.core: Added filter attribute to wrapper (automagically exposed methods of a Controller). This was a recent change in circuits.core' @listener decorator @ 906403be1f6d
 * In [520]: tests.test_sockets: Refactored these tests to not use a Manager or seprate channels. Created generic Server/Client components that accept any of the socket components as their first argument
 * In [521]: lib.sockets: Delete inherited event handler onSEND from base Server component (UDPServer needs one that is entirely different)
 * In [522]: docs/graphs/circuits.pdf: Updated
 * In [523]: docs/graphs/lib.pdf: Updated
 * In [524]: docs/graphs/tests.pdf: Updated
 * In [525]: docs/graphs: New graph web.pdf (graph of circuits.web)
 * In [526]: examples/ircbot.py: Just use manager.run() now
 * In [527]: core: Rewrote _updateTicks as _getTIcks to fix a memory leak with references to old/unused tick functions being left in the manager.
 * In [528]: lib.irc; Added Pong (PONG) event support.
 * In [529]: core: Added an optional sleep argument to start(...) and run(...). If given (a float), will sleep after each cycle. Useful in situations where you have very few pollers (I/O calls).
 * In [530]: core: Return self._components, not a copy of it.
 * In [531]: lib.drivers.pygame_driver: Added tick function
 * In [532]: tools: Store the depth (d) on the stack and restore when backtracking
 * In [533]: core: raise KeyboardInterrupt or SystemExit -always-.
 * In [534]: timers: Deprecated Timers. This is not needed anymore as -any- Component/Manager can manage a set of Timer instances
 * In [535]: circuits: Timers is deprecated
 * In [536]: tests.test_timers: Timers is deprecated. Start the Manager in each test case.
 * In [537]: core: Removed source, ignore from Event object (used by the Bridge). The Bridge can set and test for these itself\!
 * In [538]: bridge: When testing to see if we need to ignore an event, check if the event has been set with the 'ignore' attribute
 * In [539]: tests.test_core: _ignore attribute of Event object deprecated.
 * In [540]: core: Removed old useless docstring.
 * In [541]: core: Documented (Optional) but convenient operator functions.
 * In [542]: core: Improved __repr__ of Manager and BaseComponent to include the no. of channels it has as well as the running state. Added running state property.
 * In [543]: core: Delete channels that are empty when removing event handlers.
 * In [544]: tests.test_core: Fixed repr tests
 * In [545]: core: Added multiprocessing support to Runnable Components. Call start with process=True (default: False). NB: This -will- start the Manager/Component and all it's associated Components in the new process - detaching itself from the parent process.
 * In [546]: core: Fixed (Optional) __iadd__ and __add__ to register y with self rather than self.manager.
 * In [547]: debugger: Added custom file support. Can change the file (defaults to sys.stderr) that we log to.
 * In [548]: lib.sockets: IF we get an EAGAIN error while trying to accept and create a new socket, ignore it and continue (we'll try again later).
 * In [549]: core: Use self._running to check the running state during the run loop. (publicly you should use the .running property - this is internal only).
 * In [550]: core: Remove the hidden (registered) components from the manager's list of components - The manager only needs thei registration, and they only need listed in the _hidden set. This fixes the graphing.
 * In [551]: core: Added (as an experiment) __call__ to the BaseComponent. This creates a new Event object out of the args and kwargs passed to the call, sends the event and returns the result.
 * In [552]: workers: Use _running to set running state of Thread worker. Set Thread instance as _thread.
 * In [553]: workers: Deprecated isAlive function in favour of alive property.
 * In [554]: tests.test_workers: Fixed usage of isAlive() -> alive
 * In [555]: examples/filewatch.py: New example to watch the contents of a file. Basically a tail clone
 * In [556]: workers: Set HAS_MULTIPROCESSING constant appropriately as we try to import multiprocessing or processing (python-2.5). Only build the Process component if we have any kind of multiprocessing support
 * In [557]: core: Start in process mode if we have multiprocessing support, otherwise ignore process=True and start in thread mode
 * In [558]: tests.test_timers: Wait longer for this test - timing on comptuers sucks
 * In [559]: circuits: Don't import Proess from workers if it doesn't exist
 * In [560]: docs: Updaetd overview. Added HelloWorld example. Updated links to the core library
 * In [561]: docs/DownloadInstall: Fixed spelling errors
 * In [562]: docs/License: Updated copyright year
 * In [563]: docs/License: Removed BOM marker
 * In [564]: docs/GeneralPerformance: Renamed to docs/Performance
 * In [565]: docs/QuickStart: Removed
 * In [566]: docs: Removed link to QuickStart, added DevelopersGuide and renamed TutorialHelloWorld to Tutorial
 * In [567]: docs/TutorialHelloWorld: Renamed to docs/Tutorial
 * In [568]: docs/Tutorial: Fixed Status block
 * In [569]: lib.irc; Added User event object.
 * In [570]: lib.irc: Renamed all IRC Command and their Event Handlers (removed use of @listener). Updated any calls to IRC Commands.
 * In [571]: lib.irc; Removed use of @listener for (Default) Event Handlers.
 * In [572]: lib.sockets: Added Connect event object.
 * In [573]: lib.sockets: Deprecated isConnected() call in favor of a property. Use .connected property isntead.
 * In [574]: lib.sockets: Removed "open" function and moved into TCPClient's constructor (__init__). TCPClient now takes a host, port and optional ssl and bind keyword arguments. Added "connect" event handler for initiating new connections (defaults to the host, port settings provided by the TCPClient constructor).
 * In [575]: examples/ircbot.py: Simplified and fixed up
 * In [576]: examples/telnet.py: Fixed and simplieifed
 * In [577]: core: Improved send so that the default target is now either the target given (if it doesn't evaluate to False), or it's the channel of the Component/Manager managing events. (This simplifies a lot of code making it almost unnecessary to specify targets)
 * In [578]: examples/ircbot.py: Don't need to specifty target - defaults nicely
 * In [579]: examples/ircbot.py: Don't need to specifty target - defaults nicely
 * In [580]: lib.io: Retabbed
 * In [581]: core: Renamed *args to *channels in listener decorator to be more clear.
 * In [582]: core: Fixed setting of target. Set target to given target (if not None or False), set to self.channel (if available), defaulting back to None.
 * In [583]: lib.io: Added tick function
 * In [584]: lib.io: Simplified constuctor for Stdin component.
 * In [585]: tests.test_sockets: Client.open is deprcated, use connect instead (which is also an event handler)
 * In [586]: tests.test_bridge: Retabbed
 * In [587]: tools: Remove StringIO import. Use a simple list to build up the output and return .join(s)
 * In [588]: core: Fixed the order that events come off the queue. (I can't believe the whole time this was LILO rather than FIFO :/)
 * In [589]: drivers: Added a load function to load all available drivers into the drivers namespace as well as their Component
 * In [590]: drivers.inotify_driver: New INotifyDriver using the pyinotify library added
 * In [591]: drivers.pygame_driver: Import pygame into the global namespace. Remove 'Event' from event object names.
 * In [592]: drivers.pygame_driver: Remvoed __new__ from PyGameDriver as this is not needed.
 * In [593]: bridge: Added tick function
 * In [594]: tests.test_bridge: Use wait() function (from tests.test_sockets). Start and stop each manager
 * In [595]: examples/dirwatch.py: New example using the inotify_driver (INotifyDriver) to watch a directory for changes
 * In [596]: lib.drivers.pygame_driver: Forgot to import pygame
 * In [597]: lib.drivers.pygame_driver: Initialize the pygame event system.
 * In [598]: examples/pygameex.py: Simplified
 * In [599]: core: Simplified _getTicks
 * In [600]: core: Added Started "started", Stopped "stopped", Registered "registered" and Unregistered "unregistered" events.
 * In [601]: core: Check our parent manager. If it's not our manager add ourselves as a hidden component to the parent manager.
 * In [602]: tools: Alias s.append as write and use this to write the strings.
 * In [603]: tools: Added an inspect(...) function which takes as a single argument a component x to inspect and print detailed information about.
 * In [604]: core: Added hidden and ticks properties to the Manager.
 * In [605]: core: Use the ticks property during the run cycle of runnable Components.
 * In [606]: core: Use the hidden property when gathering tick functions in _getTIcks of the Component.
 * In [607]: core: @listener is deprecated in favor of @handler (more readable and easier to type) ... -and- they are "Event Handlers".
 * In [608]: core: Updated doc string for @handler
 * In [609]: core: Updated doc string examples for @handler
 * In [610]: core: Event Handlers (created with @handler) now have an attribute 'handler' set to True.
 * In [611]: core: Fixed doc string for @handler
 * In [612]: core: When sorting Event Handlers, use {{{lambda x: not x.filter}}} as the sorting key - this puts Filters first.
 * In [613]: core: Updated doc string of Manager._remove
 * In [614]: core: Fixed Manager._remove so that if no channel is given the handler is removed from -all- channels.
 * In [615]: core: Fixed doc string of Manager.flush
 * In [616]: core: Fixed doc string of Manager.send
 * In [617]: core: Fixed doc string of BaseComponent/Component (they were in the wrong place).
 * In [618]: circuits: Import new @handler decorator into the circuits namespace but leave @listener until 1.2 when it gets deprecated.
 * In [619]: core: Fixed @handler (fubbered up the commit?)
 * In [620]: core: Updated @expose to match @handler in circuits.core
 * In [621]: tests.test_core: Fixed repr tests as there are now "registered" and "unregistered" events that will be in the queue.
 * In [622]: core: Added a new test to test the filter order of Event Handlers.
 * In [623]: tools: New tool reprhandler(x) which returns a nicely formatted string representing the Event Handler given.
 * In [624]: tools: Use new reprhandler(...) to pretty print the Event Handlers found by the inspect tool
 * In [625]: bridge: Fixed registered event handler
 * In [626]: lib.web.servers: Fixed registration event handlers.
 * In [627]: lib.web.wsgi: Fixed registration event handlers.
 * In [628]: examples/circ.py: Fixed registration event handler.
 * In [629]: lib.irc: Added Pass event object.
 * In [630]: core: If target is None, try to get the channel of the current component this event was pushed from, otherwise default back to NOne.
 * In [631]: core: When sending events, if target is None, try to get the channel of the current component, otherwise default back to None.
 * In [632]: core: When setting the actual channel we're sending to, if target is not None and target is an instance of Component, set the target to the Component's channel, otherwise default back to None. When finally setting the channel, ensure that target is of the str type.
 * In [633]: core: Explicitly set the target channel of "registered" and "unregsitered" events.
 * In [634]: tests.test_core: Fixed repr test as an Unregistered event gets pushed when a component is unregistered from a manager
 * In [635]: tests.test_timer: Wait longer before doing teh assertion (timing sucks) :)
 * In [636]: lib.web.servers: Removed registered event handlers - don't need them
 * In [637]: docs/ChangeLog: Completed up to r411
 * In [638]: core: Fixed a bug in setting the correct channel for a handler if handler.target is not None.
 * In [639]: examples/telnet.py: Changed to use new @handler decorator.
 * In [640]: examples/telnet.py: Just register the TCPClient instnace.
 * In [641]: examples/telnet.py: Import Write event from lib.sockets
 * In [642]: core: Ignore any other exception raised if they weren't caught already
 * In [643]: examples/udpserver: Fixed and simplified
 * In [644]: examples/udpserver: Fixed and simplified
 * In [645]: lib.sockets: No need to delete the Server_onSEND as it doesn't exist anymore :)
 * In [646]: examples/filewatch.py: Fixed consturctor
 * In [647]: examples/echoserver.py: Fixed and simplified
 * In [648]: examples/telnet.py: Set unique channel to make read events unique
 * In [649]: core: Try to set the target before doing anything.
 * In [650]: core: Try to set the target before doing anything.
 * In [651]: examples/eventserver.py: Fixed and simplified
 * In [652]: examples/eventclient.py: Fixed and simplified
 * In [653]: examples/ircbot.py: Simplified consturctor
 * In [654]: examples/lniktest.py: Removed this bad example
 * In [655]: examples/loops.py: Removed this bad example
 * In [656]: examples/simpleweb.wsgi: Simplified
 * In [657]: examples/todo: Fixed and simplified
 * In [658]: examples/timers.py: Fixed and simplified
 * In [659]: examples/workertest.py: Removed bad example
 * In [660]: examples/testwsgi.py: Removed bad example
 * In [661]: examples: Removed most @listener. Changed filters to use @handler - This example -is- still broken though :/
 * In [662]: core: Import warnings instead of warn from warnings. Use warnings.warn
 * In [663]: lib.log: Removed unused listener import
 * In [664]: lib.irc; Removed unused listener import
 * In [665]: lib.irc; Corrected doc string of IRC component.
 * In [666]: lib.irc; Removed use of @listener in doc string example.
 * In [667]: lib.drivers: Imported warn as _warn from warnings (forgot to import this).
 * In [668]: lib.drivers.inotifydriver: Removed unused IN_ISDIR import.
 * In [669]: lib.drivers.pygame_driver: Added Unknown event object (forgot to add this).
 * In [670]: lib.web.core: Fixed spelling error of self in serve_file def
 * In [671]: lib.web.http: Removed unsued import of SERVER_PROTOCOL
 * In [672]: lib.web.wsgi: Removed unused import of Response
 * In [673]: lib.web.wsgi: Fixed error handler - code is actually status.
 * In [674]: tools.sniffer: Removed unused import of sys
 * In [675]: tools.sniffer: Removed unused import of listener
 * In [676]: tools.bench: Added import of missing Debugger
 * In [677]: tools.bench: Removed use of @listener, Use @handler for filters. Fixed one use of self.opts.verbose (was opts.verbose :/).
 * In [678]: tools.bench: If in debug mode (opts.debug), add a Debugger instance to the manager.
 * In [679]: examples/todo.py: Removed unused import of listener
 * In [680]: examples/timers.py: Removed unused import of listener
 * In [681]: examples/eventclient.py: Removed unused import of listener
 * In [682]: lib.drivers.inotify_driver: Added _sleep function that the tick function uses to sleep. Basically the driver will sleep max(0, freq - timeout). Renamed self._manager to self._wm.
 * In [683]: lib.sockets: Setting TCP_NODELAY is not necessary after accepting a new server's client socket as the server already has this set.
 * In [684]: lib.sockets: Added some better error handlnig around pollling and accept server clietn sockets
 * In [685]: core: Send ourself (self) the component being registered along with the manager (the Component/Manager being registered with) in the Registered event data.
 * In [686]: core: Send ourself (self) the component being unregistered along with the manager (the Component/Manager being unregistered from) in the Unregistered event data.
 * In [687]: bridge: 'registered' event handlers now get an additional argument, the component being registered with
 * In [688]: lib.web.wsgi: 'registered' event handlers now get an additional argument, the component being registered with
 * In [689]: examples/circ.py: 'registered' event handlers now get an additional argument, the component being registered with
 * In [690]: lib.drivers.inotify_driver: Changed default channel to 'inotify' allowing this to be customized with channel keyword argument
 * In [691]: lib.drivers.pygame_driver: Changed default channel to 'pygame' allowing this to be customized with channel keyword argument
 * In [692]: lib.web.tools: return the response object (isntead of response.body) for serve_file
 * In [693]: lib.web.tools: else return the original response if no redirection was done.
 * In [694]: lib.web.tools: return the response (after flattening).
 * In [695]: lib.web.http: If v (a possible resposne) is an instance of webob.Response, create a new Response event based on v and send it.
 * In [696]: lib.drivers.inotify_driver: Pass dir in as an argument not a keyword argument - requested by hacker_kid
 * In [697]: core: Set Runnable Components' threads as Daemons (they wil automatically terminate when the main thread terminates).
 * In [698]: core: When a Runnable Component terminates: While we still have events in the queue, run tick functions and process events until we either have no more events in the queue or a 3s timeout has expired. (This gives components a chance to cleanup).
 * In [699]: lib.io: Removed useless "# Filename:" header.
 * In [700]: lib.io: Refactored into a reusable File component with three additional convenient components, StdIn, StdOut and StdErr. This also adds initialized instances stdin, stdout and stderr.
 * In [701]: core: Added errors, log arguments to start(...) and run(...) - same as send(...).
 * In [702]: docs/html: Added generated docs by epydoc
 * In [703]: circuits: Updated main doc string
 * In [705]: circuits: (docs) Fixed example
 * In [707]: tools: Included counts in inspect tool
 * In [708]: docs: Fixed all epydoc warnings and updated some documentation that was a bit oudated
 * In [710]: Merged with 709:b6fc98eecc6f
 * In [712]: circuits: Updated listed keywords picked up by setuptools.
 * In [713]: core: (docs) Updated module's doc string.
 * In [714]: core: (docs) Updated doc strings for Event
 * In [715]: core: (docs) Updated doc strings for Error Event
 * In [716]: core: (docs) Updated doc strings for Started, Stopped, Registered and Unregistered Events. NEW: Started and Stopped both take 1 argument (component).
 * In [717]: core: (docs) Some minor spelling adjustments of terms used in doc strings.
 * In [718]: core: (docs) Updated doc string of Manager.push
 * In [719]: core: (docs) Updated doc string of Manager.flush
 * In [720]: core: (docs) Updated doc string of Manager.send
 * In [721]: core: Started and Stopped both now take a single argument. (component,) - The component being started/stopped.
 * In [722]: core: (docs) Updated doc string for BaseComponent.unregister
 * In [724]: core: (docs) Updated coc string example of handler
 * In [725]: core: (docs) Added deprecated note of the use of type in kwargs for handler(...) - planend to be deprecated in favor of filter in 1.2
 * In [726]: core: (docs) Added deprecated note for the use of listener(...) - planned to be deprecated in 1.2 in favor of handlers
 * In [727]: core: (docs) Updated doc string for HandlersType (metaclass).
 * In [728]: core: (docs) Updated doc string of Manager
 * In [729]: core: (docs) Updated doc string for Manager.__len__
 * In [730]: circuits: Added a sleep of 1s in the main doc string example so that at least it doesn't fail! :)
 * In [731]: core: Renamed Manager.handlers(...) to _getHandlers (no need for a public interface to this).
 * In [732]: core: (docs) Documented the return values and types of the (Optional) operator convenience functions.
 * In [733]: core: (docs) Updated doc string of BaseComponent
 * In [734]: core: (docs) Updated doc string of BaseComponent.__call__
 * In [735]: core: (docs) Updated doc string of BaseComponent.register
 * In [736]: core: (docs) Removed most of the doc string from Component (most of this is already documented).
 * In [737]: core: (docs) Fixed indentation
 * In [738]: core: (docs) Remoevd superfluous documentation on channel.
 * In [740]: bridge: (docs) Updated module doc string.
 * In [741]: bridge: Removed __all__ (not needed).
 * In [742]: bridge: Switched to using handler (listener is deprecated).
 * In [743]: core: (docs) Fixed example handler usage in handler doc string.
 * In [746]: docs: Added missing epydoc generated files
 * In [747]: tools: (docs) Updated doc string for graph(x)
 * In [748]: tools: (docs) Updated doc string for inspect(x)
 * In [749]: tools: (docs) Fixed typo
 * In [751]: tools: (docs) Updated doc string for reprhandler
 * In [753]: tools: Changed the way graph(x) displays the registered components to look more like a structured wiki list
 * In [754]: docs/Performance: Updated status
 * In [755]: docs/graphs: Updated
 * In [756]: Makefile: Ignore circuits.version in generated docs
 * In [758]: circuits: (blanket chnage) Switched to @handler everywhere. Removed import of circuits.core in favor of just circuits (with the exception of lib.web.core which needs access to the core.BaseComponent)
 * In [759]: docs/graphs: Updated
 * In [760]: docs/graphs: Updated
 * In [761]: lib.web.webob: Set scheme to Reqeust.scheme (default: 'http') if an empty scheme is passed in. Possible as a lot of HTTP requests can be a plain old 'GET /'
 * In [762]: lib.web.webob: Set self.remote for Request objects only if self.sock is not None (it's None when dealing with we are served from a WSGI server, eg: Apache + mdo_wsgo).
 * In [763]: lib.web.webob: Set self.script_name to self.base for all Request objects. (I'm not sure if there are any other cases where script_name should be different - except in the case of being served by another WSGI server, eg: Apache + mod_wsgi - but that's handled by the Application Component).
 * In [764]: lib.web.wsgi: Switched to using @handler (@listener is deprecated).
 * In [765]: lib.web.wsgI: Added in extra imports we need.
 * In [766]: lib.web.wsgi: Simplified Component registration in Application Component and removed reference to dispatcher.
 * In [767]: lib.web.wsgI: Parse the SERVER_PROTOCOL, because we get it as 'HTTP/x.y' - we want (x, y). Pass in None for sock to Request object creation.
 * In [768]: lib.web.wsgi: Pass in environ["wsgi.url_scheme"] to Request as the scheme.
 * In [769]: lib.web.wsgI: Pass in the parsed protocol.
 * In [770]: lib.web.wsgi: Build Host object for Request.remote from environ["REMOTE_ADDR"] and environ["REMOTE_PORT"].
 * In [771]: lib.web.wsgi: Fixed creation of Response object (needs a reference to the request object). Added in a default response header 'X-Powered-By'.
 * In [772]: lib.web.wsgi: Fixed Application request/response and error handling. (NOTE: This is almost identical code to that of HTTP's - Should refactor this into a single Component).
 * In [773]: lib.web.wsgi: Pass in SERVER_NAME and SERVER_PORT to Middleware loaded apps.
 * In [774]: lib.web.wsgi: Pass in wsgi.version, wsgi.errors, wsgi.multithread, wsgi.multiprocess, and wsgi.run_once values to the environ for the Middleware loaded app.
 * In [775]: lib.web.wsgi: Fixed typo (weird way of spelling 'status').
 * In [776]: lib.web.servers: Changed default channel for BaseServer (and Server) and child components to 'web'.
 * In [777]: lib.web.servers: Simplified Server properties.
 * In [778]: lib.web: Import wsgi as a module. Import tools too. Removed import of Application, Middleware, Filter from wsgi.
 * In [779]: lib.web.wsgi: Renamed Middleware to Gateway (will deprecated Middlware in 1.2)
 * In [780]: lib.web: Added deprecation note about the direct import of Application, Middleware and Filter into the circuits.web namespace. Post 1.2 this will be deprecated in favour of simply importnig wsgi.
 * In [781]: lib.web.wsgi: Replaced Middleware alias with an equivilant function to display an appropiate warning about the deprecation of Middleware post 1.2
 * In [782]: lib.web.wsgI: Fixed type, it's not Gateway :)
 * In [784]: lib.web: Removed Filter. (I'm not sure this Component works, is used or useful!).
 * In [785]: lib.web.wsgi: Removed Filter (I'm not sure this works, is used or is useful!)
 * In [786]: lib.web.dispatchers: Modified the DefaultDispatcher's behavior such that if the channel that was match for a particular URI happens to be a 'request' channel (plain old web request handlers), then create a basic Request Event Object based only on the request and response data (nothing else). Otherwise proceed with the normal behavior of creating a Request Event Object with proper *args, **kwargs.
 * In [787]: lib.web.wsgi: Removed *args, **kwargs from Application constructor (if we need customization in future, we'll add it).
 * In [788]: lib.web.wsgi: As Gateway Components are used in the context of either a BaseServer or Server, it must also listen on teh same default 'web' channel. Correct the channel appropriately if a custom path is given for the WSGI Application to be mounted on.
 * In [789]: lib.web.wsgi: Renamed request, response instance variables to _request and _response respectively (no need for a public interface to these). Renamed event handlers as simply request/response (much more sense).
 * In [790]: Backed out changeset 1123b4e86c96 - I souldn't code on little sleep :)
 * In [791]: Merged with 5f898166ae4f
 * In [792]: lib.web.dispatchers: The channel will in fact end with ":request" not be equal to "request" (targets).
 * In [794]: lib.web.utils: Retabbed. Rewrite parseQueryString to use urlparse.parse_qs and use a list comprehension instead of a for loop
 * In [795]: lib.web.dispatchers: Reuse the Request Event rather than recreate a new one.
 * In [796]: lib.web.sessions: Switched to using @handler (@listener is deprecated)
 * In [797]: lib.config: Switched to using @handler (@listener is deprecated)
 * In [798]: lib.env: Switched to using @handler (@listener is deprecated)
 * In [799]: lib.smtp: Switched to using @handler (@listener is deprecated)
 * In [800]: lib.sockets: Switched to using @handler (@listener is deprecated)
 * In [802]: debugger: Use type=True (filter=... is deprecated)
 * In [803]: tests.test_core: Use type=True (filter=... is deprecated)
 * In [804]: lib.sockets: Fixed capturing EWOUDLBLOCK and EAGAIN errors
 * In [805]: lib.web.dispatchers: Greatly simplified the DefaultDispatcher's Request Handler to just return the result of sending the dispatched request to Controllers (if any were found). It's ok to return None here or return nothing at all (None) to give other Dispatchers a chance to do something with the request.
 * In [806]: lib.web.dispatchers: Come to think of it, Dispatchers' Request Handlers should probably be filters.
 * In [807]: lib.web.dispatchers: Removed unused imports.
 * In [808]: lib.web.http: Fixed buffering of socket, request and response objects in cases where the entire body hasn't been received yet.
 * In [809]: lib.web.http: Don't try/except th sending of the request, let the outter try do this, just check if v is not NOne, if it is return a 404.
 * In [811]: lib.irc: Fixed source so that we send the entire source as split by sourceSplit (nick, ident, host)
 * In [812]: examples/irc.py: Fixed message handler to pass in the correct target (source[0])
 * In [813]: ez_setpu.py: Removed - download the latest version from http://peak.telecommunity.com/dist/ez_setup.py isntead
 * In [814]: lib.web.http: Removed server instance variable from HTTP (not used).
 * In [815]: lib.web.servers: Added 'version' property to BaseServer.
 * In [816]: lib.web.servers: Added ssl, scheme and host properties and rewrite the base property to use these.
 * In [817]: lib.web.webob: Don't set the script_name of the Request object to the base of the server - this is wrong :)
 * In [818]: lib.web.webob: Added 'X-Powered-By' default header to Response objects and changed 'Server' default header to use request.server.version property.
 * In [819]: lib.web.wsgi: Fixed up a few issues with the WSGI environ being created and added a few missing pieces.
 * In [820]: lib.web.wsgi: Removed default 'X-Powered-By' response header here as it's taken care of by the Response object(s).
 * In [821]: lib.web.wsgi: Fixed start_response functions (added keyword argument exc_info).
 * In [822]: lib.web.wsgi: Make 'environ' a private function '_createEnviron' (no need for public interface).
 * In [823]: lib.web.dispatchers: No need to have a special case for channels ending n ":request".
 * In [824]: lib.web.dispatchers: Added 'default' as the last channel to look for.
 * In [825]: lib.web.dispatchers: Raise errors when sending the Request Event so the HTTP Component can pick it up.
 * In [826]: lib.web.servers: Set a default Request.host that it Server.host
 * In [827]: lib.web.webob: Default host for Request is ""
 * In [828]: lib.web.webob: Set Response.cookie to Request.cookie and reuse the object rather than creating a new one to woryr about.
 * In [829]: lib.web.wsgi: Set self.path in Gateway
 * In [830]: lib.web.wsgi: Recalculate Request.script_name and Request.path based on the fact that the WSGI mounted via this Gateway may be mounted and rooted at a specific path. eg: Gateway(app, "/app")
 * In [832]: core: Make it possible to 'override' inherited event handlers by specifying override=True in the @handler decorator  when defining custom event handlers.
 * In [833]: lib.pollers: Completed implementation of Select, Poll and EPoll pollers
 * In [834]: lib.sockets: Refactored to use the new Poller Components from lib.pollers
 * In [835]: examples/echoserver.py: Just write the response backk to the client
 * In [836]: examples/ircbot.py: Fixed this example due to lib.sockets refactor and changes in TCPClient (minor).
 * In [837]: examples/telnet.py: Fixed import of stdin (Stdin was deprecated).
 * In [838]: examples/telnet.py: Fixed TCPClient instantiation due to recent changes in lib.sockets.TCPClient (minor) due to new lib.pollers
 * In [839]: examples/telnet.py: Added error handler to print errors, eg: "Connection Refused" :)
 * In [840]: examples/udpclient.py: Fixed import of stdin from lib.io (Stdin was deprecated)
 * In [841]: tests.test_sockets: Fixed TCPServer and TCPCLient test and half fixed UDPServer/UDPClient test (1 failure still :/)
 * In [842]: lib.web.cgifs: readline() doesn't accept any argumetns\!
 * In [843]: errors: Don't set a default 'Close' header for Response object - this is set by the server (and it must not be set for WSGI)
 * In [844]: lib.web.webob: Fixed settnig of server_version in Response object
 * In [846]: lib.web.servers: Make it possible to customize other things with the BaseServer and subclasses thereof and it's underlying Componetns (such as the poller used)
 * In [847]: lib.web.utils: Fix for python-2.5 compatibility (2.5's urlparse module doesn't have parse_qs, cgi does though).
 * In [848]: lib.pollers: Fixed epoll for python-2.5 compatibility. (Use the select26 library to get epoll support for 2.5 - otherwise the EPoll component is deleted).
 * In [849]: lib.sockets: Removed unsed import of errno
 * In [850]: lib.sockets: Removed unused import of select. Removed import of Poll and EPoll from lib.pollers (leave the default poller for Client/Server components to be Select).
 * In [851]: lib.web.servers: (python-2.5 compatibility) Fixed docroot property to work with python-2.5 and added some documentation about it.
 * In [853]: lib.pollers: It's possible that for Poll and EPoll pollers that an incoming event might occur whereby a Client/Server interested in it has already deregistered their interest altogether - So close it and return.
 * In [854]: lib.web: Import the actual Components we want from errors (don't use from ... import *).
 * In [855]: lib.web.dispatchers: Added 'index.xhtml' and 'index.htm" as additional static file defaults to look for in a DefaultDispatcher's docroot.
 * In [856]: lib.web.http: Put an assertion guard around the type of v being returend. This should -never- occur!
 * In [857]: lib.web.wsgi: Added missing import of NotFound from errors.
 * In [858]: lib.web.wsgi: IT's not a WSGI Application'(deployed on another web server), s responsibility to "Close a Connection" by setting the "Close" header.
 * In [859]: lib.web.wsgi: Fixed request and error handlers in wsgi.Application
 * In [860]: lib.web.wsgi: Fixed path (and Component channel) setting in wsgi.Gateway (thanks aa_).
 * In [861]: lib.web.wsgi: Set "wsgi.errors" to a File component that goes to /dev/null (for now) - not sure how to handle errors that occur in WSGI apps mounted via our Gateway :/
 * In [862]: lib.core: Ignore any exceptions that might occur during sleep (eg: KeyboardInterrupt).
 * In [863]: lib.core: Fixed exceptions thrown during shutdown when using processes. Turns out trying to terminate a process within a process isn't a very good idea (self._task will be None! duh!) :)
 * In [864]: lib.pollers: Recreate our poller object if we are part of something that's started in either Process (P) or Thread (T) mode for EPoll.
 * In [865]: core: Added a 2nd argument to the Started Event 'mode'. This is the mode in which the Component was started in. It is one of 'P' for Process mode, 'T' for Thread mode or None for Main/Normal.
 * In [866]: core: Pass in an additional argument to the run function when a Component is started. Set this argument (mode) to 'P' if started in Process mode, 'T' if started in Thread mode, otherwise it defaults to None. Send this as part of the Started Event just before we go into our Event Loop.
 * In [867]: core: (NEW) Added regsitered signal handlers for SIGINT, SIGHUP and SIGTERM. Added a new Event, Signal; which gets sent on any of SIGINT, SIGHUP or SIGTERM signals. If no Event Handler handles or filters the Signal Event, then the system is terminated cleanly. Upon system termination, all child threads and processes are also termianted.
 * In [868]: cire: Set the default join timeout to 3 (when stopping).
 * In [869]: core: Gah I'm an idiot, threads don't have a .stop() :P
 * In [870]: lib.pollers: Fixed Poll/EPoll
 * In [871]: core: Only setup signals when started in non-thread mode (apparently only the main thread can have registered posix signal handlers).
 * In [872]: lib.web.dispatchers: Fixed args given to the Request event from vpath (the left over path).
 * In [873]: lib.web.httpauth: Added HTTP Authentication library (borrowed from Cherrypy - which they borrowed from someone else\!)
 * In [874]: lib.web.errors: Don't clear the response in HTTPError (Bad for Unauthorized error).
 * In [875]: lib.web.errors: Don't need HTTPError or subclasses thereof to evaluate to False.
 * In [876]: lib.web.errors: Added Unauthorized error (sends a 401).
 * In [877]: lib.web.tools: Added basic_auth and digest_auth tools.
 * In [878]: core: (NEW) Added the capability for Event Handlers to be created with a priority. That is, Event Handlers are registered with a Manager/Component and are sorted by their priority, then by whether or not they are a filter.
 * In [879]: core: Preserve the structure of a component tree.
 * In [880]: core: Removed this component from it's manager's parent's set of hidden components if it exists.
 * In [881]: lib.pollers: Changed default TIMEOUT to be 1ms (0.001s). Removed a bit of useless code in Poll/EPoll constructors that multiplied the timeout by 1000 (what the hell for ? - what were those twisted guys smoking ?).
 * In [882]: lib.web.dispatchers: Changed the default channel of the DefaultDispatcher to "web".
 * In [883]: lib.web.http: Changed the default channel of HTTP to be "http". Updated all Events destined for a Server to "server". Set all Request events to go to "web" (by default).
 * In [884]: lib.web.http: Changed TypeError raised for when the type of v is unhandled to an assertion.
 * In [885]: tools: Added kill() function to destroy the entire structure of a component and it's children recursively
 * In [886]: lib.web.servers: Changed the way TCPServer and HTTP get registered to ouse BaseServer (circuits.web).
 * In [887]: Automated merge with http://hg.softcircuit.com.au/projects/circuits/
 * In [888]: lib.web.servers: Forgot to remove this
 * In [889]: lib.web.core: Forgot to update the ExposeType meteclass when 'type' had been deprecated from @handler. The checks were failing :/
 * In [890]: docs/Contributing: Updated
 * In [892]: core: Fixed sending of Registered and Unregistered evetns
 * In [893]: Backed out changeset 2f6c72536609 (Half asleep here :/)
 * In [894]: tools: (NEW) Added new tools root(x) to find the root of a component - ie: it's actual manager
 * In [895]: lib.web.http: Fixed streaming
 * In [896]: web.constants: Reduced default buffer size to 4KB
 * In [897]: core: Put try/except/pass around exception handlers in Manager.run in case of unclean shutdowns
 * In [898]: drivers: Greatly simplified this package and it's drivers. Removed auto loading crap :) Just load explicity
 * In [899]: net.sockets: Rewrite tools
 * In [900]: tools: Fixed walk and graph functions.
 * In [901]: Imported circuits-dev-973:592956c5f436.patch
 * In [902]: tools: Removed detail about hidden componnets in inspect tool as this is removed now
 * In [903]: core: Fixed Manager._unregisterHandlers (Manager._remove not Manager.remove)
 * In [904]: core: Better register/unregister functionality - ensures we register not only with our manager but the root manager but maintain the structure
 * In [905]: Imported circuits-dev-980:04a88088235d.patch
 * In [906]: core: _handlers may change as we're iterating - iteratore over a copy
 * In [907]: tools: Removed initial component form being printed in detailed inspect report
 * In [908]: core: Fixed sending of Unregistered event
 * In [909]: core: Fixed Manager.unregister in the case where a Component's manager is it fact itself
 * In [910]: tests.test_sockets: Fixed UDP test by fixing the channel
 * In [911]: core: Use values() as the list can changed if we iter over it instead.
 * In [912]: lib.web.tools: Fixed doc string of auth tools
 * In [913]: lib.web: Renamed httpauth modules to _httpauth (excluding this form docs)






== 1.0a2 ==
 Released:: 20081120 (''20th November 2008'')
 Revision:: [200]

=== Documentation ===
 * Documentation Improvements: See: [wiki:docs Documentation]
 * Documentation moved to Trac (''Dropped use of Sphinx''). #1

=== NEW ===
 * Basic WSGI Support:
 * Added in [115]
 * Improved in [174]
 * In [143]: [source:circuits/tools/sniffer.py tools.sniffer]: Added sniffer tool used to debug/sniff Events of another system that has an instnace of the [source:circuits/bridge.py Bridge] Component.
 * In [128]: [source:circuits/lib/web.py lib.web]: Addded very simple FileServer Component
 * In [126]: [source:circuits/lib/http.py lib.http]: Added traceback support to sendError for more meaningful HTTP Errors.
 * In [118]: [source:circuits/lib/web.py lib.web]: Added very very simple Logger to log requests (''prints to stderr'').

=== Enhancements ===
 * In [184]: [source:circuits/debugger.py debugger]: If logger is not None, treat it as a logging.Logger instance and log incoming events as debug messages.
 * In [183]: [source:circuits/debugger.py debugger]: Removed useless methods - Juset set enabled attribute appropiately.
 * In [168]: [source:circuits/lib/http.py lib.http]: Removed _Request.__call__ in favor of {{{process()}}} followed by {{{str(response)}}}
 * In [163]: [source:circuits/lib/web.py lib.web]: Better consistent docroot settings. docroot is __always__ the current path unless explicitly set.
 * In [150], [151]: [source:circuits/lib/irc.py lib.irc]: Added nick property to IRC Component. Setting a new nick causes a new nick to be sent to the connected server. Also set our own record of our nick when ircNICK is called.

=== Fixes ===
 * In [192]: [source:circuits/lib/web.py lib.web]: Fix registration and polling to work independantly within other Systems and Components. ie: The run() method doesn't have to be utilized.
 * In [175]: [source:circuits/lib/http.py lib.http]: Fixed bug on Content-Length header in HTTP Component ensuring the value is a str. Required by WSGI.
 * In [164]: [source:circuits/lib/http.py lib.http]: Fixed a bug in HTTP Component where body could be None (''due to caching'').
 * In [149]: [source:circuits/lib/irc.py lib.irc]: Fixed a bug in IRC Component where writing to client failed.
 * In [131]: [source:circuits/lib/config.py lib.config]: Fixed getint, getfloat and getboolean functions to call their respective super counterparts.
 * In [122]: [source:circuits/lib/web.py lib.web]: Print Server version and tell user where we're listening.
 * In [117]: [source:circuits/lib/web.py lib.web]: Fixed cookie support.

=== Examples ===

==== New ====
 * In [159]: [source:examples/primes.py examples/primes.py]: Added (Distributed) Prime Number finder example
 * In [148]: [source:examples/ircbot.py examples/ircbot.py]: Added simple IRC Bot example
 * In [116]: [source:examples/simpleweb.wsgi examples/simpleweb.wsgi]: Added simple WSGI example using the new WSGI support.
 * In [146]: [source:examples/eventclient.py examples/eventclient.py]: Added simple event client example demonstrating the Bridge Component and basic request/reponse
 * In [145]: [source:examples/eventserver.py examples/eventserver.py]: Added simple event server example demonstrating the Bridge Component and basic request/reponse
 * In [140]: [source:examples/timers.py examples/timers.py]: Added simple timers example showing the use of the Timer Component

==== Updated ====
 * In [158]: [source:examples/helloweb.py examples/helloweb.py]: Greatly simplified and documented
 * In [157], [156]: [source:examples/hello.py examples/hello.py]: Greatly simplified and documented


== 1.0a1 ==
 Released:: 2008-11-06 (''6th November 2008'')
 Revision:: [112]

First official release.
----
[.. Up]
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.