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