dcadenas/rubydeps

View on GitHub
README.md

Summary

Maintainability
Test Coverage
[![Build Status](https://secure.travis-ci.org/dcadenas/rubydeps.png?branch=master)](http://travis-ci.org/dcadenas/rubydeps)
[![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/dcadenas/rubydeps)
[![endorse](http://api.coderwall.com/dcadenas/endorsecount.png)](http://coderwall.com/dcadenas)

rubydeps
========

A tool to create class dependency graphs from test suites.

I think this is more useful than static analysis of the code base because of the high dynamic aspects of the language. 

Sample output
-------------

This is the result of running rubydeps on the [Rake](https://github.com/jimweirich/rake) tests after setting up its test helper with `Rubydeps.start`:

```bash
rubydeps --class_name_filter='^Rake'
```

![Rake dependencies](https://github.com/dcadenas/rubydeps/raw/master/rake-deps.png)

Usage
---------------

Rubydeps will run your test suite to record the call graph of your project and use it to create a [Graphviz](http://www.graphviz.org) dot graph.

1. Add Rubydeps to your `Gemfile` and `bundle install`:

        gem 'rubydeps', :group => :test

2. Launch Rubydeps by inserting this line in your `test/test_helper.rb` (*or `spec_helper.rb`, cucumber `env.rb`, or whatever
   your preferred test framework uses*):

        Rubydeps.start

    Notice that this will slow down your tests so consider adding a conditional bound to some ENV variable or just remove the line when you are done.

3. Run your tests, a file named `rubydeps.dump` will be created in the project root.

4. The next step is reading the dump file to generate the [Graphviz](http://www.graphviz.org) dot graph `rubydeps.dot` with any filter you specify.

    ```bash
    rubydeps --path_filter='app/models'
    ```

5. Now you are in [Graphviz](http://www.graphviz.org) realm. You can convert the dot file to any image format with your prefered orientations and layouts with the dot utility that comes with the [Graphviz](http://www.graphviz.org) installation e.g.:

    ```bash
    dot -Tsvg rubydeps.dot > rubydeps.svg
    ```

    Keep in mind that sometimes you may have missing dependencies as we graph the dependencies exercised by your tests so you can use it as a quick bird's eye view of your project test coverage.

### Command line options

* The `--path_filter` option specifies a regexp that matches the path of the files you are interested in analyzing. For example you could have filters like `'project_name/app|project_name/lib'` to analyze only code that is located in the `app` and `lib` dirs or as an alternative you could just exclude some directory you are not interested using a negative regexp like `'project_name(?!.*test)'`

* The `--class_name_filter` option is similar to the `--path_filter` options except that the regexp is matched against the class names (i.e. graph node names).

* The `--from_file` option is used to specify the dump file generated after the test (or block) run so you can try different filters without needing to rerun the tests. e.g.:

    ```bash
    rubydeps --from_file='rubydeps.dump' --path_filter='app/models'
    rubydeps --from_file='rubydeps.dump' --path_filter='app/models|app/controllers'
    ```

  If you didn't rename the file you can skip this option as it will use the default `rubydeps.dump` 

Library usage
-------------

Just require rubydeps and pass a block to analyze to the `analyze` method.

```ruby
require 'rubydeps'

Rubydeps.analyze(:path_filter => path_filter_regexp, :class_name_filter => class_name_filter_regexp, :to_file => "rubydeps.dump") do
    # your code goes here
end
```

Installation
------------

```bash
gem install rubydeps
```

Rubydeps now only supports ruby >= 1.9.2. If you need 1.8.x support then:

```bash
gem install rubydeps -v0.2.0
```

Notice that in 0.2.0 you should use `dot_for` instead of `analyze` and the dump functionality is missing.

Dependencies
------------

* graphviz
* ruby-graphviz gem
* rcov gem (only for version 0.2.0)

Note on Patches/Pull Requests
-----------------------------

* Fork the project.
* Make your feature addition or bug fix.
* Add tests for it. This is important so I don't break it in a
  future version unintentionally.
* Commit, do not mess with rakefile, version, or history.
  (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
* Send me a pull request. Bonus points for topic branches.

Copyright
---------

Copyright (c) 2012 Daniel Cadenas. See LICENSE for details.

Development sponsored by [Neo](http://neo.com)