<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kevin&#039;s random thoughts</title>
	<atom:link href="http://kbullock.ringworld.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://kbullock.ringworld.org</link>
	<description>god, tech, and other geekery</description>
	<lastBuildDate>Mon, 23 Apr 2012 22:49:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Hosting RubyGems for local use</title>
		<link>http://kbullock.ringworld.org/2012/03/29/hosting-rubygems-for-local-use-geminabox/</link>
		<comments>http://kbullock.ringworld.org/2012/03/29/hosting-rubygems-for-local-use-geminabox/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 19:02:46 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/?p=1753</guid>
		<description><![CDATA[Last week at work I set up my own RubyGems repository to host some local builds of upstream gems. Following the recommendation on <a href="http://guides.rubygems.org/run-your-own-gem-server/">guides.rubygems.org</a>, I tried out <a href="https://github.com/cwninja/geminabox">Gem in a Box</a>. It works perfectly as advertised, but the setup is largely left as an exercise for the reader (who is assumed to know their way around a web app deployment process).

I'll run through the process I used both as a step-by-step guide to setting up a reasonably locked-down and authenticated (for upload) gem server, and as an example of how to deploy an arbitrary Ruby web app using a sane, repeatable process.]]></description>
			<content:encoded><![CDATA[<p>Last week at work I set up my own RubyGems repository to host some local builds of upstream gems. Following the recommendation on <a href="http://guides.rubygems.org/run-your-own-gem-server/">guides.rubygems.org</a>, I tried out <a href="https://github.com/cwninja/geminabox">Gem in a Box</a>. It works perfectly as advertised, but the setup is largely left as an exercise for the reader (who is assumed to know their way around a web app deployment process).</p>

<p>I&#8217;ll run through the process I used both as a step-by-step guide to setting up a reasonably locked-down and authenticated (for upload) gem server, and as an example of how to deploy an arbitrary Ruby web app using a sane, repeatable process.</p>

<p><span id="more-1753"></span></p>

<p>Gem in a Box consists of a <a href="http://www.sinatrarb.com/">Sinatra</a> app and a RubyGems <a href="http://guides.rubygems.org/plugins/">plugin</a>, packaged together in a single gem. We could thus just <code>gem install geminabox</code> and go from there, but we want to do this the Right Way(tm). That means:</p>

<ul>
<li>Being able to manage dependencies on deployment easily: <a href="http://gembundler.com/">Bundler</a></li>
<li>Using a deployment tool: <a href="http://rubyhitsquad.com/Vlad_the_Deployer.html">Vlad</a></li>
<li>Keeping our setup in source control: <a href="http://mercurial.selenic.com/">Mercurial</a></li>
</ul>

<p>Substitute Capistrano, Subversion, Git, or other tools as appropriate; the above make up my preferred toolkit. We&#8217;ll also be deploying with <a href="http://unicorn.bogomips.org/">Unicorn</a>, and we&#8217;ll want the appropriate Vlad plugins (namely <a href="http://hitsquad.rubyforge.org/vlad-hg/">vlad-hg</a> and <a href="http://hitsquad.rubyforge.org/vlad-unicorn/">vlad-unicorn</a>) to ease our deployment too.</p>

<h3>1. Create a repository</h3>

<pre><code>$ hg init boxogems
$ cd boxogems
</code></pre>

<h3>2. Create a Gemfile</h3>

<pre><code>source :rubygems

gem 'geminabox'
gem 'unicorn'

group :development do
  gem 'rake'
  gem 'vlad'
  gem 'vlad-hg'
  gem 'vlad-unicorn'
end
</code></pre>

<h3>3. Set up Vlad</h3>

<pre><code># Rakefile
begin
  require 'vlad'
  Vlad.load(:scm =&gt; :mercurial, :type =&gt; nil,
    :app =&gt; :unicorn, :config =&gt; 'vlad.conf.rb')
rescue LoadError
end
</code></pre>

<p>This is just your standard <code>Vlad.load</code> call, but note that we&#8217;re passing <code>:type =&gt; nil</code>. The <code>:type</code> option defaults to <code>:rails</code> &#8212; but we don&#8217;t want to load any of the Rails-specific setup tasks. This way we bypass creating unnecessary symlinks from our release code into the <code>shared/</code> directory.</p>

<p>Also note that I&#8217;m using a non-standard filename for the Vlad config&#8211;if you want to create a <code>config/</code> directory in your project and use the normal <code>config/deploy.rb</code>, that&#8217;s fine. Setting up Gem in a Box requires so little code that I decided to avoid creating unnecessary subdirectories.</p>

<p>Now we create the deployment configuration. We&#8217;ll put the whole gem repository, both the app deployment we&#8217;re creating here and the hosted gems, in a subdirectory of <a href="http://www.pathname.com/fhs/pub/fhs-2.3.html#SRVDATAFORSERVICESPROVIDEDBYSYSTEM"><code>/srv</code></a>, with the app in <code>/srv/rubygems/app</code> and the hosted gems in <code>/srv/rubygems/data</code>.</p>

<pre><code># vlad.conf.rb (or config/deploy.rb)
set :application, 'boxogems'
set :domain, 'backend.example.com'
set :deploy_to, '/srv/rubygems/app'
set :repository, 'ssh://backend.example.com//path/to/boxogems'
set :unicorn_command, "cd #{current_path} &amp;&amp; bundle exec unicorn"
</code></pre>

<h3>4. Create the rackup file</h3>

<p>Now that we&#8217;ve got the deployment harness in place, we can describe our app instance:</p>

<pre><code>require 'geminabox'
Geminabox.data = '/srv/rubygems/data'
map '/gems' do
  run Geminabox
end
</code></pre>

<p>I didn&#8217;t feel the need to create a whole new virtual host when I&#8217;ve already got a perfectly good back-end web server (with an SSL certificate), so I&#8217;m using the <a href="http://rack.rubyforge.org/doc/Rack/Builder.html"><code>Rack::URLMap</code></a> middleware to serve the app on a URI prefix (subdirectory, path prefix, etc.) of &#8216;/gems&#8217;.</p>

<h3>5. Commit and push</h3>

<pre><code>$ hg ci -m 'initial Gem in a Box setup'
$ hg clone . ssh://backend.example.com//path/to/boxogems
</code></pre>

<h3>6. Deploy the app</h3>

<p>Now you should be able to tell Vlad to deploy your app:</p>

<pre><code>$ rake vlad:setup vlad:update
</code></pre>

<p>If all goes well, you can now SSH into your server and&#8230;</p>

<h3>7. Configure the server</h3>

<p>Create the Unicorn configuration file at <code>/srv/rubygems/app/shared/config/unicorn.rb</code>. The specifics are up to you, but here&#8217;s what mine looks like:</p>

<pre><code># shared/config/unicorn.rb
listen '127.0.0.1:4242'
pid '/srv/rubygems/app/shared/pids/unicorn.pid'
stdout_path '/srv/rubygems/app/shared/log/unicorn.stdout.log'
stderr_path '/srv/rubygems/app/shared/log/unicorn.stderr.log'
</code></pre>

<p>If you&#8217;re following the usual practice, you&#8217;ll probably bundle the gems in your deployed app. I don&#8217;t do it that way&#8211;I use Bundler to resolve dependencies, not to duplicate the same gems all over my server&#8217;s hard drive. So after I run <code>rake vlad:update</code>, I always:</p>

<pre><code>server$ cd /srv/rubygems/app/current
server$ sudo bundle install --system --without development
</code></pre>

<p>Now you should be able to start the app using Vlad:</p>

<pre><code>$ rake vlad:start_app
</code></pre>

<p>Check for output from Unicorn in <code>/srv/rubygems/app/shared/log/unicorn.stderr.log</code>. You should see a line that says something like:</p>

<pre><code>I, [2012-03-22T11:32:55.918690 #10411]  INFO -- : worker=0 ready
</code></pre>

<p>That means the app is ready to serve requests; now to make Apache proxy requests to it. This is a bit different from the usual Apache config for a Rails app, so we use a <code>&lt;Location&gt;</code> block inside the virtual host config to do the proxying:</p>

<pre><code># Proxy anything under /gems to Gem in a Box
RewriteEngine On
RewriteRule ^/gems http://127.0.0.1:4242%{REQUEST_URI} [P,QSA,L]

&lt;Location /gems&gt;
  # Limit access to local network
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 172.16.0.0/20

  # Set up HTTP Basic authentication
  # Substitute your own authentication info here
  AuthName "Box o' Gems"
  AuthType Basic
  AuthUserFile /srv/rubygems/app/shared/config/htpasswd

  # Only allow authenticated users to upload gems
  &lt;LimitExcept GET&gt;
    Require valid-user
  &lt;/LimitExcept&gt;
&lt;/Location&gt;
</code></pre>

<p>Of course, you can force authentication even to download gems just by moving the <code>Require valid-user</code> line outside of the <code>&lt;LimitExcept&gt;</code> block (and removing the empty block). Adjust to your own needs.</p>

<p>At this point you&#8217;re probably thinking, &#8220;Hey, shouldn&#8217;t we be letting Apache serve the static files?&#8221; I&#8217;ll leave that as an exercise for the reader, but I&#8217;ll mention that I tried it, and then went back to letting Gem in a Box handle it directly. To make Apache do it I would&#8217;ve had to teach it about the MIME type of .gem files.</p>

<p>Now restart Apache and you should have a fully-functional RubyGems server!</p>

<h3>Extras</h3>

<p>If you want to be fancy, you can add a little magic into your Rakefile to make <code>rake vlad:setup_app</code> write a default Unicorn config into the right place for you. Put the default config into your source repository as <code>unicorn.example.rb</code>, then add this inside the <code>begin ... rescue LoadError ... end</code> block in your Rakefile:</p>

<pre><code>namespace :vlad do
  task :setup_app do
    commands = ["umask #{umask}"]
    commands &lt;&lt; "mkdir -p #{shared_path}/config"
    commands &lt;&lt; "chown #{perm_owner} #{shared_path}/config" if perm_owner
    commands &lt;&lt; "chgrp #{perm_group} #{shared_path}/config" if perm_group
    run commands.join(' &amp;&amp; ')

    put(unicorn_config) { File.read('unicorn.example.rb') }
    run %(chmod 640 #{unicorn_config})
  end
end
</code></pre>

<p>You can also add a chunk of code that automatically installs the gems like I showed above:</p>

<pre><code>namespace :vlad do
  task :update do
    run %(cd #{current_path} &amp;&amp; sudo bundle install --system --without development)
  end
end
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2012/03/29/hosting-rubygems-for-local-use-geminabox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vlad-unicorn version 2.1.1 has been released!</title>
		<link>http://kbullock.ringworld.org/2012/02/01/vlad-unicorn-version-2-1-1-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2012/02/01/vlad-unicorn-version-2-1-1-has-been-released/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 19:35:12 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2012/02/01/vlad-unicorn-version-2-1-1-has-been-released/</guid>
		<description><![CDATA[Unicorn app server support for Vlad. Adds support for vlad:startapp and vlad:stopapp using Unicorn[http://unicorn.bogomips.org/]. Changes: 2.1.1 / 2011-12-28 1 bug fix Allow complex commands in unicorn_command (Matthew Smith) http://bitbucket.org/krbullock/vlad-unicorn/]]></description>
			<content:encoded><![CDATA[<p>Unicorn app server support for Vlad. Adds support for vlad:start<em>app and
vlad:stop</em>app using Unicorn[http://unicorn.bogomips.org/].</p>

<p>Changes:</p>

<h3>2.1.1 / 2011-12-28</h3>

<ul>
<li><p>1 bug fix</p>

<ul>
<li>Allow complex commands in unicorn_command (Matthew Smith)</li>
</ul></li>
<li><p><a href="http://bitbucket.org/krbullock/vlad-unicorn/">http://bitbucket.org/krbullock/vlad-unicorn/</a></p></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2012/02/01/vlad-unicorn-version-2-1-1-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vlad-unicorn version 2.1.0 has been released!</title>
		<link>http://kbullock.ringworld.org/2011/09/30/vlad-unicorn-version-2-1-0-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2011/09/30/vlad-unicorn-version-2-1-0-has-been-released/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 21:49:35 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2011/09/30/vlad-unicorn-version-2-1-0-has-been-released/</guid>
		<description><![CDATA[Unicorn app server support for Vlad. Adds support for vlad:startapp and vlad:stopapp using Unicorn[http://unicorn.bogomips.org/]. Changes: 2.1.0 / 2011-09-30 1 minor enhancement Now uses SIGHUP to restart Added documentation on use with Rails 2.3 apps with Bundler http://bitbucket.org/krbullock/vlad-unicorn/]]></description>
			<content:encoded><![CDATA[<p>Unicorn app server support for Vlad. Adds support for vlad:start<em>app and
vlad:stop</em>app using Unicorn[http://unicorn.bogomips.org/].</p>

<p>Changes:</p>

<h3>2.1.0 / 2011-09-30</h3>

<ul>
<li><p>1 minor enhancement</p>

<ul>
<li>Now uses SIGHUP to restart</li>
</ul></li>
<li><p>Added documentation on use with Rails 2.3 apps with Bundler</p></li>
<li><p><a href="http://bitbucket.org/krbullock/vlad-unicorn/">http://bitbucket.org/krbullock/vlad-unicorn/</a></p></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2011/09/30/vlad-unicorn-version-2-1-0-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vlad-hg version 2.2.3 has been released!</title>
		<link>http://kbullock.ringworld.org/2011/09/30/vlad-hg-version-2-2-3-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2011/09/30/vlad-hg-version-2-2-3-has-been-released/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 15:16:56 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2011/09/30/vlad-hg-version-2-2-3-has-been-released/</guid>
		<description><![CDATA[Mercurial support for Vlad. Using it is as simple as passing :scm => :mercurial to Vlad when loading it up. Changes: 2.2.3 / 2011-09-29 2 bug fixes Use hg qclone when cloning a repository with a patch queue, so that the default path on the deployment patch queue repo is set to the central repository. [...]]]></description>
			<content:encoded><![CDATA[<p>Mercurial support for Vlad. Using it is as simple as passing
<tt>:scm => :mercurial</tt> to Vlad when loading it up.</p>

<p>Changes:</p>

<h3>2.2.3 / 2011-09-29</h3>

<ul>
<li><p>2 bug fixes</p>

<ul>
<li><p>Use <code>hg qclone</code> when cloning a repository with a patch queue,
so that the default path on the deployment patch queue repo is set to the
central repository. This matches the bugfix made in 2.2.0.</p></li>
<li><p>Set a default value for +hg_subrepos+ when using MQ. This prevents the
export step from blowing up with an &#8220;undefined local variable or method&#8221;
error.</p></li>
</ul></li>
<li><p><a href="http://hitsquad.rubyforge.org/vlad-hg/">http://hitsquad.rubyforge.org/vlad-hg/</a></p></li>
<li><a href="http://rubyforge.org/projects/hitsquad/">http://rubyforge.org/projects/hitsquad/</a></li>
<li><a href="http://bitbucket.org/krbullock/vlad-hg/">http://bitbucket.org/krbullock/vlad-hg/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2011/09/30/vlad-hg-version-2-2-3-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vlad-hg version 2.2.2 has been released!</title>
		<link>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-2-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-2-has-been-released/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 20:10:14 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-2-has-been-released/</guid>
		<description><![CDATA[Mercurial support for Vlad. Using it is as simple as passing :scm => :mercurial to Vlad when loading it up. Changes: 2.2.2 / 2011-07-18 1 bug fix Respect +deployvia+ and +hgsubrepos+ when using MQ http://hitsquad.rubyforge.org/vlad-hg/ http://rubyforge.org/projects/hitsquad/ http://bitbucket.org/krbullock/vlad-hg/]]></description>
			<content:encoded><![CDATA[<p>Mercurial support for Vlad. Using it is as simple as passing
<tt>:scm => :mercurial</tt> to Vlad when loading it up.</p>

<p>Changes:</p>

<h3>2.2.2 / 2011-07-18</h3>

<ul>
<li><p>1 bug fix</p>

<ul>
<li>Respect +deploy<em>via+ and +hg</em>subrepos+ when using MQ</li>
</ul></li>
<li><p><a href="http://hitsquad.rubyforge.org/vlad-hg/">http://hitsquad.rubyforge.org/vlad-hg/</a></p></li>
<li><a href="http://rubyforge.org/projects/hitsquad/">http://rubyforge.org/projects/hitsquad/</a></li>
<li><a href="http://bitbucket.org/krbullock/vlad-hg/">http://bitbucket.org/krbullock/vlad-hg/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-2-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vlad-hg version 2.2.1 has been released!</title>
		<link>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-1-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-1-has-been-released/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 16:56:02 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-1-has-been-released/</guid>
		<description><![CDATA[Mercurial support for Vlad. Using it is as simple as passing :scm => :mercurial to Vlad when loading it up. Changes: 2.2.1 / 2011-07-18 1 bug fix Fix regressions caused by failure to merge 2.1.3 before releasing 2.2.0. http://hitsquad.rubyforge.org/vlad-hg/ http://rubyforge.org/projects/hitsquad/ http://bitbucket.org/krbullock/vlad-hg/]]></description>
			<content:encoded><![CDATA[<p>Mercurial support for Vlad. Using it is as simple as passing
<tt>:scm => :mercurial</tt> to Vlad when loading it up.</p>

<p>Changes:</p>

<h3>2.2.1 / 2011-07-18</h3>

<ul>
<li><p>1 bug fix</p>

<ul>
<li>Fix regressions caused by failure to merge 2.1.3 before releasing 2.2.0.</li>
</ul></li>
<li><p><a href="http://hitsquad.rubyforge.org/vlad-hg/">http://hitsquad.rubyforge.org/vlad-hg/</a></p></li>
<li><a href="http://rubyforge.org/projects/hitsquad/">http://rubyforge.org/projects/hitsquad/</a></li>
<li><a href="http://bitbucket.org/krbullock/vlad-hg/">http://bitbucket.org/krbullock/vlad-hg/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-1-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vlad-hg version 2.2.0 has been released!</title>
		<link>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-0-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-0-has-been-released/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 16:55:10 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-0-has-been-released/</guid>
		<description><![CDATA[Mercurial support for Vlad. Using it is as simple as passing :scm => :mercurial to Vlad when loading it up. Changes: 2.2.0 / 2011-07-18 1 minor enhancement Added +hg_subrepos+ variable. When set to +true+, the export step recurses into subdirectories (adds the -S flag to hg archive). 1 bug fix Now does a proper hg [...]]]></description>
			<content:encoded><![CDATA[<p>Mercurial support for Vlad. Using it is as simple as passing
<tt>:scm => :mercurial</tt> to Vlad when loading it up.</p>

<p>Changes:</p>

<h3>2.2.0 / 2011-07-18</h3>

<ul>
<li><p>1 minor enhancement</p>

<ul>
<li>Added +hg_subrepos+ variable. When set to +true+, the export step recurses
into subdirectories (adds the -S flag to <code>hg archive</code>).</li>
</ul></li>
<li><p>1 bug fix</p>

<ul>
<li>Now does a proper <code>hg clone</code>, so that the default path on the
deployment clone is set to the central repository. This is necessary if your
repo has subrepos with relative paths.</li>
</ul></li>
<li><p><a href="http://hitsquad.rubyforge.org/vlad-hg/">http://hitsquad.rubyforge.org/vlad-hg/</a></p></li>
<li><a href="http://rubyforge.org/projects/hitsquad/">http://rubyforge.org/projects/hitsquad/</a></li>
<li><a href="http://bitbucket.org/krbullock/vlad-hg/">http://bitbucket.org/krbullock/vlad-hg/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2011/07/18/vlad-hg-version-2-2-0-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ruby-configurable version 1.0.2 has been released!</title>
		<link>http://kbullock.ringworld.org/2011/05/10/ruby-configurable-version-1-0-2-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2011/05/10/ruby-configurable-version-1-0-2-has-been-released/#comments</comments>
		<pubDate>Wed, 11 May 2011 04:33:52 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2011/05/10/ruby-configurable-version-1-0-2-has-been-released/</guid>
		<description><![CDATA[Lets you make your Ruby class configurable with a simple mixin. Changes: 1.0.2 / 2011-05-10 1 minor enhancement Default config is now accessible thru the generated Config module, as Config.defaults. The default_config method added to your class when you include Configurable is deprecated, but will continue to work (on both your class and instances of [...]]]></description>
			<content:encoded><![CDATA[<p>Lets you make your Ruby class configurable with a simple mixin.</p>

<p>Changes:</p>

<h3>1.0.2 / 2011-05-10</h3>

<ul>
<li><p>1 minor enhancement</p>

<ul>
<li>Default config is now accessible thru the generated Config module,
as Config.defaults. The default_config method added to your class
when you include Configurable is deprecated, but will continue to
work (on both your class and instances of it).</li>
</ul></li>
<li><p><a href="http://bitbucket.org/krbullock/configurable">http://bitbucket.org/krbullock/configurable</a></p></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2011/05/10/ruby-configurable-version-1-0-2-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ruby-configurable version 1.0.1 has been released!</title>
		<link>http://kbullock.ringworld.org/2011/05/06/ruby-configurable-version-1-0-1-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2011/05/06/ruby-configurable-version-1-0-1-has-been-released/#comments</comments>
		<pubDate>Fri, 06 May 2011 17:06:17 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2011/05/06/ruby-configurable-version-1-0-1-has-been-released/</guid>
		<description><![CDATA[Lets you make your Ruby class configurable with a simple mixin. Changes: 1.0.1 / 2011-05-06 2 bugfixes to_args now returns a Hash with symbols as keys. This lets you pass your configuration directly to methods that expect option-style hash arguments. to_args now excludes nil values from the resulting hash. http://bitbucket.org/krbullock/configurable]]></description>
			<content:encoded><![CDATA[<p>Lets you make your Ruby class configurable with a simple mixin.</p>

<p>Changes:</p>

<h3>1.0.1 / 2011-05-06</h3>

<ul>
<li><p>2 bugfixes</p>

<ul>
<li><p>to_args now returns a Hash with symbols as keys. This lets you pass
your configuration directly to methods that expect option-style hash
arguments.</p></li>
<li><p>to_args now excludes nil values from the resulting hash.</p></li>
</ul></li>
<li><p><a href="http://bitbucket.org/krbullock/configurable">http://bitbucket.org/krbullock/configurable</a></p></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2011/05/06/ruby-configurable-version-1-0-1-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ruby-configurable version 1.0.0 has been released!</title>
		<link>http://kbullock.ringworld.org/2011/05/04/ruby-configurable-version-1-0-0-has-been-released/</link>
		<comments>http://kbullock.ringworld.org/2011/05/04/ruby-configurable-version-1-0-0-has-been-released/#comments</comments>
		<pubDate>Thu, 05 May 2011 04:49:25 +0000</pubDate>
		<dc:creator>kbullock</dc:creator>
				<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://kbullock.ringworld.org/2011/05/04/ruby-configurable-version-1-0-0-has-been-released/</guid>
		<description><![CDATA[Lets you make your Ruby class configurable with a simple mixin. Changes: 1.0.0 / 2011-05-03 1 major enhancement Birthday! http://bitbucket.org/krbullock/configurable]]></description>
			<content:encoded><![CDATA[<p>Lets you make your Ruby class configurable with a simple mixin.</p>

<p>Changes:</p>

<h3>1.0.0 / 2011-05-03</h3>

<ul>
<li><p>1 major enhancement</p>

<ul>
<li>Birthday!</li>
</ul></li>
<li><p><a href="http://bitbucket.org/krbullock/configurable">http://bitbucket.org/krbullock/configurable</a></p></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kbullock.ringworld.org/2011/05/04/ruby-configurable-version-1-0-0-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

