[DRE-commits] r4989 - in trunk/libbuilder-ruby/debian: . patches
Marc Dequènes
duck at alioth.debian.org
Sun Mar 21 15:55:35 UTC 2010
Author: duck
Date: 2010-03-21 15:55:34 +0000 (Sun, 21 Mar 2010)
New Revision: 4989
Added:
trunk/libbuilder-ruby/debian/patches/pre-2.2.0
trunk/libbuilder-ruby/debian/patches/tolsen
Removed:
trunk/libbuilder-ruby/debian/patches/ruby_1.9
Modified:
trunk/libbuilder-ruby/debian/changelog
trunk/libbuilder-ruby/debian/libbuilder-ruby1.8.docs
trunk/libbuilder-ruby/debian/patches/series
trunk/libbuilder-ruby/debian/rules
Log:
[evol/fix] new patches (fixes+ruby1.9 from tolsen, fixes from git), preliminary ruby-1.9 patch removed, build fix (DEB_RUBY_REAL_LIB_PACKAGES undeclared)
Modified: trunk/libbuilder-ruby/debian/changelog
===================================================================
--- trunk/libbuilder-ruby/debian/changelog 2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/changelog 2010-03-21 15:55:34 UTC (rev 4989)
@@ -7,12 +7,16 @@
* Added Vcs-* fields.
[ Marc Dequènes (Duck) ]
+ * Added patches:
+ + pre-2.2.0: various fixes from git
+ + tolsen: fixes from the Tim Olsen's fork
* Switched to dpkg-source 3.0 (quilt) format.
* Switched to compat level 7.
* Increased Standards-Version to 3.8.4 (no changes).
- * Added support for Ruby 1.9.1 (with a patch from Sam Ruby).
+ * Added support for Ruby 1.9.1 (with a patch from Sam Ruby, included
+ in the tolsen patch).
- -- Marc Dequènes (Duck) <Duck at DuckCorp.org> Sun, 21 Mar 2010 11:07:55 +0100
+ -- Marc Dequènes (Duck) <Duck at DuckCorp.org> Sun, 21 Mar 2010 16:41:45 +0100
libbuilder-ruby (2.1.2-1) unstable; urgency=low
Modified: trunk/libbuilder-ruby/debian/libbuilder-ruby1.8.docs
===================================================================
--- trunk/libbuilder-ruby/debian/libbuilder-ruby1.8.docs 2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/libbuilder-ruby1.8.docs 2010-03-21 15:55:34 UTC (rev 4989)
@@ -1,2 +1,2 @@
-README
+README.rdoc
doc/releases/builder-2.1.1.rdoc
Added: trunk/libbuilder-ruby/debian/patches/pre-2.2.0
===================================================================
--- trunk/libbuilder-ruby/debian/patches/pre-2.2.0 (rev 0)
+++ trunk/libbuilder-ruby/debian/patches/pre-2.2.0 2010-03-21 15:55:34 UTC (rev 4989)
@@ -0,0 +1,3723 @@
+Index: builder-2.1.2/builder.blurb
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/builder.blurb 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,27 @@
++name: builder
++document: http://builder.rubyforge.org
++download: http://rubyforge.org/frs/?group_id=415
++description: >
++ <p>This package contains Builder, a simple ruby library for
++ building XML document quickly and easily.</p>
++
++ <p>Here's an example:</p>
++
++ <pre>
++ xml = Builder::XmlMarkup.new(:indent=>2)
++ xml.person {
++ xml.first_name("Jim")
++ xml.last_name("Weirich")
++ }
++ puts xml.target!
++ </pre>
++
++ <p>Produces:</p>
++
++ <pre>
++ <person>
++ <first_name>Jim</first_name>
++ <last_name>Weirich</last_name>
++ </person>
++ </pre>
++
+Index: builder-2.1.2/CHANGES
+===================================================================
+--- builder-2.1.2.orig/CHANGES 2007-06-15 07:01:59.000000000 +0200
++++ builder-2.1.2/CHANGES 2010-03-21 16:37:51.000000000 +0100
+@@ -1,12 +1,16 @@
+ = Change Log
+
++== Version 2.2.0
++
++* Applied patch from Thijs van der Vossen to allow UTF-8 encoded
++ output when the encoding is UTF-8 and $KCODE is UTF8.
++
+ == Version 2.1.2
+
+ * Fixed bug where private methods in kernel could leak through using
+ tag!(). Thanks to Hagen Overdick for finding and diagnosing this
+ bug.
+
+-
+ == Version 2.1.1
+
+ * Fixed typo in XmlMarkup class docs (ident => indent). (from Martin
+Index: builder-2.1.2/doc/jamis.rb
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/doc/jamis.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,591 @@
++module RDoc
++module Page
++
++FONTS = "\"Bitstream Vera Sans\", Verdana, Arial, Helvetica, sans-serif"
++
++STYLE = <<CSS
++a {
++ color: #00F;
++ text-decoration: none;
++}
++
++a:hover {
++ color: #77F;
++ text-decoration: underline;
++}
++
++body, td, p {
++ font-family: %fonts%;
++ background: #FFF;
++ color: #000;
++ margin: 0px;
++ font-size: small;
++}
++
++#content {
++ margin: 2em;
++}
++
++#description p {
++ margin-bottom: 0.5em;
++}
++
++.sectiontitle {
++ margin-top: 1em;
++ margin-bottom: 1em;
++ padding: 0.5em;
++ padding-left: 2em;
++ background: #005;
++ color: #FFF;
++ font-weight: bold;
++ border: 1px dotted black;
++}
++
++.attr-rw {
++ padding-left: 1em;
++ padding-right: 1em;
++ text-align: center;
++ color: #055;
++}
++
++.attr-name {
++ font-weight: bold;
++}
++
++.attr-desc {
++}
++
++.attr-value {
++ font-family: monospace;
++}
++
++.file-title-prefix {
++ font-size: large;
++}
++
++.file-title {
++ font-size: large;
++ font-weight: bold;
++ background: #005;
++ color: #FFF;
++}
++
++.banner {
++ background: #005;
++ color: #FFF;
++ border: 1px solid black;
++ padding: 1em;
++}
++
++.banner td {
++ background: transparent;
++ color: #FFF;
++}
++
++h1 a, h2 a, .sectiontitle a, .banner a {
++ color: #FF0;
++}
++
++h1 a:hover, h2 a:hover, .sectiontitle a:hover, .banner a:hover {
++ color: #FF7;
++}
++
++.dyn-source {
++ display: none;
++ background: #FFE;
++ color: #000;
++ border: 1px dotted black;
++ margin: 0.5em 2em 0.5em 2em;
++ padding: 0.5em;
++}
++
++.dyn-source .cmt {
++ color: #00F;
++ font-style: italic;
++}
++
++.dyn-source .kw {
++ color: #070;
++ font-weight: bold;
++}
++
++.method {
++ margin-left: 1em;
++ margin-right: 1em;
++ margin-bottom: 1em;
++}
++
++.description pre {
++ padding: 0.5em;
++ border: 1px dotted black;
++ background: #FFE;
++}
++
++.method .title {
++ font-family: monospace;
++ font-size: large;
++ border-bottom: 1px dashed black;
++ margin-bottom: 0.3em;
++ padding-bottom: 0.1em;
++}
++
++.method .description, .method .sourcecode {
++ margin-left: 1em;
++}
++
++.description p, .sourcecode p {
++ margin-bottom: 0.5em;
++}
++
++.method .sourcecode p.source-link {
++ text-indent: 0em;
++ margin-top: 0.5em;
++}
++
++.method .aka {
++ margin-top: 0.3em;
++ margin-left: 1em;
++ font-style: italic;
++ text-indent: 2em;
++}
++
++h1 {
++ padding: 1em;
++ border: 1px solid black;
++ font-size: x-large;
++ font-weight: bold;
++ color: #FFF;
++ background: #007;
++}
++
++h2 {
++ padding: 0.5em 1em 0.5em 1em;
++ border: 1px solid black;
++ font-size: large;
++ font-weight: bold;
++ color: #FFF;
++ background: #009;
++}
++
++h3, h4, h5, h6 {
++ padding: 0.2em 1em 0.2em 1em;
++ border: 1px dashed black;
++ color: #000;
++ background: #AAF;
++}
++
++.sourcecode > pre {
++ padding: 0.5em;
++ border: 1px dotted black;
++ background: #FFE;
++}
++
++CSS
++
++XHTML_PREAMBLE = %{<?xml version="1.0" encoding="%charset%"?>
++<!DOCTYPE html
++ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
++}
++
++HEADER = XHTML_PREAMBLE + <<ENDHEADER
++<html>
++ <head>
++ <title>%title%</title>
++ <meta http-equiv="Content-Type" content="text/html; charset=%charset%" />
++ <link rel="stylesheet" href="%style_url%" type="text/css" media="screen" />
++
++ <script language="JavaScript" type="text/javascript">
++ // <![CDATA[
++
++ function toggleSource( id )
++ {
++ var elem
++ var link
++
++ if( document.getElementById )
++ {
++ elem = document.getElementById( id )
++ link = document.getElementById( "l_" + id )
++ }
++ else if ( document.all )
++ {
++ elem = eval( "document.all." + id )
++ link = eval( "document.all.l_" + id )
++ }
++ else
++ return false;
++
++ if( elem.style.display == "block" )
++ {
++ elem.style.display = "none"
++ link.innerHTML = "show source"
++ }
++ else
++ {
++ elem.style.display = "block"
++ link.innerHTML = "hide source"
++ }
++ }
++
++ function openCode( url )
++ {
++ window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
++ }
++ // ]]>
++ </script>
++ </head>
++
++ <body>
++ENDHEADER
++
++FILE_PAGE = <<HTML
++<table border='0' cellpadding='0' cellspacing='0' width="100%" class='banner'>
++ <tr><td>
++ <table width="100%" border='0' cellpadding='0' cellspacing='0'><tr>
++ <td class="file-title" colspan="2"><span class="file-title-prefix">File</span><br />%short_name%</td>
++ <td align="right">
++ <table border='0' cellspacing="0" cellpadding="2">
++ <tr>
++ <td>Path:</td>
++ <td>%full_path%
++IF:cvsurl
++ (<a href="%cvsurl%">CVS</a>)
++ENDIF:cvsurl
++ </td>
++ </tr>
++ <tr>
++ <td>Modified:</td>
++ <td>%dtm_modified%</td>
++ </tr>
++ </table>
++ </td></tr>
++ </table>
++ </td></tr>
++</table><br>
++HTML
++
++###################################################################
++
++CLASS_PAGE = <<HTML
++<table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
++ <td class="file-title"><span class="file-title-prefix">%classmod%</span><br />%full_name%</td>
++ <td align="right">
++ <table cellspacing=0 cellpadding=2>
++ <tr valign="top">
++ <td>In:</td>
++ <td>
++START:infiles
++HREF:full_path_url:full_path:
++IF:cvsurl
++ (<a href="%cvsurl%">CVS</a>)
++ENDIF:cvsurl
++END:infiles
++ </td>
++ </tr>
++IF:parent
++ <tr>
++ <td>Parent:</td>
++ <td>
++IF:par_url
++ <a href="%par_url%">
++ENDIF:par_url
++%parent%
++IF:par_url
++ </a>
++ENDIF:par_url
++ </td>
++ </tr>
++ENDIF:parent
++ </table>
++ </td>
++ </tr>
++ </table>
++HTML
++
++###################################################################
++
++METHOD_LIST = <<HTML
++ <div id="content">
++IF:diagram
++ <table cellpadding='0' cellspacing='0' border='0' width="100%"><tr><td align="center">
++ %diagram%
++ </td></tr></table>
++ENDIF:diagram
++
++IF:description
++ <div class="description">%description%</div>
++ENDIF:description
++
++IF:requires
++ <div class="sectiontitle">Required Files</div>
++ <ul>
++START:requires
++ <li>HREF:aref:name:</li>
++END:requires
++ </ul>
++ENDIF:requires
++
++IF:toc
++ <div class="sectiontitle">Contents</div>
++ <ul>
++START:toc
++ <li><a href="#%href%">%secname%</a></li>
++END:toc
++ </ul>
++ENDIF:toc
++
++IF:methods
++ <div class="sectiontitle">Methods</div>
++ <ul>
++START:methods
++ <li>HREF:aref:name:</li>
++END:methods
++ </ul>
++ENDIF:methods
++
++IF:includes
++<div class="sectiontitle">Included Modules</div>
++<ul>
++START:includes
++ <li>HREF:aref:name:</li>
++END:includes
++</ul>
++ENDIF:includes
++
++START:sections
++IF:sectitle
++<div class="sectiontitle"><a nem="%secsequence%">%sectitle%</a></div>
++IF:seccomment
++<div class="description">
++%seccomment%
++</div>
++ENDIF:seccomment
++ENDIF:sectitle
++
++IF:classlist
++ <div class="sectiontitle">Classes and Modules</div>
++ %classlist%
++ENDIF:classlist
++
++IF:constants
++ <div class="sectiontitle">Constants</div>
++ <table border='0' cellpadding='5'>
++START:constants
++ <tr valign='top'>
++ <td class="attr-name">%name%</td>
++ <td>=</td>
++ <td class="attr-value">%value%</td>
++ </tr>
++IF:desc
++ <tr valign='top'>
++ <td> </td>
++ <td colspan="2" class="attr-desc">%desc%</td>
++ </tr>
++ENDIF:desc
++END:constants
++ </table>
++ENDIF:constants
++
++IF:attributes
++ <div class="sectiontitle">Attributes</div>
++ <table border='0' cellpadding='5'>
++START:attributes
++ <tr valign='top'>
++ <td class='attr-rw'>
++IF:rw
++[%rw%]
++ENDIF:rw
++ </td>
++ <td class='attr-name'>%name%</td>
++ <td class='attr-desc'>%a_desc%</td>
++ </tr>
++END:attributes
++ </table>
++ENDIF:attributes
++
++IF:method_list
++START:method_list
++IF:methods
++<div class="sectiontitle">%type% %category% methods</div>
++START:methods
++<div class="method">
++ <div class="title">
++IF:callseq
++ <a name="%aref%"></a><b>%callseq%</b>
++ENDIF:callseq
++IFNOT:callseq
++ <a name="%aref%"></a><b>%name%</b>%params%
++ENDIF:callseq
++IF:codeurl
++[ <a href="javascript:openCode('%codeurl%')">source</a> ]
++ENDIF:codeurl
++ </div>
++IF:m_desc
++ <div class="description">
++ %m_desc%
++ </div>
++ENDIF:m_desc
++IF:aka
++<div class="aka">
++ This method is also aliased as
++START:aka
++ <a href="%aref%">%name%</a>
++END:aka
++</div>
++ENDIF:aka
++IF:sourcecode
++<div class="sourcecode">
++ <p class="source-link">[ <a href="javascript:toggleSource('%aref%_source')" id="l_%aref%_source">show source</a> ]</p>
++ <div id="%aref%_source" class="dyn-source">
++<pre>
++%sourcecode%
++</pre>
++ </div>
++</div>
++ENDIF:sourcecode
++</div>
++END:methods
++ENDIF:methods
++END:method_list
++ENDIF:method_list
++END:sections
++</div>
++HTML
++
++FOOTER = <<ENDFOOTER
++ </body>
++</html>
++ENDFOOTER
++
++BODY = HEADER + <<ENDBODY
++ !INCLUDE! <!-- banner header -->
++
++ <div id="bodyContent">
++ #{METHOD_LIST}
++ </div>
++
++ #{FOOTER}
++ENDBODY
++
++########################## Source code ##########################
++
++SRC_PAGE = XHTML_PREAMBLE + <<HTML
++<html>
++<head><title>%title%</title>
++<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
++<style>
++.ruby-comment { color: green; font-style: italic }
++.ruby-constant { color: #4433aa; font-weight: bold; }
++.ruby-identifier { color: #222222; }
++.ruby-ivar { color: #2233dd; }
++.ruby-keyword { color: #3333FF; font-weight: bold }
++.ruby-node { color: #777777; }
++.ruby-operator { color: #111111; }
++.ruby-regexp { color: #662222; }
++.ruby-value { color: #662222; font-style: italic }
++ .kw { color: #3333FF; font-weight: bold }
++ .cmt { color: green; font-style: italic }
++ .str { color: #662222; font-style: italic }
++ .re { color: #662222; }
++</style>
++</head>
++<body bgcolor="white">
++<pre>%code%</pre>
++</body>
++</html>
++HTML
++
++########################## Index ################################
++
++FR_INDEX_BODY = <<HTML
++!INCLUDE!
++HTML
++
++FILE_INDEX = XHTML_PREAMBLE + <<HTML
++<html>
++<head>
++<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
++<style>
++<!--
++ body {
++ background-color: #EEE;
++ font-family: #{FONTS};
++ color: #000;
++ margin: 0px;
++ }
++ .banner {
++ background: #005;
++ color: #FFF;
++ padding: 0.2em;
++ font-size: small;
++ font-weight: bold;
++ text-align: center;
++ }
++ .entries {
++ margin: 0.25em 1em 0 1em;
++ font-size: x-small;
++ }
++ a {
++ color: #00F;
++ text-decoration: none;
++ white-space: nowrap;
++ }
++ a:hover {
++ color: #77F;
++ text-decoration: underline;
++ }
++-->
++</style>
++<base target="docwin">
++</head>
++<body>
++<div class="banner">%list_title%</div>
++<div class="entries">
++START:entries
++<a href="%href%">%name%</a><br>
++END:entries
++</div>
++</body></html>
++HTML
++
++CLASS_INDEX = FILE_INDEX
++METHOD_INDEX = FILE_INDEX
++
++INDEX = XHTML_PREAMBLE + <<HTML
++<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
++<head>
++ <title>%title%</title>
++ <meta http-equiv="Content-Type" content="text/html; charset=%charset%">
++</head>
++
++<frameset cols="20%,*">
++ <frameset rows="15%,35%,50%">
++ <frame src="fr_file_index.html" title="Files" name="Files" />
++ <frame src="fr_class_index.html" name="Classes" />
++ <frame src="fr_method_index.html" name="Methods" />
++ </frameset>
++IF:inline_source
++ <frame src="%initial_page%" name="docwin">
++ENDIF:inline_source
++IFNOT:inline_source
++ <frameset rows="80%,20%">
++ <frame src="%initial_page%" name="docwin">
++ <frame src="blank.html" name="source">
++ </frameset>
++ENDIF:inline_source
++ <noframes>
++ <body bgcolor="white">
++ Click <a href="html/index.html">here</a> for a non-frames
++ version of this page.
++ </body>
++ </noframes>
++</frameset>
++
++</html>
++HTML
++
++end
++end
++
++
+Index: builder-2.1.2/.gitignore
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/.gitignore 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,2 @@
++html
++.DS_Store
+Index: builder-2.1.2/lib/blankslate.rb
+===================================================================
+--- builder-2.1.2.orig/lib/blankslate.rb 2007-05-31 19:19:47.000000000 +0200
++++ builder-2.1.2/lib/blankslate.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -36,13 +36,9 @@
+ # Redefine a previously hidden method so that it may be called on a blank
+ # slate object.
+ def reveal(name)
+- bound_method = nil
+- unbound_method = find_hidden_method(name)
+- fail "Don't know how to reveal method '#{name}'" unless unbound_method
+- define_method(name) do |*args|
+- bound_method ||= unbound_method.bind(self)
+- bound_method.call(*args)
+- end
++ hidden_method = find_hidden_method(name)
++ fail "Don't know how to reveal method '#{name}'" unless hidden_method
++ define_method(name, hidden_method)
+ end
+ end
+
+Index: builder-2.1.2/lib/builder/css.rb
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/lib/builder/css.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,250 @@
++#!/usr/bin/env ruby
++#--
++# Copyright 2004, 2005 by Jim Weirich (jim at weirichhouse.org).
++# Copyright 2005 by Scott Barron (scott at elitists.net).
++# All rights reserved.
++#
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#
++# Much of this is taken from Jim's work in xmlbase.rb and xmlmarkup.rb.
++# Documentation has also been copied and pasted and modified to reflect
++# that we're building CSS here instead of XML. Jim is conducting the
++# orchestra here and I'm just off in the corner playing a flute.
++#++
++
++# Provide a flexible and easy to use Builder for creating Cascading
++# Style Sheets (CSS).
++
++
++require 'builder/blankslate'
++
++module Builder
++
++ # Create a Cascading Style Sheet (CSS) using Ruby.
++ #
++ # Example usage:
++ #
++ # css = Builder::CSS.new
++ #
++ # text_color = '#7F7F7F'
++ # preferred_fonts = 'Helvetica, Arial, sans_serif'
++ #
++ # css.comment! 'This is our stylesheet'
++ # css.body {
++ # background_color '#FAFAFA'
++ # font_size 'small'
++ # font_family preferred_fonts
++ # color text_color
++ # }
++ #
++ # css.id!('navbar') {
++ # width '500px'
++ # }
++ #
++ # css.class!('navitem') {
++ # color 'red'
++ # }
++ #
++ # css.a :hover {
++ # text_decoration 'underline'
++ # }
++ #
++ # css.div(:id => 'menu') {
++ # background 'green'
++ # }
++ #
++ # css.div(:class => 'foo') {
++ # background 'red'
++ # }
++ #
++ # This will yield the following stylesheet:
++ #
++ # /* This is our stylesheet */
++ # body {
++ # background_color: #FAFAFA;
++ # font_size: small;
++ # font_family: Helvetica, Arial, sans_serif;
++ # color: #7F7F7F;
++ # }
++ #
++ # #navbar {
++ # width: 500px;
++ # }
++ #
++ # .navitem {
++ # color: red;
++ # }
++ #
++ # a:hover {
++ # text_decoration: underline;
++ # }
++ #
++ # div#menu {
++ # background: green;
++ # }
++ #
++ # div.foo {
++ # background: red;
++ # }
++ #
++ class CSS < BlankSlate
++
++ # Create a CSS builder.
++ #
++ # out:: Object receiving the markup.1 +out+ must respond to
++ # <tt><<</tt>.
++ # indent:: Number of spaces used for indentation (0 implies no
++ # indentation and no line breaks).
++ #
++ def initialize(indent=2)
++ @indent = indent
++ @target = []
++ @parts = []
++ @library = {}
++ end
++
++ def +(part)
++ _join_with_op! '+'
++ self
++ end
++
++ def >>(part)
++ _join_with_op! ''
++ self
++ end
++
++ def >(part)
++ _join_with_op! '>'
++ self
++ end
++
++ def |(part)
++ _join_with_op! ','
++ self
++ end
++
++ # Return the target of the builder
++ def target!
++ @target * ''
++ end
++
++ # Create a comment string in the output.
++ def comment!(comment_text)
++ @target << "/* #{comment_text} */\n"
++ end
++
++ def id!(arg, &block)
++ _start_container('#'+arg.to_s, nil, block_given?)
++ _css_block(block) if block
++ _unify_block
++ self
++ end
++
++ def class!(arg, &block)
++ _start_container('.'+arg.to_s, nil, block_given?)
++ _css_block(block) if block
++ _unify_block
++ self
++ end
++
++ def store!(sym, &block)
++ @library[sym] = block.to_proc
++ end
++
++ def group!(*args, &block)
++ args.each do |arg|
++ if arg.is_a?(Symbol)
++ instance_eval(&@library[arg])
++ else
++ instance_eval(&arg)
++ end
++ _text ', ' unless arg == args.last
++ end
++ if block
++ _css_block(block)
++ _unify_block
++ end
++ end
++
++ def method_missing(sym, *args, &block)
++ sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
++ if block
++ _start_container(sym, args.first)
++ _css_block(block)
++ _unify_block
++ elsif @in_block
++ _indent
++ _css_line(sym, *args)
++ _newline
++ return self
++ else
++ _start_container(sym, args.first, false)
++ _unify_block
++ end
++ self
++ end
++
++ # "Cargo culted" from Jim who also "cargo culted" it. See xmlbase.rb.
++ def nil?
++ false
++ end
++
++ private
++ def _unify_block
++ @target << @parts * ''
++ @parts = []
++ end
++
++ def _join_with_op!(op)
++ rhs, lhs = @target.pop, @target.pop
++ @target << "#{lhs} #{op} #{rhs}"
++ end
++
++ def _text(text)
++ @parts << text
++ end
++
++ def _css_block(block)
++ _newline
++ _nested_structures(block)
++ _end_container
++ _end_block
++ end
++
++ def _end_block
++ _newline
++ _newline
++ end
++
++ def _newline
++ _text "\n"
++ end
++
++ def _indent
++ _text ' ' * @indent
++ end
++
++ def _nested_structures(block)
++ @in_block = true
++ self.instance_eval(&block)
++ @in_block = false
++ end
++
++ def _start_container(sym, atts = {}, with_bracket = true)
++ selector = sym.to_s
++ selector << ".#{atts[:class]}" if atts && atts[:class]
++ selector << '#' + "#{atts[:id]}" if atts && atts[:id]
++ @parts << "#{selector}#{with_bracket ? ' {' : ''}"
++ end
++
++ def _end_container
++ @parts << "}"
++ end
++
++ def _css_line(sym, *args)
++ _text("#{sym.to_s.gsub('_','-')}: #{args * ' '};")
++ end
++ end
++end
+Index: builder-2.1.2/lib/builder/xchar.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xchar.rb 2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/lib/builder/xchar.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -10,7 +10,7 @@
+
+ module Builder
+ def self.check_for_name_collision(klass, method_name, defined_constant=nil)
+- if klass.instance_methods.include?(method_name)
++ if klass.instance_methods.include?(method_name.to_s)
+ fail RuntimeError,
+ "Name Collision: Method '#{method_name}' is already defined in #{klass}"
+ end
+@@ -89,11 +89,13 @@
+ class Fixnum
+ XChar = Builder::XChar if ! defined?(XChar)
+
+- # XML escaped version of chr
+- def xchr
++ # XML escaped version of chr. When <tt>escape</tt> is set to false
++ # the CP1252 fix is still applied but utf-8 characters are not
++ # converted to character entities.
++ def xchr(escape=true)
+ n = XChar::CP1252[self] || self
+ case n when *XChar::VALID
+- XChar::PREDEFINED[n] or (n<128 ? n.chr : "&##{n};")
++ XChar::PREDEFINED[n] or (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
+ else
+ '*'
+ end
+@@ -106,9 +108,11 @@
+ # to_s.
+ #
+ class String
+- # XML escaped version of to_s
+- def to_xs
+- unpack('U*').map {|n| n.xchr}.join # ASCII, UTF-8
++ # XML escaped version of to_s. When <tt>escape</tt> is set to false
++ # the CP1252 fix is still applied but utf-8 characters are not
++ # converted to character entities.
++ def to_xs(escape=true)
++ unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
+ rescue
+ unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
+ end
+Index: builder-2.1.2/lib/builder/xmlbase.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xmlbase.rb 2007-06-15 07:00:31.000000000 +0200
++++ builder-2.1.2/lib/builder/xmlbase.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -13,19 +13,22 @@
+
+ # Create an XML markup builder.
+ #
+- # out:: Object receiving the markup. +out+ must respond to
+- # <tt><<</tt>.
+- # indent:: Number of spaces used for indentation (0 implies no
+- # indentation and no line breaks).
+- # initial:: Level of initial indentation.
+- #
+- def initialize(indent=0, initial=0)
++ # out:: Object receiving the markup. +out+ must respond to
++ # <tt><<</tt>.
++ # indent:: Number of spaces used for indentation (0 implies no
++ # indentation and no line breaks).
++ # initial:: Level of initial indentation.
++ # encoding:: When <tt>encoding</tt> and $KCODE are set to 'utf-8'
++ # characters aren't converted to character entities in
++ # the output stream.
++ def initialize(indent=0, initial=0, encoding='utf-8')
+ @indent = indent
+ @level = initial
++ @encoding = encoding.downcase
+ end
+
+ # Create a tag named +sym+. Other than the first argument which
+- # is the tag name, the arguements are the same as the tags
++ # is the tag name, the arguments are the same as the tags
+ # implemented via <tt>method_missing</tt>.
+ def tag!(sym, *args, &block)
+ method_missing(sym.to_sym, *args, &block)
+@@ -74,7 +77,7 @@
+ end
+
+ # Append text to the output target. Escape any markup. May be
+- # used within the markup brakets as:
++ # used within the markup brackets as:
+ #
+ # builder.p { |b| b.br; b.text! "HI" } #=> <p><br/>HI</p>
+ def text!(text)
+@@ -82,7 +85,7 @@
+ end
+
+ # Append text to the output target without escaping any markup.
+- # May be used within the markup brakets as:
++ # May be used within the markup brackets as:
+ #
+ # builder.p { |x| x << "<br/>HI" } #=> <p><br/>HI</p>
+ #
+@@ -112,7 +115,7 @@
+
+ require 'builder/xchar'
+ def _escape(text)
+- text.to_xs
++ text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
+ end
+
+ def _escape_quote(text)
+Index: builder-2.1.2/lib/builder/xmlmarkup.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xmlmarkup.rb 2007-02-15 22:01:48.000000000 +0100
++++ builder-2.1.2/lib/builder/xmlmarkup.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -23,14 +23,14 @@
+ # Examples will demonstrate this easier than words. In the
+ # following, +xm+ is an +XmlMarkup+ object.
+ #
+- # xm.em("emphasized") # => <em>emphasized</em>
+- # xm.em { xmm.b("emp & bold") } # => <em><b>emph & bold</b></em>
++ # xm.em("emphasized") # => <em>emphasized</em>
++ # xm.em { xm.b("emp & bold") } # => <em><b>emph & bold</b></em>
+ # xm.a("A Link", "href"=>"http://onestepback.org")
+- # # => <a href="http://onestepback.org">A Link</a>
+- # xm.div { br } # => <div><br/></div>
++ # # => <a href="http://onestepback.org">A Link</a>
++ # xm.div { xm.br } # => <div><br/></div>
+ # xm.target("name"=>"compile", "option"=>"fast")
+- # # => <target option="fast" name="compile"\>
+- # # NOTE: order of attributes is not specified.
++ # # => <target option="fast" name="compile"\>
++ # # NOTE: order of attributes is not specified.
+ #
+ # xm.instruct! # <?xml version="1.0" encoding="UTF-8"?>
+ # xm.html { # <html>
+@@ -163,8 +163,9 @@
+ # option hash.
+ #
+ # :target=><em>target_object</em>::
+- # Object receiving the markup. +out+ must respond to the
+- # <tt><<</tt> operator. The default is a plain string target.
++ # Object receiving the markup. +target_object+ must respond to
++ # the <tt><<(<em>a_string</em>)</tt> operator and return
++ # itself. The default target is a plain string target.
+ #
+ # :indent=><em>indentation</em>::
+ # Number of spaces used for indentation. The default is no
+@@ -174,7 +175,7 @@
+ # Amount of initial indentation (specified in levels, not
+ # spaces).
+ #
+- # :escape_attrs=><b>OBSOLETE</em>::
++ # :escape_attrs=><em>OBSOLETE</em>::
+ # The :escape_attrs option is no longer supported by builder
+ # (and will be quietly ignored). String attribute values are
+ # now automatically escaped. If you need unescaped attribute
+@@ -235,18 +236,22 @@
+ # xml.instruct! :aaa, :bbb=>"ccc"
+ # #=> <?aaa bbb="ccc"?>
+ #
++ # Note: If the encoding is setup to "UTF-8" and the value of
++ # $KCODE is "UTF8", then builder will emit UTF-8 encoded strings
++ # rather than the entity encoding normally used.
+ def instruct!(directive_tag=:xml, attrs={})
+ _ensure_no_block block_given?
+ if directive_tag == :xml
+ a = { :version=>"1.0", :encoding=>"UTF-8" }
+ attrs = a.merge attrs
++ @encoding = attrs[:encoding].downcase
+ end
+ _special(
+- "<?#{directive_tag}",
+- "?>",
+- nil,
+- attrs,
+- [:version, :encoding, :standalone])
++ "<?#{directive_tag}",
++ "?>",
++ nil,
++ attrs,
++ [:version, :encoding, :standalone])
+ end
+
+ # Insert a CDATA section into the XML markup.
+Index: builder-2.1.2/Rakefile
+===================================================================
+--- builder-2.1.2.orig/Rakefile 2007-06-15 07:06:26.000000000 +0200
++++ builder-2.1.2/Rakefile 2010-03-21 16:37:51.000000000 +0100
+@@ -21,7 +21,7 @@
+
+ CLOBBER.include('pkg')
+
+-CURRENT_VERSION = '2.1.2'
++CURRENT_VERSION = '2.2.0'
+ PKG_VERSION = ENV['REL'] ? ENV['REL'] : CURRENT_VERSION
+
+ SRC_RB = FileList['lib/**/*.rb']
+@@ -49,7 +49,7 @@
+ rd = Rake::RDocTask.new("rdoc") { |rdoc|
+ rdoc.rdoc_dir = 'html'
+ rdoc.title = "Builder for Markup"
+- rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README'
++ rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README.rdoc'
+ rdoc.rdoc_files.include('lib/**/*.rb', '[A-Z]*', 'doc/**/*.rdoc')
+ rdoc.template = 'doc/jamis.rb'
+ }
+@@ -99,7 +99,7 @@
+ s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
+ s.rdoc_options <<
+ '--title' << 'Builder -- Easy XML Building' <<
+- '--main' << 'README' <<
++ '--main' << 'README.rdoc' <<
+ '--line-numbers'
+
+ s.author = "Jim Weirich"
+@@ -130,7 +130,7 @@
+ s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
+ s.rdoc_options <<
+ '--title' << 'BlankSlate -- Base Class for building proxies.' <<
+- '--main' << 'README' <<
++ '--main' << 'README.rdoc' <<
+ '--line-numbers'
+
+ s.author = "Jim Weirich"
+@@ -158,6 +158,40 @@
+ FileList['**/*.rb'].egrep /\bDBG|\bbreakpoint\b/
+ end
+
++
++# RCov ---------------------------------------------------------------
++begin
++ require 'rcov/rcovtask'
++
++ Rcov::RcovTask.new do |t|
++ t.libs << "test"
++ t.rcov_opts = [
++ '-xRakefile', '--text-report'
++ ]
++ t.test_files = FileList[
++ 'test/test*.rb'
++ ]
++ t.output_dir = 'coverage'
++ t.verbose = true
++ end
++rescue LoadError
++ # No rcov available
++end
++
++# Tags file ----------------------------------------------------------
++
++namespace "tags" do
++ desc "Create a TAGS file"
++ task :emacs => "TAGS"
++
++ TAGS = 'xctags -e'
++
++ file "TAGS" => SRC_RB do
++ puts "Makings TAGS"
++ sh "#{TAGS} #{SRC_RB}", :verbose => false
++ end
++end
++
+ # --------------------------------------------------------------------
+ # Creating a release
+
+@@ -235,7 +269,7 @@
+ if ENV['RELTEST']
+ announce "Release Task Testing, skipping commiting of new version"
+ else
+- sh %{cvs commit -m "Updated to version #{PKG_VERSION}" Rakefile}
++ sh "cvs commit -m \"Updated to version #{PKG_VERSION}\" Rakefile"
+ end
+ end
+ end
+@@ -259,5 +293,3 @@
+ fail "Unabled to write to #{dest_dir}" unless File.writable?(dest_dir)
+ install "doc/jamis.rb", dest_dir, :verbose => true
+ end
+-
+-require 'scripts/publish'
+Index: builder-2.1.2/rakelib/publish.rake
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/rakelib/publish.rake 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,17 @@
++# Optional publish task for Rake
++
++require 'rake/contrib/sshpublisher'
++require 'rake/contrib/rubyforgepublisher'
++
++publisher = Rake::CompositePublisher.new
++publisher.add Rake::RubyForgePublisher.new('builder', 'jimweirich')
++publisher.add Rake::SshFilePublisher.new(
++ 'linode',
++ 'htdocs/software/builder',
++ '.',
++ 'builder.blurb')
++
++desc "Publish the Documentation to RubyForge."
++task :publish => [:rdoc] do
++ publisher.upload
++end
+Index: builder-2.1.2/README
+===================================================================
+--- builder-2.1.2.orig/README 2006-12-24 20:29:01.000000000 +0100
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,210 +0,0 @@
+-= Project: Builder
+-
+-== Goal
+-
+-Provide a simple way to create XML markup and data structures.
+-
+-== Classes
+-
+-Builder::XmlMarkup:: Generate XML markup notiation
+-Builder::XmlEvents:: Generate XML events (i.e. SAX-like)
+-
+-<b>Notes</b>::
+-
+-* An <tt>Builder::XmlTree</tt> class to generate XML tree
+- (i.e. DOM-like) structures is also planned, but not yet implemented.
+- Also, the events builder is currently lagging the markup builder in
+- features.
+-
+-== Usage
+-
+- require 'rubygems'
+- require_gem 'builder', '~> 2.0'
+-
+- builder = Builder::XmlMarkup.new
+- xml = builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+- xml #=> <person><name>Jim</name><phone>555-1234</phone></person>
+-
+-or
+-
+- require 'rubygems'
+- require_gem 'builder'
+-
+- builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
+- builder.person { |b| b.name("Jim"); b.phone("555-1234") }
+- #
+- # Prints:
+- # <person>
+- # <name>Jim</name>
+- # <phone>555-1234</phone>
+- # </person>
+-
+-== Compatibility
+-
+-=== Version 2.0.0 Compatibility Changes
+-
+-Version 2.0.0 introduces automatically escaped attribute values for
+-the first time. Versions prior to 2.0.0 did not insert escape
+-characters into attribute values in the XML markup. This allowed
+-attribute values to explicitly reference entities, which was
+-occasionally used by a small number of developers. Since strings
+-could always be explicitly escaped by hand, this was not a major
+-restriction in functionality.
+-
+-However, it did suprise most users of builder. Since the body text is
+-normally escaped, everybody expected the attribute values to be
+-escaped as well. Escaped attribute values were the number one support
+-request on the 1.x Builder series.
+-
+-Starting with Builder version 2.0.0, all attribute values expressed as
+-strings will be processed and the appropriate characters will be
+-escaped (e.g. "&" will be tranlated to "&"). Attribute values
+-that are expressed as Symbol values will not be processed for escaped
+-characters and will be unchanged in output. (Yes, this probably counts
+-as Symbol abuse, but the convention is convenient and flexible).
+-
+-Example:
+-
+- xml = Builder::XmlMarkup.new
+- xml.sample(:escaped=>"This&That", :unescaped=>:"Here&There")
+- xml.target! =>
+- <sample escaped="This&That" unescaped="Here&There"/>
+-
+-=== Version 1.0.0 Compatibility Changes
+-
+-Version 1.0.0 introduces some changes that are not backwards
+-compatible with earlier releases of builder. The main areas of
+-incompatibility are:
+-
+-* Keyword based arguments to +new+ (rather than positional based). It
+- was found that a developer would often like to specify indentation
+- without providing an explicit target, or specify a target without
+- indentation. Keyword based arguments handle this situation nicely.
+-
+-* Builder must now be an explicit target for markup tags. Instead of
+- writing
+-
+- xml_markup = Builder::XmlMarkup.new
+- xml_markup.div { strong("text") }
+-
+- you need to write
+-
+- xml_markup = Builder::XmlMarkup.new
+- xml_markup.div { xml_markup.strong("text") }
+-
+-* The builder object is passed as a parameter to all nested markup
+- blocks. This allows you to create a short alias for the builder
+- object that can be used within the block. For example, the previous
+- example can be written as:
+-
+- xml_markup = Builder::XmlMarkup.new
+- xml_markup.div { |xml| xml.strong("text") }
+-
+-* If you have both a pre-1.0 and a post-1.0 gem of builder installed,
+- you can choose which version to use through the RubyGems
+- +require_gem+ facility.
+-
+- require_gem 'builder', "~> 0.0" # Gets the old version
+- require_gem 'builder', "~> 1.0" # Gets the new version
+-
+-== Features
+-
+-* XML Comments are supported ...
+-
+- xml_markup.comment! "This is a comment"
+- #=> <!-- This is a comment -->
+-
+-* XML processing instructions are supported ...
+-
+- xml_markup.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
+- #=> <?xml version="1.0" encoding="UTF-8"?>
+-
+- If the processing instruction is omitted, it defaults to "xml".
+- When the processing instruction is "xml", the defaults attributes
+- are:
+-
+- <b>version</b>:: 1.0
+- <b>encoding</b>:: "UTF-8"
+-
+-* XML entity declarations are now supported to a small degree.
+-
+- xml_markup.declare! :DOCTYPE, :chapter, :SYSTEM, "../dtds/chapter.dtd"
+- #=> <!DOCTYPE chapter SYSTEM "../dtds/chapter.dtd">
+-
+- The parameters to a declare! method must be either symbols or
+- strings. Symbols are inserted without quotes, and strings are
+- inserted with double quotes. Attribute-like arguments in hashes are
+- not allowed.
+-
+- If you need to have an argument to declare! be inserted without
+- quotes, but the arguement does not conform to the typical Ruby
+- syntax for symbols, then use the :"string" form to specify a symbol.
+-
+- For example:
+-
+- xml_markup.declare! :ELEMENT, :chapter, :"(title,para+)"
+- #=> <!ELEMENT chapter (title,para+)>
+-
+- Nested entity declarations are allowed. For example:
+-
+- @xml_markup.declare! :DOCTYPE, :chapter do |x|
+- x.declare! :ELEMENT, :chapter, :"(title,para+)"
+- x.declare! :ELEMENT, :title, :"(#PCDATA)"
+- x.declare! :ELEMENT, :para, :"(#PCDATA)"
+- end
+-
+- #=>
+-
+- <!DOCTYPE chapter [
+- <!ELEMENT chapter (title,para+)>
+- <!ELEMENT title (#PCDATA)>
+- <!ELEMENT para (#PCDATA)>
+- ]>
+-
+-* Some support for XML namespaces is now available. If the first
+- argument to a tag call is a symbol, it will be joined to the tag to
+- produce a namespace:tag combination. It is easier to show this than
+- describe it.
+-
+- xml.SOAP :Envelope do ... end
+-
+- Just put a space before the colon in a namespace to produce the
+- right form for builder (e.g. "<tt>SOAP:Envelope</tt>" =>
+- "<tt>xml.SOAP :Envelope</tt>")
+-
+-* String attribute values are <em>now</em> escaped by default by
+- Builder (<b>NOTE:</b> this is _new_ behavior as of version 2.0).
+-
+- However, occasionally you need to use entities in attribute values.
+- Using a symbols (rather than a string) for an attribute value will
+- cause Builder to not run its quoting/escaping algorithm on that
+- particular value.
+-
+- (<b>Note:</b> The +escape_attrs+ option for builder is now
+- obsolete).
+-
+- Example:
+-
+- xml = Builder::XmlMarkup.new
+- xml.sample(:escaped=>"This&That", :unescaped=>:"Here&There")
+- xml.target! =>
+- <sample escaped="This&That" unescaped="Here&There"/>
+-
+-* UTF-8 Support
+-
+- Builder correctly translates UTF-8 characters into valid XML. (New
+- in version 2.0.0). Thanks to Sam Ruby for the translation code.
+-
+- Example:
+-
+- xml = Builder::Markup.new
+- xml.sample("Iñtërnâtiônàl")
+- xml.target! =>
+- "<sample>Iñtërnâtiônàl</sample>"
+-
+-== Contact
+-
+-Author:: Jim Weirich
+-Email:: jim at weirichhouse.org
+-Home Page:: http://onestepback.org
+-License:: MIT Licence (http://www.opensource.org/licenses/mit-license.html)
+Index: builder-2.1.2/README.rdoc
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/README.rdoc 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,232 @@
++= Project: Builder
++
++== Goal
++
++Provide a simple way to create XML markup and data structures.
++
++== Classes
++
++Builder::XmlMarkup:: Generate XML markup notiation
++Builder::XmlEvents:: Generate XML events (i.e. SAX-like)
++
++<b>Notes</b>::
++
++* An <tt>Builder::XmlTree</tt> class to generate XML tree
++ (i.e. DOM-like) structures is also planned, but not yet implemented.
++ Also, the events builder is currently lagging the markup builder in
++ features.
++
++== Usage
++
++ require 'rubygems'
++ require_gem 'builder', '~> 2.0'
++
++ builder = Builder::XmlMarkup.new
++ xml = builder.person { |b| b.name("Jim"); b.phone("555-1234") }
++ xml #=> <person><name>Jim</name><phone>555-1234</phone></person>
++
++or
++
++ require 'rubygems'
++ require_gem 'builder'
++
++ builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
++ builder.person { |b| b.name("Jim"); b.phone("555-1234") }
++ #
++ # Prints:
++ # <person>
++ # <name>Jim</name>
++ # <phone>555-1234</phone>
++ # </person>
++
++== Compatibility
++
++=== Version 2.0.0 Compatibility Changes
++
++Version 2.0.0 introduces automatically escaped attribute values for
++the first time. Versions prior to 2.0.0 did not insert escape
++characters into attribute values in the XML markup. This allowed
++attribute values to explicitly reference entities, which was
++occasionally used by a small number of developers. Since strings
++could always be explicitly escaped by hand, this was not a major
++restriction in functionality.
++
++However, it did suprise most users of builder. Since the body text is
++normally escaped, everybody expected the attribute values to be
++escaped as well. Escaped attribute values were the number one support
++request on the 1.x Builder series.
++
++Starting with Builder version 2.0.0, all attribute values expressed as
++strings will be processed and the appropriate characters will be
++escaped (e.g. "&" will be tranlated to "&"). Attribute values
++that are expressed as Symbol values will not be processed for escaped
++characters and will be unchanged in output. (Yes, this probably counts
++as Symbol abuse, but the convention is convenient and flexible).
++
++Example:
++
++ xml = Builder::XmlMarkup.new
++ xml.sample(:escaped=>"This&That", :unescaped=>:"Here&There")
++ xml.target! =>
++ <sample escaped="This&That" unescaped="Here&There"/>
++
++=== Version 1.0.0 Compatibility Changes
++
++Version 1.0.0 introduces some changes that are not backwards
++compatible with earlier releases of builder. The main areas of
++incompatibility are:
++
++* Keyword based arguments to +new+ (rather than positional based). It
++ was found that a developer would often like to specify indentation
++ without providing an explicit target, or specify a target without
++ indentation. Keyword based arguments handle this situation nicely.
++
++* Builder must now be an explicit target for markup tags. Instead of
++ writing
++
++ xml_markup = Builder::XmlMarkup.new
++ xml_markup.div { strong("text") }
++
++ you need to write
++
++ xml_markup = Builder::XmlMarkup.new
++ xml_markup.div { xml_markup.strong("text") }
++
++* The builder object is passed as a parameter to all nested markup
++ blocks. This allows you to create a short alias for the builder
++ object that can be used within the block. For example, the previous
++ example can be written as:
++
++ xml_markup = Builder::XmlMarkup.new
++ xml_markup.div { |xml| xml.strong("text") }
++
++* If you have both a pre-1.0 and a post-1.0 gem of builder installed,
++ you can choose which version to use through the RubyGems
++ +require_gem+ facility.
++
++ require_gem 'builder', "~> 0.0" # Gets the old version
++ require_gem 'builder', "~> 1.0" # Gets the new version
++
++== Features
++
++* XML Comments are supported ...
++
++ xml_markup.comment! "This is a comment"
++ #=> <!-- This is a comment -->
++
++* XML processing instructions are supported ...
++
++ xml_markup.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
++ #=> <?xml version="1.0" encoding="UTF-8"?>
++
++ If the processing instruction is omitted, it defaults to "xml".
++ When the processing instruction is "xml", the defaults attributes
++ are:
++
++ <b>version</b>:: 1.0
++ <b>encoding</b>:: "UTF-8"
++
++ (NOTE: if the encoding is set to "UTF-8" and $KCODE is set to
++ "UTF8", then Builder will emit UTF-8 encoded strings rather than
++ encoding non-ASCII characters as entities.)
++
++* XML entity declarations are now supported to a small degree.
++
++ xml_markup.declare! :DOCTYPE, :chapter, :SYSTEM, "../dtds/chapter.dtd"
++ #=> <!DOCTYPE chapter SYSTEM "../dtds/chapter.dtd">
++
++ The parameters to a declare! method must be either symbols or
++ strings. Symbols are inserted without quotes, and strings are
++ inserted with double quotes. Attribute-like arguments in hashes are
++ not allowed.
++
++ If you need to have an argument to declare! be inserted without
++ quotes, but the arguement does not conform to the typical Ruby
++ syntax for symbols, then use the :"string" form to specify a symbol.
++
++ For example:
++
++ xml_markup.declare! :ELEMENT, :chapter, :"(title,para+)"
++ #=> <!ELEMENT chapter (title,para+)>
++
++ Nested entity declarations are allowed. For example:
++
++ @xml_markup.declare! :DOCTYPE, :chapter do |x|
++ x.declare! :ELEMENT, :chapter, :"(title,para+)"
++ x.declare! :ELEMENT, :title, :"(#PCDATA)"
++ x.declare! :ELEMENT, :para, :"(#PCDATA)"
++ end
++
++ #=>
++
++ <!DOCTYPE chapter [
++ <!ELEMENT chapter (title,para+)>
++ <!ELEMENT title (#PCDATA)>
++ <!ELEMENT para (#PCDATA)>
++ ]>
++
++* Some support for XML namespaces is now available. If the first
++ argument to a tag call is a symbol, it will be joined to the tag to
++ produce a namespace:tag combination. It is easier to show this than
++ describe it.
++
++ xml.SOAP :Envelope do ... end
++
++ Just put a space before the colon in a namespace to produce the
++ right form for builder (e.g. "<tt>SOAP:Envelope</tt>" =>
++ "<tt>xml.SOAP :Envelope</tt>")
++
++* String attribute values are <em>now</em> escaped by default by
++ Builder (<b>NOTE:</b> this is _new_ behavior as of version 2.0).
++
++ However, occasionally you need to use entities in attribute values.
++ Using a symbols (rather than a string) for an attribute value will
++ cause Builder to not run its quoting/escaping algorithm on that
++ particular value.
++
++ (<b>Note:</b> The +escape_attrs+ option for builder is now
++ obsolete).
++
++ Example:
++
++ xml = Builder::XmlMarkup.new
++ xml.sample(:escaped=>"This&That", :unescaped=>:"Here&There")
++ xml.target! =>
++ <sample escaped="This&That" unescaped="Here&There"/>
++
++* UTF-8 Support
++
++ Builder correctly translates UTF-8 characters into valid XML. (New
++ in version 2.0.0). Thanks to Sam Ruby for the translation code.
++
++ Example:
++
++ xml = Builder::Markup.new
++ xml.sample("Iñtërnâtiônàl")
++ xml.target! =>
++ "<sample>Iñtërnâtiônàl</sample>"
++
++ You can get UTF-8 encoded output by making sure that the XML
++ encoding is set to "UTF-8" and that the $KCODE variable is set to
++ "UTF8".
++
++ $KCODE = 'UTF8'
++ xml = Builder::Markup.new
++ xml.instruct!(:xml, :encoding => "UTF-8")
++ xml.sample("Iñtërnâtiônàl")
++ xml.target! =>
++ "<sample>Iñtërnâtiônàl</sample>"
++
++== Links
++
++Documents:: http://builder.rubyforge.org/
++Github Clone:: git://github.com/jimweirich/builder.git
++Issue Tracking:: http://www.pivotaltracker.com/projects/29210
++Bug Reports:: http://onestepback.org/cgi-bin/bugs.cgi?project=builder
++
++== Contact
++
++Author:: Jim Weirich
++Email:: jim at weirichhouse.org
++Home Page:: http://onestepback.org
++License:: MIT Licence (http://www.opensource.org/licenses/mit-license.html)
+Index: builder-2.1.2/scripts/publish.rb
+===================================================================
+--- builder-2.1.2.orig/scripts/publish.rb 2006-12-24 20:29:01.000000000 +0100
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,17 +0,0 @@
+-# Optional publish task for Rake
+-
+-require 'rake/contrib/sshpublisher'
+-require 'rake/contrib/rubyforgepublisher'
+-
+-publisher = Rake::CompositePublisher.new
+-publisher.add Rake::RubyForgePublisher.new('builder', 'jimweirich')
+-publisher.add Rake::SshFilePublisher.new(
+- 'umlcoop',
+- 'htdocs/software/builder',
+- '.',
+- 'builder.blurb')
+-
+-desc "Publish the Documentation to RubyForge."
+-task :publish => [:rdoc] do
+- publisher.upload
+-end
+Index: builder-2.1.2/TAGS
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/TAGS 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,96 @@
++
++lib/blankslate.rb,455
++class BlankSlateBlankSlate17,621
++ def hide(name)hide22,788
++ def find_hidden_method(name)find_hidden_method31,1032
++ def reveal(name)reveal38,1268
++module KernelKernel55,1902
++ def method_added(name)method_added61,2078
++class ObjectObject73,2357
++ def method_added(name)method_added79,2532
++ def find_hidden_method(name)find_hidden_method86,2693
++class ModuleModule99,3124
++ def append_features(mod)append_features101,3197
++
++lib/builder/blankslate.rb,30
++module BuilderBuilder18,555
++
++lib/builder/css.rb,1102
++module BuilderBuilder23,757
++ class CSS < BlankSlateCSS92,2139
++ def initialize(indent=2)initialize101,2424
++ def +(part)+108,2562
++ def >>(part)>>113,2623
++ def >(part)>118,2684
++ def |(part)|123,2745
++ def target!target!129,2845
++ def comment!(comment_text)comment!134,2934
++ def id!(arg, &block)id!138,3017
++ def class!(arg, &block)class!145,3170
++ def store!(sym, &block)store!152,3326
++ def group!(*args, &block)group!156,3399
++ def method_missing(sym, *args, &block)method_missing171,3712
++ def nil?nil?190,4216
++ def _unify_block_unify_block195,4262
++ def _join_with_op!(op)_join_with_op!200,4343
++ def _text(text)_text205,4464
++ def _css_block(block)_css_block209,4514
++ def _end_block_end_block216,4634
++ def _newline_newline221,4696
++ def _indent_indent225,4743
++ def _nested_structures(block)_nested_structures229,4794
++ def _start_container(sym, atts = {}, with_bracket = true)_start_container235,4917
++ def _end_container_end_container242,5192
++ def _css_line(sym, *args)_css_line246,5244
++
++lib/builder/xchar.rb,342
++module BuilderBuilder11,321
++ def self.check_for_name_collision(klass, method_name, defined_constant=nil)check_for_name_collision12,336
++module BuilderBuilder26,798
++ module XChar # :nodoc:XChar32,997
++class FixnumFixnum89,2948
++ def xchr(escape=true)xchr95,3179
++class StringString110,3542
++ def to_xs(escape=true)to_xs114,3727
++
++lib/builder/xmlbase.rb,639
++module BuilderBuilder5,51
++ class IllegalBlockError < RuntimeError; endIllegalBlockError8,97
++ class XmlBase < BlankSlateXmlBase12,264
++ def initialize(indent=0, initial=0, encoding='utf-8')initialize24,777
++ def tag!(sym, *args, &block)tag!33,1109
++ def method_missing(sym, *args, &block)method_missing40,1366
++ def text!(text)text!83,2417
++ def <<(text)<<100,3077
++ def nil?nil?110,3508
++ def _escape(text)_escape117,3587
++ def _escape_quote(text)_escape_quote121,3679
++ def _newline_newline125,3768
++ def _indent_indent130,3844
++ def _nested_structures(block)_nested_structures135,3955
++
++lib/builder/xmlevents.rb,216
++module BuilderBuilder14,315
++ class XmlEvents < XmlMarkupXmlEvents48,1598
++ def text!(text)text!49,1628
++ def _start_tag(sym, attrs, end_too=false)_start_tag53,1682
++ def _end_tag(sym)_end_tag58,1804
++
++lib/builder/xmlmarkup.rb,776
++module BuilderBuilder16,425
++ class XmlMarkup < XmlBaseXmlMarkup160,5942
++ def initialize(options={})initialize186,7059
++ def target!target!194,7284
++ def comment!(comment_text)comment!198,7323
++ def declare!(inst, *args, &block)declare!209,7619
++ def instruct!(directive_tag=:xml, attrs={})instruct!242,8497
++ def cdata!(text)cdata!264,9081
++ def _text(text)_text275,9405
++ def _special(open, close, data=nil, attrs=nil, order=[])_special280,9495
++ def _start_tag(sym, attrs, end_too=false)_start_tag291,9829
++ def _end_tag(sym)_end_tag299,10028
++ def _insert_attributes(attrs, order=[])_insert_attributes304,10137
++ def _attr_value(value)_attr_value315,10452
++ def _ensure_no_block(got_block)_ensure_no_block324,10597
++
++lib/builder.rb,0
+Index: builder-2.1.2/test/performance.rb
+===================================================================
+--- builder-2.1.2.orig/test/performance.rb 2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/test/performance.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -1,5 +1,15 @@
+ #!/usr/bin/env ruby
+
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
+ require 'builder/xmlmarkup'
+ require 'benchmark'
+
+Index: builder-2.1.2/test/preload.rb
+===================================================================
+--- builder-2.1.2.orig/test/preload.rb 2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/test/preload.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -1,5 +1,15 @@
+ #!/usr/bin/env ruby
+
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
+ # We are defining method_added in Kernel and Object so that when
+ # BlankSlate overrides them later, we can verify that it correctly
+ # calls the older hooks.
+Index: builder-2.1.2/test/test_blankslate.rb
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_blankslate.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,218 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'test/preload'
++require 'builder/blankslate'
++require 'stringio'
++
++# Methods to be introduced into the Object class late.
++module LateObject
++ def late_object
++ 33
++ end
++ def LateObject.included(mod)
++ # Modules defining an included method should not prevent blank
++ # slate erasure!
++ end
++end
++
++# Methods to be introduced into the Kernel module late.
++module LateKernel
++ def late_kernel
++ 44
++ end
++ def LateKernel.included(mod)
++ # Modules defining an included method should not prevent blank
++ # slate erasure!
++ end
++end
++
++# Introduce some late methods (both module and direct) into the Kernel
++# module.
++module Kernel
++ include LateKernel
++
++ def late_addition
++ 1234
++ end
++
++ def double_late_addition
++ 11
++ end
++
++ def double_late_addition
++ 22
++ end
++end
++
++
++# Introduce some late methods (both module and direct) into the Object
++# class.
++class Object
++ include LateObject
++ def another_late_addition
++ 4321
++ end
++end
++
++# Introduce some late methods by inclusion.
++module GlobalModule
++ def global_inclusion
++ 42
++ end
++end
++include GlobalModule
++
++def direct_global
++ 43
++end
++
++######################################################################
++# Test case for blank slate.
++#
++class TestBlankSlate < Test::Unit::TestCase
++ def setup
++ @bs = BlankSlate.new
++ end
++
++ def test_undefined_methods_remain_undefined
++ assert_raise(NoMethodError) { @bs.no_such_method }
++ assert_raise(NoMethodError) { @bs.nil? }
++ end
++
++
++ # NOTE: NameError is acceptable because the lack of a '.' means that
++ # Ruby can't tell if it is a method or a local variable.
++ def test_undefined_methods_remain_undefined_during_instance_eval
++ assert_raise(NoMethodError, NameError) do
++ @bs.instance_eval do nil? end
++ end
++ assert_raise(NoMethodError, NameError) do
++ @bs.instance_eval do no_such_method end
++ end
++ end
++
++ def test_private_methods_are_undefined
++ assert_raise(NoMethodError) do
++ @bs.puts "HI"
++ end
++ end
++
++ def test_targetted_private_methods_are_undefined_during_instance_eval
++ assert_raise(NoMethodError, NameError) do
++ @bs.instance_eval do self.puts "HI" end
++ end
++ end
++
++ def test_untargetted_private_methods_are_defined_during_instance_eval
++ oldstdout = $stdout
++ $stdout = StringIO.new
++ @bs.instance_eval do
++ puts "HI"
++ end
++ ensure
++ $stdout = oldstdout
++ end
++
++ def test_methods_added_late_to_kernel_remain_undefined
++ assert_equal 1234, nil.late_addition
++ assert_raise(NoMethodError) { @bs.late_addition }
++ end
++
++ def test_methods_added_late_to_object_remain_undefined
++ assert_equal 4321, nil.another_late_addition
++ assert_raise(NoMethodError) { @bs.another_late_addition }
++ end
++
++ def test_methods_added_late_to_global_remain_undefined
++ assert_equal 42, global_inclusion
++ assert_raise(NoMethodError) { @bs.global_inclusion }
++ end
++
++ def test_preload_method_added
++ assert Kernel.k_added_names.include?(:late_addition)
++ assert Object.o_added_names.include?(:another_late_addition)
++ end
++
++ def test_method_defined_late_multiple_times_remain_undefined
++ assert_equal 22, nil.double_late_addition
++ assert_raise(NoMethodError) { @bs.double_late_addition }
++ end
++
++ def test_late_included_module_in_object_is_ok
++ assert_equal 33, 1.late_object
++ assert_raise(NoMethodError) { @bs.late_object }
++ end
++
++ def test_late_included_module_in_kernel_is_ok
++ assert_raise(NoMethodError) { @bs.late_kernel }
++ end
++
++ def test_revealing_previously_hidden_methods_are_callable
++ with_to_s = Class.new(BlankSlate) do
++ reveal :to_s
++ end
++ assert_match /^#<.*>$/, with_to_s.new.to_s
++ end
++
++ def test_revealing_previously_hidden_methods_are_callable_with_block
++ Object.class_eval <<-EOS
++ def given_block(&block)
++ block
++ end
++ EOS
++
++ with_given_block = Class.new(BlankSlate) do
++ reveal :given_block
++ end
++ assert_not_nil with_given_block.new.given_block {}
++ end
++
++ def test_revealing_a_hidden_method_twice_is_ok
++ with_to_s = Class.new(BlankSlate) do
++ reveal :to_s
++ reveal :to_s
++ end
++ assert_match /^#<.*>$/, with_to_s.new.to_s
++ end
++
++ def test_revealing_unknown_hidden_method_is_an_error
++ assert_raises(RuntimeError) do
++ Class.new(BlankSlate) do
++ reveal :xyz
++ end
++ end
++ end
++
++ def test_global_includes_still_work
++ assert_nothing_raised do
++ assert_equal 42, global_inclusion
++ assert_equal 42, Object.new.global_inclusion
++ assert_equal 42, "magic number".global_inclusion
++ assert_equal 43, direct_global
++ end
++ end
++
++ def test_reveal_should_not_bind_to_an_instance
++ with_object_id = Class.new(BlankSlate) do
++ reveal(:object_id)
++ end
++
++ obj1 = with_object_id.new
++ obj2 = with_object_id.new
++
++ assert obj1.object_id != obj2.object_id,
++ "Revealed methods should not be bound to a particular instance"
++ end
++end
++
+Index: builder-2.1.2/test/testblankslate.rb
+===================================================================
+--- builder-2.1.2.orig/test/testblankslate.rb 2007-05-31 19:19:46.000000000 +0200
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,183 +0,0 @@
+-#!/usr/bin/env ruby
+-
+-require 'test/unit'
+-require 'test/preload'
+-require 'builder/blankslate'
+-require 'stringio'
+-
+-# Methods to be introduced into the Object class late.
+-module LateObject
+- def late_object
+- 33
+- end
+- def LateObject.included(mod)
+- # Modules defining an included method should not prevent blank
+- # slate erasure!
+- end
+-end
+-
+-# Methods to be introduced into the Kernel module late.
+-module LateKernel
+- def late_kernel
+- 44
+- end
+- def LateKernel.included(mod)
+- # Modules defining an included method should not prevent blank
+- # slate erasure!
+- end
+-end
+-
+-# Introduce some late methods (both module and direct) into the Kernel
+-# module.
+-module Kernel
+- include LateKernel
+-
+- def late_addition
+- 1234
+- end
+-
+- def double_late_addition
+- 11
+- end
+-
+- def double_late_addition
+- 22
+- end
+-end
+-
+-
+-# Introduce some late methods (both module and direct) into the Object
+-# class.
+-class Object
+- include LateObject
+- def another_late_addition
+- 4321
+- end
+-end
+-
+-# Introduce some late methods by inclusion.
+-module GlobalModule
+- def global_inclusion
+- 42
+- end
+-end
+-include GlobalModule
+-
+-def direct_global
+- 43
+-end
+-
+-######################################################################
+-# Test case for blank slate.
+-#
+-class TestBlankSlate < Test::Unit::TestCase
+- def setup
+- @bs = BlankSlate.new
+- end
+-
+- def test_undefined_methods_remain_undefined
+- assert_raise(NoMethodError) { @bs.no_such_method }
+- assert_raise(NoMethodError) { @bs.nil? }
+- end
+-
+-
+- # NOTE: NameError is acceptable because the lack of a '.' means that
+- # Ruby can't tell if it is a method or a local variable.
+- def test_undefined_methods_remain_undefined_during_instance_eval
+- assert_raise(NoMethodError, NameError) do
+- @bs.instance_eval do nil? end
+- end
+- assert_raise(NoMethodError, NameError) do
+- @bs.instance_eval do no_such_method end
+- end
+- end
+-
+- def test_private_methods_are_undefined
+- assert_raise(NoMethodError) do
+- @bs.puts "HI"
+- end
+- end
+-
+- def test_targetted_private_methods_are_undefined_during_instance_eval
+- assert_raise(NoMethodError, NameError) do
+- @bs.instance_eval do self.puts "HI" end
+- end
+- end
+-
+- def test_untargetted_private_methods_are_defined_during_instance_eval
+- oldstdout = $stdout
+- $stdout = StringIO.new
+- @bs.instance_eval do
+- puts "HI"
+- end
+- ensure
+- $stdout = oldstdout
+- end
+-
+- def test_methods_added_late_to_kernel_remain_undefined
+- assert_equal 1234, nil.late_addition
+- assert_raise(NoMethodError) { @bs.late_addition }
+- end
+-
+- def test_methods_added_late_to_object_remain_undefined
+- assert_equal 4321, nil.another_late_addition
+- assert_raise(NoMethodError) { @bs.another_late_addition }
+- end
+-
+- def test_methods_added_late_to_global_remain_undefined
+- assert_equal 42, global_inclusion
+- assert_raise(NoMethodError) { @bs.global_inclusion }
+- end
+-
+- def test_preload_method_added
+- assert Kernel.k_added_names.include?(:late_addition)
+- assert Object.o_added_names.include?(:another_late_addition)
+- end
+-
+- def test_method_defined_late_multiple_times_remain_undefined
+- assert_equal 22, nil.double_late_addition
+- assert_raise(NoMethodError) { @bs.double_late_addition }
+- end
+-
+- def test_late_included_module_in_object_is_ok
+- assert_equal 33, 1.late_object
+- assert_raise(NoMethodError) { @bs.late_object }
+- end
+-
+- def test_late_included_module_in_kernel_is_ok
+- assert_raise(NoMethodError) { @bs.late_kernel }
+- end
+-
+- def test_revealing_previously_hidden_methods_are_callable
+- with_to_s = Class.new(BlankSlate) do
+- reveal :to_s
+- end
+- assert_match /^#<.*>$/, with_to_s.new.to_s
+- end
+-
+- def test_revealing_a_hidden_method_twice_is_ok
+- with_to_s = Class.new(BlankSlate) do
+- reveal :to_s
+- reveal :to_s
+- end
+- assert_match /^#<.*>$/, with_to_s.new.to_s
+- end
+-
+- def test_revealing_unknown_hidden_method_is_an_error
+- assert_raises(RuntimeError) do
+- Class.new(BlankSlate) do
+- reveal :xyz
+- end
+- end
+- end
+-
+- def test_global_includes_still_work
+- assert_nothing_raised do
+- assert_equal 42, global_inclusion
+- assert_equal 42, Object.new.global_inclusion
+- assert_equal 42, "magic number".global_inclusion
+- assert_equal 43, direct_global
+- end
+- end
+-end
+-
+Index: builder-2.1.2/test/test_cssbuilder.rb
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_cssbuilder.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,125 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'test/preload'
++require 'builder'
++require 'builder/css'
++
++class TestCSS < Test::Unit::TestCase
++ def setup
++ @css = Builder::CSS.new
++ end
++
++ def test_create
++ assert_not_nil @css
++ end
++
++ def test_no_block
++ @css.body
++ assert_equal 'body', @css.target!
++ end
++
++ def test_block
++ @css.body {
++ color 'green'
++ }
++ assert_equal "body {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_id
++ @css.id!('nav') { color 'green' }
++ assert_equal "#nav {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_class
++ @css.class!('nav') { color 'green' }
++ assert_equal ".nav {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_elem_with_id
++ @css.div(:id => 'nav') { color 'green' }
++ assert_equal "div#nav {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_elem_with_class
++ @css.div(:class => 'nav') { color 'green' }
++ assert_equal "div.nav {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_comment
++ @css.comment!('foo')
++ assert_equal "/* foo */\n", @css.target!
++ end
++
++ def test_selector
++ @css.a(:hover) { color 'green' }
++ assert_equal "a:hover {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_plus
++ @css.h1 + @css.span
++ assert_equal "h1 + span", @css.target!
++ end
++
++ def test_plus_with_block
++ @css.h1 + @css.span { color 'green' }
++ assert_equal "h1 + span {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_contextual
++ @css.h1 >> @css.span
++ assert_equal "h1 span", @css.target!
++ end
++
++ def test_contextual_with_block
++ @css.h1 >> @css.span { color 'green' }
++ assert_equal "h1 span {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_child
++ @css.h1 > @css.span
++ assert_equal "h1 > span", @css.target!
++ end
++
++ def test_child_with_block
++ @css.h1 > @css.span { color 'green' }
++ assert_equal "h1 > span {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_multiple_op
++ @css.h1 + @css.span + @css.span
++ assert_equal "h1 + span + span", @css.target!
++ end
++
++ def test_all
++ @css.h1 | @css.h2 { color 'green' }
++ assert_equal "h1 , h2 {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_all_with_atts
++ @css.h1(:class => 'foo') | @css.h2(:class => 'bar') { color 'green' }
++ assert_equal "h1.foo , h2.bar {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_multiple_basic
++ @css.body { color 'green' }
++ @css.h1 { color 'green' }
++ assert_equal "body {\n color: green;\n}\n\nh1 {\n color: green;\n}\n\n", @css.target!
++ end
++
++ def test_multiple_ops
++ @css.body { color 'green' }
++ @css.body > @css.h1 { color 'green' }
++ assert_equal "body {\n color: green;\n}\n\nbody > h1 {\n color: green;\n}\n\n", @css.target!
++ end
++end
+Index: builder-2.1.2/test/test_eventbuilder.rb
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_eventbuilder.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,150 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'test/preload'
++require 'builder'
++require 'builder/xmlevents'
++
++class TestEvents < Test::Unit::TestCase
++
++ class Target
++ attr_reader :events
++
++ def initialize
++ @events = []
++ end
++
++ def start_tag(tag, attrs)
++ @events << [:start_tag, tag, attrs]
++ end
++
++ def end_tag(tag)
++ @events << [:end_tag, tag]
++ end
++
++ def text(string)
++ @events << [:text, string]
++ end
++
++ end
++
++
++ def setup
++ @target = Target.new
++ @xml = Builder::XmlEvents.new(:target=>@target)
++ end
++
++ def test_simple
++ @xml.one
++ expect [:start_tag, :one, nil]
++ expect [:end_tag, :one]
++ expect_done
++ end
++
++ def test_nested
++ @xml.one { @xml.two }
++ expect [:start_tag, :one, nil]
++ expect [:start_tag, :two, nil]
++ expect [:end_tag, :two]
++ expect [:end_tag, :one]
++ expect_done
++ end
++
++ def test_text
++ @xml.one("a")
++ expect [:start_tag, :one, nil]
++ expect [:text, "a"]
++ expect [:end_tag, :one]
++ expect_done
++ end
++
++ def test_special_text
++ @xml.one("H&R")
++ expect [:start_tag, :one, nil]
++ expect [:text, "H&R"]
++ expect [:end_tag, :one]
++ expect_done
++ end
++
++ def test_text_with_entity
++ @xml.one("H&R")
++ expect [:start_tag, :one, nil]
++ expect [:text, "H&R"]
++ expect [:end_tag, :one]
++ expect_done
++ end
++
++ def test_attributes
++ @xml.a(:b=>"c", :x=>"y")
++ expect [:start_tag, :a, {:x => "y", :b => "c"}]
++ expect [:end_tag, :a]
++ expect_done
++ end
++
++ def test_moderately_complex
++ @xml.tag! "address-book" do |x|
++ x.entry :id=>"1" do
++ x.name {
++ x.first "Bill"
++ x.last "Smith"
++ }
++ x.address "Cincinnati"
++ end
++ x.entry :id=>"2" do
++ x.name {
++ x.first "John"
++ x.last "Doe"
++ }
++ x.address "Columbus"
++ end
++ end
++ expect [:start_tag, "address-book".intern, nil]
++ expect [:start_tag, :entry, {:id => "1"}]
++ expect [:start_tag, :name, nil]
++ expect [:start_tag, :first, nil]
++ expect [:text, "Bill"]
++ expect [:end_tag, :first]
++ expect [:start_tag, :last, nil]
++ expect [:text, "Smith"]
++ expect [:end_tag, :last]
++ expect [:end_tag, :name]
++ expect [:start_tag, :address, nil]
++ expect [:text, "Cincinnati"]
++ expect [:end_tag, :address]
++ expect [:end_tag, :entry]
++ expect [:start_tag, :entry, {:id => "2"}]
++ expect [:start_tag, :name, nil]
++ expect [:start_tag, :first, nil]
++ expect [:text, "John"]
++ expect [:end_tag, :first]
++ expect [:start_tag, :last, nil]
++ expect [:text, "Doe"]
++ expect [:end_tag, :last]
++ expect [:end_tag, :name]
++ expect [:start_tag, :address, nil]
++ expect [:text, "Columbus"]
++ expect [:end_tag, :address]
++ expect [:end_tag, :entry]
++ expect [:end_tag, "address-book".intern]
++ expect_done
++ end
++
++ def expect(value)
++ assert_equal value, @target.events.shift
++ end
++
++ def expect_done
++ assert_nil @target.events.shift
++ end
++
++end
+Index: builder-2.1.2/test/testeventbuilder.rb
+===================================================================
+--- builder-2.1.2.orig/test/testeventbuilder.rb 2006-12-24 20:29:01.000000000 +0100
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,133 +0,0 @@
+-class TestEvents < Test::Unit::TestCase
+-
+- class Target
+- attr_reader :events
+-
+- def initialize
+- @events = []
+- end
+-
+- def start_tag(tag, attrs)
+- @events << [:start_tag, tag, attrs]
+- end
+-
+- def end_tag(tag)
+- @events << [:end_tag, tag]
+- end
+-
+- def text(string)
+- @events << [:text, string]
+- end
+-
+- end
+-
+-
+- def setup
+- @target = Target.new
+- @xml = Builder::XmlEvents.new(:target=>@target)
+- end
+-
+- def test_simple
+- @xml.one
+- expect [:start_tag, :one, nil]
+- expect [:end_tag, :one]
+- expect_done
+- end
+-
+- def test_nested
+- @xml.one { @xml.two }
+- expect [:start_tag, :one, nil]
+- expect [:start_tag, :two, nil]
+- expect [:end_tag, :two]
+- expect [:end_tag, :one]
+- expect_done
+- end
+-
+- def test_text
+- @xml.one("a")
+- expect [:start_tag, :one, nil]
+- expect [:text, "a"]
+- expect [:end_tag, :one]
+- expect_done
+- end
+-
+- def test_special_text
+- @xml.one("H&R")
+- expect [:start_tag, :one, nil]
+- expect [:text, "H&R"]
+- expect [:end_tag, :one]
+- expect_done
+- end
+-
+- def test_text_with_entity
+- @xml.one("H&R")
+- expect [:start_tag, :one, nil]
+- expect [:text, "H&R"]
+- expect [:end_tag, :one]
+- expect_done
+- end
+-
+- def test_attributes
+- @xml.a(:b=>"c", :x=>"y")
+- expect [:start_tag, :a, {:x => "y", :b => "c"}]
+- expect [:end_tag, :a]
+- expect_done
+- end
+-
+- def test_moderately_complex
+- @xml.tag! "address-book" do |x|
+- x.entry :id=>"1" do
+- x.name {
+- x.first "Bill"
+- x.last "Smith"
+- }
+- x.address "Cincinnati"
+- end
+- x.entry :id=>"2" do
+- x.name {
+- x.first "John"
+- x.last "Doe"
+- }
+- x.address "Columbus"
+- end
+- end
+- expect [:start_tag, "address-book".intern, nil]
+- expect [:start_tag, :entry, {:id => "1"}]
+- expect [:start_tag, :name, nil]
+- expect [:start_tag, :first, nil]
+- expect [:text, "Bill"]
+- expect [:end_tag, :first]
+- expect [:start_tag, :last, nil]
+- expect [:text, "Smith"]
+- expect [:end_tag, :last]
+- expect [:end_tag, :name]
+- expect [:start_tag, :address, nil]
+- expect [:text, "Cincinnati"]
+- expect [:end_tag, :address]
+- expect [:end_tag, :entry]
+- expect [:start_tag, :entry, {:id => "2"}]
+- expect [:start_tag, :name, nil]
+- expect [:start_tag, :first, nil]
+- expect [:text, "John"]
+- expect [:end_tag, :first]
+- expect [:start_tag, :last, nil]
+- expect [:text, "Doe"]
+- expect [:end_tag, :last]
+- expect [:end_tag, :name]
+- expect [:start_tag, :address, nil]
+- expect [:text, "Columbus"]
+- expect [:end_tag, :address]
+- expect [:end_tag, :entry]
+- expect [:end_tag, "address-book".intern]
+- expect_done
+- end
+-
+- def expect(value)
+- assert_equal value, @target.events.shift
+- end
+-
+- def expect_done
+- assert_nil @target.events.shift
+- end
+-
+-end
+Index: builder-2.1.2/test/test_markupbuilder.rb
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_markupbuilder.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,505 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'test/preload'
++require 'builder'
++require 'builder/xmlmarkup'
++
++class TestMarkup < Test::Unit::TestCase
++ def setup
++ @xml = Builder::XmlMarkup.new
++ end
++
++ def test_create
++ assert_not_nil @xml
++ end
++
++ def test_simple
++ @xml.simple
++ assert_equal "<simple/>", @xml.target!
++ end
++
++ def test_value
++ @xml.value("hi")
++ assert_equal "<value>hi</value>", @xml.target!
++ end
++
++ def test_nested
++ @xml.outer { |x| x.inner("x") }
++ assert_equal "<outer><inner>x</inner></outer>", @xml.target!
++ end
++
++ def test_attributes
++ @xml.ref(:id => 12)
++ assert_equal %{<ref id="12"/>}, @xml.target!
++ end
++
++ def test_string_attributes_are_quoted_by_default
++ @xml.ref(:id => "H&R")
++ assert_equal %{<ref id="H&R"/>}, @xml.target!
++ end
++
++ def test_symbol_attributes_are_unquoted_by_default
++ @xml.ref(:id => :"H&R")
++ assert_equal %{<ref id="H&R"/>}, @xml.target!
++ end
++
++ def test_attributes_quoted_can_be_turned_on
++ @xml = Builder::XmlMarkup.new
++ @xml.ref(:id => "<H&R \"block\">")
++ assert_equal %{<ref id="<H&R "block">"/>}, @xml.target!
++ end
++
++ def test_mixed_attribute_quoting_with_nested_builders
++ x = Builder::XmlMarkup.new(:target=>@xml)
++ @xml.ref(:id=>:"H&R") {
++ x.element(:tag=>"Long&Short")
++ }
++ assert_equal "<ref id=\"H&R\"><element tag=\"Long&Short\"/></ref>",
++ @xml.target!
++ end
++
++ def test_multiple_attributes
++ @xml.ref(:id => 12, :name => "bill")
++ assert_match %r{^<ref( id="12"| name="bill"){2}/>$}, @xml.target!
++ end
++
++ def test_attributes_with_text
++ @xml.a("link", :href=>"http://onestepback.org")
++ assert_equal %{<a href="http://onestepback.org">link</a>}, @xml.target!
++ end
++
++ def test_complex
++ @xml.body(:bg=>"#ffffff") { |x|
++ x.title("T", :style=>"red")
++ }
++ assert_equal %{<body bg="#ffffff"><title style="red">T</title></body>}, @xml.target!
++ end
++
++ def test_funky_symbol
++ @xml.tag!("non-ruby-token", :id=>1) { |x| x.ok }
++ assert_equal %{<non-ruby-token id="1"><ok/></non-ruby-token>}, @xml.target!
++ end
++
++ def test_tag_can_handle_private_method
++ @xml.tag!("loop", :id=>1) { |x| x.ok }
++ assert_equal %{<loop id="1"><ok/></loop>}, @xml.target!
++ end
++
++ def test_no_explicit_marker
++ @xml.p { |x| x.b("HI") }
++ assert_equal "<p><b>HI</b></p>", @xml.target!
++ end
++
++ def test_reference_local_vars
++ n = 3
++ @xml.ol { |x| n.times { x.li(n) } }
++ assert_equal "<ol><li>3</li><li>3</li><li>3</li></ol>", @xml.target!
++ end
++
++ def test_reference_methods
++ @xml.title { |x| x.a { x.b(name) } }
++ assert_equal "<title><a><b>bob</b></a></title>", @xml.target!
++ end
++
++ def test_append_text
++ @xml.p { |x| x.br; x.text! "HI" }
++ assert_equal "<p><br/>HI</p>", @xml.target!
++ end
++
++ def test_ambiguous_markup
++ ex = assert_raises(ArgumentError) {
++ @xml.h1("data1") { b }
++ }
++ assert_match /\btext\b/, ex.message
++ assert_match /\bblock\b/, ex.message
++ end
++
++ def test_capitalized_method
++ @xml.P { |x| x.B("hi"); x.BR(); x.EM { x.text! "world" } }
++ assert_equal "<P><B>hi</B><BR/><EM>world</EM></P>", @xml.target!
++ end
++
++ def test_escaping
++ @xml.div { |x| x.text! "<hi>"; x.em("H&R Block") }
++ assert_equal %{<div><hi><em>H&R Block</em></div>}, @xml.target!
++ end
++
++ def test_non_escaping
++ @xml.div("ns:xml"=>:"&xml;") { |x| x << "<h&i>"; x.em("H&R Block") }
++ assert_equal %{<div ns:xml="&xml;"><h&i><em>H&R Block</em></div>}, @xml.target!
++ end
++
++ def test_return_value
++ str = @xml.x("men")
++ assert_equal @xml.target!, str
++ end
++
++ def test_stacked_builders
++ b = Builder::XmlMarkup.new( :target => @xml )
++ b.div { @xml.span { @xml.a("text", :href=>"ref") } }
++ assert_equal "<div><span><a href=\"ref\">text</a></span></div>", @xml.target!
++ end
++
++ def name
++ "bob"
++ end
++end
++
++class TestAttributeEscaping < Test::Unit::TestCase
++
++ def setup
++ @xml = Builder::XmlMarkup.new
++ end
++
++ def test_element_gt
++ @xml.title('1<2')
++ assert_equal '<title>1<2</title>', @xml.target!
++ end
++
++ def test_element_amp
++ @xml.title('AT&T')
++ assert_equal '<title>AT&T</title>', @xml.target!
++ end
++
++ def test_element_amp2
++ @xml.title('&')
++ assert_equal '<title>&amp;</title>', @xml.target!
++ end
++
++ def test_attr_less
++ @xml.a(:title => '2>1')
++ assert_equal '<a title="2>1"/>', @xml.target!
++ end
++
++ def test_attr_amp
++ @xml.a(:title => 'AT&T')
++ assert_equal '<a title="AT&T"/>', @xml.target!
++ end
++
++ def test_attr_quot
++ @xml.a(:title => '"x"')
++ assert_equal '<a title=""x""/>', @xml.target!
++ end
++
++end
++
++class TestNameSpaces < Test::Unit::TestCase
++ def setup
++ @xml = Builder::XmlMarkup.new(:indent=>2)
++ end
++
++ def test_simple_name_spaces
++ @xml.rdf :RDF
++ assert_equal "<rdf:RDF/>\n", @xml.target!
++ end
++
++ def test_long
++ xml = Builder::XmlMarkup.new(:indent=>2)
++ xml.instruct!
++ xml.rdf :RDF,
++ "xmlns:rdf" => :"&rdf;",
++ "xmlns:rdfs" => :"&rdfs;",
++ "xmlns:xsd" => :"&xsd;",
++ "xmlns:owl" => :"&owl;" do
++ xml.owl :Class, :'rdf:ID'=>'Bird' do
++ xml.rdfs :label, 'bird'
++ xml.rdfs :subClassOf do
++ xml.owl :Restriction do
++ xml.owl :onProperty, 'rdf:resource'=>'#wingspan'
++ xml.owl :maxCardinality,1,'rdf:datatype'=>'&xsd;nonNegativeInteger'
++ end
++ end
++ end
++ end
++ assert_match /^<\?xml/, xml.target!
++ assert_match /\n<rdf:RDF/m, xml.target!
++ assert_match /xmlns:rdf="&rdf;"/m, xml.target!
++ assert_match /<owl:Restriction>/m, xml.target!
++ end
++
++end
++
++class TestDeclarations < Test::Unit::TestCase
++ def setup
++ @xml = Builder::XmlMarkup.new(:indent=>2)
++ end
++
++ def test_declare
++ @xml.declare! :element
++ assert_equal "<!element>\n", @xml.target!
++ end
++
++ def test_bare_arg
++ @xml.declare! :element, :arg
++ assert_equal"<!element arg>\n", @xml.target!
++ end
++
++ def test_string_arg
++ @xml.declare! :element, "string"
++ assert_equal"<!element \"string\">\n", @xml.target!
++ end
++
++ def test_mixed_args
++ @xml.declare! :element, :x, "y", :z, "-//OASIS//DTD DocBook XML//EN"
++ assert_equal "<!element x \"y\" z \"-//OASIS//DTD DocBook XML//EN\">\n", @xml.target!
++ end
++
++ def test_nested_declarations
++ @xml = Builder::XmlMarkup.new
++ @xml.declare! :DOCTYPE, :chapter do |x|
++ x.declare! :ELEMENT, :chapter, "(title,para+)".intern
++ end
++ assert_equal "<!DOCTYPE chapter [<!ELEMENT chapter (title,para+)>]>", @xml.target!
++ end
++
++ def test_nested_indented_declarations
++ @xml.declare! :DOCTYPE, :chapter do |x|
++ x.declare! :ELEMENT, :chapter, "(title,para+)".intern
++ end
++ assert_equal "<!DOCTYPE chapter [\n <!ELEMENT chapter (title,para+)>\n]>\n", @xml.target!
++ end
++
++ def test_complex_declaration
++ @xml.declare! :DOCTYPE, :chapter do |x|
++ x.declare! :ELEMENT, :chapter, "(title,para+)".intern
++ x.declare! :ELEMENT, :title, "(#PCDATA)".intern
++ x.declare! :ELEMENT, :para, "(#PCDATA)".intern
++ end
++ expected = %{<!DOCTYPE chapter [
++ <!ELEMENT chapter (title,para+)>
++ <!ELEMENT title (#PCDATA)>
++ <!ELEMENT para (#PCDATA)>
++]>
++}
++ assert_equal expected, @xml.target!
++ end
++end
++
++
++class TestSpecialMarkup < Test::Unit::TestCase
++ def setup
++ @xml = Builder::XmlMarkup.new(:indent=>2)
++ end
++
++ def test_comment
++ @xml.comment!("COMMENT")
++ assert_equal "<!-- COMMENT -->\n", @xml.target!
++ end
++
++ def test_indented_comment
++ @xml.p { @xml.comment! "OK" }
++ assert_equal "<p>\n <!-- OK -->\n</p>\n", @xml.target!
++ end
++
++ def test_instruct
++ @xml.instruct! :abc, :version=>"0.9"
++ assert_equal "<?abc version=\"0.9\"?>\n", @xml.target!
++ end
++
++ def test_indented_instruct
++ @xml.p { @xml.instruct! :xml }
++ assert_match %r{<p>\n <\?xml version="1.0" encoding="UTF-8"\?>\n</p>\n},
++ @xml.target!
++ end
++
++ def test_instruct_without_attributes
++ @xml.instruct! :zz
++ assert_equal "<?zz?>\n", @xml.target!
++ end
++
++ def test_xml_instruct
++ @xml.instruct!
++ assert_match /^<\?xml version="1.0" encoding="UTF-8"\?>$/, @xml.target!
++ end
++
++ def test_xml_instruct_with_overrides
++ @xml.instruct! :xml, :encoding=>"UCS-2"
++ assert_match /^<\?xml version="1.0" encoding="UCS-2"\?>$/, @xml.target!
++ end
++
++ def test_xml_instruct_with_standalong
++ @xml.instruct! :xml, :encoding=>"UCS-2", :standalone=>"yes"
++ assert_match /^<\?xml version="1.0" encoding="UCS-2" standalone="yes"\?>$/, @xml.target!
++ end
++
++ def test_no_blocks
++ assert_raises(Builder::IllegalBlockError) do
++ @xml.instruct! { |x| x.hi }
++ end
++ assert_raises(Builder::IllegalBlockError) do
++ @xml.comment!(:element) { |x| x.hi }
++ end
++ end
++
++ def test_cdata
++ @xml.cdata!("TEST")
++ assert_equal "<![CDATA[TEST]]>\n", @xml.target!
++ end
++
++ def test_cdata_with_ampersand
++ @xml.cdata!("TEST&CHECK")
++ assert_equal "<![CDATA[TEST&CHECK]]>\n", @xml.target!
++ end
++end
++
++class TestIndentedXmlMarkup < Test::Unit::TestCase
++ def setup
++ @xml = Builder::XmlMarkup.new(:indent=>2)
++ end
++
++ def test_one_level
++ @xml.ol { |x| x.li "text" }
++ assert_equal "<ol>\n <li>text</li>\n</ol>\n", @xml.target!
++ end
++
++ def test_two_levels
++ @xml.p { |x|
++ x.ol { x.li "text" }
++ x.br
++ }
++ assert_equal "<p>\n <ol>\n <li>text</li>\n </ol>\n <br/>\n</p>\n", @xml.target!
++ end
++
++ def test_initial_level
++ @xml = Builder::XmlMarkup.new(:indent=>2, :margin=>4)
++ @xml.name { |x| x.first("Jim") }
++ assert_equal " <name>\n <first>Jim</first>\n </name>\n", @xml.target!
++ end
++
++ class TestUtfMarkup < Test::Unit::TestCase
++ def setup
++ @old_kcode = $KCODE
++ end
++
++ def teardown
++ $KCODE = @old_kcode
++ end
++
++ def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
++ $KCODE = 'NONE'
++ xml = Builder::XmlMarkup.new
++ xml.p("\xE2\x80\x99")
++ assert_match(%r(<p>’</p>), xml.target!) #
++ end
++
++ def test_use_entities_if_encoding_is_utf_but_kcode_is_not
++ $KCODE = 'NONE'
++ xml = Builder::XmlMarkup.new
++ xml.instruct!(:xml, :encoding => 'UTF-8')
++ xml.p("\xE2\x80\x99")
++ assert_match(%r(<p>’</p>), xml.target!) #
++ end
++
++ def test_use_entities_if_kcode_is_utf_but_encoding_is_something_else
++ $KCODE = 'UTF8'
++ xml = Builder::XmlMarkup.new
++ xml.instruct!(:xml, :encoding => 'UTF-16')
++ xml.p("\xE2\x80\x99")
++ assert_match(%r(<p>’</p>), xml.target!) #
++ end
++
++ def test_use_utf8_if_encoding_defaults_and_kcode_is_utf8
++ $KCODE = 'UTF8'
++ xml = Builder::XmlMarkup.new
++ xml.p("\xE2\x80\x99")
++ assert_equal "<p>\xE2\x80\x99</p>", xml.target!
++ end
++
++ def test_use_utf8_if_both_encoding_and_kcode_are_utf8
++ $KCODE = 'UTF8'
++ xml = Builder::XmlMarkup.new
++ xml.instruct!(:xml, :encoding => 'UTF-8')
++ xml.p("\xE2\x80\x99")
++ assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
++ end
++
++ def test_use_utf8_if_both_encoding_and_kcode_are_utf8_with_lowercase
++ $KCODE = 'UTF8'
++ xml = Builder::XmlMarkup.new
++ xml.instruct!(:xml, :encoding => 'utf-8')
++ xml.p("\xE2\x80\x99")
++ assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
++ end
++ end
++
++ class TestXmlEvents < Test::Unit::TestCase
++ def setup
++ @handler = EventHandler.new
++ @xe = Builder::XmlEvents.new(:target=>@handler)
++ end
++
++ def test_simple
++ @xe.p
++ assert_equal [:start, :p, nil], @handler.events.shift
++ assert_equal [:end, :p], @handler.events.shift
++ end
++
++ def test_text
++ @xe.p("HI")
++ assert_equal [:start, :p, nil], @handler.events.shift
++ assert_equal [:text, "HI"], @handler.events.shift
++ assert_equal [:end, :p], @handler.events.shift
++ end
++
++ def test_attributes
++ @xe.p("id"=>"2")
++ ev = @handler.events.shift
++ assert_equal [:start, :p], ev[0,2]
++ assert_equal "2", ev[2]['id']
++ assert_equal [:end, :p], @handler.events.shift
++ end
++
++ def test_indented
++ @xml = Builder::XmlEvents.new(:indent=>2, :target=>@handler)
++ @xml.p { |x| x.b("HI") }
++ assert_equal [:start, :p, nil], @handler.events.shift
++ assert_equal "\n ", pop_text
++ assert_equal [:start, :b, nil], @handler.events.shift
++ assert_equal "HI", pop_text
++ assert_equal [:end, :b], @handler.events.shift
++ assert_equal "\n", pop_text
++ assert_equal [:end, :p], @handler.events.shift
++ end
++
++ def pop_text
++ result = ''
++ while ! @handler.events.empty? && @handler.events[0][0] == :text
++ result << @handler.events[0][1]
++ @handler.events.shift
++ end
++ result
++ end
++
++ class EventHandler
++ attr_reader :events
++ def initialize
++ @events = []
++ end
++
++ def start_tag(sym, attrs)
++ @events << [:start, sym, attrs]
++ end
++
++ def end_tag(sym)
++ @events << [:end, sym]
++ end
++
++ def text(txt)
++ @events << [:text, txt]
++ end
++ end
++ end
++
++end
++
+Index: builder-2.1.2/test/testmarkupbuilder.rb
+===================================================================
+--- builder-2.1.2.orig/test/testmarkupbuilder.rb 2007-06-15 06:58:44.000000000 +0200
++++ /dev/null 1970-01-01 00:00:00.000000000 +0000
+@@ -1,449 +0,0 @@
+-#!/usr/bin/env ruby
+-
+-#--
+-# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
+-# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
+-# All rights reserved.
+-
+-# Permission is granted for use, copying, modification, distribution,
+-# and distribution of modified versions of this work as long as the
+-# above copyright notice is included.
+-#++
+-
+-require 'test/unit'
+-require 'test/preload'
+-require 'builder'
+-require 'builder/xmlmarkup'
+-
+-class TestMarkup < Test::Unit::TestCase
+- def setup
+- @xml = Builder::XmlMarkup.new
+- end
+-
+- def test_create
+- assert_not_nil @xml
+- end
+-
+- def test_simple
+- @xml.simple
+- assert_equal "<simple/>", @xml.target!
+- end
+-
+- def test_value
+- @xml.value("hi")
+- assert_equal "<value>hi</value>", @xml.target!
+- end
+-
+- def test_nested
+- @xml.outer { |x| x.inner("x") }
+- assert_equal "<outer><inner>x</inner></outer>", @xml.target!
+- end
+-
+- def test_attributes
+- @xml.ref(:id => 12)
+- assert_equal %{<ref id="12"/>}, @xml.target!
+- end
+-
+- def test_string_attributes_are_quoted_by_default
+- @xml.ref(:id => "H&R")
+- assert_equal %{<ref id="H&R"/>}, @xml.target!
+- end
+-
+- def test_symbol_attributes_are_unquoted_by_default
+- @xml.ref(:id => :"H&R")
+- assert_equal %{<ref id="H&R"/>}, @xml.target!
+- end
+-
+- def test_attributes_quoted_can_be_turned_on
+- @xml = Builder::XmlMarkup.new
+- @xml.ref(:id => "<H&R \"block\">")
+- assert_equal %{<ref id="<H&R "block">"/>}, @xml.target!
+- end
+-
+- def test_mixed_attribute_quoting_with_nested_builders
+- x = Builder::XmlMarkup.new(:target=>@xml)
+- @xml.ref(:id=>:"H&R") {
+- x.element(:tag=>"Long&Short")
+- }
+- assert_equal "<ref id=\"H&R\"><element tag=\"Long&Short\"/></ref>",
+- @xml.target!
+- end
+-
+- def test_multiple_attributes
+- @xml.ref(:id => 12, :name => "bill")
+- assert_match %r{^<ref( id="12"| name="bill"){2}/>$}, @xml.target!
+- end
+-
+- def test_attributes_with_text
+- @xml.a("link", :href=>"http://onestepback.org")
+- assert_equal %{<a href="http://onestepback.org">link</a>}, @xml.target!
+- end
+-
+- def test_complex
+- @xml.body(:bg=>"#ffffff") { |x|
+- x.title("T", :style=>"red")
+- }
+- assert_equal %{<body bg="#ffffff"><title style="red">T</title></body>}, @xml.target!
+- end
+-
+- def test_funky_symbol
+- @xml.tag!("non-ruby-token", :id=>1) { |x| x.ok }
+- assert_equal %{<non-ruby-token id="1"><ok/></non-ruby-token>}, @xml.target!
+- end
+-
+- def test_tag_can_handle_private_method
+- @xml.tag!("loop", :id=>1) { |x| x.ok }
+- assert_equal %{<loop id="1"><ok/></loop>}, @xml.target!
+- end
+-
+- def test_no_explicit_marker
+- @xml.p { |x| x.b("HI") }
+- assert_equal "<p><b>HI</b></p>", @xml.target!
+- end
+-
+- def test_reference_local_vars
+- n = 3
+- @xml.ol { |x| n.times { x.li(n) } }
+- assert_equal "<ol><li>3</li><li>3</li><li>3</li></ol>", @xml.target!
+- end
+-
+- def test_reference_methods
+- @xml.title { |x| x.a { x.b(name) } }
+- assert_equal "<title><a><b>bob</b></a></title>", @xml.target!
+- end
+-
+- def test_append_text
+- @xml.p { |x| x.br; x.text! "HI" }
+- assert_equal "<p><br/>HI</p>", @xml.target!
+- end
+-
+- def test_ambiguous_markup
+- ex = assert_raises(ArgumentError) {
+- @xml.h1("data1") { b }
+- }
+- assert_match /\btext\b/, ex.message
+- assert_match /\bblock\b/, ex.message
+- end
+-
+- def test_capitalized_method
+- @xml.P { |x| x.B("hi"); x.BR(); x.EM { x.text! "world" } }
+- assert_equal "<P><B>hi</B><BR/><EM>world</EM></P>", @xml.target!
+- end
+-
+- def test_escaping
+- @xml.div { |x| x.text! "<hi>"; x.em("H&R Block") }
+- assert_equal %{<div><hi><em>H&R Block</em></div>}, @xml.target!
+- end
+-
+- def test_non_escaping
+- @xml.div("ns:xml"=>:"&xml;") { |x| x << "<h&i>"; x.em("H&R Block") }
+- assert_equal %{<div ns:xml="&xml;"><h&i><em>H&R Block</em></div>}, @xml.target!
+- end
+-
+- def test_return_value
+- str = @xml.x("men")
+- assert_equal @xml.target!, str
+- end
+-
+- def test_stacked_builders
+- b = Builder::XmlMarkup.new( :target => @xml )
+- b.div { @xml.span { @xml.a("text", :href=>"ref") } }
+- assert_equal "<div><span><a href=\"ref\">text</a></span></div>", @xml.target!
+- end
+-
+- def name
+- "bob"
+- end
+-end
+-
+-class TestAttributeEscaping < Test::Unit::TestCase
+-
+- def setup
+- @xml = Builder::XmlMarkup.new
+- end
+-
+- def test_element_gt
+- @xml.title('1<2')
+- assert_equal '<title>1<2</title>', @xml.target!
+- end
+-
+- def test_element_amp
+- @xml.title('AT&T')
+- assert_equal '<title>AT&T</title>', @xml.target!
+- end
+-
+- def test_element_amp2
+- @xml.title('&')
+- assert_equal '<title>&amp;</title>', @xml.target!
+- end
+-
+- def test_attr_less
+- @xml.a(:title => '2>1')
+- assert_equal '<a title="2>1"/>', @xml.target!
+- end
+-
+- def test_attr_amp
+- @xml.a(:title => 'AT&T')
+- assert_equal '<a title="AT&T"/>', @xml.target!
+- end
+-
+- def test_attr_quot
+- @xml.a(:title => '"x"')
+- assert_equal '<a title=""x""/>', @xml.target!
+- end
+-
+-end
+-
+-class TestNameSpaces < Test::Unit::TestCase
+- def setup
+- @xml = Builder::XmlMarkup.new(:indent=>2)
+- end
+-
+- def test_simple_name_spaces
+- @xml.rdf :RDF
+- assert_equal "<rdf:RDF/>\n", @xml.target!
+- end
+-
+- def test_long
+- xml = Builder::XmlMarkup.new(:indent=>2)
+- xml.instruct!
+- xml.rdf :RDF,
+- "xmlns:rdf" => :"&rdf;",
+- "xmlns:rdfs" => :"&rdfs;",
+- "xmlns:xsd" => :"&xsd;",
+- "xmlns:owl" => :"&owl;" do
+- xml.owl :Class, :'rdf:ID'=>'Bird' do
+- xml.rdfs :label, 'bird'
+- xml.rdfs :subClassOf do
+- xml.owl :Restriction do
+- xml.owl :onProperty, 'rdf:resource'=>'#wingspan'
+- xml.owl :maxCardinality,1,'rdf:datatype'=>'&xsd;nonNegativeInteger'
+- end
+- end
+- end
+- end
+- assert_match /^<\?xml/, xml.target!
+- assert_match /\n<rdf:RDF/m, xml.target!
+- assert_match /xmlns:rdf="&rdf;"/m, xml.target!
+- assert_match /<owl:Restriction>/m, xml.target!
+- end
+-
+-end
+-
+-class TestDeclarations < Test::Unit::TestCase
+- def setup
+- @xml = Builder::XmlMarkup.new(:indent=>2)
+- end
+-
+- def test_declare
+- @xml.declare! :element
+- assert_equal "<!element>\n", @xml.target!
+- end
+-
+- def test_bare_arg
+- @xml.declare! :element, :arg
+- assert_equal"<!element arg>\n", @xml.target!
+- end
+-
+- def test_string_arg
+- @xml.declare! :element, "string"
+- assert_equal"<!element \"string\">\n", @xml.target!
+- end
+-
+- def test_mixed_args
+- @xml.declare! :element, :x, "y", :z, "-//OASIS//DTD DocBook XML//EN"
+- assert_equal "<!element x \"y\" z \"-//OASIS//DTD DocBook XML//EN\">\n", @xml.target!
+- end
+-
+- def test_nested_declarations
+- @xml = Builder::XmlMarkup.new
+- @xml.declare! :DOCTYPE, :chapter do |x|
+- x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+- end
+- assert_equal "<!DOCTYPE chapter [<!ELEMENT chapter (title,para+)>]>", @xml.target!
+- end
+-
+- def test_nested_indented_declarations
+- @xml.declare! :DOCTYPE, :chapter do |x|
+- x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+- end
+- assert_equal "<!DOCTYPE chapter [\n <!ELEMENT chapter (title,para+)>\n]>\n", @xml.target!
+- end
+-
+- def test_complex_declaration
+- @xml.declare! :DOCTYPE, :chapter do |x|
+- x.declare! :ELEMENT, :chapter, "(title,para+)".intern
+- x.declare! :ELEMENT, :title, "(#PCDATA)".intern
+- x.declare! :ELEMENT, :para, "(#PCDATA)".intern
+- end
+- expected = %{<!DOCTYPE chapter [
+- <!ELEMENT chapter (title,para+)>
+- <!ELEMENT title (#PCDATA)>
+- <!ELEMENT para (#PCDATA)>
+-]>
+-}
+- assert_equal expected, @xml.target!
+- end
+-end
+-
+-
+-class TestSpecialMarkup < Test::Unit::TestCase
+- def setup
+- @xml = Builder::XmlMarkup.new(:indent=>2)
+- end
+-
+- def test_comment
+- @xml.comment!("COMMENT")
+- assert_equal "<!-- COMMENT -->\n", @xml.target!
+- end
+-
+- def test_indented_comment
+- @xml.p { @xml.comment! "OK" }
+- assert_equal "<p>\n <!-- OK -->\n</p>\n", @xml.target!
+- end
+-
+- def test_instruct
+- @xml.instruct! :abc, :version=>"0.9"
+- assert_equal "<?abc version=\"0.9\"?>\n", @xml.target!
+- end
+-
+- def test_indented_instruct
+- @xml.p { @xml.instruct! :xml }
+- assert_match %r{<p>\n <\?xml version="1.0" encoding="UTF-8"\?>\n</p>\n},
+- @xml.target!
+- end
+-
+- def test_instruct_without_attributes
+- @xml.instruct! :zz
+- assert_equal "<?zz?>\n", @xml.target!
+- end
+-
+- def test_xml_instruct
+- @xml.instruct!
+- assert_match /^<\?xml version="1.0" encoding="UTF-8"\?>$/, @xml.target!
+- end
+-
+- def test_xml_instruct_with_overrides
+- @xml.instruct! :xml, :encoding=>"UCS-2"
+- assert_match /^<\?xml version="1.0" encoding="UCS-2"\?>$/, @xml.target!
+- end
+-
+- def test_xml_instruct_with_standalong
+- @xml.instruct! :xml, :encoding=>"UCS-2", :standalone=>"yes"
+- assert_match /^<\?xml version="1.0" encoding="UCS-2" standalone="yes"\?>$/, @xml.target!
+- end
+-
+- def test_no_blocks
+- assert_raises(Builder::IllegalBlockError) do
+- @xml.instruct! { |x| x.hi }
+- end
+- assert_raises(Builder::IllegalBlockError) do
+- @xml.comment!(:element) { |x| x.hi }
+- end
+- end
+-
+- def test_cdata
+- @xml.cdata!("TEST")
+- assert_equal "<![CDATA[TEST]]>\n", @xml.target!
+- end
+-
+- def test_cdata_with_ampersand
+- @xml.cdata!("TEST&CHECK")
+- assert_equal "<![CDATA[TEST&CHECK]]>\n", @xml.target!
+- end
+-end
+-
+-class TestIndentedXmlMarkup < Test::Unit::TestCase
+- def setup
+- @xml = Builder::XmlMarkup.new(:indent=>2)
+- end
+-
+- def test_one_level
+- @xml.ol { |x| x.li "text" }
+- assert_equal "<ol>\n <li>text</li>\n</ol>\n", @xml.target!
+- end
+-
+- def test_two_levels
+- @xml.p { |x|
+- x.ol { x.li "text" }
+- x.br
+- }
+- assert_equal "<p>\n <ol>\n <li>text</li>\n </ol>\n <br/>\n</p>\n", @xml.target!
+- end
+-
+- def test_initial_level
+- @xml = Builder::XmlMarkup.new(:indent=>2, :margin=>4)
+- @xml.name { |x| x.first("Jim") }
+- assert_equal " <name>\n <first>Jim</first>\n </name>\n", @xml.target!
+- end
+-
+- class TestXmlEvents < Test::Unit::TestCase
+- def setup
+- @handler = EventHandler.new
+- @xe = Builder::XmlEvents.new(:target=>@handler)
+- end
+-
+- def test_simple
+- @xe.p
+- assert_equal [:start, :p, nil], @handler.events.shift
+- assert_equal [:end, :p], @handler.events.shift
+- end
+-
+- def test_text
+- @xe.p("HI")
+- assert_equal [:start, :p, nil], @handler.events.shift
+- assert_equal [:text, "HI"], @handler.events.shift
+- assert_equal [:end, :p], @handler.events.shift
+- end
+-
+- def test_attributes
+- @xe.p("id"=>"2")
+- ev = @handler.events.shift
+- assert_equal [:start, :p], ev[0,2]
+- assert_equal "2", ev[2]['id']
+- assert_equal [:end, :p], @handler.events.shift
+- end
+-
+- def test_indented
+- @xml = Builder::XmlEvents.new(:indent=>2, :target=>@handler)
+- @xml.p { |x| x.b("HI") }
+- assert_equal [:start, :p, nil], @handler.events.shift
+- assert_equal "\n ", pop_text
+- assert_equal [:start, :b, nil], @handler.events.shift
+- assert_equal "HI", pop_text
+- assert_equal [:end, :b], @handler.events.shift
+- assert_equal "\n", pop_text
+- assert_equal [:end, :p], @handler.events.shift
+- end
+-
+- def pop_text
+- result = ''
+- while ! @handler.events.empty? && @handler.events[0][0] == :text
+- result << @handler.events[0][1]
+- @handler.events.shift
+- end
+- result
+- end
+-
+- class EventHandler
+- attr_reader :events
+- def initialize
+- @events = []
+- end
+-
+- def start_tag(sym, attrs)
+- @events << [:start, sym, attrs]
+- end
+-
+- def end_tag(sym)
+- @events << [:end, sym]
+- end
+-
+- def text(txt)
+- @events << [:text, txt]
+- end
+- end
+- end
+-
+-end
+-
+Index: builder-2.1.2/test/test_namecollision.rb
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ builder-2.1.2/test/test_namecollision.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -0,0 +1,39 @@
++#!/usr/bin/env ruby
++
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++require 'test/unit'
++require 'builder/xchar'
++
++class TestNameCollisions < Test::Unit::TestCase
++ module Collide
++ def xchr
++ end
++ end
++
++ def test_no_collision
++ assert_nothing_raised do
++ Builder.check_for_name_collision(Collide, :not_defined)
++ end
++ end
++
++ def test_collision
++ assert_raise RuntimeError do
++ Builder.check_for_name_collision(Collide, "xchr")
++ end
++ end
++
++ def test_collision_with_symbol
++ assert_raise RuntimeError do
++ Builder.check_for_name_collision(Collide, :xchr)
++ end
++ end
++end
+Index: builder-2.1.2/test/test_xchar.rb
+===================================================================
+--- builder-2.1.2.orig/test/test_xchar.rb 2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/test/test_xchar.rb 2010-03-21 16:37:51.000000000 +0100
+@@ -1,5 +1,17 @@
+ #!/usr/bin/env ruby
+
++#--
++# Portions copyright 2004 by Jim Weirich (jim at weirichhouse.org).
++# Portions copyright 2005 by Sam Ruby (rubys at intertwingly.net).
++# All rights reserved.
++
++# Permission is granted for use, copying, modification, distribution,
++# and distribution of modified versions of this work as long as the
++# above copyright notice is included.
++#++
++
++#!/usr/bin/env ruby
++
+ require 'test/unit'
+ require 'builder/xchar'
+
+@@ -34,4 +46,11 @@
+ assert_equal '’', "\xE2\x80\x99".to_xs # right single quote
+ assert_equal '©', "\xC2\xA9".to_xs # copy
+ end
++
++ def test_utf8_verbatim
++ assert_equal "\xE2\x80\x99", "\xE2\x80\x99".to_xs(false) # right single quote
++ assert_equal "\xC2\xA9", "\xC2\xA9".to_xs(false) # copy
++ assert_equal "\xC2\xA9&\xC2\xA9",
++ "\xC2\xA9&\xC2\xA9".to_xs(false) # copy with ampersand
++ end
+ end
Deleted: trunk/libbuilder-ruby/debian/patches/ruby_1.9
===================================================================
--- trunk/libbuilder-ruby/debian/patches/ruby_1.9 2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/patches/ruby_1.9 2010-03-21 15:55:34 UTC (rev 4989)
@@ -1,597 +0,0 @@
-Index: test/test_blankslate.rb
-===================================================================
---- test/test_blankslate.rb (revision 110)
-+++ test/test_blankslate.rb (working copy)
-@@ -71,6 +71,13 @@
- # Test case for blank slate.
- #
- class TestBlankSlate < Test::Unit::TestCase
-+ if Object::const_defined?(:BasicObject)
-+ def self.suite
-+ # skip tests if :BasicObject is present
-+ Test::Unit::TestSuite.new(name)
-+ end
-+ end
-+
- def setup
- @bs = BlankSlate.new
- end
-Index: test/test_xchar.rb
-===================================================================
---- test/test_xchar.rb (revision 110)
-+++ test/test_xchar.rb (working copy)
-@@ -3,7 +3,28 @@
- require 'test/unit'
- require 'builder/xchar'
-
-+if String.method_defined?(:encode)
-+ class String
-+ ENCODING_BINARY = Encoding.find('BINARY')
-+
-+ # shim method for testing purposes
-+ def to_xs(escape=true)
-+ raise NameError.new('to_xs') unless caller[0].index(__FILE__)
-+
-+ result = Builder::XChar.encode(self)
-+ if escape
-+ result.gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}
-+ else
-+ # really only useful for testing purposes
-+ result.force_encoding(ENCODING_BINARY)
-+ end
-+ end
-+ end
-+end
-+
- class TestXmlEscaping < Test::Unit::TestCase
-+ REPLACEMENT_CHAR = Builder::XChar::REPLACEMENT_CHAR.to_xs
-+
- def test_ascii
- assert_equal 'abc', 'abc'.to_xs
- end
-@@ -15,9 +36,9 @@
- end
-
- def test_invalid
-- assert_equal '*', "\x00".to_xs # null
-- assert_equal '*', "\x0C".to_xs # form feed
-- assert_equal '*', "\xEF\xBF\xBF".to_xs # U+FFFF
-+ assert_equal REPLACEMENT_CHAR, "\x00".to_xs # null
-+ assert_equal REPLACEMENT_CHAR, "\x0C".to_xs # form feed
-+ assert_equal REPLACEMENT_CHAR, "\xEF\xBF\xBF".to_xs # U+FFFF
- end
-
- def test_iso_8859_1
-Index: test/test_markupbuilder.rb
-===================================================================
---- test/test_markupbuilder.rb (revision 110)
-+++ test/test_markupbuilder.rb (working copy)
-@@ -118,7 +118,7 @@
- end
-
- def test_ambiguous_markup
-- ex = assert_raises(ArgumentError) {
-+ ex = assert_raise(ArgumentError) {
- @xml.h1("data1") { b }
- }
- assert_match /\btext\b/, ex.message
-@@ -228,6 +228,22 @@
- assert_match /<owl:Restriction>/m, xml.target!
- end
-
-+ def test_ensure
-+ xml = Builder::XmlMarkup.new
-+ xml.html do
-+ xml.body do
-+ begin
-+ xml.p do
-+ raise Exception.new('boom')
-+ end
-+ rescue Exception => e
-+ xml.pre e
-+ end
-+ end
-+ end
-+ assert_match %r{<p>}, xml.target!
-+ assert_match %r{</p>}, xml.target!
-+ end
- end
-
- class TestDeclarations < Test::Unit::TestCase
-@@ -334,10 +350,10 @@
- end
-
- def test_no_blocks
-- assert_raises(Builder::IllegalBlockError) do
-+ assert_raise(Builder::IllegalBlockError) do
- @xml.instruct! { |x| x.hi }
- end
-- assert_raises(Builder::IllegalBlockError) do
-+ assert_raise(Builder::IllegalBlockError) do
- @xml.comment!(:element) { |x| x.hi }
- end
- end
-@@ -378,58 +394,83 @@
- end
-
- class TestUtfMarkup < Test::Unit::TestCase
-- def setup
-- @old_kcode = $KCODE
-- end
-+ if ! String.method_defined?(:encode)
-+ def setup
-+ @old_kcode = $KCODE
-+ end
-
-- def teardown
-- $KCODE = @old_kcode
-- end
-+ def teardown
-+ $KCODE = @old_kcode
-+ end
-
-- def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
-- $KCODE = 'NONE'
-- xml = Builder::XmlMarkup.new
-- xml.p("\xE2\x80\x99")
-- assert_match(%r(<p>’</p>), xml.target!) #
-+ def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
-+ $KCODE = 'NONE'
-+ xml = Builder::XmlMarkup.new
-+ xml.p("\xE2\x80\x99")
-+ assert_match(%r(<p>’</p>), xml.target!) #
-+ end
-+
-+ def test_use_entities_if_encoding_is_utf_but_kcode_is_not
-+ $KCODE = 'NONE'
-+ xml = Builder::XmlMarkup.new
-+ xml.instruct!(:xml, :encoding => 'UTF-8')
-+ xml.p("\xE2\x80\x99")
-+ assert_match(%r(<p>’</p>), xml.target!) #
-+ end
-+ else
-+ # change in behavior. As there is no $KCODE anymore, the default
-+ # moves from "does not understand utf-8" to "supports utf-8".
-+
-+ def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
-+ xml = Builder::XmlMarkup.new
-+ xml.p("\xE2\x80\x99")
-+ assert_match("<p>\u2019</p>", xml.target!) #
-+ end
-+
-+ def test_use_entities_if_encoding_is_utf_but_kcode_is_not
-+ xml = Builder::XmlMarkup.new
-+ xml.instruct!(:xml, :encoding => 'UTF-8')
-+ xml.p("\xE2\x80\x99")
-+ assert_match("<p>\u2019</p>", xml.target!) #
-+ end
- end
-
-- def test_use_entities_if_encoding_is_utf_but_kcode_is_not
-- $KCODE = 'NONE'
-- xml = Builder::XmlMarkup.new
-- xml.instruct!(:xml, :encoding => 'UTF-8')
-- xml.p("\xE2\x80\x99")
-- assert_match(%r(<p>’</p>), xml.target!) #
-+ def encode string, encoding
-+ if !String.method_defined?(:encode)
-+ $KCODE = encoding
-+ string
-+ elsif encoding == 'UTF8'
-+ string.force_encoding('UTF-8')
-+ else
-+ string
-+ end
- end
-
- def test_use_entities_if_kcode_is_utf_but_encoding_is_something_else
-- $KCODE = 'UTF8'
- xml = Builder::XmlMarkup.new
- xml.instruct!(:xml, :encoding => 'UTF-16')
-- xml.p("\xE2\x80\x99")
-+ xml.p(encode("\xE2\x80\x99", 'UTF8'))
- assert_match(%r(<p>’</p>), xml.target!) #
- end
-
- def test_use_utf8_if_encoding_defaults_and_kcode_is_utf8
-- $KCODE = 'UTF8'
- xml = Builder::XmlMarkup.new
-- xml.p("\xE2\x80\x99")
-- assert_equal "<p>\xE2\x80\x99</p>", xml.target!
-+ xml.p(encode("\xE2\x80\x99",'UTF8'))
-+ assert_equal encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
- end
-
- def test_use_utf8_if_both_encoding_and_kcode_are_utf8
-- $KCODE = 'UTF8'
- xml = Builder::XmlMarkup.new
- xml.instruct!(:xml, :encoding => 'UTF-8')
-- xml.p("\xE2\x80\x99")
-- assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
-+ xml.p(encode("\xE2\x80\x99",'UTF8'))
-+ assert_match encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
- end
-
- def test_use_utf8_if_both_encoding_and_kcode_are_utf8_with_lowercase
-- $KCODE = 'UTF8'
- xml = Builder::XmlMarkup.new
- xml.instruct!(:xml, :encoding => 'utf-8')
-- xml.p("\xE2\x80\x99")
-- assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
-+ xml.p(encode("\xE2\x80\x99",'UTF8'))
-+ assert_match encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
- end
- end
-
-Index: Rakefile
-===================================================================
---- Rakefile (revision 110)
-+++ Rakefile (working copy)
-@@ -68,7 +68,7 @@
-
- BLANKSLATE_FILES = FileList[
- 'lib/blankslate.rb',
-- 'test/testblankslate.rb'
-+ 'test/test_blankslate.rb'
- ]
-
- if ! defined?(Gem)
-Index: lib/builder/blankslate.rb
-===================================================================
---- lib/builder/blankslate.rb (revision 110)
-+++ lib/builder/blankslate.rb (working copy)
-@@ -8,13 +8,16 @@
- # above copyright notice is included.
- #++
-
--require 'blankslate'
--
- ######################################################################
- # BlankSlate has been promoted to a top level name and is now
- # available as a standalone gem. We make the name available in the
- # Builder namespace for compatibility.
- #
- module Builder
-- BlankSlate = ::BlankSlate
-+ if Object::const_defined?(:BasicObject)
-+ BlankSlate = ::BasicObject
-+ else
-+ require 'blankslate'
-+ BlankSlate = ::BlankSlate
-+ end
- end
-Index: lib/builder/xmlmarkup.rb
-===================================================================
---- lib/builder/xmlmarkup.rb (revision 110)
-+++ lib/builder/xmlmarkup.rb (working copy)
-@@ -195,7 +195,7 @@
- end
-
- def comment!(comment_text)
-- _ensure_no_block block_given?
-+ _ensure_no_block ::Kernel::block_given?
- _special("<!-- ", " -->", comment_text, nil)
- end
-
-@@ -210,13 +210,13 @@
- @target << "<!#{inst}"
- args.each do |arg|
- case arg
-- when String
-+ when ::String
- @target << %{ "#{arg}"} # " WART
-- when Symbol
-+ when ::Symbol
- @target << " #{arg}"
- end
- end
-- if block_given?
-+ if ::Kernel::block_given?
- @target << " ["
- _newline
- _nested_structures(block)
-@@ -239,7 +239,7 @@
- # $KCODE is "UTF8", then builder will emit UTF-8 encoded strings
- # rather than the entity encoding normally used.
- def instruct!(directive_tag=:xml, attrs={})
-- _ensure_no_block block_given?
-+ _ensure_no_block ::Kernel::block_given?
- if directive_tag == :xml
- a = { :version=>"1.0", :encoding=>"UTF-8" }
- attrs = a.merge attrs
-@@ -261,7 +261,7 @@
- # #=> <![CDATA[text to be included in cdata]]>
- #
- def cdata!(text)
-- _ensure_no_block block_given?
-+ _ensure_no_block ::Kernel::block_given?
- _special("<![CDATA[", "]]>", text, nil)
- end
-
-@@ -313,7 +313,7 @@
-
- def _attr_value(value)
- case value
-- when Symbol
-+ when ::Symbol
- value.to_s
- else
- _escape_quote(value.to_s)
-@@ -322,8 +322,9 @@
-
- def _ensure_no_block(got_block)
- if got_block
-- fail IllegalBlockError,
-- "Blocks are not allowed on XML instructions"
-+ ::Kernel::raise IllegalBlockError.new(
-+ "Blocks are not allowed on XML instructions"
-+ )
- end
- end
-
-Index: lib/builder/xchar.rb
-===================================================================
---- lib/builder/xchar.rb (revision 110)
-+++ lib/builder/xchar.rb (working copy)
-@@ -10,14 +10,14 @@
-
- module Builder
- def self.check_for_name_collision(klass, method_name, defined_constant=nil)
-- if klass.instance_methods.include?(method_name.to_s)
-+ if klass.method_defined?(method_name.to_s)
- fail RuntimeError,
- "Name Collision: Method '#{method_name}' is already defined in #{klass}"
- end
- end
- end
-
--if ! defined?(Builder::XChar)
-+if ! defined?(Builder::XChar) and ! String.method_defined?(:encode)
- Builder.check_for_name_collision(String, "to_xs")
- Builder.check_for_name_collision(Fixnum, "xchr")
- end
-@@ -78,42 +78,120 @@
- (0xE000..0xFFFD),
- (0x10000..0x10FFFF)
- ]
-+
-+ # http://www.fileformat.info/info/unicode/char/fffd/index.htm
-+ REPLACEMENT_CHAR =
-+ if String.method_defined?(:encode)
-+ "\uFFFD"
-+ elsif $KCODE == 'UTF8'
-+ "\xEF\xBF\xBD"
-+ else
-+ '*'
-+ end
- end
-
- end
-
-
--######################################################################
--# Enhance the Fixnum class with a XML escaped character conversion.
--#
--class Fixnum
-- XChar = Builder::XChar if ! defined?(XChar)
-+if String.method_defined?(:encode)
-+ module Builder
-+ module XChar # :nodoc:
-+ CP1252_DIFFERENCES, UNICODE_EQUIVALENT = Builder::XChar::CP1252.each.
-+ inject([[],[]]) {|(domain,range),(key,value)|
-+ [domain << key,range << value]
-+ }.map {|seq| seq.pack('U*').force_encoding('utf-8')}
-+
-+ XML_PREDEFINED = Regexp.new('[' +
-+ Builder::XChar::PREDEFINED.keys.pack('U*').force_encoding('utf-8') +
-+ ']')
-+
-+ INVALID_XML_CHAR = Regexp.new('[^'+
-+ Builder::XChar::VALID.map { |item|
-+ case item
-+ when Fixnum
-+ [item].pack('U').force_encoding('utf-8')
-+ when Range
-+ [item.first, '-'.ord, item.last].pack('UUU').force_encoding('utf-8')
-+ end
-+ }.join +
-+ ']')
-+
-+ ENCODING_BINARY = Encoding.find('BINARY')
-+ ENCODING_UTF8 = Encoding.find('UTF-8')
-+ ENCODING_ISO1 = Encoding.find('ISO-8859-1')
-
-- # XML escaped version of chr. When <tt>escape</tt> is set to false
-- # the CP1252 fix is still applied but utf-8 characters are not
-- # converted to character entities.
-- def xchr(escape=true)
-- n = XChar::CP1252[self] || self
-- case n when *XChar::VALID
-- XChar::PREDEFINED[n] or (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
-- else
-- '*'
-+ # convert a string to valid UTF-8, compensating for a number of
-+ # common errors.
-+ def XChar.unicode(string)
-+ if string.encoding == ENCODING_BINARY
-+ if string.ascii_only?
-+ string
-+ else
-+ string = string.clone.force_encoding(ENCODING_UTF8)
-+ if string.valid_encoding?
-+ string
-+ else
-+ string.encode(ENCODING_UTF8, ENCODING_ISO1)
-+ end
-+ end
-+
-+ elsif string.encoding == ENCODING_UTF8
-+ if string.valid_encoding?
-+ string
-+ else
-+ string.encode(ENCODING_UTF8, ENCODING_ISO1)
-+ end
-+
-+ else
-+ string.encode(ENCODING_UTF8)
-+ end
-+ end
-+
-+ # encode a string per XML rules
-+ def XChar.encode(string)
-+ unicode(string).
-+ tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT).
-+ gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR).
-+ gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}
-+ end
- end
- end
--end
-
-+else
-
--######################################################################
--# Enhance the String class with a XML escaped character version of
--# to_s.
--#
--class String
-- # XML escaped version of to_s. When <tt>escape</tt> is set to false
-- # the CP1252 fix is still applied but utf-8 characters are not
-- # converted to character entities.
-- def to_xs(escape=true)
-- unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
-- rescue
-- unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
-+ ######################################################################
-+ # Enhance the Fixnum class with a XML escaped character conversion.
-+ #
-+ class Fixnum
-+ XChar = Builder::XChar if ! defined?(XChar)
-+
-+ # XML escaped version of chr. When <tt>escape</tt> is set to false
-+ # the CP1252 fix is still applied but utf-8 characters are not
-+ # converted to character entities.
-+ def xchr(escape=true)
-+ n = XChar::CP1252[self] || self
-+ case n when *XChar::VALID
-+ XChar::PREDEFINED[n] or
-+ (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
-+ else
-+ Builder::XChar::REPLACEMENT_CHAR
-+ end
-+ end
- end
-+
-+
-+ ######################################################################
-+ # Enhance the String class with a XML escaped character version of
-+ # to_s.
-+ #
-+ class String
-+ # XML escaped version of to_s. When <tt>escape</tt> is set to false
-+ # the CP1252 fix is still applied but utf-8 characters are not
-+ # converted to character entities.
-+ def to_xs(escape=true)
-+ unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
-+ rescue
-+ unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
-+ end
-+ end
- end
-Index: lib/builder/css.rb
-===================================================================
---- lib/builder/css.rb (revision 110)
-+++ lib/builder/css.rb (working copy)
-@@ -136,14 +136,14 @@
- end
-
- def id!(arg, &block)
-- _start_container('#'+arg.to_s, nil, block_given?)
-+ _start_container('#'+arg.to_s, nil, ::Kernel.block_given?)
- _css_block(block) if block
- _unify_block
- self
- end
-
- def class!(arg, &block)
-- _start_container('.'+arg.to_s, nil, block_given?)
-+ _start_container('.'+arg.to_s, nil, ::Kernel.block_given?)
- _css_block(block) if block
- _unify_block
- self
-@@ -169,7 +169,7 @@
- end
-
- def method_missing(sym, *args, &block)
-- sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
-+ sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
- if block
- _start_container(sym, args.first)
- _css_block(block)
-Index: lib/builder/xmlbase.rb
-===================================================================
---- lib/builder/xmlbase.rb (revision 110)
-+++ lib/builder/xmlbase.rb (working copy)
-@@ -40,10 +40,10 @@
- def method_missing(sym, *args, &block)
- text = nil
- attrs = nil
-- sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
-+ sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
- args.each do |arg|
- case arg
-- when Hash
-+ when ::Hash
- attrs ||= {}
- attrs.merge!(arg)
- else
-@@ -53,15 +53,19 @@
- end
- if block
- unless text.nil?
-- raise ArgumentError, "XmlMarkup cannot mix a text argument with a block"
-+ ::Kernel::raise ::ArgumentError,
-+ "XmlMarkup cannot mix a text argument with a block"
- end
- _indent
- _start_tag(sym, attrs)
- _newline
-- _nested_structures(block)
-- _indent
-- _end_tag(sym)
-- _newline
-+ begin
-+ _nested_structures(block)
-+ ensure
-+ _indent
-+ _end_tag(sym)
-+ _newline
-+ end
- elsif text.nil?
- _indent
- _start_tag(sym, attrs, true)
-@@ -114,8 +118,22 @@
- private
-
- require 'builder/xchar'
-- def _escape(text)
-- text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
-+ if ::String.method_defined?(:encode)
-+ def _escape(text)
-+ result = XChar.encode(text)
-+ begin
-+ result.encode(@encoding)
-+ rescue
-+ # if the encoding can't be supported, use numeric character references
-+ result.
-+ gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}.
-+ force_encoding('ascii')
-+ end
-+ end
-+ else
-+ def _escape(text)
-+ text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
-+ end
- end
-
- def _escape_quote(text)
Modified: trunk/libbuilder-ruby/debian/patches/series
===================================================================
--- trunk/libbuilder-ruby/debian/patches/series 2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/patches/series 2010-03-21 15:55:34 UTC (rev 4989)
@@ -1 +1,2 @@
-ruby_1.9
+pre-2.2.0
+tolsen
Added: trunk/libbuilder-ruby/debian/patches/tolsen
===================================================================
--- trunk/libbuilder-ruby/debian/patches/tolsen (rev 0)
+++ trunk/libbuilder-ruby/debian/patches/tolsen 2010-03-21 15:55:34 UTC (rev 4989)
@@ -0,0 +1,829 @@
+Index: builder-2.1.2/lib/builder/blankslate.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/blankslate.rb 2006-12-24 20:29:01.000000000 +0100
++++ builder-2.1.2/lib/builder/blankslate.rb 2010-03-21 16:38:02.000000000 +0100
+@@ -8,13 +8,16 @@
+ # above copyright notice is included.
+ #++
+
+-require 'blankslate'
+-
+ ######################################################################
+ # BlankSlate has been promoted to a top level name and is now
+ # available as a standalone gem. We make the name available in the
+ # Builder namespace for compatibility.
+ #
+ module Builder
+- BlankSlate = ::BlankSlate
++ if Object::const_defined?(:BasicObject)
++ BlankSlate = ::BasicObject
++ else
++ require 'blankslate'
++ BlankSlate = ::BlankSlate
++ end
+ end
+Index: builder-2.1.2/lib/builder/css.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/css.rb 2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/lib/builder/css.rb 2010-03-21 16:38:02.000000000 +0100
+@@ -136,14 +136,14 @@
+ end
+
+ def id!(arg, &block)
+- _start_container('#'+arg.to_s, nil, block_given?)
++ _start_container('#'+arg.to_s, nil, ::Kernel.block_given?)
+ _css_block(block) if block
+ _unify_block
+ self
+ end
+
+ def class!(arg, &block)
+- _start_container('.'+arg.to_s, nil, block_given?)
++ _start_container('.'+arg.to_s, nil, ::Kernel.block_given?)
+ _css_block(block) if block
+ _unify_block
+ self
+@@ -169,7 +169,7 @@
+ end
+
+ def method_missing(sym, *args, &block)
+- sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
++ sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
+ if block
+ _start_container(sym, args.first)
+ _css_block(block)
+Index: builder-2.1.2/lib/builder/xchar.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xchar.rb 2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/lib/builder/xchar.rb 2010-03-21 16:38:02.000000000 +0100
+@@ -10,14 +10,14 @@
+
+ module Builder
+ def self.check_for_name_collision(klass, method_name, defined_constant=nil)
+- if klass.instance_methods.include?(method_name.to_s)
++ if klass.method_defined?(method_name.to_s)
+ fail RuntimeError,
+ "Name Collision: Method '#{method_name}' is already defined in #{klass}"
+ end
+ end
+ end
+
+-if ! defined?(Builder::XChar)
++if ! defined?(Builder::XChar) and ! String.method_defined?(:encode)
+ Builder.check_for_name_collision(String, "to_xs")
+ Builder.check_for_name_collision(Fixnum, "xchr")
+ end
+@@ -78,42 +78,120 @@
+ (0xE000..0xFFFD),
+ (0x10000..0x10FFFF)
+ ]
++
++ # http://www.fileformat.info/info/unicode/char/fffd/index.htm
++ REPLACEMENT_CHAR =
++ if String.method_defined?(:encode)
++ "\uFFFD"
++ elsif $KCODE == 'UTF8'
++ "\xEF\xBF\xBD"
++ else
++ '*'
++ end
+ end
+
+ end
+
+
+-######################################################################
+-# Enhance the Fixnum class with a XML escaped character conversion.
+-#
+-class Fixnum
+- XChar = Builder::XChar if ! defined?(XChar)
+-
+- # XML escaped version of chr. When <tt>escape</tt> is set to false
+- # the CP1252 fix is still applied but utf-8 characters are not
+- # converted to character entities.
+- def xchr(escape=true)
+- n = XChar::CP1252[self] || self
+- case n when *XChar::VALID
+- XChar::PREDEFINED[n] or (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
+- else
+- '*'
++if String.method_defined?(:encode)
++ module Builder
++ module XChar # :nodoc:
++ CP1252_DIFFERENCES, UNICODE_EQUIVALENT = Builder::XChar::CP1252.each.
++ inject([[],[]]) {|(domain,range),(key,value)|
++ [domain << key,range << value]
++ }.map {|seq| seq.pack('U*').force_encoding('utf-8')}
++
++ XML_PREDEFINED = Regexp.new('[' +
++ Builder::XChar::PREDEFINED.keys.pack('U*').force_encoding('utf-8') +
++ ']')
++
++ INVALID_XML_CHAR = Regexp.new('[^'+
++ Builder::XChar::VALID.map { |item|
++ case item
++ when Fixnum
++ [item].pack('U').force_encoding('utf-8')
++ when Range
++ [item.first, '-'.ord, item.last].pack('UUU').force_encoding('utf-8')
++ end
++ }.join +
++ ']')
++
++ ENCODING_BINARY = Encoding.find('BINARY')
++ ENCODING_UTF8 = Encoding.find('UTF-8')
++ ENCODING_ISO1 = Encoding.find('ISO-8859-1')
++
++ # convert a string to valid UTF-8, compensating for a number of
++ # common errors.
++ def XChar.unicode(string)
++ if string.encoding == ENCODING_BINARY
++ if string.ascii_only?
++ string
++ else
++ string = string.clone.force_encoding(ENCODING_UTF8)
++ if string.valid_encoding?
++ string
++ else
++ string.encode(ENCODING_UTF8, ENCODING_ISO1)
++ end
++ end
++
++ elsif string.encoding == ENCODING_UTF8
++ if string.valid_encoding?
++ string
++ else
++ string.encode(ENCODING_UTF8, ENCODING_ISO1)
++ end
++
++ else
++ string.encode(ENCODING_UTF8)
++ end
++ end
++
++ # encode a string per XML rules
++ def XChar.encode(string)
++ unicode(string).
++ tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT).
++ gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR).
++ gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}
++ end
+ end
+ end
+-end
+
++else
+
+-######################################################################
+-# Enhance the String class with a XML escaped character version of
+-# to_s.
+-#
+-class String
+- # XML escaped version of to_s. When <tt>escape</tt> is set to false
+- # the CP1252 fix is still applied but utf-8 characters are not
+- # converted to character entities.
+- def to_xs(escape=true)
+- unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
+- rescue
+- unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
++ ######################################################################
++ # Enhance the Fixnum class with a XML escaped character conversion.
++ #
++ class Fixnum
++ XChar = Builder::XChar if ! defined?(XChar)
++
++ # XML escaped version of chr. When <tt>escape</tt> is set to false
++ # the CP1252 fix is still applied but utf-8 characters are not
++ # converted to character entities.
++ def xchr(escape=true)
++ n = XChar::CP1252[self] || self
++ case n when *XChar::VALID
++ XChar::PREDEFINED[n] or
++ (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
++ else
++ Builder::XChar::REPLACEMENT_CHAR
++ end
++ end
++ end
++
++
++ ######################################################################
++ # Enhance the String class with a XML escaped character version of
++ # to_s.
++ #
++ class String
++ # XML escaped version of to_s. When <tt>escape</tt> is set to false
++ # the CP1252 fix is still applied but utf-8 characters are not
++ # converted to character entities.
++ def to_xs(escape=true)
++ unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8
++ rescue
++ unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
++ end
+ end
+ end
+Index: builder-2.1.2/lib/builder/xmlbase.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xmlbase.rb 2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/lib/builder/xmlbase.rb 2010-03-21 16:38:02.000000000 +0100
+@@ -40,10 +40,10 @@
+ def method_missing(sym, *args, &block)
+ text = nil
+ attrs = nil
+- sym = "#{sym}:#{args.shift}" if args.first.kind_of?(Symbol)
++ sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol)
+ args.each do |arg|
+ case arg
+- when Hash
++ when ::Hash
+ attrs ||= {}
+ attrs.merge!(arg)
+ else
+@@ -53,15 +53,19 @@
+ end
+ if block
+ unless text.nil?
+- raise ArgumentError, "XmlMarkup cannot mix a text argument with a block"
++ ::Kernel::raise ::ArgumentError,
++ "XmlMarkup cannot mix a text argument with a block"
+ end
+ _indent
+ _start_tag(sym, attrs)
+ _newline
+- _nested_structures(block)
+- _indent
+- _end_tag(sym)
+- _newline
++ begin
++ _nested_structures(block)
++ ensure
++ _indent
++ _end_tag(sym)
++ _newline
++ end
+ elsif text.nil?
+ _indent
+ _start_tag(sym, attrs, true)
+@@ -114,8 +118,22 @@
+ private
+
+ require 'builder/xchar'
+- def _escape(text)
+- text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
++ if ::String.method_defined?(:encode)
++ def _escape(text)
++ result = XChar.encode(text)
++ begin
++ result.encode(@encoding)
++ rescue
++ # if the encoding can't be supported, use numeric character references
++ result.
++ gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}.
++ force_encoding('ascii')
++ end
++ end
++ else
++ def _escape(text)
++ text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8'))
++ end
+ end
+
+ def _escape_quote(text)
+Index: builder-2.1.2/lib/builder/xmlmarkup.rb
+===================================================================
+--- builder-2.1.2.orig/lib/builder/xmlmarkup.rb 2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/lib/builder/xmlmarkup.rb 2010-03-21 16:38:02.000000000 +0100
+@@ -196,7 +196,7 @@
+ end
+
+ def comment!(comment_text)
+- _ensure_no_block block_given?
++ _ensure_no_block ::Kernel::block_given?
+ _special("<!-- ", " -->", comment_text, nil)
+ end
+
+@@ -211,13 +211,13 @@
+ @target << "<!#{inst}"
+ args.each do |arg|
+ case arg
+- when String
++ when ::String
+ @target << %{ "#{arg}"} # " WART
+- when Symbol
++ when ::Symbol
+ @target << " #{arg}"
+ end
+ end
+- if block_given?
++ if ::Kernel::block_given?
+ @target << " ["
+ _newline
+ _nested_structures(block)
+@@ -240,7 +240,7 @@
+ # $KCODE is "UTF8", then builder will emit UTF-8 encoded strings
+ # rather than the entity encoding normally used.
+ def instruct!(directive_tag=:xml, attrs={})
+- _ensure_no_block block_given?
++ _ensure_no_block ::Kernel::block_given?
+ if directive_tag == :xml
+ a = { :version=>"1.0", :encoding=>"UTF-8" }
+ attrs = a.merge attrs
+@@ -262,7 +262,7 @@
+ # #=> <![CDATA[text to be included in cdata]]>
+ #
+ def cdata!(text)
+- _ensure_no_block block_given?
++ _ensure_no_block ::Kernel::block_given?
+ _special("<![CDATA[", "]]>", text, nil)
+ end
+
+@@ -314,7 +314,7 @@
+
+ def _attr_value(value)
+ case value
+- when Symbol
++ when ::Symbol
+ value.to_s
+ else
+ _escape_quote(value.to_s)
+@@ -323,8 +323,9 @@
+
+ def _ensure_no_block(got_block)
+ if got_block
+- fail IllegalBlockError,
+- "Blocks are not allowed on XML instructions"
++ ::Kernel::raise IllegalBlockError.new(
++ "Blocks are not allowed on XML instructions"
++ )
+ end
+ end
+
+Index: builder-2.1.2/Rakefile
+===================================================================
+--- builder-2.1.2.orig/Rakefile 2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/Rakefile 2010-03-21 16:38:02.000000000 +0100
+@@ -68,7 +68,7 @@
+
+ BLANKSLATE_FILES = FileList[
+ 'lib/blankslate.rb',
+- 'test/testblankslate.rb'
++ 'test/test_blankslate.rb'
+ ]
+
+ if ! defined?(Gem)
+Index: builder-2.1.2/test/test_blankslate.rb
+===================================================================
+--- builder-2.1.2.orig/test/test_blankslate.rb 2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/test/test_blankslate.rb 2010-03-21 16:38:02.000000000 +0100
+@@ -80,126 +80,132 @@
+ ######################################################################
+ # Test case for blank slate.
+ #
+-class TestBlankSlate < Test::Unit::TestCase
+- def setup
+- @bs = BlankSlate.new
+- end
+
+- def test_undefined_methods_remain_undefined
+- assert_raise(NoMethodError) { @bs.no_such_method }
+- assert_raise(NoMethodError) { @bs.nil? }
+- end
++# skip tests if :BasicObject is present
++unless Object::const_defined?(:BasicObject)
+
++ class TestBlankSlate < Test::Unit::TestCase
+
+- # NOTE: NameError is acceptable because the lack of a '.' means that
+- # Ruby can't tell if it is a method or a local variable.
+- def test_undefined_methods_remain_undefined_during_instance_eval
+- assert_raise(NoMethodError, NameError) do
+- @bs.instance_eval do nil? end
++ def setup
++ @bs = BlankSlate.new
+ end
+- assert_raise(NoMethodError, NameError) do
+- @bs.instance_eval do no_such_method end
++
++ def test_undefined_methods_remain_undefined
++ assert_raise(NoMethodError) { @bs.no_such_method }
++ assert_raise(NoMethodError) { @bs.nil? }
+ end
+- end
+
+- def test_private_methods_are_undefined
+- assert_raise(NoMethodError) do
+- @bs.puts "HI"
++
++ # NOTE: NameError is acceptable because the lack of a '.' means that
++ # Ruby can't tell if it is a method or a local variable.
++ def test_undefined_methods_remain_undefined_during_instance_eval
++ assert_raise(NoMethodError, NameError) do
++ @bs.instance_eval do nil? end
++ end
++ assert_raise(NoMethodError, NameError) do
++ @bs.instance_eval do no_such_method end
++ end
+ end
+- end
+-
+- def test_targetted_private_methods_are_undefined_during_instance_eval
+- assert_raise(NoMethodError, NameError) do
+- @bs.instance_eval do self.puts "HI" end
++
++ def test_private_methods_are_undefined
++ assert_raise(NoMethodError) do
++ @bs.puts "HI"
++ end
+ end
+- end
+-
+- def test_untargetted_private_methods_are_defined_during_instance_eval
+- oldstdout = $stdout
+- $stdout = StringIO.new
+- @bs.instance_eval do
+- puts "HI"
++
++ def test_targetted_private_methods_are_undefined_during_instance_eval
++ assert_raise(NoMethodError, NameError) do
++ @bs.instance_eval do self.puts "HI" end
++ end
++ end
++
++ def test_untargetted_private_methods_are_defined_during_instance_eval
++ oldstdout = $stdout
++ $stdout = StringIO.new
++ @bs.instance_eval do
++ puts "HI"
++ end
++ ensure
++ $stdout = oldstdout
++ end
++
++ def test_methods_added_late_to_kernel_remain_undefined
++ assert_equal 1234, nil.late_addition
++ assert_raise(NoMethodError) { @bs.late_addition }
+ end
+- ensure
+- $stdout = oldstdout
+- end
+-
+- def test_methods_added_late_to_kernel_remain_undefined
+- assert_equal 1234, nil.late_addition
+- assert_raise(NoMethodError) { @bs.late_addition }
+- end
+
+- def test_methods_added_late_to_object_remain_undefined
+- assert_equal 4321, nil.another_late_addition
+- assert_raise(NoMethodError) { @bs.another_late_addition }
+- end
+-
+- def test_methods_added_late_to_global_remain_undefined
+- assert_equal 42, global_inclusion
+- assert_raise(NoMethodError) { @bs.global_inclusion }
+- end
++ def test_methods_added_late_to_object_remain_undefined
++ assert_equal 4321, nil.another_late_addition
++ assert_raise(NoMethodError) { @bs.another_late_addition }
++ end
++
++ def test_methods_added_late_to_global_remain_undefined
++ assert_equal 42, global_inclusion
++ assert_raise(NoMethodError) { @bs.global_inclusion }
++ end
+
+- def test_preload_method_added
+- assert Kernel.k_added_names.include?(:late_addition)
+- assert Object.o_added_names.include?(:another_late_addition)
+- end
++ def test_preload_method_added
++ assert Kernel.k_added_names.include?(:late_addition)
++ assert Object.o_added_names.include?(:another_late_addition)
++ end
+
+- def test_method_defined_late_multiple_times_remain_undefined
+- assert_equal 22, nil.double_late_addition
+- assert_raise(NoMethodError) { @bs.double_late_addition }
+- end
++ def test_method_defined_late_multiple_times_remain_undefined
++ assert_equal 22, nil.double_late_addition
++ assert_raise(NoMethodError) { @bs.double_late_addition }
++ end
+
+- def test_late_included_module_in_object_is_ok
+- assert_equal 33, 1.late_object
+- assert_raise(NoMethodError) { @bs.late_object }
+- end
++ def test_late_included_module_in_object_is_ok
++ assert_equal 33, 1.late_object
++ assert_raise(NoMethodError) { @bs.late_object }
++ end
+
+- def test_late_included_module_in_kernel_is_ok
+- assert_raise(NoMethodError) { @bs.late_kernel }
+- end
++ def test_late_included_module_in_kernel_is_ok
++ assert_raise(NoMethodError) { @bs.late_kernel }
++ end
+
+- def test_revealing_previously_hidden_methods_are_callable
+- with_to_s = Class.new(BlankSlate) do
+- reveal :to_s
++ def test_revealing_previously_hidden_methods_are_callable
++ with_to_s = Class.new(BlankSlate) do
++ reveal :to_s
++ end
++ assert_match /^#<.*>$/, with_to_s.new.to_s
+ end
+- assert_match /^#<.*>$/, with_to_s.new.to_s
+- end
+
+- def test_revealing_previously_hidden_methods_are_callable_with_block
+- Object.class_eval <<-EOS
++ def test_revealing_previously_hidden_methods_are_callable_with_block
++ Object.class_eval <<-EOS
+ def given_block(&block)
+ block
+ end
+- EOS
+-
+- with_given_block = Class.new(BlankSlate) do
+- reveal :given_block
++ EOS
++
++ with_given_block = Class.new(BlankSlate) do
++ reveal :given_block
++ end
++ assert_not_nil with_given_block.new.given_block {}
+ end
+- assert_not_nil with_given_block.new.given_block {}
+- end
+
+- def test_revealing_a_hidden_method_twice_is_ok
+- with_to_s = Class.new(BlankSlate) do
+- reveal :to_s
+- reveal :to_s
++ def test_revealing_a_hidden_method_twice_is_ok
++ with_to_s = Class.new(BlankSlate) do
++ reveal :to_s
++ reveal :to_s
++ end
++ assert_match /^#<.*>$/, with_to_s.new.to_s
+ end
+- assert_match /^#<.*>$/, with_to_s.new.to_s
+- end
+
+- def test_revealing_unknown_hidden_method_is_an_error
+- assert_raises(RuntimeError) do
+- Class.new(BlankSlate) do
+- reveal :xyz
++ def test_revealing_unknown_hidden_method_is_an_error
++ assert_raises(RuntimeError) do
++ Class.new(BlankSlate) do
++ reveal :xyz
++ end
+ end
+ end
+- end
+
+- def test_global_includes_still_work
+- assert_nothing_raised do
+- assert_equal 42, global_inclusion
+- assert_equal 42, Object.new.global_inclusion
+- assert_equal 42, "magic number".global_inclusion
+- assert_equal 43, direct_global
++ def test_global_includes_still_work
++ assert_nothing_raised do
++ assert_equal 42, global_inclusion
++ assert_equal 42, Object.new.global_inclusion
++ assert_equal 42, "magic number".global_inclusion
++ assert_equal 43, direct_global
++ end
+ end
+ end
+
+Index: builder-2.1.2/test/test_markupbuilder.rb
+===================================================================
+--- builder-2.1.2.orig/test/test_markupbuilder.rb 2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/test/test_markupbuilder.rb 2010-03-21 16:38:03.000000000 +0100
+@@ -108,7 +108,7 @@
+ end
+
+ def test_reference_methods
+- @xml.title { |x| x.a { x.b(name) } }
++ @xml.title { |x| x.a { x.b("bob") } }
+ assert_equal "<title><a><b>bob</b></a></title>", @xml.target!
+ end
+
+@@ -118,7 +118,7 @@
+ end
+
+ def test_ambiguous_markup
+- ex = assert_raises(ArgumentError) {
++ ex = assert_raise(ArgumentError) {
+ @xml.h1("data1") { b }
+ }
+ assert_match /\btext\b/, ex.message
+@@ -151,9 +151,6 @@
+ assert_equal "<div><span><a href=\"ref\">text</a></span></div>", @xml.target!
+ end
+
+- def name
+- "bob"
+- end
+ end
+
+ class TestAttributeEscaping < Test::Unit::TestCase
+@@ -228,6 +225,22 @@
+ assert_match /<owl:Restriction>/m, xml.target!
+ end
+
++ def test_ensure
++ xml = Builder::XmlMarkup.new
++ xml.html do
++ xml.body do
++ begin
++ xml.p do
++ raise Exception.new('boom')
++ end
++ rescue Exception => e
++ xml.pre e
++ end
++ end
++ end
++ assert_match %r{<p>}, xml.target!
++ assert_match %r{</p>}, xml.target!
++ end
+ end
+
+ class TestDeclarations < Test::Unit::TestCase
+@@ -334,10 +347,10 @@
+ end
+
+ def test_no_blocks
+- assert_raises(Builder::IllegalBlockError) do
++ assert_raise(Builder::IllegalBlockError) do
+ @xml.instruct! { |x| x.hi }
+ end
+- assert_raises(Builder::IllegalBlockError) do
++ assert_raise(Builder::IllegalBlockError) do
+ @xml.comment!(:element) { |x| x.hi }
+ end
+ end
+@@ -378,58 +391,83 @@
+ end
+
+ class TestUtfMarkup < Test::Unit::TestCase
+- def setup
+- @old_kcode = $KCODE
+- end
++ if ! String.method_defined?(:encode)
++ def setup
++ @old_kcode = $KCODE
++ end
+
+- def teardown
+- $KCODE = @old_kcode
+- end
++ def teardown
++ $KCODE = @old_kcode
++ end
+
+- def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
+- $KCODE = 'NONE'
+- xml = Builder::XmlMarkup.new
+- xml.p("\xE2\x80\x99")
+- assert_match(%r(<p>’</p>), xml.target!) #
++ def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
++ $KCODE = 'NONE'
++ xml = Builder::XmlMarkup.new
++ xml.p("\xE2\x80\x99")
++ assert_match(%r(<p>’</p>), xml.target!) #
++ end
++
++ def test_use_entities_if_encoding_is_utf_but_kcode_is_not
++ $KCODE = 'NONE'
++ xml = Builder::XmlMarkup.new
++ xml.instruct!(:xml, :encoding => 'UTF-8')
++ xml.p("\xE2\x80\x99")
++ assert_match(%r(<p>’</p>), xml.target!) #
++ end
++ else
++ # change in behavior. As there is no $KCODE anymore, the default
++ # moves from "does not understand utf-8" to "supports utf-8".
++
++ def test_use_entities_if_no_encoding_is_given_and_kcode_is_none
++ xml = Builder::XmlMarkup.new
++ xml.p("\xE2\x80\x99")
++ assert_match("<p>\u2019</p>", xml.target!) #
++ end
++
++ def test_use_entities_if_encoding_is_utf_but_kcode_is_not
++ xml = Builder::XmlMarkup.new
++ xml.instruct!(:xml, :encoding => 'UTF-8')
++ xml.p("\xE2\x80\x99")
++ assert_match("<p>\u2019</p>", xml.target!) #
++ end
+ end
+
+- def test_use_entities_if_encoding_is_utf_but_kcode_is_not
+- $KCODE = 'NONE'
+- xml = Builder::XmlMarkup.new
+- xml.instruct!(:xml, :encoding => 'UTF-8')
+- xml.p("\xE2\x80\x99")
+- assert_match(%r(<p>’</p>), xml.target!) #
++ def encode string, encoding
++ if !String.method_defined?(:encode)
++ $KCODE = encoding
++ string
++ elsif encoding == 'UTF8'
++ string.force_encoding('UTF-8')
++ else
++ string
++ end
+ end
+
+ def test_use_entities_if_kcode_is_utf_but_encoding_is_something_else
+- $KCODE = 'UTF8'
+ xml = Builder::XmlMarkup.new
+ xml.instruct!(:xml, :encoding => 'UTF-16')
+- xml.p("\xE2\x80\x99")
++ xml.p(encode("\xE2\x80\x99", 'UTF8'))
+ assert_match(%r(<p>’</p>), xml.target!) #
+ end
+
+ def test_use_utf8_if_encoding_defaults_and_kcode_is_utf8
+- $KCODE = 'UTF8'
+ xml = Builder::XmlMarkup.new
+- xml.p("\xE2\x80\x99")
+- assert_equal "<p>\xE2\x80\x99</p>", xml.target!
++ xml.p(encode("\xE2\x80\x99",'UTF8'))
++ assert_equal encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
+ end
+
+ def test_use_utf8_if_both_encoding_and_kcode_are_utf8
+- $KCODE = 'UTF8'
+ xml = Builder::XmlMarkup.new
+ xml.instruct!(:xml, :encoding => 'UTF-8')
+- xml.p("\xE2\x80\x99")
+- assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
++ xml.p(encode("\xE2\x80\x99",'UTF8'))
++ assert_match encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
+ end
+
+ def test_use_utf8_if_both_encoding_and_kcode_are_utf8_with_lowercase
+- $KCODE = 'UTF8'
+ xml = Builder::XmlMarkup.new
+ xml.instruct!(:xml, :encoding => 'utf-8')
+- xml.p("\xE2\x80\x99")
+- assert_match(%r(<p>\xE2\x80\x99</p>), xml.target!)
++ xml.p(encode("\xE2\x80\x99",'UTF8'))
++ assert_match encode("<p>\xE2\x80\x99</p>",'UTF8'), xml.target!
+ end
+ end
+
+Index: builder-2.1.2/test/test_xchar.rb
+===================================================================
+--- builder-2.1.2.orig/test/test_xchar.rb 2010-03-21 16:37:51.000000000 +0100
++++ builder-2.1.2/test/test_xchar.rb 2010-03-21 16:38:03.000000000 +0100
+@@ -15,7 +15,28 @@
+ require 'test/unit'
+ require 'builder/xchar'
+
++if String.method_defined?(:encode)
++ class String
++ ENCODING_BINARY = Encoding.find('BINARY')
++
++ # shim method for testing purposes
++ def to_xs(escape=true)
++ raise NameError.new('to_xs') unless caller[0].index(__FILE__)
++
++ result = Builder::XChar.encode(self)
++ if escape
++ result.gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}
++ else
++ # really only useful for testing purposes
++ result.force_encoding(ENCODING_BINARY)
++ end
++ end
++ end
++end
++
+ class TestXmlEscaping < Test::Unit::TestCase
++ REPLACEMENT_CHAR = Builder::XChar::REPLACEMENT_CHAR.to_xs
++
+ def test_ascii
+ assert_equal 'abc', 'abc'.to_xs
+ end
+@@ -27,9 +48,9 @@
+ end
+
+ def test_invalid
+- assert_equal '*', "\x00".to_xs # null
+- assert_equal '*', "\x0C".to_xs # form feed
+- assert_equal '*', "\xEF\xBF\xBF".to_xs # U+FFFF
++ assert_equal REPLACEMENT_CHAR, "\x00".to_xs # null
++ assert_equal REPLACEMENT_CHAR, "\x0C".to_xs # form feed
++ assert_equal REPLACEMENT_CHAR, "\xEF\xBF\xBF".to_xs # U+FFFF
+ end
+
+ def test_iso_8859_1
Modified: trunk/libbuilder-ruby/debian/rules
===================================================================
--- trunk/libbuilder-ruby/debian/rules 2010-03-21 10:10:10 UTC (rev 4988)
+++ trunk/libbuilder-ruby/debian/rules 2010-03-21 15:55:34 UTC (rev 4989)
@@ -3,6 +3,7 @@
# CDBS file to build the Builder Ruby package.
include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/ruby-pkg-tools/1/class/ruby-common.mk
$(patsubst %,install/%,$(DEB_RUBY_REAL_LIB_PACKAGES)) :: install/% :
mkdir -p debian/libbuilder-ruby$(cdbs_ruby_ver)/usr/lib/ruby/$(cdbs_ruby_ver)
More information about the Pkg-ruby-extras-commits
mailing list