July 7, 2009
Are you using Ruby on Rails? Are you using Git? Do you have a need to track how long you spend on things? Then I have just the thing for you.
I threw together a quick rake task that gets all of your commits in a git repo and parses out the times and commit message from them. Then it formats them with the time and also the time interval between them. You can get the rake task to track your time from this gist.
The output will look something like this:
Fri, Jul 07 10:55AM 20m 49s Added toolbar for controllers using temp...
Fri, Jul 07 10:34AM 21h 52m Added support for using page templates i...
Thu, Jul 07 12:42PM 37m 57s LH#77, fixed issue with tests failing on...
Thu, Jul 07 12:04PM 12m 18s LH#67, added a limit option to the rende...
Thu, Jul 07 11:52AM 17m 30s Removed debug statement ...
Thu, Jul 07 11:34AM 19h 52m LH#66, added :path option to render menu...
Wed, Jul 07 03:41PM Added DSL for modifying portlet behavior...
Tue, Jun 06 02:05PM 18h 44m LH#119, multiple HTML fields on one bloc...
Mon, Jun 06 07:20PM 6h 21m Converted docs to textile ...
Mon, Jun 06 12:58PM Fix for LH#118, create directories in ge...
Sat, Jun 06 10:22PM Added support for other template handler...
Fri, Jun 06 04:49PM 0m 58s bump build ...
Fri, Jun 06 04:48PM 23m 11s Fix LH#106: Section not correctly loadin...
Fri, Jun 06 04:25PM 34m 25s Fix for LH#107, images were not showing ...
Fri, Jun 06 03:51PM 9m 48s Fix for LH#110, can't view usages of a p...
Fri, Jun 06 03:41PM 11m 12s Fix for LH#113, check to see if there is...
Fri, Jun 06 03:30PM 2m 52s Fixed LH#114, documentation typo ...
Fri, Jun 06 03:27PM 0m 38s bump build number ...
Fri, Jun 06 03:26PM 5h 38m Fix for LH#98, tags not getting updated ...
Fri, Jun 06 09:48AM 33m 14s Fixed LH#105, deleted portlets showing u...
It doesn't actually truncate the commit messages, I just did that here to make each one fit on a line. If the time interval is over 24 hours, it doesn't bother printing the interval, because you probably didn't actually work on that one commit for 37 hours straight. I've been thinking if you really want to track time this way then each time you sit down to start hacking on a project, you just make a minor change to the .gitignore or something and then commit it with a message like "started hacking on foo", so then when you commit your first chunk of actual work, you will know how long you spend on that.
Posted in
Technology
|
Tags
Git, Rake, Ruby
|
2 Comments
April 20, 2009
This is just a quick 60 second intro to Rake. If you are doing development with Ruby on Rails, you undoubtedly use Rake on a daily basis. For example, you use rake db:migrate to run your migrations or rake test:units to run your unit tests. But do you know how to write your own Rake tasks? If you never have done that, you might hesitate to write a rake task instead thinking you ran just write a quick ruby script rather than take the time to figure out how to write a Rake task.
So to create a rake task, in an existing Rails app, create a file called lib/tasks/app.rake. You can name it whatever you want as long as it ends in .rake. I'm choosing to use app because we are going to write some app-specific tasks. In the file, put this:
task :hello_world
Now from the command line you can run your task with rake hello_world. Nothing happens, but it runs. Now let's have it print hello world:
task :hello_world do
puts "Hello, World!"
end
Now when you run your task, it prints "Hello, World!". Let's add a description to our task to let people know what it does:
desc "Prints 'Hello, World!'"
task :hello_world do
puts "Hello, World!"
end
Now if you run rake -T, you will see your hello_world task in the list of tasks. rake -T only shows tasks that have a description. You can also run rake -D hello_world to see the full description of the task. You should give all of your tasks that you expect users to run from the command-line a description.
Now a problem with our task is what happens if someone else wants to write a task named hello_world? Well, we would have a namespace problem. So what we want to do is put all of our tasks into the app namespace:
namespace :app do
desc "Prints 'Hello, World!'"
task :hello_world do
puts "Hello, World!"
end
end
So now we can run our task as rake app:hello_world.
So this is obviously not a real task. Let's say we want to know what the load path of our app looks like. Easy, we'll just do this:
namespace :app do
desc "Prints load path of this app"
task :load_paths do
Rails.configuration.load_paths.each do |p|
puts p
end
end
end
When you try to run this rake tast, you will get this error:
rake aborted!
uninitialized class variable @@configuration in Rails
The problem is that by default, a rake task doesn't load the Rails environment. It's easy to tell it to do that with this:
namespace :app do
desc "Prints load path of this app"
task :load_paths => :environment do
Rails.configuration.load_paths.each do |p|
puts p
end
end
end
By saying :load_path => :environment, you are saying that the load_path task depends on the environment being loaded. Or more specifically, you are saying "run the environment task before running this task". There is a task called "environment", and it loads the Rails environment. You won't see it under rake -T, because it has no description because it is not a task you should run directly, only as a dependency of other tasks.
Now that we have the Rails environment loading, when you run the rake task, you will get the output you expect. If you make your task depend on environment, you will also be able to access your models from within your task. Now that you know the basics of Rake, you can easily get going making Rake tasks for your Rails app.
Posted in
Technology
|
Tags
Rails, Rake, Ruby
|
4 Comments