--0016364ee3aa4d936b04a8ba1983
Content-Type: text/plain; charset=ISO-8859-1

I'm pleased to announce that alf 0.9.3 has been released and pushed to
rubygems.org!

Alf follows semantic versioning (http://semver.org/) and has not reached
its
first stable 1.0.0 release. Quoting semver.org: "Anything may change at any
time. The public API should not be considered stable". Including alf with
the
version requirement "~> 0.9.0" shouldn't break your code, though.

This release is a milestone towards 0.10.0 whose aims is to provide new
data-source connectors. Release 0.9.3 contains important bug fixes and a
few
backward compatible features that were already ready for inclusion.

 lf -- Relational Algebra at your fingertips

* <http://rubydoc.info/github/blambeau/alf/master/frames>
* <http://github.com/blambeau/alf>
* <http://rubygems.org/gems/alf>

Alf brings the relational algebra both in Shell and in Ruby. In Shell,
because
manipulating any relation-like data source should be as straightforward as
a
one-liner. In Ruby, because I've never understood why programming languages
provide data structures like arrays, hashes, sets, trees and graphs but not
_relations_... Let's stop the segregation ;-)

Changes (changelog at
https://raw.github.com/blambeau/alf/master/CHANGELOG.md)

# 0.9.3 / 2011-07-23

## Bug fixes

* Added Relation#allbut, forgotten in two previous releases
* Fixed (join xxx, DEE) and (join xxx, DUM)
* Fixed scoping bug when using attributes named :path, :expr or :block in
  Lispy compiled expressions (coming from .alf files)
* Fixed 'alf --yaml show suppliers' that renderer a --text table instead of
  a yaml output
* Fixed bugs when using Date and Time attributes with .rash files
* Fixed bugs when using Date and Time attributes in restrict expressions
  compiled from the commandline
* Fixed a few bugs when using attribute names that are ruby keywords
  (restrict & extend)

## New operators (available both in shell and in Lispy DSL)

* Added MATCHING and NOT MATCHING operators. These operators are useful
  shortcuts for the following expressions.

      (matching     l, r) : project (join l, r), [l's attributes])
      (not_matching l, r) : minus l, (matching l, r))

  For example:

      # Give suppliers who supply at least one part
      (matching suppliers, supplies)

      # Give suppliers who don't supply any part
      (not_matching suppliers, supplies)

* Added RANK operator, which is useful for for computing quota queries as
  illustrated below. See 'alf help rank' for details.

      # Give the three heaviest parts
      (restrict (rank :parts, [[:weight, :desc]], :pos), lambda{ pos < 3 })

## Enhancements when using Alf in shell

* added 'alf -r', that mimics 'ruby -r' (require library before run)

* When alf is invoked in shell (and only in this case), ALF_OPTS is used as
  global options to apply as if they were specified inline:

      % export ALF_OPTS-env--yaml"
      % alf show suppliers

  is the same as

      % alf --env--yaml show suppliers

* 'alf --help' now distinguishes experimental operators (quota in
particular)
  from those coming from the (much more stable) TUTORIAL D specification.
The
  former should be used with care as their specification may change at any
  time.

## Enhancements when using Alf in Ruby

* Alf.lispy now accepts any argument recognized by Environment.autodetect;
it
  obtains its working Environment that way. Among others:

      Alf.lispy(Alf::Environment.folder("path/to/an/existing/folder"))

  is the same as:

      Alf.lispy("path/to/an/existing/folder")

* Added Relation::DUM and Relation::DEE constants (relations of empty
heading
  with no and one tuple, respectively). They are also available as DUM and
DEE
  in Lispy functional expressions.

* Added a Heading abstraction, as a set of attribute (name, type) pairs.

## Internal enhancements (extension points)

* The Reader and Renderer classes accept a Hash of options as third
  constructor argument. These options can be used by extension points.

* The Environment class now provides a class-based registering mechanism
'ala'
  Reader and Renderer. This allows auto-detecting the target environment
when
  --env. is used in shell. See Environment.autodetect and
  Environment#recognizes? for contributing to this extension point.

* Internals now rely on Myrrha for code generation. This means that all
  datatypes can now be safely used in relations and dumped to .rash files in
  particular.

--0016364ee3aa4d936b04a8ba1983--