views:

536

answers:

3

Is there a standard or conventional system for organizing multi-file Ruby programs? I have embarked on my first large "project" in Ruby, a search program which is logically organized into multiple files and directories. I've outlined below my potential structure:

  • The main file. This file implements the search class and general searching protocol.
  • The algorithmic analysis file. This file implements functions that interpret search results.
  • Protocols directory
    • Contains one file per protocol to search.
  • Feeds Directory
    • Part of the program's purpose is to search archived news feeds. The files for this feature go in this folder.

However, the code currently has a class (let's call it Searcher) that each protocol's search class inherits from (GoogleSearcher < Searcher). In order to manage this, I need to include the main file in these protocol files (right?) which doesn't seem possible given my ideal structure.

Aside from my specific example, I was wondering if there are any conventions, such as "more files rather than less", or "logical structuring of files is unnecessary". Is it common to have a file of "helper" functions (such as in Rails?) What level of abstraction is considered appropriate?

Finally, I'm planning on integrating this into Rails someday as a library (not a plugin; I want it to work standalone as well). I don't know if this would affect the organization.

I know this is a pretty open-ended question, but that's because I would appreciate any advice that is remotely relevant. Thanks in advance.

A: 

If you want to integrate with Rails, you will probably want to create a plugin.

This guide might be a good place to start: http://guides.rubyonrails.org/plugins.html

grifaton
Interesting, but I don't think I want that deep of a Rails integration. (Particularly since I'm not exactly a Rails expert). I think I will just use it as a library instead. Have updated request to clarify.
Luke
+6  A: 

You may want to consider creating a gem for your library. This would make it easy to use the library both stand-alone and with Rails, as well as make deployment/updates simpler.

Further, because gems normally follow a specific directory structure, it also solves your issue of not knowing how to organize the library.

There is plenty of documentation available for creating gems. This article is a good place to start. Here's a bit more info about file structure, as well as other useful tips.

vonconrad
there's a few neat gem generating tools: newgem, Jeweler, bones. I used newgem for a project (that was actually NOT intended to be released as a gem) and it worked pretty well
RyanWilcox
This is good, and it only leaves one unanswered question (in retrospect, this question was definitely too wide.) Is there a way to have class inheritance across multiple files, where the main class is in the main file and classes that inherit from it are in periphery files in a subdirectory? Or is that a backwards organization?
Luke
Ruby is pretty forgiving when it comes to inheritance. If I understand your question correctly, it would definitely be possible to set it up as you describe. Without knowing any particulars of your project, I would probably do the same thing where a "main class" is in the lib/foo/ directory and classes that inherit from the main class are in lib/foo/bar, lib/foo/baz and so on. Have a look at gems such as Nokogiri for live examples of this type of setup.
vonconrad
Ah, but I tried this and have come to the conclusion that I cannot inherit from classes from other source files unless I require those files. How do I require files from a parent directory?
Luke
+2  A: 

You might want to take a look at http://stackoverflow.com/questions/614309/ideal-ruby-project-structure in conjunction with vonconrad's advice. A gem would definitely be a good place to start and a run through the official rubygems documentation might also be beneficial.

Joshua Vera