Ruby Facets
http://facets.rubyforge.com
"ALL YOUR BASE ARE BELONG TO RUBY"
Introduction
Ruby Facets is the single largest collection of general purpose method extensions and system additions for the Ruby programming language.
The core extensions is a large collection of methods which extend the core capabilities of Ruby’s built-in classes and modules. This collection of extension methods are unique by virtue of their atomicity. The methods are stored in relatively small groups of tightly coupled methods so that each can be required independently. This gives developers the potential for much finer control over which extra methods to bring into their code.
The “more” additions are a collection of classes, modules and light meta-systems which constitutes an ever improving source of reusable components. Some very nice additions are provided, from the simple Functor class to a full-blown annotations system.
Documentation
Note that Facets has special documentation needs due to it’s extensive bredth. For this reason, rdocs are not automatically built by RubyGems on install. To find documentation, please see facets.rubyforge.org/learn.html. If you need off-line docs, there is a separate package available on the Files page of the Facets RubyForge project site.
Installation
The easiest way to install is via RubyGems.
$ gem install facets
To install manually, download and unpack the .tar.gz package and use the included task/install script. Eg.
$ tar -xvzf facets-2.x.x.tar.gz
$ cd facets-2.x.x
$ sudo task/setup
On Window the last step will be:
C:\> ruby task/setup
IMPORTANT! Note that setup.rb is no longer used b/c of Facets’ new layout.
Compatibility with 1.x series.
Prior to 2.0, Facets was divided between CORE and MORE –standalone extensions vs. classes and modules, respectively. With 2.0, the notion of “CORE” has taken only a slightly different meaning. Instead CORE now consists of the libraries that are thought essential and as such are loaded automatically when using ++require “facets”++. While still primarily made up of extension methods a few classes now belong to core as well.
Additionally, the extension methods are no longer stored on a per-method basis. While dividing the extension methods up on a per-method basis had certain advantages, not the least of which was a simple organization, it proved too granular –more “subatomic” than “atomic”. With 2.0 we have address this issue. All the extension methods have now been organized into small tightly related groups. However, being able to require on the basis of a method is still a useful approach, so a compatibility layer for the 1.x series has been created. It makes it possible to load Facets libraries on a per method basis, just as before, via require redirection. For example:
require 'facets/string/underscore'
Will redirect according to the content of the underscore.rb file which is:
require 'facets/string/stylize'
So the underscore method will be loaded just as before. But a few other stylization methods will also be loaded. This actually proves a more useful approach because quite often a related method is needed as well.
The other significant change from 1.x to 2.0 is the removal of some libraries that were considered too extraneous for a general purpose library. Most of these were spun-off to their own projects. In particular, the web-related libs are now part of Blow (blow.rubyforge.org), inflection libraries are in English (english.rubyforge.org), units.rb along with constants.rb are in Stick (stick.rubyforge.org), and the persistance system in Opod (opod.rubyforge.org).
Mission
Facets holds to the notion that the more we can reasonably integrate into a common foundation directed toward general needs, the better that foundation will be able to serve everyone. There are a number of advantages here:
* Better Code-reuse
* Collaborative Improvements
* Greater Name Consistency
* One-stop Shop and Installation
Status
The current status of Facets is very good. While some libs could still use some “finishing” work, all are highly API stable and functional.
Usage
For detailed usage of any given method or module please refer to the API RDocs.
http://facets.rubyforge.org/learn.html
Most libraries are well documented. Assistance in improving documentation though is always appreciated.
If you plan to use more then a few of Facets core method it is recommended that you require require the main facility.
require 'facets'
This loads all the CORE functionality at once.
Of course you can use the CORE library piecemeal if you prefer. The general require statement for a core extensions library is:
require 'facets/<class|module>/<method-lib>'
For example:
require 'facets/time/stamp'
Most “atoms” contain only a few methods, sometimes only one, but a few exceptions provide quite a few methods, such as string/indexable.rb.
You can load per-class or per-module groups of core methods by requiring the class or module by name. For example“
require 'facets/time'
Will require all the Time method extensions.
Note that some methods that were part of CORE in 1.8 and earlier are now part of MORE libraries. A good example is ‘random.rb’. There were separated because they had more specialized use cases, where as CORE extensions are intended as general purpose.
Using a Facets/MORE library of modules, classes or microframeworks is essentially the same. For example:
require 'facets/basicobject'
Again, for details pertaining to the functionality of each feature, please see the API Docs.
# PLEASE IGNORE THIS FOR NOW
It is possible to eliminate the need for the ‘facets/’ prefix on requires if the Facets libpaths are added to the LOAD_PATH. But this isn’t as straight-forward as it is for most libraries b/c of the layout of Facets library.
require 'facets-topload'
require 'basicobject'
Understand that on the off chance that another library has the same name as one of Facets’ everything will still work fine. You will just not be able to use the prefixless shortcut to require it.
# END IGNORE.
Method File Names
Operator method redirect files are stored using English names. For instance for Proc#* is ‘proc/op_mul’.
For reference, here is the chart.
+@ => op_plus_self
-@ => op_minus_self
+ => op_plus
- => op_minus
** => op_pow
* => op_mul
/ => op_div
% => op_mod
~ => op_tilde
<=> => op_cmp
<< => op_lshift
>> => op_rshift
< => op_lt
> => op_gt
=== => op_case_eq
== => op_equal
=~ => op_apply
<= => op_lt_eq
>= => op_gt_eq
| => op_or
& => op_and
^ => op_xor
[]= => op_store
[] => op_fetch
Facets simply takes the ‘*’ and translates it into a string acceptable to all file systems. Also, if a method ends in ‘=’, ‘?’ or ‘!’ it is simply removed.
Contribute
This project thrives on contribution.
If you have any extension methods, classes, modules or small frameworks that you think have general applicability and would like to see them included in this project, don’t hesitiate to submit. There’s a very good chance they will be included. Also, if you have better versions of any thing already included or simply have a patch, they too are more than welcome. We want Ruby Facets to be of the highest quality.
Authors
This collection was put together by, and largely written by Thomas Sawyer (aka Trans). He can be reached via email at transfire at gmail.com.
Some parts of this collection were written and/or inspired by other persons. Fortunately nearly all were copyrighted under the same open license, the Ruby License. In the few exceptions I have included the copyright notice with the source code.
Any code file not specifically labeled shall fall under the Ruby License.
In all cases, I have made every effort to give credit where credit is due. You will find these copyrights, thanks and acknowledgments embedded in the source code, and an unobtrusive “Author(s)” section is given in the RDocs.
Also see the AUTHORS file for a list of all contributing Rubyists.
If anyone is missing from the list, please let me know and I will correct right away. Thanks.
License
The collection PER COLLECTION is licensed as follows:
Ruby Facets
Copyright (c) 2004-2006 Thomas Sawyer
Distributed under the terms of the Ruby license.
The Ruby license is a dual license that also provides for use of the GPL. Complete texts of both licenses accompany this document (see LICENSE).
Acknowledgments and Copyrights for particular snippets of borrowed code are given in their respective source. All licenses are either compatible with the Ruby license (namely the GPL) or the original author has given permission for inclusion of their code under such license.
Pitch
ALL YOUR BASE ARE BELONG TO RUBY!
- 1
-
A lot of mental anguish went into finding this good project name Ruby Facets. Of course, in the end only one name can take the honor. Other good names which were considered: Calibre, Florida and California, Warchest w/ Atomix, Downs & Ace, Trix & Atomx and even Pillbox & Pills (a _why suggestion). Then the names that almost won out and were used for a good while: Nano Methods and Mega Modules –great names but a little too “fad”. Finally let’s not forget even older “working” titles that were used along the way: Raspberry, ABC, Succ and the very original Tomslib.
Copyright ©2007 Thomas Sawyer
Do you Ruby? (ruby-lang.org)