Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
= Change Log

== Version 3.1.0

* Included the to_xs arity patch needed for weird Rails compatibility
issue.

* Escaping newlines in attributes now.

* Allow method caching

== Version 3.0.0

* Ruby 1.9 compatiblity issues.

== 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
Fowler).
* Removed extra directory indirection from legacy CVS to SVN move.
* Removed some extraneous tabs from source.
* Fixed test on private methods in blankslate to differentiate between
targetted and untargetted private methods.
* Removed legacy capture of @self in XmlBase (@self was used back when
we used instance eval).
* Added additional tests for global functions (both direct and included).

== Version 2.1.0

* Fixed bug in BlankSlate where including a module into Object could
cause methods to leak into BlankSlate.
* Made BlankSlate available as its own gem. Currently the builder gem
still directly includes the BlankSlate code.
* Added reveal capability to BlankSlate.

== Version 2.0.0

* Added doc directory
* Added unit tests for XmlEvents.
* Added XChar module and used it in the _escape method.
* Attributes are now quoted by default when strings. Use Symbol
attribute values for unquoted behavior.

== Version 1.2.4

* Added a cdata! command to an XML Builder (from Josh Knowles).

== Version 1.2.3

The attributes in the <?xml ... ?> instruction will be ordered:
version, encoding, standalone.

== Version 1.2.2

Another fix for BlankSlate. The Kernal/Object traps added in 1.2.1
failed when a method was defined late more than once. Since the
method was already marked as removed, another attempt to undefine it
raised an error. The fix was to check the list of instance methods
before attempting the undef operation. Thanks to Florian Gross and
David Heinemeier Hansson for the patch.

== Version 1.2.1

BlankSlate now traps method definitions in Kernel and Object to avoid
late method definitions inadvertently becoming part of the definition
of BlankSlate as well.

== Version 1.2.0

Improved support for entity declarations by allowing nested
declarations and removal of the attribute processing.

Added namespace support.

== Version 1.1.0

Added support for comments, entity declarations and processing instructions.

== Version 1.0.0

Removed use of <tt>instace_eval</tt> making the use of XmlMarkup much
less prone to error.

== Version 0.1.1

Bug fix.

== Version 0.1.0

Initial version release.
2 changes: 1 addition & 1 deletion MIT-LICENSE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Copyright 2011 Jim Weirich (jim@weirichhouse.org)
Copyright (c) 2003-2012 Jim Weirich (jim.weirich@gmail.com)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
Expand Down
189 changes: 189 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
# Rakefile for rake -*- ruby -*-

# Copyright 2004, 2005, 2006 by Jim Weirich (jim@weirichhouse.org).
# 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 'rake/clean'
require 'rake/testtask'
require 'rdoc/task'
begin
require 'rubygems'
require 'rubygems/package_task'
rescue Exception
nil
end

require './lib/builder/version'

# Determine the current version of the software

CLOBBER.include('pkg')
CLEAN.include('pkg/builder-*').include('pkg/blankslate-*').exclude('pkg/*.gem')

PKG_VERSION = Builder::VERSION

SRC_RB = FileList['lib/**/*.rb']

# The default task is run if rake is given no explicit arguments.

desc "Default Task"
task :default => :test_all

# Test Tasks ---------------------------------------------------------

desc "Run all tests"
task :test_all => [:test_units]
task :ta => [:test_all]

task :tu => [:test_units]

Rake::TestTask.new("test_units") do |t|
t.test_files = FileList['test/test*.rb']
t.libs << "."
t.verbose = false
end

# Create a task to build the RDOC documentation tree.

rd = RDoc::Task.new("rdoc") { |rdoc|
rdoc.rdoc_dir = 'html'
rdoc.title = "Builder for Markup"
rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README.rdoc'
rdoc.rdoc_files.include('lib/**/*.rb', '[A-Z]*', 'doc/**/*.rdoc').exclude("TAGS")
rdoc.template = 'doc/jamis.rb'
}

# ====================================================================
# Create a task that will package the Rake software into distributable
# gem files.

PKG_FILES = FileList[
'lib/**/*.rb',
'test/**/*.rb',
'scripts/**/*.rb'
]
PKG_FILES.exclude('test/test_cssbuilder.rb')
PKG_FILES.exclude('lib/builder/css.rb')
PKG_FILES.exclude('TAGS')

BLANKSLATE_FILES = FileList[
'lib/blankslate.rb',
'test/test_blankslate.rb'
]

if ! defined?(Gem)
puts "Package Target requires RubyGEMs"
else
spec = Gem::Specification.new do |s|

#### Basic information.

s.name = 'builder'
s.version = PKG_VERSION
s.summary = "Builders for MarkUp."
s.description = %{\
Builder provides a number of builder objects that make creating structured data
simple to do. Currently the following builder objects are supported:

* XML Markup
* XML Events
}

s.files = PKG_FILES.to_a
s.require_path = 'lib'

s.test_files = PKG_FILES.select { |fn| fn =~ /^test\/test/ }

s.has_rdoc = true
s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a
s.rdoc_options <<
'--title' << 'Builder -- Easy XML Building' <<
'--main' << 'README.rdoc' <<
'--line-numbers'

s.author = "Jim Weirich"
s.email = "jim.weirich@gmail.com"
s.homepage = "http://onestepback.org"
s.license = 'MIT'
end

blankslate_spec = Gem::Specification.new do |s|

#### Basic information.

s.name = 'blankslate'
s.version = PKG_VERSION
s.summary = "Blank Slate base class."
s.description = %{\
BlankSlate provides a base class where almost all of the methods from Object and
Kernel have been removed. This is useful when providing proxy object and other
classes that make heavy use of method_missing.
}

s.files = BLANKSLATE_FILES.to_a
s.require_path = 'lib'

s.test_files = PKG_FILES.select { |fn| fn =~ /^test\/test/ }

s.has_rdoc = true
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.rdoc' <<
'--line-numbers'

s.author = "Jim Weirich"
s.email = "jim.weirich@gmail.com"
s.homepage = "http://onestepback.org"
s.license = 'MIT'
end

namespace 'builder' do
Gem::PackageTask.new(spec) do |t|
t.need_tar = false
end
end

namespace 'blankslate' do
Gem::PackageTask.new(blankslate_spec) do |t|
t.need_tar = false
end
end

task :package => [:remove_tags, 'builder:package', 'blankslate:package']
end

task :remove_tags do
rm "TAGS" rescue nil
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

desc "Install the jamis RDoc template"
task :install_jamis_template do
require 'rbconfig'
dest_dir = File.join(Config::CONFIG['rubylibdir'], "rdoc/generators/template/html")
fail "Unabled to write to #{dest_dir}" unless File.writable?(dest_dir)
install "doc/jamis.rb", dest_dir, :verbose => true
end
36 changes: 29 additions & 7 deletions lib/blankslate.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#!/usr/bin/env ruby
#--
# Copyright 2004, 2006 by Jim Weirich (jim@weirichhouse.org).
# All rights reserved.
Expand All @@ -8,6 +7,30 @@
# above copyright notice is included.
#++

class String
if instance_methods.first.is_a?(Symbol)
def _blankslate_as_name
to_sym
end
else
def _blankslate_as_name
self
end
end
end

class Symbol
if instance_methods.first.is_a?(Symbol)
def _blankslate_as_name
self
end
else
def _blankslate_as_name
to_s
end
end
end

######################################################################
# BlankSlate provides an abstract base class with no predefined
# methods (except for <tt>\_\_send__</tt> and <tt>\_\_id__</tt>).
Expand All @@ -16,13 +39,12 @@
#
class BlankSlate
class << self

# Hide the method named +name+ in the BlankSlate class. Don't
# hide +instance_eval+ or any method beginning with "__".
def hide(name)
methods = instance_methods.map(&:to_sym)
if methods.include?(name.to_sym) and
name !~ /^(__|instance_eval)/
if instance_methods.include?(name._blankslate_as_name) and
name !~ /^(__|instance_eval$)/
@hidden_methods ||= {}
@hidden_methods[name.to_sym] = instance_method(name)
undef_method name
Expand All @@ -42,7 +64,7 @@ def reveal(name)
define_method(name, hidden_method)
end
end

instance_methods.each { |m| hide(m) }
end

Expand Down Expand Up @@ -107,4 +129,4 @@ def append_features(mod)
end
result
end
end
end
Loading