<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>data/stickler.yml</filename>
    </added>
    <added>
      <filename>lib/stickler/paths.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -23,6 +23,8 @@ require 'rake/clean'
 # load up all the project tasks and setup the default task to be the
 # test:default task.
 #-------------------------------------------------------------------------------
+require 'stickler/paths'
+require 'stickler/version'
 Configuration.for(&quot;packaging&quot;).files.tasks.each do |tasklib|
   import tasklib
 end</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -14,26 +14,36 @@ Stickler::GEM_SPEC = Gem::Specification.new do |spec|
   spec.description  = proj.description
   spec.platform     = Gem::Platform::RUBY
 
+  spec.required_rubygems_version = [ &quot;&gt;= 1.2.0&quot; ]
+  spec.post_install_message = &quot;Run `stickler help` for more information&quot;
+
+  spec.add_runtime_dependency( 'highline', &quot;~&gt; 1.4&quot; )
+  spec.add_runtime_dependency( 'logging', &quot;~&gt; 0.9&quot; )
+  spec.add_runtime_dependency( 'main', &quot;~&gt; 2.8&quot; )
+
+  spec.add_development_dependency( 'rake', &quot;~&gt; 0.8&quot;  )
+  spec.add_development_dependency( 'rspec', &quot;~&gt; 1.1&quot; )
+  spec.add_development_dependency( 'configuration', &quot;~&gt; 0.0&quot; )
+
   
   pkg = Configuration.for('packaging')
   spec.files        = pkg.files.all
   spec.executables  = pkg.files.bin.collect { |b| File.basename(b) }
-
  
-  if rdoc = Configuration.for_if_exist('rdoc') then
+  if rdoc = Configuration.for_if_exist?('rdoc') then
     spec.has_rdoc         = true
     spec.extra_rdoc_files = pkg.files.rdoc
-    spec.rdoc_options     = rdoc.options + [ &quot;--main&quot; , rdoc.main ]
+    spec.rdoc_options     = rdoc.options + [ &quot;--main&quot; , rdoc.main_page ]
   else
     spec.has_rdoc         = false
   end
 
-  if test = Configuration.for_if_exist('testing') then
+  if test = Configuration.for_if_exist?('testing') then
     spec.test_files       = test.files
   end
 
 
-  if rf = Configuration.for_if_exist('rubyforge') then
+  if rf = Configuration.for_if_exist?('rubyforge') then
     spec.rubyforge_project  = rf.project
   end
 end</diff>
      <filename>gemspec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -54,20 +54,7 @@ module Stickler
 
     $stdout.puts msg
   end
-
-  #
-  # recursively descend the directory with the same name as this file and do a
-  # require 'stickler/path/to/file'
-  #
-  def self.require_all_libs_relative_to_me
-    remove_parent = File.dirname(File.expand_path(__FILE__)) + File::SEPARATOR
-    descend_dir   = File.join(remove_parent,File.basename(__FILE__, &quot;.rb&quot;))
-
-    Dir.glob(&quot;#{descend_dir}/**/*.rb&quot;).each do |rb|
-      lib = rb.gsub(remove_parent,'')
-      require lib
-    end
-  end
 end
 
-Stickler.require_all_libs_relative_to_me
+require 'stickler/paths'
+require 'stickler/version'</diff>
      <filename>lib/stickler.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,12 +11,11 @@ module Stickler
   #
   module Configuration
 
-    # The root directory of the project is considered to be the parent directory
-    # of the 'lib' directory.
     #
-    # returns:: [String] The full expanded path of the parent directory of 'lib'
-    #           going up the path from the current file.  Trailing
-    #           File::SEPARATOR is guaranteed.
+    # The root directory of the project is considered to be the parent directory
+    # of the 'lib' directory.  returns the full expanded path of the parent
+    # directory of 'lib' going up the path from the current file.  A trailing
+    # File::SEPARATOR is guaranteed.
     #
     def self.root_dir
       unless @root_dir
@@ -27,28 +26,28 @@ module Stickler
       return @root_dir
     end
 
-    # returns:: [String] The full expanded path of the +config+ directory
-    #           below _root_dir_.  All parameters passed in are joined onto the
-    #           result.  Trailing File::SEPARATOR is guaranteed if _args_ are
-    #           *not* present.
+    # 
+    # return the full expanded path of the +config+ directory below +root_dir+.
+    # All parameters passed in are joined on to the result. a Trailing
+    # File::SEPARATOR is guaranteed if _args_ are *not* present
     #
     def self.config_path(*args)
       self.sub_path(&quot;config&quot;, *args)
     end
 
-    # returns:: [String] The full expanded path of the +data+ directory below
-    #           _root_dir_.  All parameters passed in are joined onto the 
-    #           result. Trailing File::SEPARATOR is guaranteed if 
-    #           _*args_ are *not* present.
+    #
+    # return the full expanded path of the +data+ directory below +root_dir+.
+    # All parameters passed in are joined on to the result. a Trailing
+    # File::SEPARATOR is guaranteed if _args_ are *not* present
     #
     def self.data_path(*args)
       self.sub_path(&quot;data&quot;, *args)
     end
-    
-    # returns:: [String] The full expanded path of the +lib+ directory below
-    #           _root_dir_.  All parameters passed in are joined onto the 
-    #           result. Trailing File::SEPARATOR is guaranteed if 
-    #           _*args_ are *not* present.
+   
+    #
+    # return the full expanded path of the +lib+ directory below +root_dir+.
+    # All parameters passed in are joined on to the result. a Trailing
+    # File::SEPARATOR is guaranteed if _args_ are *not* present
     #
     def self.lib_path(*args)
       self.sub_path(&quot;lib&quot;, *args)</diff>
      <filename>lib/stickler/configuration.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,19 +14,18 @@ module Stickler
   # is very similar to a GEM_HOME directory.   The layout is as follows, this is
   # all assumed to be under STICKLER_HOME.
   #
-  #   stickler.rb     - the Stickler configuration file for this repository.
+  #   stickler.yml    - the Stickler configuration file for this repository.
   #                     The existence of this file indicates this is the root 
   #                     of a stickler repository
-  #   doc/            - Generated RDOC of all the gems
-  #   gems/           - storage of the actual gem files, somewhat similar to GEM_HOME/cache
+  #   gems/           - storage of the actual gem files, somewhat similar to the
+  #                     GEM_HOME/cache directory
   #   specifications/ - ruby gemspec files 
   #   log/            - directory holding rotating logs files for stickler
   #   dist/           - directory holding the distributable gem index location,
   #                     rsync this to your webserver, or serve from it directly.
-  # 
-  # Additionally, if a repository is instantiated and it is connected to an
-  # already existing repo directory, a logfile appender is added for a logfile
-  # in the log directory
+  #   log/            - directory holding the rolling logs of what has gone on
+  #                     with the repository.
+  #
   #
   class Repository
 
@@ -41,7 +40,8 @@ module Stickler
         return cfg
       end
     end
-      # The repository directory
+
+    # The repository directory.  the directory containing the stickler.yml file
     attr_reader :directory
 
     def initialize( opts )
@@ -73,13 +73,13 @@ module Stickler
     end
 
     #
-    # return a handle to the repository configuration found in stickler.rb
+    # return a handle to the repository configuration found in stickler.yml
     #
     def configuration
       unless @configuration 
         @config_contents = File.read(config_file)
         begin
-          @configuration = eval(@config_contents)
+          @configuration = eval( @config_contents )
           @configuration.upstream = [ @configuration.upstream ].flatten
         rescue =&gt; e
           logger.error &quot;Failure to load configuration #{e}&quot;
@@ -93,7 +93,7 @@ module Stickler
     # The configuration file for the repository
     # 
     def config_file
-      @config_file ||= File.join( directory, 'stickler.rb' )
+      @config_file ||= File.join( directory, 'stickler.yml' )
     end
 
     #
@@ -209,7 +209,7 @@ module Stickler
       end
 
       unless File.exist?( config_file )
-        FileUtils.cp Stickler::Configuration.data_path(&quot;stickler.rb&quot;), config_file
+        FileUtils.cp Stickler::Configuration.data_path( &quot;stickler.yml&quot;), config_file
         logger.info &quot;copied in default configuration to #{config_file}&quot;
       end
 </diff>
      <filename>lib/stickler/repository.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,57 +1,39 @@
-#-----------------------------------------------------------------------
-# Announcement tasks
-#   - create a basic email template that can be used to send email to
-#     rubytalk.
-#-----------------------------------------------------------------------
-def changes
-    change_file = File.expand_path(File.join(Stickler::ROOT_DIR,&quot;CHANGES&quot;))
-    sections    = File.read(change_file).split(/^(?===)/)
-end
-
-def last_changeset
-    changes[1]
-end
-
-def announcement
-    urls    = &quot;  #{Stickler::SPEC.homepage}&quot;
-    subject = &quot;#{Stickler::SPEC.name} #{Stickler::VERSION} Released&quot;
-    title   = &quot;#{Stickler::SPEC.name} version #{Stickler::VERSION} has been released.&quot;
-    body    = &lt;&lt;BODY
-#{Stickler::SPEC.description.rstrip}
-
-{{ Changelog for Version #{Stickler::VERSION} }}
-
-#{last_changeset.rstrip}
-
-BODY
-
-    return subject, title, body, urls
-end
+require 'tasks/config'
+#-------------------------------------------------------------------------------
+# announcement methods
+#-------------------------------------------------------------------------------
 
+proj_config = Configuration.for('project')
 namespace :announce do
-    desc &quot;create email for ruby-talk&quot;
-    task :email do
-        subject, title, body, urls = announcement
+  desc &quot;create email for ruby-talk&quot;
+  task :email do
+    info = Utils.announcement
+
+    File.open(&quot;email.txt&quot;, &quot;w&quot;) do |mail|
+      mail.puts &quot;From: #{proj_config.author} &lt;#{proj_config.email}&gt;&quot;
+      mail.puts &quot;To: ruby-talk@ruby-lang.org&quot;
+      mail.puts &quot;Date: #{Time.now.rfc2822}&quot;
+      mail.puts &quot;Subject: [ANN] #{info[:subject]}&quot;
+      mail.puts
+      mail.puts info[:title]
+      mail.puts
+      mail.puts &quot;  gem install #{Stickler::GEM_SPEC.name}&quot;
+      mail.puts
+      mail.puts info[:urls]
+      mail.puts 
+      mail.puts info[:description]
+      mail.puts 
+      mail.puts &quot;{{ Release notes for Version #{Stickler::VERSION} }}&quot;
+      mail.puts 
+      mail.puts info[:release_notes]
+      mail.puts
+    end 
+    puts &quot;Created the following as email.txt:&quot;
+    puts &quot;-&quot; * 72
+    puts File.read(&quot;email.txt&quot;)
+    puts &quot;-&quot; * 72
+  end 
+
+  CLOBBER &lt;&lt; &quot;email.txt&quot;
+end
 
-        File.open(&quot;email.txt&quot;, &quot;w&quot;) do |mail|
-            mail.puts &quot;From: #{Stickler::SPEC.author} &lt;#{Stickler::SPEC.email}&gt;&quot;
-            mail.puts &quot;To: ruby-talk@ruby-lang.org&quot;
-            mail.puts &quot;Date: #{Time.now.rfc2822}&quot;
-            mail.puts &quot;Subject: [ANN] #{subject}&quot;
-            mail.puts
-            mail.puts title
-            mail.puts
-            mail.puts urls
-            mail.puts 
-            mail.puts body
-            mail.puts 
-            mail.puts urls
-        end
-        puts &quot;Created the following as email.txt:&quot;
-        puts &quot;-&quot; * 72
-        puts File.read(&quot;email.txt&quot;)
-        puts &quot;-&quot; * 72
-    end
-    
-    CLOBBER &lt;&lt; &quot;email.txt&quot;
-end
\ No newline at end of file</diff>
      <filename>tasks/announce.rake</filename>
    </modified>
    <modified>
      <diff>@@ -1,24 +1,21 @@
 require 'configuration'
 
 require 'rake'
-require 'stickler/configuration'
-require 'stickler/version'
-
 require 'tasks/utils'
 
 #-----------------------------------------------------------------------
 # General project configuration
 #-----------------------------------------------------------------------
 Configuration.for('project') {
-  name          Stickler.to_s.downcase
-  version       Stickler::VERSION
-  author        &quot;Jeremy Hinegardner&quot;
-  email         &quot;jeremy at hinegardner dot org&quot;
-  homepage      &quot;http://copiousfreetime.rubyforge.org/stickler/&quot;
+  name          &quot;FIXME: NAME&quot;
+  version       &quot;FIXME: 0.0.0&quot;
+  author        &quot;FIXME: The Author&quot;
+  email         &quot;FIXME: author@example.com&quot;
+  homepage      &quot;FIXME: http://project.example.com&quot;
   description   Utils.section_of(&quot;README&quot;, &quot;description&quot;)
   summary       description.split(&quot;.&quot;).first
   history       &quot;HISTORY&quot;
-  license       &quot;LICENSE&quot;
+  license       FileList[&quot;LICENSE&quot;, &quot;COPYING&quot;]
   readme        &quot;README&quot;
 }
 
@@ -30,20 +27,21 @@ Configuration.for('packaging') {
   proj_conf = Configuration.for('project')
   files {
     bin       FileList[&quot;bin/*&quot;]
+    ext       FileList[&quot;ext/*.{c,h,rb}&quot;]
     lib       FileList[&quot;lib/**/*.rb&quot;]
-    test      FileList[&quot;spec/**/*.rb&quot;]
+    test      FileList[&quot;spec/**/*.rb&quot;, &quot;test/**/*.rb&quot;]
     data      FileList[&quot;data/**/*&quot;]
     tasks     FileList[&quot;tasks/**/*.r{ake,b}&quot;]
-    rdoc      FileList[proj_conf.history, &quot;COPYING&quot;, proj_conf.readme, 
+    rdoc      FileList[proj_conf.readme, proj_conf.history,
                        proj_conf.license] + lib
-    all       bin + lib + test + data + rdoc + tasks 
+    all       bin + ext + lib + test + data + rdoc + tasks 
   }
 
   # ways to package the results
   formats {
     tgz true
     zip true
-    gem Configuration.exist?('gem')
+    gem Configuration::Table.has_key?('gem')
   }
 }
 
@@ -57,6 +55,7 @@ Configuration.for(&quot;gem&quot;) {
 
 #-----------------------------------------------------------------------
 # Testing
+#   - change mode to 'testunit' to use unit testing
 #-----------------------------------------------------------------------
 Configuration.for('test') {
   mode      &quot;spec&quot;
@@ -74,8 +73,6 @@ Configuration.for('rcov') {
   rcov_opts   %w[ --html ]
   ruby_opts   %w[ ]
   test_files  Configuration.for('packaging').files.test
-
-  # hmm... how to configure remote publishing
 }
 
 #-----------------------------------------------------------------------
@@ -83,49 +80,28 @@ Configuration.for('rcov') {
 #-----------------------------------------------------------------------
 Configuration.for('rdoc') {
   files       Configuration.for('packaging').files.rdoc
-  main        files.first
+  main_page   files.first
   title       Configuration.for('project').name
   options     %w[ --line-numbers --inline-source ]
   output_dir  &quot;doc&quot;
-
-  # hmm... how to configure remote publishing ...
 }
 
 #-----------------------------------------------------------------------
-# Rubyforge 
+# Extensions
 #-----------------------------------------------------------------------
-Configuration.for('rubyforge') {
-  project   &quot;copiousfreetime&quot;
-  user      &quot;jjh&quot;
+Configuration.for('extension') {
+  configs   Configuration.for('packaging').files.ext.find_all { |x| 
+                %w[ mkrf_conf.rb extconf.rb ].include?( File.basename(x) ) 
+            }
 }
-
 #-----------------------------------------------------------------------
-# dump the configuration
+# Rubyforge 
 #-----------------------------------------------------------------------
-if $0 == __FILE__ then
-  $: &lt;&lt; &quot;../lib&quot;
+Configuration.for('rubyforge') {
+  project       &quot;FIXME: rubyforge project&quot;
+  user          &quot;FIXME: username&quot;
+  host          &quot;rubyforge.org&quot;
+  rdoc_location &quot;#{user}@#{host}:/var/www/gforge-projects/#{project}&quot;
+}
 
-  def dump_config(config, prefix = &quot;&quot;)
-    (config.methods - Object.methods - ['method_missing']).each do |method|
-      r = config.send(method)
-      r = r.to_ary if r.respond_to?(:to_ary)
-      case r
-      when Configuration
-        puts &quot;#{prefix}&lt;#{method.to_s.center(12)}&gt;&quot; 
-        dump_config(r,prefix + &quot;    &quot;)
-      when Array
-        puts &quot;#{prefix}#{method.to_s.rjust(12)} :&quot;
-        r.each do |x|
-          puts &quot;#{prefix}#{&quot;-&quot;.rjust(12)} #{x}&quot;
-        end
-      else
-        puts &quot;#{prefix}#{method.to_s.rjust(12)} : #{r.inspect}&quot;
-      end
-    end
-  end
 
-  Configuration::Table.keys.sort.each do |config_key|
-    puts &quot;[#{config_key.center(12)}]&quot; 
-    dump_config(Configuration.for(config_key), &quot;    &quot;)
-  end
-end</diff>
      <filename>tasks/config.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,16 @@
-#-----------------------------------------------------------------------
-# Distribution and Packaging
-#-----------------------------------------------------------------------
 require 'tasks/config'
 
-# only do this task if the appropriate section from the configuration exists
-if pkg_config= Configuration.for_if_exist(&quot;packaging&quot;) then
+#-------------------------------------------------------------------------------
+# Distribution and Packaging
+#-------------------------------------------------------------------------------
+if pkg_config = Configuration.for_if_exist?(&quot;packaging&quot;) then
 
   require 'gemspec'
   require 'rake/gempackagetask'
+  require 'rake/contrib/sshpublisher'
 
   namespace :dist do
+
     Rake::GemPackageTask.new(Stickler::GEM_SPEC) do |pkg|
       pkg.need_tar = pkg_config.formats.tgz
       pkg.need_zip = pkg_config.formats.zip
@@ -17,21 +18,21 @@ if pkg_config= Configuration.for_if_exist(&quot;packaging&quot;) then
 
     desc &quot;Install as a gem&quot;
     task :install =&gt; [:clobber, :package] do
-      sh &quot;sudo gem install -y pkg/#{Stickler::SPEC.full_name}.gem&quot;
+      sh &quot;sudo gem install pkg/#{Stickler::GEM_SPEC.full_name}.gem&quot;
     end
 
     desc &quot;Uninstall gem&quot;
     task :uninstall do 
-      sh &quot;sudo gem uninstall -i #{Stickler::SPEC.name} -x&quot;
+      sh &quot;sudo gem uninstall -x #{Stickler::GEM_SPEC.name}&quot;
     end
 
     desc &quot;dump gemspec&quot;
     task :gemspec do
-      puts Stickler::GEM_SPEC
+      puts Stickler::GEM_SPEC.to_ruby
     end
 
     desc &quot;reinstall gem&quot;
     task :reinstall =&gt; [:uninstall, :repackage, :install]
 
-  end
+ end
 end</diff>
      <filename>tasks/distribution.rake</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,10 @@
+require 'tasks/config'
+
 #-----------------------------------------------------------------------
 # Documentation
 #-----------------------------------------------------------------------
 
-require 'tasks/config'
-if rdoc_config = Configuration.for('rdoc') then
+if rdoc_config = Configuration.for_if_exist?('rdoc') then
 
   namespace :doc do
 
@@ -15,19 +16,16 @@ if rdoc_config = Configuration.for('rdoc') then
       rdoc.options    = rdoc_config.options
       rdoc.rdoc_files = rdoc_config.files
       rdoc.title      = rdoc_config.title
-      rdoc.main       = rdoc_config.main
-    end
-
-    # desc &quot;Deploy the RDoc documentation to #{Stickler::SPEC.remote_rdoc_location}&quot;
-    # task :deploy =&gt; :rerdoc do
-      # sh &quot;rsync -zav --delete #{Stickler::SPEC.local_rdoc_dir}/ #{Stickler::SPEC.remote_rdoc_location}&quot;
-    # end
-
-    # if HAVE_HEEL then
-      # desc &quot;View the RDoc documentation locally&quot;
-      # task :view =&gt; :rdoc do
-        # sh &quot;heel --root  #{Stickler::SPEC.local_rdoc_dir}&quot;
-      # end
-    # end
-  end
+      rdoc.main       = rdoc_config.main_page
+    end 
+
+    if rubyforge_config = Configuration.for_if_exist?('rubyforge') then
+      desc &quot;Deploy the RDoc documentation to #{rubyforge_config.rdoc_location}&quot;
+      task :deploy =&gt; :rerdoc do
+        sh &quot;rsync -zav --delete #{rdoc_config.output_dir}/ #{rubyforge_config.rdoc_location}&quot;
+      end 
+    end 
+
+  end 
 end
+</diff>
      <filename>tasks/documentation.rake</filename>
    </modified>
    <modified>
      <diff>@@ -1,32 +1,29 @@
+
 require 'tasks/config'
-if spec_config = Configuration.for_if_exist('test') then
 
-  namespace :test do
-  
-    task :default =&gt; :spec
-    
-    require 'spec/rake/spectask'
-    Spec::Rake::SpecTask.new do |r| 
-      r.ruby_opts   = spec_config.ruby_opts
-      r.libs        = [ Stickler::Configuration.lib_path, 
-                      Stickler::Configuration.root_dir ]
-      r.spec_files  = spec_config.files
-      r.spec_opts   = spec_config.options
+#--------------------------------------------------------------------------------
+# configuration for running rspec.  This shows up as the test:default task
+#--------------------------------------------------------------------------------
+if spec_config = Configuration.for_if_exist?(&quot;test&quot;) then
+  if spec_config.mode == &quot;spec&quot; then
+    namespace :test do
 
-      if rcov_config = Configuration.for_if_exist('rcov') then
-        r.rcov      = true
-        r.rcov_dir  = rcov_config.output_dir
-        r.rcov_opts = rcov_config.rcov_opts
-      end
+      task :default =&gt; :spec
+
+      require 'spec/rake/spectask'
+      Spec::Rake::SpecTask.new do |r| 
+        r.ruby_opts   = spec_config.ruby_opts
+        r.libs        = [ Stickler::Paths.lib_path, 
+                          Stickler::Paths.root_dir ]
+        r.spec_files  = spec_config.files 
+        r.spec_opts   = spec_config.options
 
+        if rcov_config = Configuration.for_if_exist?('rcov') then
+          r.rcov      = true
+          r.rcov_dir  = rcov_config.output_dir
+          r.rcov_opts = rcov_config.rcov_opts
+        end
+      end
     end
   end
-
-  #if HAVE_HEEL then
-  #desc &quot;View the code coverage report locally&quot;
-  #task :coverage =&gt; [:spec] do
-  #sh &quot;heel --root #{Stickler::SPEC.local_coverage_dir}&quot;
-  #end 
-  #end
-
 end</diff>
      <filename>tasks/rspec.rake</filename>
    </modified>
    <modified>
      <diff>@@ -1,44 +1,49 @@
-require 'tasks/config'
-if rf_conf = Configuration.for_if_exist('rubyforge') then
-  #-----------------------------------------------------------------------
-  # Rubyforge additions to the task library
-  #-----------------------------------------------------------------------
-  require 'rubyforge'
+require 'tasks/config'    
+
+#-----------------------------------------------------------------------
+# Rubyforge additions to the task library
+#-----------------------------------------------------------------------
+if rf_conf = Configuration.for_if_exist?(&quot;rubyforge&quot;) then
+
+  abort(&quot;rubyforge gem not installed 'gem install rubyforge'&quot;) unless Utils.try_require('rubyforge')
   
-  prof_conf = Configuration.for('project')
+  proj_conf = Configuration.for('project')
 
   namespace :dist do
     desc &quot;Release files to rubyforge&quot;
     task :rubyforge =&gt; [:clean, :package] do
 
-      rubyforge = ::RubyForge.new
+      rubyforge = RubyForge.new
+
+      config = {}
+      config[&quot;release_notes&quot;]     = proj_conf.description
+      config[&quot;release_changes&quot;]   = Utils.release_notes_from(proj_conf.history)[Stickler::VERSION]
+      config[&quot;Prefomatted&quot;]       = true
+
+      rubyforge.configure
 
       # make sure this release doesn't already exist
       releases = rubyforge.autoconfig['release_ids']
-      if releases.has_key?(prof_conf.name) and releases[prof_conf.name][Stickler::VERSION] then
+      if releases.has_key?(Stickler::GEM_SPEC.name) and releases[Stickler::GEM_SPEC.name][Stickler::VERSION] then
         abort(&quot;Release #{Stickler::VERSION} already exists! Unable to release.&quot;)
       end
 
-      config = rubyforge.userconfig
-      config[&quot;release_notes&quot;]     = prof_conf.description
-      config[&quot;release_changes&quot;]   = Utils.release_notes_from(proj_conf.history)[Stickler::VERSION]
-      config[&quot;Prefomatted&quot;]       = true
-
       puts &quot;Uploading to rubyforge...&quot;
-      files = FileList[File.join(&quot;pkg&quot;,&quot;#{prof_conf.name}-#{Stickler::VERSION}*.*&quot;)].to_a
+      files = FileList[File.join(&quot;pkg&quot;,&quot;#{Stickler::GEM_SPEC.name}-#{Stickler::VERSION}*.*&quot;)].to_a
       rubyforge.login
-      rubyforge.add_release(rf_conf.project, prof_conf.name, Stickler::VERSION, *files)
+      rubyforge.add_release(Stickler::GEM_SPEC.rubyforge_project, Stickler::GEM_SPEC.name, Stickler::VERSION, *files)
       puts &quot;done.&quot;
     end
   end
 
   namespace :announce do
-    desc &quot;Post news of #{prof_conf.name} to #{rf_conf.project} on rubyforge&quot;
+    desc &quot;Post news of #{proj_conf.name} to #{rf_conf.project} on rubyforge&quot;
     task :rubyforge do
-      subject, title, body, urls = announcement
+      info = Utils.announcement
       rubyforge = RubyForge.new
+      rubyforge.configure
       rubyforge.login
-      rubyforge.post_news(rf_conf.project, subject, &quot;#{title}\n\n#{urls}\n\n#{body}&quot;)
+      rubyforge.post_news(rf_conf.project, info[:subject], &quot;#{info[:title]}\n\n#{info[:urls]}\n\n#{info[:release_notes]}&quot;)
       puts &quot;Posted to rubyforge&quot;
     end
 </diff>
      <filename>tasks/rubyforge.rake</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,25 @@
 require 'stickler/version'
+
+#-------------------------------------------------------------------------------
+# Additions to the Configuration class that are useful
+#-------------------------------------------------------------------------------
+class Configuration
+  class &lt;&lt; self
+    def exist?( name )
+      Configuration::Table.has_key?( name )
+    end
+
+    def for_if_exist?( name )
+      if self.exist?( name ) then
+        self.for( name )
+      end
+    end
+  end
+end
+
+#-------------------------------------------------------------------------------
+# some useful utilitiy methods for the tasks
+#-------------------------------------------------------------------------------
 module Utils
   class &lt;&lt; self
 
@@ -34,13 +55,26 @@ module Utils
     def release_notes_from(history_file)
       releases = {}
       File.read(history_file).split(/^(?==)/).each do |section|
-        lines = release.split(&quot;\n&quot;)
+        lines = section.split(&quot;\n&quot;)
         md = %r{Version ((\w+\.)+\w+)}.match(lines.first)
         next unless md
         releases[md[1]] = lines[1..-1].join(&quot;\n&quot;).strip
       end
       return releases
     end
-  end # &lt;&lt; self
-end
 
+    # return a hash of useful information for the latest release
+    # urls, subject, title, description and latest release notes
+    #
+    def announcement
+      cfg = Configuration.for(&quot;project&quot;) 
+      { 
+        :subject        =&gt; &quot;#{cfg.name} #{Stickler::VERSION} Released&quot;,
+        :title          =&gt; &quot;#{cfg.name} version #{Stickler::VERSION} has been released.&quot;,
+        :urls           =&gt; &quot;#{cfg.homepage}&quot;,
+        :description    =&gt; &quot;#{cfg.description.rstrip}&quot;,
+        :release_notes  =&gt; Utils.release_notes_from(cfg.history)[Stickler::VERSION].rstrip 
+      }
+    end
+  end
+end # &lt;&lt; self</diff>
      <filename>tasks/utils.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>data/stickler.rb</filename>
    </removed>
    <removed>
      <filename>lib/configuration.rb</filename>
    </removed>
    <removed>
      <filename>tasks/site.rake</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>8de59adc60fdb130b637ecfd098451191748e930</id>
    </parent>
  </parents>
  <author>
    <name>Jeremy Hinegardner</name>
    <email>jeremy@hinegardner.org</email>
  </author>
  <url>http://github.com/copiousfreetime/stickler/commit/67721ed04a0a578b5a5b3a931b190e162492a1c5</url>
  <id>67721ed04a0a578b5a5b3a931b190e162492a1c5</id>
  <committed-date>2008-09-20T18:07:00-07:00</committed-date>
  <authored-date>2008-09-20T18:07:00-07:00</authored-date>
  <message>restructure project</message>
  <tree>b24a5996536461241955376a232ccfa857d95d50</tree>
  <committer>
    <name>Jeremy Hinegardner</name>
    <email>jeremy@hinegardner.org</email>
  </committer>
</commit>
