12006-06-12  Glyph Lefkowitz <glyph@divmod.com>
2
3	* Nevow 0.9.0: see NEWS.txt for details.
4
52006-04-07  Jp Calderone <exarkun@divmod.com>
6
7	* Nevow 0.8.0 released
8
92006-03-30  Tommi Virtanen <tv@twistedmatrix.com>
10
11       * nevow/static.py: Fix handling of range requests on static files.
12
132006-03-30  Jp Calderone <exarkun@divmod.com>
14
15       * formless/freeform-defaults.css, formless/annotate.py: Style and
16       feedback improvements.
17
182006-03-29  Jp Calderone <exarkun@divmod.com>
19
20       * examples/formbuilder/: Apply Cory Dodt's patch to make this
21       example work again.
22
232006-03-27  Jp Calderone <exarkun@divmod.com>
24
25       * nevow/athena.py: Add getInitialArguments method which will be
26       invoked during rendering and may return a list or tuple of objects
27       which will be be passed to the client-side Widget's __init__ method.
28
292006-03-24  Allen Short <washort@divmod.com>
30
31	* Upgrade MochiKit to 1.2
32
332006-03-17  Tristan Seligmann <mithrandi@mithrandi.za.net>
34
35	* Remove usage of twisted.python.components.Interface from formless.
36	Convert TypedInterface to zope.interface.
37
382006-03-17  Jp Calderone <exarkun@divmod.com>
39
40	* nevow/json.py: Improve (hopefully correct this time ;) unicode
41	support.
42
432006-03-08  Valentino Volonghi <dialtone@divmod.com>
44
45	* Remove usage of twisted.python.components.Interface from nevow.
46	Remove compyCompat.
47
482006-02-28  Jp Calderone <exarkun@divmod.com>
49
50	* nevow/athena.py: Make the "Connection: Close" header of Athena
51	transport responses optional (toggleable by a flag on LivePage) to
52	allow TCP connection setup overhead to be avoided.
53
542006-02-15  Tristan Seligmann <mithrandi@mithrandi.za.net>
55
56	* nevow/athena.js, nevow/athena.py: Pass JavaScript call-stack
57	information back to the server and include it in logged tracebacks
58	(Firefox only).
59
602006-02-14  Jp Calderone <exarkun@divmod.com>
61
62	* nevow/util.py: Delete a bunch of code duplicated from Twisted.
63
642006-02-06  Glyph Lefkowitz <glyph@twistedmatrix.com>
65
66	* nevow/athena.py, nevow/athena.js: Pop up an obnoxious widget when
67	an Athena connection is lost.
68
692006-02-06  Jp Calderone <exarkun@divmod.com>
70
71	* nevow/runtime.js: Add Platform.getPage, a wrapper around the
72	browser-provided HTTP request function.
73
742006-02-01  Tristan Seligmann <mithrandi@mithrandi.za.net>
75
76	* nevow/athena.js: Add support for <athena:handler> element, a
77	declarative mechanism for attaching event handlers to nodes.
78
792006-02-01  Tristan Seligmann <mithrandi@mithrandi.za.net>
80
81	* bin/nit: Test collector/runner for Athena widgets.
82
832006-02-01  Jp Calderone <exarkun@divmod.com>
84
85	* nevow/defer.js: Deferred implementation to replace MochiKit
86	Deferreds.
87
882006-01-21  Valentino Volonghi <dialtone@divmod.com>
89
90	* nevow/rend.py, formless/webform.py: Support Deferreds returned
91	from bind_ methods.
92
932006-01-21  Valentino Volonghi <dialtone@divmod.com>
94
95	* nevow/flat/flatstan.py: Fix macros inside of other specials.
96
972006-01-19  Jp Calderone <exarkun@divmod.com>
98
99	* nevow/athena.js: Added Divmod.Class.methods() for defining
100	multiple methods at once.
101
1022006-01-19  Jp Calderone <exarkun@divmod.com>
103
104	* nevow/athena.py, nevow/athena.js: Support the addition of
105	LiveFragment instances to a page after the initial render pass.
106
1072006-01-15  Jp Calderone <exarkun@divmod.com>
108
109	* nevow/athena.js: Introduced new form of Divmod.Class.method() for
110	adding methods to JavaScript classes.  Added a child-window based
111	log viewer.
112
1132006-01-08  Valentino Volonghi <dialtone@divmod.com>
114
115	* examples/hello/hellohtml.py: Removed htmlfile usage
116	* nevow/loaders.py: Deprecated htmlfile/htmlstr
117
1182006-01-08  Glyph Lefkowitz <glyph@twistedmatrix.com>
119
120	* nevow/test/, formless/test/: Removed all usage of trial's
121	deferredResult() and util.wait() functions.
122
1232006-01-04  Glyph Lefkowitz <glyph@twistedmatrix.com>
124
125	* nevow/athena.py: Added fragment and widget nesting.  On the
126	server side, this documents and provides a supported way of
127	setting the magical required "page" attribute.  On the client
128	side, this provides a convenient hook for multiple widgets within
129	a page to communicate with each other.
130
1312005-12-26  Jp Calderone <exarkun@divmod.com>
132
133	* nevow/athena.py: Added athena.js and MochiKit.js to the dictionary
134	returned by allJavascriptModules(), allowing them to be referenced
135	using the JS import mechanism, in turn allowing them both to be
136	served from a single site-wide URL, rather than once per page.
137
1382005-12-22  Jp Calderone <exarkun@divmod.com>
139
140	* nevow/athena.py: Remove Python 2.4 dependencies.
141
1422005-12-21  Jp Calderone <exarkun@divmod.com>
143
144	* Nevow 0.7.0 released
145
1462005-12-18  Jp Calderone <exarkun@divmod.com>
147
148	* nevow/athena.py: Server-side processing of .js files to allow for
149	an import directive.  Imported JavaScript modules are inserted into
150	the page during the render process in dependency order.
151
152	* nevow/widget.js: Athena Widgets class and support code definitions
153	moved here.
154
1552005-12-13  Matt Goodall <matt@pollenation.net>
156
157	* nevow/athena.js: Improved IE compatibility.
158
1592005-12-05  Jp Calderone <exarkun@divmod.com>
160
161	* nevow/athena.js: Added Divmod.Class object which provides a
162	class-based object model for JavaScript programs.  Added
163	Nevow.Athena.Widget, a base class for "Live Widgets" - JavaScript
164	classes which can control a particular section of a LivePage and can
165	communicate with corresponding LiveFragment instances on the server.
166
167	* nevow/athena.py: Added a callRemote method to LiveFragment - this
168	allows the server to invoke methods on particular Widgets on the
169	client.
170
1712005-12-03  Jp Calderone <exarkun@divmod.com>
172
173	* nevow/rend.py: Fixed a bug in xmlfile caching which could lead to
174	a corrupt loader cache.
175
1762005-11-29  Jp Calderone <exarkun@divmod.com>
177
178	* nevow/appserver.py: Removed "support" (which consisted of logging
179	an error message and continuing) for returning objects which do not
180	provide IResource.
181
1822005-11-26  Jp Calderone <exarkun@divmod.com>
183
184	* nevow/athena.py, nevow/athena.js: Use POST for the LivePage
185	transport, rather than GET.
186
187	* nevow/json.py: Fix a bug in JSON support for floating points.
188
1892005-11-25  Jp Calderone <exarkun@divmod.com>
190
191	* nevow/athena.js: Go live by default.
192
1932005-11-22  Glyph Lefkowitz <glyph@divmod.com>
194
195	* nevow/guard.py: Removed __session_just_startd__.
196
1972005-11-15  Jp Calderone <exarkun@divmod.com>
198
199	* nevow/athena.py: Added LiveFragment - base class for Fragments
200	which may cooperatively share a single LivePage connection.
201
202
2032005-11-09  Jp Calderone <exarkun@divmod.com>
204
205	* Athena JavaScript API unified into a pseudo-namespace hierarchy.
206
2072005-11-07  Jp Calderone <exarkun@divmod.com>
208
209	* JSON serializer now quotes dict/object keys.
210
2112005-11-02  Jp Calderone <exarkun@divmod.com>
212
213	* Nevow 0.6.0 released
214
2152005-09-21  Jp Calderone <exarkun@divmod.com>
216
217	* nevow/athena.py: New implementation of LivePage with a
218	data-centric API: generation of JavaScript on the server is highly
219	discouraged, instead an API for passing around simple or complex
220	data structures is provided.
221
2222005-08-01  Matt Goodall <matt@pollenation.net>
223
224	egg-ify the distribution. "python setup.py bdist_egg" will now build
225	a .egg in dist for Python 2.3 and Python 2.4.
226
2272005-07-14  Donovan Preston <dp@divmod.org>
228
229	* It's no longer necessary to specify addSlash = True on
230	the root resource. nevow.appserver.NevowSite automatically
231	sets it on the first argument you pass to it (the root
232	resource).
233
2342005-07-12  Donovan Preston <dp@divmod.org>
235
236	* Usability improvements for formless at the expense of
237	purity of abstraction. Since the only thing anybody uses
238	formless for is rendering web forms, make it a little easier
239	to do common things. For example:
240
241	- _nevow_carryover_ does not get appended to URLs unless absolutely
242	necessary (because you return a value from an autocallable)
243
244	- TypedInterface is being deprecated in favor of using
245	IConfigurable directly, and an IConfigurable implementation
246	on Fragment/Page that is easy to use. To expose a "foo" method
247	on a page which takes a "bar" string and a "baz" integer, do this:
248
249	def bind_foo(self, ctx):
250		return [('bar', String()), ('baz', Integer())]
251
252	Previously, you would have had to create a TypedInterface,
253	declare foo and the types of the arguments in the class body,
254	declare that foo is autocallable, and declare that your Page
255	class __implements__ the interface. Now, just implement
256	bind_foo to return an IBinding or a list which can be munged
257	into one.
258
259	- It is possible to return a Page from an autocallable to have
260	that page displayed directly after posting the autocallable.
261	The URL that is used is freeform_hand, which means that the
262	Page goes into your "hand" in the session. The hand can only
263	hold one value, the most recent return result of an autocallable.
264	This isn't very back-button friendly but it makes it super
265	easy to put together a multi-step wizard interface.
266
267	See examples/tests/testformless.py and the /testformless on
268	the example server to see how to do this.
269
270	- It is possible to return a URL instance from an autocallable
271	to have the user redirected to that page after posting the
272	form successfully. This replaces and deprecates the old,
273	whacko method of setting IRedirectAfterPost on the Request.
274
275	See examples/tests/testformless.py and the /formless_redirector
276	on the example server to see how to do this.
277
278	* There is now livetest coverage of the formless examples,
279	including posting forms and checking erroneous conditions.
280
2812005-07-06  Donovan Preston <dp@divmod.org>
282
283	* Major non-backwards-compatible improvements to livepage. Changes
284	are designed to avoid an uncollectable garbage problem which was
285	inherent in the previous design.
286
287	The livepage javascript glue now includes a global object named
288	"server". This object has a "handle" method which takes at least
289	one argument, a string indicating the name of the handler to
290	invoke on the server. When called by client-side javascript,
291	LivePage.locateHandler is invoked. locateHandler should return
292	a callable which will be called with a context indicating
293	which client is invoking the method, and any additional arguments
294	which were passed to server.handle, as strings.
295
296	The default implementation of LivePage.locateHandler looks for
297	a correspondingly named "handle_*" method. Using livepage is
298	now as simple as subclassing LivePage and providing handle_*
299	methods:
300
301		class Foo(LivePage):
302			def handle_bar(self, ctx, something):
303				print "something!", something
304
305	And calling server.handle in javascript:
306
307		<a onclick="server.handle('bar', 'here is something')">Click me</a>
308
309	The previous behavior of registering closures or other callables
310	as event handlers and then embedding them in the page is still
311	available using the IClientHandle.transient method. These one-
312	shot handlers are only invokable by the client once before being
313	garbage collected on the server. This makes it possible to
314	implement temporary dialog boxes and the like.
315
3162005-04-09  Tommi Virtanen <tv@twistedmatrix.com>
317
318	* Allow remembering ILogger to specify an alternate access logging
319	method.
320
3212005-04-06  Matt Goodall <matt@pollenation.net>
322
323    * Added optional context argument to Page's renderString and
324    renderSynchronously methods. This provides a site-like context that is
325    useful when rendering multiple pages that need common remembered data.
326
3272005-3-23	Donovan Preston	<dp@divmod.org>
328
329	* Releasing 0.4.1
330
3312005-3-22	Donovan Preston	<dp@divmod.org>
332
333	* Releasing 0.4
334
3352005-02-22  Matt Goodall <matt@pollenation.net>
336
337    * Added a "data" renderer (rend.data) that replaces the tag's content
338    with the current data. i.e. <p n:data="name" n:render="data">Foo Bar</p>.
339
3402005-02-17  Matt Goodall <matt@pollenation.net>
341
342    * Added i18n - a gettext-like mechanism for marking translatable content
343    in an application's Python modules by wrapping a string in _(). Standard
344    Python gettext tools can be used to generate translation files.
345
346    Translation happens during rendering and depends on a list of languages
347    found in the context. By default, the browser's preferred languages are
348    used. The default behaviour can be overridden by remembering the languages
349    as inevow.ILanguages in the context; allowing the language to be selected
350    from user preferences, for example.
351
3522005-02-08  Matt Goodall <matt@pollenation.net>
353
354    * Extended the IDocFactory interface's load method to accept an optional
355    context.
356
357    The current loaders do not use the context but future loaders may, i.e. one
358    that loads a localised template based on some language in the context.
359
3602005-01-01	Donovan Preston <dp@divmod.org>
361
362	* Rewrote LivePage quoting code to be much more correct; added many unit
363	tests. Some older livepage code must be changed to use the
364	livepage.literal object instead of passing normal strings to handler or
365	the LivePage client APIs.
366
367	* Added nevow.livepage module, LivePage, and ILivePage. The name liveevil
368	is deprecated.
369
3702004-12-23	Phil Frost <indigo@bitglue.com>
371
372	* Added support for formless to return unicode objects. annotate.String
373	and subclasses (Text, Password, etc.) take a 'unicode' parameter to
374	enable unicode, like so:
375
376	| annotate.String(unicode=True)
377
378	The coerced value will then be a unicode object.
379
3802004-12-16  Matt Goodall <matt@pollenation.net>
381
382    * Added ObjectContainer - a data directive accessor for retrieving an
383    attribute of an object. If the current data in the context (the IData) is an
384    object you can register ObjectContainer as the IContainer adapter for the
385    object's class and Nevow will automatically look inside the object to fetch
386    the attribute.
387
388    Note: ObjectContainer is *not* registered as the adapter for all object
389    types. You must explicitly register the adapter for application classes as
390    needed.
391
3922004-12-08  Matt Goodall <matt@pollenation.net>
393
394    * Applied the foom/mesozoic patch to make Page.remember work correctly and
395    without the hack. You can now use the method reliably to remember objects at
396    Page construction time or any other time before the PageContext is created.
397    The remembered objects can be found from the context in the usual way.
398
399        class MyPage(rend.Page):
400
401            def __init__(self, original):
402                # Make original available as ISomething(ctx) for later.
403                self.remember(original, ISomething)
404                rend.Page.__init__(self, original)
405
406    * Added a similar remember method for NevowSite (and made a SiteContext
407    object the ultimate parent). You can know remember objects on the site and
408    have them available anywhere there's a context. A typical use case is making
409    some object store available to the site. This was often achieved using a
410    wrapper resource but now it's as easy as:
411
412        store = makeStore()
413        site = NevowSite(rootResource)
414        site.remember(store, IStore)
415
4162004-12-08  Matt Goodall <matt@pollenation.net>
417
418    * Renamed URL.fromRequest to URL.fromContext. URL.fromRequest was a little
419    confusing - the URL it returned only included the segments that had been
420    consumed so far by the locateChild process and not the whole URL as the name
421    might suggest. Eventually, fromRequest will change to return a full URL but,
422    for now, its use is deprecated.
423
424    * Renamed URL.parent to URL.parentdir. URL.parent() was logically equivalent
425    to '..' and so removed more segments than expected. URL.parent's use is now
426    deprecated and in a future release will be changed to remove exactly one
427    segment.
428
429    * Improve URL.click to normalise any segments of '.' or '..'. Browsers
430    normalise the URL so, according to the docstring, click should too.
431
4322004-12-04	Donovan Preston	<dp@divmod.org>
433
434	* Added macros! This is the same patch as the one I attached to my
435	"Macros in Nevow" mail, with the addition of an IMacroFactory,
436	a MacroFactory implementation on rend.Page, and macro directive
437	support. Macros are like render functions that take only the
438	context (no data parameter) and run only once during the lifetime
439	of a template loader. Here is an example of the difference between
440	a macro and a renderer:
441
442	>>> class Bumper(object):
443	...     num = 0
444	...     def bump(self):
445	...         self.num += 1
446	...         return self.num
447	...
448	>>> staysTheSame = Bumper()
449	>>> changes = Bumper()
450	>>> from nevow import flat, tags, loaders
451	>>> document = loaders.stan([tags.invisible(macro=lambda ctx: staysTheSame.bump()), tags.invisible(render=lambda ctx, data: changes.bump())])
452	>>> flat.flatten(document)
453	'11'
454	>>> flat.flatten(document)
455	'12'
456	>>> flat.flatten(document)
457	'13'
458
4592004-12-01	Donovan Preston	<dp@divmod.org>
460
461	* Added __iter__ to nevow.stan.slot to prevent infinite loops by
462	trying to do "for x in slot('foo'): print x".
463
464	* Added an IGettable adapter for nevow.stan.slot. It is now possible
465	to specify a slot as the data for a node, so the following example
466	would work:
467
468	from nevow import rend, tags
469
470	def fillEm(ctx, data):
471		ctx.fillSlots('value', [1, 2])
472		return ctx.tag
473
474	tags.html(render=fillEm)[
475		tags.ul(data=tags.slot('value'), render=rend.sequence)[
476			tags.li(pattern='item')[
477				str ]]]
478
4792004-09-26	Donovan Preston <dp@divmod.org>
480
481	* Added nevow.inevow.IQ interface, an interface for querying the
482	stan DOM. Eventually, this interface will contain APIs for doing
483	traditional DOM introspection, such as iterating children,
484	examining tag names, and examining attributes. For now, it contains
485	only the patternGenerator, onePattern, and allPatterns APIs. These
486	APIs have been deprecated from Context.
487
488	The main benefit of this is the ability to do:
489
490		IQ(loaders.xmlfile(...)).patternGenerator(...)
491
492	which would be nice for creating "pattern library" files containing
493	common skin idioms which can then be copied and used throughout
494	the app.
495
4962004-09-25	Donovan Preston <dp@divmod.org>
497
498	* Chatola received a major facelift, bringing it from cool demo
499	up to almost a full fledged web-based chat server. The helper API
500	LiveEvil.call(...) was added, which deprecates
501	LiveEvil.sendScript(callJS(...))
502
5032004-09-23	Tommi Virtanen	<tv@twistedmatrix.com>
504
505	* Make guard.SessionWrapper store its URL  location in all requests it
506	passes to its children. This allows the children know where to post
507	the __login__ and __logout__ forms, even deep inside the resource
508	tree (fixes issue59).
509
510	* Guard now works as a non-root resource, with help from the above
511	change. Semantics of __login__ clarified in unit tests; if your guard
512	is at /foo, posting to /foo/__login__ redirects to /foo, and posting
513	to /foo/__login__/ redirects to /foo/. The two unit tests that failed
514	earlier now pass (with that change in their __login__ URLs).
515
516	* If URL-based sessions are used, login no longer loses session
517	information due to redirect to / (fixes issue56).
518
5192004-09-20	Matt Goodall <matt@pollenation.net>
520
521	* Added URL.secure() method to make switching between http and
522	https easier.
523
5242004-09-08	Donovan Preston	<dp@divmod.org>
525
526	* Nevow now includes a very simple proof-of-concept WSGI Application
527	implementation, and can be used with no Twisted dependency. Nevow can
528	also be used to write CGIs, either using a simple CGI WSGI gateway
529	(which supports URL traversal), or by using Page.renderString (which does not).
530
531	* Two new context interfaces, ICurrentSegments and IRemainingSegments,
532	replace the need to examine the Request prepath and postpath attributes
533	directly.
534
535	* ISerializable is deprecated, and has been replaced with a simple
536	Flattener registry. nevow.flat.registerFlattener and
537	nevow.flat.getFlattener have been added to support this.
538
5392004-09-06	Donovan Preston	<dp@divmod.org>
540
541	* BACKWARDS INCOMPATIBLE CHANGE. Page.configurable_ *always* returns
542	self, and a new Page.configurable_original *always* returns
543	self.original. If you were relying on Page.configurable_'s
544	introspection behavior and are now getting errors about adapting
545	to IConfigurable, change your renderForms() calls to:
546
547		renderForms('original')
548
549	This causes Page.configurable_original to be invoked and
550	introspected for form rendering.
551
5522004-08-23	Donovan Preston <dp@divmod.org>
553
554	* LivePage uses a simpler implementation strategy which requires
555	the browser to make one request per output event. As a result,
556	LivePage now works on Mozilla, Safari, and Internet Explorer Windows.
557
5582004-08-05	Donovan Preston <dp@divmod.org>
559
560	* Implemented support for IFoo(ctx) synonym syntax. It does the
561	same thing as ctx.locate(IFoo)
562
563	* Removed Resource Generators, a feature of NevowSite that nobody
564	used and wasn't really useful.
565
566	* Changed all inevow.IResource apis to take a Context object
567	where they used to take the request. Remembering objects in
568	PageContexts is now much easier, and fewer hacks are required to
569	build the context chain. The context chain now looks like:
570
571		SiteContext->RequestContext->PageContext(s)->WovenContext(s)
572
5732004-7-28	Donovan Preston <dp@divmod.org>
574
575	* Parameterize data_* methods in the same way as render_* methods.
576	Patch by k3mper.
577
578	For example, <div nevow:data="foo bar,baz" /> will cause
579	data_foo(self, bar, baz) to be called with the strings "bar" and
580	"baz". This data method should return a callable taking ctx, data.
581	The return value of this callable will be remembered as IData at
582	this point in the context stack.
583
584	* Added list-slicing support to ListContainer. You may now use
585	list slicing syntax in a data directive in addition to a simple
586	index. For example:
587
588	def data_aList(self, ctx, data):
589		return ["Buckle", "My", "Shoe"]
590
591	<div nevow:data="aList">
592		<span nevow:data="1:-1" nevow:render="string" />
593	</div>
594
595	Will render as <div><span>My</span></div>
596
5972004-7-20	Matt Goodall <matt@pollenation.net>
598
599	* Modified sax loader to retain doctypes, comments and xmlns attributes.
600	It's now possible to build XHTML valid pages :).
601
602	xmlns attributes are always kept but there are options to ignore the doctype
603	and comment (at the request of foom, not sure why yet). Right now, the default
604	is to retain doctypes and comments but you can use the ignoreDocType and
605	ignoreComment args to the xml loaders and flatsax parse functions. This bit
606	may change.
607
608	* Add a URL -> IResource adapter that performs a HTTP redirect. URLs can then
609	be returned from locateChild().
610
6112004-06-07	Donovan Preston <dp@divmod.org>
612
613	* Added nevow.canvas, an experimental module similar to LivePage
614	which provides a Python server-side API for drawing arbitrary lines,
615	curves, and text in the browser. The implementation is socket-based
616	and asynchronous, so the server can issue drawing commands to the
617	client at any time.
618
619	The idea is to provide a server-side API to the Python programmer
620	and shield them from implementation details, but the current
621	implementation uses a pre-compiled Flash movie (which never changes;
622	we are not generating Flash bytecodes). An implementation using SVG
623	or Safari's Canvas (nevow.canvas was written before the Safari Canvas
624	announcement) would be possible.
625
6262004-05-26	Donovan Preston	<dp@divmod.org>
627
628	* Add URLOverlay.keep,  an API which lets you specify which query args
629	will be carried on from the current page render into the new URL.
630
6312004-05-24	Matt Goodall <matt@pollenation.net>
632
633	* Extracted Fragment from Page. Hopefully,  it will make it more obvious
634	that embedding an object with data_ and render_ methods in a stan tree is
635	possible without using something as "heavy" as Page which is really meant
636	to be a web resource.
637
6382004-05-23	Donovan Preston	<dp@divmod.org>
639
640	* Added some useful APIs to LiveEvil for manipulating the client-side
641	page:
642
643		- flt(stan): Flatten some stan, quoting apostrophes as
644		as appropriate for embedding in javascript
645
646		- set(what, to): Set the contents of the client-side node
647		with the id 'what' to the stan 'to'.
648
649		- append(where, what): Append the stan 'what' to the client-
650		side node with the id 'where'
651
652		- alert(what): Show an alert to the user with the text "what"
653
6542004-05-19	Jonathan Simms	<slyphon@divmod.com>
655
656	* 0.2 released.
657
6582004-05-14	Donovan Preston	<dp@divmod.org>
659
660	* nevow.url.URLPath is renamed nevow.url.URL
661
662	* URL objects are now lazier about casting things to strings; they will
663	keep track of path segments in a list and defer to the nevow rendering
664	machinery to do the conversion; This means you can do things like
665	here.child(deferred) or here.child(function)
666
667	* URL objects have a better api for manipulating query arguments
668	    - add(key, value=None) adds a new query arg at the end; the value may
669	      be None if only a query key needs to be added
670	    - replace(key, value) removes all occurrences of 'key' and inserts a
671              new (key, value) at the same location as the previous first
672              occurrence of key
673	    - clear() clears all args
674
6752004-05-06	Donovan Preston <dp@divmod.org>
676
677	* Merged freeform-patterned branch, a large formless/freeform refactor.
678	It is now possible to influence the rendering of forms by providing
679	"patterns" to renderForms.
680
681	* Formless is now a top-level package. Freeform has been renamed
682	formless.webform. It should be possible to use formless outside
683	the context of nevow for doing things such as validating network
684	input based on method argument type annotations.
685
686	* TypedInterface, autocallable, and all the Typed subclasses are now
687	in the formless.annotate module.
688
6892004-04-30	Donovan Preston <dp@divmod.org>
690
691	* Created nevow.blocks, a module containing helpful code for working
692	around display: inline-block bugs in Mozilla.
693
6942004-04-27	Donovan Preston <dp@divmod.org>
695
696	* IRenderer.__call__ was renamed IRenderer.rend to be more explicit.
697
6982004-04-21	Donovan Preston	<dp@divmod.org>
699
700	* Implemented nevow.flat.flatten and nevow.flat.precompile, functions
701	useful for using stan outside of the context of Page classes. Useful
702	for generating some XML or even raw text; use it any time you want
703	to convert a tree data structure into a contiguous string!
704
705        import random
706        import string
707
708        from nevow import flat
709
710        def letters(howMany):
711            for i in range(howMany):
712                    yield '    ', string.letters[i], '\n'
713
714        def outline():
715            for i in range(5):
716                    yield i, '\n'
717                    yield letters(random.choice(range(7)))
718                    yield '\n'
719
720        print flat.flatten(outline())
721
7222004-04-20	Donovan Preston	<dp@divmod.org>
723
724	* guard sessions are no longer required to use formless.
725
7262004-04-19	Donovan Preston <dp@divmod.org>
727
728	* Implemented lazy context factories. It is now possible to register
729	an adapter against various *Context classes and an interface. They
730	will be invoked if *Context.locate(interface) is called.
731
732	Implemented a lazy ISession adapter against RequestContext, making
733	it possible to do ctx.locate(ISession), which is nice.
734
7352004-04-16	Donovan Preston <dp@divmod.org>
736
737	* Added nevow.entities module, a module containing literals for all of
738	the valid XHTML entities. For example:
739
740		def render_nbsp(self, ctx, data):
741			from nevow import entities
742			return entities.nbsp
743
744