Full Changelog

tip (XXX-XX-XX)

  • webhelpers.html.converters: bugfix in ``format_paragraphs(), should return a literal. (#74)

1.3 (2011-03-24)

  • webhelpers.paginate:
    • Revert Sprox patch (#59) from 1.3b1; it makes SQLAlchemy inefficient (#63). The bug reporter’s Sprox object seems to be unsliceable and therefore incompatible with paginate. Changed error message to say this if the slicing operation raises “TypeError: unhashable type”.

1.3b1 (2011-03-17)

  • Documentation:

    • Some webhelpers.misc helpers were undocumented.
    • Spelling corrections throughout, done by Marius Gedminas.
  • webhelpers.date:

    • Adjust test in ‘test_date.py’ to account for leap years. (#61, reported by Andrey Rahmatullin / wrar)
  • webhelpers.html.grid, webhelpers.pylonslib.grid:

    • Add ‘request’ and ‘url’ args to support paged display. (webhelpers.html.grid only)
    • Deprecate webhelpers.pylonslib.grid. It may be removed in a future version.
  • webhelpers.paginate:

    • Add URL generator classes for new frameworks like Pyramid.
    • In the Pylons backward compatibility code, support page parameter in the route path (e.g., “/help/page5”) when using Routes explicit mode without a URL generator.
  • setup.py:

    • Fix typo in test requirements. (#60, Andrey Rahmatullin/wrar)

1.2 (2010-08-18)

  • WebHelpers now depends on MarkupSafe. literal and escape now use it.
  • webhelpers.html.builder:
    • literal and escape now use MarkupSafe, which has a C speedup for escaping, escapes single-quotes for security, and adds new methods to literal. Compatibility should not be a problem; but see the docs if you encounter any edge cases.
  • webhelpers.html.tags:
    • For new HTML 5 input fields, the text helper has a “type” argument.
    • Don’t put an “id” attribute on a hidden fields generated by the form() helper, including the magic _method field. The IDs will clash if there are multiple forms on the page.
  • webhelpers.html.tools:
    • Preserve case of “method” arg in button_to() for XHTML compatibility. Patch by transducer.
  • webhelpers.text:
    • Urlencode urlify return value in case it contains special characters like ”?”. Reported by mcd34@gmail.com.
  • webhelpers.util:
    • Fix bug in update_params in handling existing query strings. Support multiple values per parameter.

1.1 (2010-08-09)

  • webhelpers.paginate:
    • Remove stray Routes import. (Other conditional Routes imports remain for backward compatibility; see module docstring.)
  • webhelpers.pylonslib.minify:
    • Remove _jsmin module due to licensing issues. Details are in webhelpers/pylonslib/_jsmin.py . You can install the “jsmin” package in PyPI (which has the same license), and the helper will use it. If that package is installed, the helper will use it. Otherwise the helper will emit a warning and leave the Javascript unchanged. CSS minification is not affected.

1.0 (2010-06-01)

  • webhelpers.html.tools:
  • Bugfix re URLs surrounded by []. Bug #32.

1.0rc1 (2010-05-24)

  • webhelpers.html.tags:
  • Change ‘id’ argument to all form field helpers. The default value is now NotGiven rather than None. NotGiven tells WebHelpers to create an ID attribute based on the field name (formerly None did this). None suppresses the ID attribute entirely (formerly “” did this, and still does for backward compatibility). This behavior of None is consistent with other parts of WebHelpers.
  • webhelpers.misc:
  • New format_exception helper to display an exception as Python would but without the traceback.

1.0b7 (2010-05-16)

  • webhelpers.containers:
    • Bugfix in canada_provinces, reported by rpetrello.
  • webhelpers.html.grid / webhelpers.pylonslib.grid:
    • Updates by Ergo, mainly styling and CSS classes.
    • Rename classes: ObjectGrid, PylonsGrid, PylonsObjectGrid.
  • webhelpers.paginate:
  • New URL generation algorithm for Page.pager(). You can pass a callback function to the constructor, or it will fall back to pylons.url.current or routes.url_for (in that order). It will raise NotImplementedError if none of these are available.
  • Don’t allow extra positional args in constructor. The implementation does nothing with them, so it shouldn’t allow them.
  • Import sqlalchemy.orm as well as sqlalchemy. User Sybiam reports an error otherwise.
  • Add code to work with other iterable containers, contributed by Marcin Kuzminski.
  • webhelpers.pylonslib.flash:
    • New argument ignore_duplicate to prevent adding the same message multiple times.

1.0b6 (2010-04-23)

  • webhelpers.containers / webhelpers.misc:
    • NotGiven moved to webhelpers.misc.
  • webhelpers.html.grid / webhelpers.pylonslib.grid:
    • Updates by Ergo, including SQLAlchemy object grid classes.
  • webhelpers.misc:
    • New function deprecate.
  • webhelpers.number:
    • New functions format_data_size, format_byte_size, and format_bit_size for displaying numbers in SI units (“1.2 kilobytes”, “1.2 kB”, “1.0 KiB”). Contributed by Wojciech Malinowski.

1.0b5 (2010-03-18)

  • webhelpers.html.converters:
    • Re-add import of render and sanitize from webhelpers.html.render. That module is not public.
  • webhelpers.misc:
    • New exception OverwriteError.
    • Add exclude argument to subclasses_only.
  • webhelpers.text:
    • Disable convert_misc_characters: it fails its doctests and there’s no consensus on what it should do.
  • “number_to_human_size.py” is in unfinished directory. This is an old rails helper from WebHelpers 0.6.4. It’s here pending a more comprehensive helper; see http://bitbucket.org/bbangert/webhelpers/issue/2/reinstate-number_to_human_size

1.0b4 (2010-01-24)

  • Delete webhelpers.string24. WebHelpers no longer supports Python 2.3.
  • webhelpers.feedgenerator:
    • Add a basic Geometry class for the Geo helpers.
  • webhelpers.html.grid_demo:
    • Demonstrates webhelpers.html.grid. Run as “python -m webhelpers.html.grid_demo OUTPUT_DIRECTORY”.
  • webhelpers.html.converters:
    • Don’t import render and sanitize to converters module. (Reversed in 1.0b5.)
  • webhelpers.html.secure_form:
    • Move module to webhelpers.pylonslib.secure_form because it depends on pylons.session.
  • webhelpers.misc:
    • New helper flatten to interpolate embedded lists and tuples.
    • New helper subclasses_only to extract the subclasses of an abstract base class from a module or iterable.
  • webhelpers.pylonslib.flash:
    • Moved to its own module.
    • Changed Flash.__html__() implementation.
    • Categories may be specified in constructor. Patch by Eli Collins.
  • webhelpers.pylonslib.grid:
    • Bugfixes.
  • webhelpers.pylonslib.minify:
    • Bugfix.
  • webhelpers.util:
    • Bugfix: parse_qs moved from cgi to urlparse in Python 2.6. Patch by Mike Verdone.

1.0b3 (2009-12-29)

  • webhelpers.feedgenerator:
    • Allow either lat-lon and lon-lat formats in geometry data. The default is lat-lon. For lon-lat, set GeoFeedMixin.is_input_latitude_first to false. (You can set in a subclass or instance before writing the output.) lat-lon is the most common format but GeoDjango and some other libraries use lon-lat. The XML output is always lat-lon per the GeoRSS spec.
  • webhelpers.html.grid:
    • New module to create an HTML table from a list of records.
  • webhelpers.html.tags:
    • New helpers Doctype (class) and xml_declaration.
    • Python 2.5 compatibility fix by Yuen Ho Wong. (#20)
  • webhelpers.html.tools:
    • New helper js_obfuscate implements the old rails helpers.
  • webhelpers.util:
    • New helper update_params to update query parameters in a URL.

1.0b2 (2009-12-21)

  • webhelpers.constants:

    • Fix spelling of Massachusetts.
  • webhelpers.feedgenerator:

    • Sync with Django rev 11910. This adds GeoRSS and makes the API more extensible, as well as fixing a few bugs. (Re-added the Atom1 ‘published’ property.) (The ‘generator’ and ‘source’ properties were lost, but they weren’t working correctly anyway.)

      GeoRSS usage: use the Geo* classes and add geometry=(lat, lon) to each news item. Other shapes and a (not yet implemented) Geometry class are allowed; see the source.

  • webhelpers.html:

    • New HTML.cdata() method for producing “<!![CDATA[ ... ]]>” sections.

    • The basic tag builders (HTML.a() and HTML.tag("a")) now have a _nl arg which, if true, inserts a newline between content elements and at the end of the tag for readability. Example:

      HTML.a("A", "B", href="/")  =>   '<a href="/">AB</a>'
      HTML.a("A", "B", href="/", _nl=True)   =>   '<a href="/">\nA\nB\n</a>\n'

      This does not affect HTML attributes nor the higher-level tag helpers. The exact spacing is subject to change. The tag building code has been refactored to accommodate this.

  • webhelpers.html.tags:

    • form() puts its hidden “_method” field in a ‘<div style=”display:none”>’ to conform to XHTML syntax. The style prevents the div from being displayed or affecting the layout. A new arg hidden_fields may be a dict or iterable of additional hidden fields, which will be added to the div.
    • Set magic ID attribute in hidden helper to match behavior of the other tag helpers.
    • image() can now calculate the width and height automatically from an image file, using either the PIL algorithm or the pure Python algorithm in webhelpers.media. It also logs the dimensions to the debug log for troubleshooting.
  • webhelpers.html.tools:

    • Reimplement highlight() using the HTML builder. New arguments add flexibility. Deprecate the highlighter argument, which creates tags via string interpolation.
    • Fixed auto_link() to parse slash characters in query string. Patch by hanula; Bitbucket issue #10.
    • Fix HTML overescaping and underescaping in auto_link(). Patch by Marius Gedminas. A parsing bug remains: http://pylonshq.com/project/pylonshq/ticket/657
  • webhelpers.markdown / webhelpers.html.converters:

    • webhelpers.markdown will not be upgraded to the version 2 series but will remain at 1.7. Users who want the latest bugfixes and extensions should download the full Markdown package or the alternative Markdown2 from PyPI.
    • The markdown() helper in webhelpers.html.converters now has support for external Markdown implementations. You can pass a specific module via the markdown argument, otherwise it will attempt to import markdown or fall back to webhelpers.markdown.
    • To see which version is autoloaded, call _get_markdown_module() and inspect the .__file__, .version, and/or .version_info attributes of the return value.
  • webhelpers.media:

    • Bugfix in get_dimensions_pil.
  • webhelpers.paginate:

    • Change for SQLAlchemy 0.6. (bug #11)
  • webhelpers.pylonslib:

    • Fix HTML overescaping. Patch by Marius Gedminas.

1.0b1 (2009-11-20)

  • Delete deprecated subpackage: rails. These are replaced by new helpers in date, html, misc, number, text.
  • Delete other deprecated subpackages: commands, hinclude, htmlgen, pagination. Pagination is replaced by paginate.
  • webhelpers.constants:
    • uk_counties returns tuples rather than strings.
  • webhelpers.feedgenerator:
    • rfc3339_date now accepts date objects without crashing.
    • Add ‘generator’ and ‘source’ properties to RSS2 feeds. Patch by Vince Spicer. (Removed in 1.0b2 due to bugs.)
    • Add ‘published’ property to Atom1 feeds.
  • webhelpers.html.converters:
    • New helper render() formats HTML to text.
    • New helper sanitize() strips HTML tags from user input.
  • webhelprs.html.tags:
    • New helper css_classes() to add classes to a tag programmatically.
    • Fix bug in tag helpers when passing id_ argument (although id is recommended instead).
    • Add OptionGroup class and optgroup support to select(). Patch by Alexandre Bourget.
  • webhelpers.html.tools:
  • New helper strip_tags() deletes HTML tags in a string.
  • webhelpers.paginate:
    • Allow all versions of SQLAlchemy > 0.3.
    • convert “_range” and “_pagelink” function to Page class method so that they can be overridden
    • pager “onclick” argument use template string value. So, javascript code can use “partial_url” or “page” value or any. Backward compatibility is considered.
    • Add presliced list option to avoid slicing when list is already.
  • webhelpers.pylonslib:
    • is now a package.
    • The Flash class now accepts severity categories, thanks to Wichert Akkerman. The docstring shows how to set up auto-fading messages using Javascript a la Mac OSX’s “Growl” feature. This is backward compatible although you should delete existing sessions when upgrading from 0.6.x.
    • webhelpers.pylonslib.minify contains enhanced versions of javascript_link and stylesheet_link to minify (shrink) files for more efficient transmission. (EXPERIMENTAL: tests fail in unfinished/disabled_test_pylonslib_minify.py; see http://pylonshq.com/project/pylonshq/ticket/466 .)
  • webhelpers.text:
  • Port several helpers from Ruby’s “stringex” package.
    • urlify() converts any string to a URL-friendly equivalent.
    • remove_formatting().
    • If the unidecode package is installed, these two helpers will also transliterate non-ASCII characters to their closest pronounciation equvivalent in ASCII.
    • Four other helpers reduce HTML entities or whitespace.

0.6.4 (12/2/2008)

  • text(), password(), checkbox(), textarea(), and select() have a magic ‘id attribute. If not specified it defaults to the name. To suppress the ID entirely, pass id="". This is to help set the ID for title(). radio() doesn’t do this because it generates the ID another way. hidden() doesn’t because hidden fields aren’t used with labels.
  • Bugfixes in mt.select():
    • selected values not being passed as list.
    • allow currently-selected value to be a long.
  • Delete experimental module webhelpers.html.form_layout.

0.6.3 (10/7/2008)

  • Bugfix in distribute() found by Randy Syring.
  • New helpers title() and required_legend() in webhelpers.html.tags.
  • New directory webhelpers/public for static files
  • Suggested stylesheet webhelpers/public/stylesheets/webhelpers.css (You’ll have to manually add this to your application.)

0.6.2 (10/2/2008)

  • nl2br() and format-paragraphs were not literal-safe.
  • webhelpers.converters:
    • New helper transpose() to turn a 2D list sideways (making the rows columns and the columns rows).
  • webhelpers.markdown:
    • Upgrade to Markdown 1.7.
    • Add a warning about escaping untrusted HTML to webhelpers.html.converters.markdown() docstring.
    • Did not include Markdown’s extensions due to relative import issues. Use the full Markdown package if you want footnotes or RSS.
  • webhelpers.media:
    • New module for muiltimedia helpers. Initial functions determine the size of an image and choose a scaling factor.
  • webhelpers.html.tags:
    • Options tuple contains Option objects for select/checkbox/radio groups. select() now uses this automatically.
    • checkbox() and radio() now have a label argument.
  • webhelpers.number:
    • Population standard deviation contributed by Lorenzo Catucci.
  • webhelpers.html.form_layout: form field layout (PRELIMINARY, UNSTABLE).

0.6.1 (7/31/2008)

  • Include a faster version of cgi.escape for use by the literal object.
  • Fixed bug in SimplerXMLGenerator that the FeedGenerator uses, so that it doesn’t use a {} arg.
  • New helpers:
    • nl2br() and format_paragraphs() in webhelpers.html.converters.
    • ul() and ol() in webhelpers.html.tags.
    • series() in webhelpers.text.
  • HTML.tag() is a synonym for make_tag(), both in webhelpers.html.builder.
  • Change default form method to “post” (rather than “POST”) to conform to XHTML.
  • Add DeprecationWarning for webhelpers.rails package, webhelpers.rails.url_for(), and webhelpers.pagination.

0.6 (07/08/2008)

  • Add webhelpers.html.builder to generate HTML tags with smart escaping, along with a literal type to mark preformatted strings.
  • Deprecate webhelpers.rails, including its Javascript libraries (Prototype and Scriptaculous). Wrap all rails helpers in a literal.
  • Many new modules:
    • constants - countries, states, and provinces.
    • containers - high-level collections, including flash messages.
    • date - date/time (rails replacement).
    • html.converters - text-to-HTML (rails replacement).
    • html.tags - HTML tags (rails replacement).
    • html.tools - larger HTML chunks (rails replacement).
    • mail - sending email.
    • misc - helpers that are neither text, numeric, container, nor date.
    • number - numeric helpers and number formatters.
    • paginate - successor to deprecated pagination module.
    • text - non-HTML text formatting (rails replacement).
  • Removed dependency on simplejson and normalized quotes. Patch by Elisha Cook.


  • image(), javascript_link(), stylesheet_link(), and auto_discovery_link() in webhelpers.html.tags do not add prefixes or suffixes to the URL args anymore; they output the exact URL given. Same for button_to() in webhelpers.html.tools.
  • webhelpers.html.tags.javascript_path was deleted.

0.3.4 (03/18/08)

  • Fixed missing javascripts dir.

0.3.3 (02/27/08)

  • Fixed strip_unders so that it won’t explode during iteration when the size changes.
  • Updated feedgenerator with the latest changes from Django’s version (only a few additional attributes).

0.3.2 (09/05/07)

  • Added capability to pass pagination a SA 0.4 Session object which will be used for queries. This allows compatibility with Session.mapper’d objects and normal SA 0.4 mapper relations.
  • Updated SQLAlchemy ORM pagination for SA 0.4 Session.mapper objects.
  • Updated Scriptaculous to 1.7.1 beta 3 (1.7.0 is incompatible with Prototype 1.5.1). Thanks errcw. Fixes #288.

0.3.1 (07/14/07)

  • Added the secure_form_tag helper module, for generating form tags including client-specific authorization tokens for preventing CSRF attacks. Original patch by David Turner. Fixes #157.
  • current_url now accepts arguments to pass along to url_for. Fixes #251.
  • Updated prototype to
  • Added image support to button_to. Patch by Alex Conrad. Fixes #184.
  • Fix radio_button and submit_to_remote not handling unicode values. Fixes #235.
  • Added support for the defer attribute to javascript_include_tag. Suggested by s0undt3ch. Fixes #214.
  • Added a distutils command compress_resources, which can combine CSS and Javascript files, and compress Javascript via ShrinkSafe. Add “command_packages=webhelpers.commands” in [global] in setup.cfg to enable this command for your package.

0.3 (03/18/2007)

  • WARNING: paginate now takes arguments intended for the collection object as query_args. This could affect backwards compatibility. This fixes a common issue that non-keyword arguments passed into paginate get eaten by paginate’s keyword arguments instead of being in *args to go on to the collection.
  • Added environ checking with Routes so that page will be automatically pulled out of the query string, or from the Routes match dict if available.
  • Added ability for paginate to check for objects that had SQLAlchemy’s assign_mapper applied to them.
  • Added better range checking to paginator to require a positive value that is less than the total amount of pages available for a page.
  • WARNING: Due to a typo, the Text helper highlight function no longer highlights text with the CSS class name ‘hilight’ by default: it now uses the CSS class name ‘highlight’ instead. The function’s ‘hilighter’ keyword argument has also been deprecated, use ‘highlighter’ instead.
  • Fixed the broken markdown function.
  • Upgraded markdown from 1.5 to 1.6a.
  • Sync’d Prototype helper to 6057.
  • Sync’d Urls helper to 6070.
  • Sync’d Text helper to 6096.
  • Sync’d Date helper to 6080.
  • Sync’d Tags helper to 5857.
  • Sync’d Asset tag helper to 6057.
  • Sync’d Rails Number helper to 6045.
  • Updated Ajax commands to internally use with_ to avoid name conflicts with Python 2.5 and beyond. Reported by anilj. Fixes #190.
  • Applied patch from David Smith to decode URL parts as Routes does. Fixes #186.
  • Changed pagination to give better response if its passed an invalid object. Patch from Christoph Haas.
  • Fixed scriptaculous helper docs example. Fixes #178.
  • Updated scriptaculous/prototype to Prototype 1.5.0 and Scriptaculous 1.7.0.
  • Updated scriptaculous javascripts to 1.6.5. Fixes #155.
  • Updated remote_function doc-string to more clearly indicate the arguments it can receive.
  • Synced Rails Javascript helper to 5245 (escape_javascript now escaping backslashes and allow passing html_options to javascript_tag).

0.2.2 (10/20/06)

  • Fixed tag_options function to not str() string and let html_escape handle it so unicode is properly handled. Reported with fix by Michael G. Noll.
  • Added sqlalchemy.Query support to the pagination orm wrappers, patch from Andrija Zarić
  • Fixed python 2.3 compliance in webhelpers.rails (use of sorted()) (Thanks Jamie Wilkinson)

0.2.1 (9/7/06)

  • Adding counter func to text helpers, patch from Jamie Wilkinson.
  • Sync’d Rails Text helper to 4994.
  • Sync’d Rails Asset tag helper to 4999.
  • Sync’d Rails Form tag helper to 5045, also doesn’t apply to our version.
  • Sync’d Rails Javascript func to 5039, doesn’t apply to us.
  • Updated Scriptaculous to 1.6.3.
  • Updated Prototype to 1.5.0_rc1.
  • Updated radio_button so that id’s are unique. Brings up to date with Rails changeset #4925, also fixes #103.
  • More precise distance_of_time_in_words (Follows bottom half of #4989 Rails changeset)
  • button_to accepts method keyword so you can PUT and DELETE with it. (Follows #4914 Rails changeset)
  • Fixed auto_link to parse more valid url formats (Thanks Jamie Wilkinson).
  • Sync’d text helper from latest Rails version.
  • Fixed form tag’s method matching to be case insensitive.

0.2 (8/31/06)

  • Adding simplejson req, adding use of json’ification. Updated scriptaculous helpers to split out JS generation for use in JS Generation port.
  • Finished sync’ing Rails ports (urls, tags) in WebHelpers. Closes #69. url and prototype tests updated, url helpers updated to handle method argument.
  • Sync’d scriptaculous helper.
  • Sync’d javascript, prototype helpers and prototype.js to latest Rails modifications. Added more prototype tests.
  • Sync’d form_options, form_tag helpers. form_tag’s form function can now accept other HTTP methods, and will include a hidden field for them if its not ‘get’ or ‘post’.
  • Sync’d number helper, added number unit tests.
  • Added markdown.py (python-markdown) for new markdown support in text helper.
  • Added textile.py (PyTextile) for new textilize support in text helper.
  • Brought asset/date/text helpers up to date with revision info.

0.1.3 (Release)

  • Brought feedgenerator in line with Django’s version, which fixed the missing support for feed categories and updated classes for new-style. Other minor feed updates as well. Now synced as of Django r3143.
  • Fixed typo in feedgenerator import, reported by tiksin@free.fr.
  • Added webhelpers.rails.asset_tag, for generating links to other assets such as javascripts, stylesheets, and feeds.