
Its almost Christmas time and that means presents.
It also means that sometime between today and December 25th you need to go out and buy other people some presents because you haven’t done it yet.
But there’s someone else special in your life that deserves an Xmas gift this year. That special someone is your open source projects.
You might think, “But, Dr Nic, what do I get for the open source project that already has everything? What gift would my open source projects possible appreciate?”
Its true – this year has been a boon for open source. You probably migrated your projects from SVN to Git this year. Specifically, you probably clicked the “create a new one” link on your GitHub home page a lot this year: either to migrate your old projects to github or start new ones. Lots of new ones.
And now that your code is on github, your README file is rendered beautifully on the home page, so you were more inclined to rename it to README.markdown or README.textile and thusforthly fill it full of education information about your projects.
More people would then instantaneously figure out what the f@#$ your project actually does, thus more people used it, thus more people wrote patches or forked your code and sent Pull Requests.
All round, in 2008, I bet your open source projects had a sweet year.
Nonetheless, it is Christmas time and you should now get them a present. Something they wouldn’t get for themselves. Something you wouldn’t have done for them except for the free loving spirit of Christmas.
The Gift for all Open Source projects

A website.
Oh sure, github renders your README.markdown file. Yeah, yeah, github gives you a wiki for your project. Sure, sure, Google Groups let you communicate with your co-developers and users. Certainly, you don’t need a website for your project.
That’s why its a Christmas gift. You’re going to do it because you care.
Websites sell your project. READMEs and Wikis educate. The project website will sell it and make people want to use your stuff.
A website could have a blog with an RSS/atom feed. Then you could post updates about your project. People could subscribe and also leave comments. Oh the novelty.
And if it only took 5 minutes to get all this setup – the website code, the blog engine, the RSS feed, the comments, and published to its own hosted server – then that would just be oh so sweet.
So we’re going to do some craft for our Xmas present. A little DIY project, if you will. You’ll need a few things that you’ll find around your house, a command-line interface, and a beer or perhaps some port or sherry. Christmas cake is good too.
(more…)

Bugger.
I’m a Ruby monogamist. I use the Ruby that comes with Leopard (ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]). Oh sure I’ve cheated on my Ruby a couple of times. It was just sex, I didn’t fall in love, I promise.
My machine has had various versions of jRuby, Rubinius and MacRuby installed at various times, but I don’t think it’s ever had two working copies of Ruby MRI (Matz Ruby Implementation) at a time.
Ok, that’s a lie. On Christmas Day 2007, Matz released Ruby 1.9. Yes I was a deviant. I installed it. But I didn’t inhale. ruby19 sat on my filesystem outside the $PATH. It was a trophy not a tool.
My Ruby monogamy was working out perfectly for me, whilst I collected futurist and novelty Ruby implementations as a passive hobby, until yesterday when I saw the above tweet.
That’s a bit of a bugger. I mean, why was he playing with Ruby 1.9.1 anyway?
Or perhaps having multiple version of Ruby on one computer isn’t some illicit activity. Everyone else is doing it, Your Honour.
I still didn’t care for having multiple ruby versions lying around in my path; but I had to fix rubigen. I just wanted a way to fix bugs against ruby 1.9+ and move on with my life. I didn’t want to have to do any manual work in order to set this up. Surely someone else has solved this problem already?
(more…)

The Open Source Developers Conference (osdc) is a nifty conference – people from different language communities, who all do open source, come together in harmony. They simultaneously snigger at each other and then proceed to steal each others ideas when they aren’t looking.
Miscellaneous idea possibly worth stealing from Perl: when you install Perl modules from CPAN it runs the module’s tests locally to confirm everything is oaky-dokey. You can manually do this via gem install --test rails, but its not the default. Nor have I ever used the --test flag. I just looked it up via gem help install. I like it.
Another CPAN thing to steal: For any RubyGem or perhaps Rails project on rubyforge/github/whatever, show the aggregate status of tests. Here’s a sample from CPAN. Lots of green lines but the aggregate change of this project working? 11%. I like the chart, and perhaps runcoderun or some other hosted CI service to generate a sexy graph of test outputs for dependencies.
Anyway, Ruby. I did a talk. I have slides.
Over time I’ve written a few RubyGems and am pretty happy with my basic tools and workflow for getting new gems out the door or maintaining existing projects. I use newgem + a patched version of hoe, I use git + github, and recently I started using runcoderun for hosted continuous integration.
If you’re new to creating your own RubyGems, perhaps my workflow and tools are a useful starting point to follow.
If you want an account with runcoderun, and I reckon you do, then hassle Rob Sanheim (twitter). For what its worth, tell him I said it was urgent.
There is now a sexy blog badge to show off the current pass/fail state of each of your projects, by Glenn Vanderburg. Badges are fun. It seems to clash with having github-badge in the same page, and there are other bugs with these badges. Probably my fault. I should investigate that soon.
Radio is where ugly people go. Podcasts is where ugly, niche people go. It doesn’t get much uglier and nicher than talking about iPhone dev; and the tale of one desperate man X on a desperate journey Y with his desperate sidekick Z, where:
- X = Dr Nic
- Y = iPhone development
- Z = Ruby
From the Mobile Orchard news desk:

Dr. Nic talks about his migration manager for updating SQLite iPhone databases, trying to get Ruby onto an iPhone, using Ruby to unit-test Objective-C iPhone code, his company Mocra, and the Mobile Orchard Podcast’s lavish recording studios.
Dan Grigsby is the interviewer and post-production guy for the interview, and so it is entirely his handy work that it seems like I’m the only one talking for 15 minutes. The original interview took 4 hours and it was mostly him talking. He’s quite a chatterbox. I barely got a word in edgewise. [1]
Dan also created this list of “things we talked about”:
- 0:00: Migrations for SQLite
- 5:18: Getting Ruby onto an iPhone
- 5:59: Nu – Lisp-based language that sits atop Obj-C and would work on the iPhone
- 7:37: Unit testing Obj-C from Ruby
- 8:12: Webkit UIs
- 12:31: Mocra / “Used my blog for evil”

Go to Mobile Orchard (or Mobile Awkward it is accidently called at the end of the interview) to cop a listen.
[1] This paragraph starts well and ends with blatant falsehoods.
The New Gem Generator (newgem) was exciting, moderately revolutionary, and definitely helpful two years ago when I created it. Of late it seems to attract a chunk of criticism:
- making a new gem, but newgem seems broken… hoe hoe
- NewGem has the “hoe” virus. Much prefer Mr. Bones.
- the newgem site is begging for someone to put the word fuck on its front page
- Almost two days fighting with newgem, but today i won! The secret is hoe 1.7.0 and rubygem 1.2.0.
- unfortunately for the one project I went with newgem, will give Mr. Bones a try on the next gem I throw out there.
- sow or newgem, neither, Mr. Bones
- egads, the website newgem sets up for you looks awful
- newgem seems to be failed to generate package if AUTHOR is an array of authors.
On the positive side of the spectrum is the following list:
- newgem? really? you rock drnic!
Comparatively, the two lists are awfully different in length. And not in a good way. No, not at all.
I know about these criticisms and platitude(s) because they appear publicly on newgem’s website within a live Twitter search of ‘newgem’. So that the twitter messages on the project’s own homepage are more positive, it was time for a new direction. A new beginning. It was time for a change.
So I fixed it. All of it. As of release 1.0.3 it is perfect [1].
To help you realise how wonderful newgem now is, I shall use the time-proven medium for proving awesomeness: a list. The bullet points are for free.
- newgem now finally gone 1.0.0. It made it all the way to 0.29.0, but I think 1.0.0 was needed to transfer the message of a new beginning. This is the Obama of Gem Generators.
- Generated gems are 50% smaller. No more config/hoe.rb. No more website folder (by default). No more tasks folder. No more license file. No more version.rb file.
- Very little config required before releasing your gem. Just a few fields in the
Rakefile.
- You can use rspec or test/unit for unit testing (option:
-T rspec)
- You can use cucumber for functional testing (option:
-i cucumber or run script/generate install_cucumber)
- Generated gems are future-proofed. They will automatically benefit from future newgem releases.
- Executable apps within gems now have a
lib/appname/cli.rb file for the code base, and a lightweight bin/appname (option: -b appname or run script/generate executable appname)
- Your README file can be called
README.rdoc so it appears nicely formatted on github. No more hoe warning messages about “README.txt is missing” (see feature)
- GitHub RubyGem support.
rake gemspec generates a clean my_project.gemspec file that will work with GitHub
- RubyForge support. As before,
rake release VERSION=X.Y.Z releases your project to RubyForge (see ‘preparing for releases to rubyforge’ help page)
- newgem’s website is a different colour. Its a nice peppermint green colour. The default website template is now this theme too.
- You can raise bugs or suggest improvements via Lighthouse tracker
Installation
sudo gem install newgem
Usage
To create your RubyGem scaffold:
newgem mygem
newgem mygem -b myapp # create a CLI executable
newgem mygem -T rspec -i cucumber # use rspec and cucumber for gem tests
newgem mygem -w # create a simple website
newgem -h # get help
Now your code goes in lib folder, and your tests go in test, spec, and/or features as appropriate.
There are a bunch of rails-esque generators (like model or migration) that you can use to help your development:
script/generate executable myapp # create your own command-line interface (CLI)
script/generate extconf mylib # starting point for C-extensions, plus TDD framework
script/generate component_generator mygenerator scope # create your own generators for Rails, Merb, RubyGems
script/generate application_generator myapp # create a CLI that is a generator for something
script/generate -h # get help
Bugs and suggestions
You can raise bugs or suggest improvements via Lighthouse tracker
Thanks goes to… Cucumber
Aside from several days of my time refactoring it, reducing it, and doubling the amount of awesomeness within it, all its wondefulness is thanks to Cucumber.
Cucumber is the successor to Rspec Story Runner. I never found time to play with Story Runner, but Cucumber is blowing my mind with awesomeness. My attention-span is short so I may be forgetting something but I think Cucumber could be the most important piece of software released in 2008 for Ruby-based developers.
Cucumber gave me a framework to specify newgem’s expected behaviour; its features. First I wrote feature descriptions for known, expected behaviour. Then I refactored the crap out of newgem until it was in tip-top shape.
There are over 90 feature steps defining newgem’s current features. To run them:
gem unpack newgem
cd newgem-*
sudo gem install cucumber
cucumber features
And watch the awesomeness of Cucumber unfold before your eyes. What you are seeing isn’t just newgem’s generators being executed, but also the generated code is being executed, rake tasks executed, and generated test files tested.
I can now setup continuous integration for newgem. I have a framework to know that newgem, or any other RubyGem, is doing what it should do.
UPDATE: I want to thank David Chelimsky for our time hanging out in Brazil during RailsSummit. I saw him using Cucumber, and talking about it on stage and then help helped me whilst I integrated it into newgem as a generator and then using it internally itself. For a day and a half we hung out in the hotel foyer. He’s so wonderful.
Cucumber makes me so happy.
Summary
Use newgem. Write gems.
Use mrbones. Write gems.
Use sow. Write gems.
Use gemhub. Write gems.
And write cucumber feature descriptions first. Then unit tests. Then code. Then release. Then profit.
[1] All claims of perfection are for the express purpose of making you try the product enough to use it, share it with your friends, and wrap it up and give it as a gift to family on Xmas day. Gift boxes are available upon request.