Home » Ruby » Should one use dashes or underscores when naming a gem with more than one word?

Should one use dashes or underscores when naming a gem with more than one word?

Posted by: admin November 30, 2017 Leave a comment

Questions:

I’m confused about what the gem naming convention is when the gem name has more than one word.

  • thinking-sphinx is the name of the gem, but the base *.rb file for this gem is lib/thinking_sphinx.rb (underscores)

  • acts-as-taggable-on is the name of the gem, and the base *.rb file is called lib/acts-as-taggable-on.rb (hyphens)

  • factory_girl uses an underscore in both the gem name and in the name of the base *.rb file

Does it matter if one uses underscores or hyphens? Is any emerging consensus here?

Answers:

Eric Hodel has a blog post on this: A Project Naming Recommendation

Rails solidified the convention of
mapping CamelCase class names to
underscored file names (class
IMAPProcesor is defined in
imap_processor.rb). Using underscored
gem names makes it easy for people to
figure out what file to require (same
as the project name) or what class
name to look for in ri.

If I have a plugin gem or an extension
I’ll tack on the sub-project’s name
with a dash. If I wanted to add a new
handler for imap_to_rss for Chase bank
email, the gem would be named
imap_to_rss-chase.

Questions:
Answers:

Following the advice here, here is a table of how things would break down.

|     Gem name        |   Require statement          | Main class or module  |
|:--------------------|:-----------------------------|:----------------------|
|fancy_require        |require 'fancy_require'       | FancyRequire          |
|ruby_parser          |require 'ruby_parser'         | RubyParser            |
|net-http-persistent  |require 'net/http/persistent' | Net::HTTP::Persistent |
|rdoc-data            |require 'rdoc/data'           | RDoc::Data            |
|autotest-growl       |require 'autotest/growl'      | Autotest::Growl       |
|net-http-digest_auth |require 'net/http/digest_auth'| Net::HTTP::DigestAuth |