Project

cmf

0.0
No commit activity in last 3 years
No release in over 3 years
Builds and parses messages in the Compact Message Format (CMF)
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 12
~> 3.7
~> 0.9.12
 Project Readme

CMF

Build Status

Description

This library builds and parses messages in the Compact Message Format (CMF).

CMF is a binary format that has the speed and compact size of a binary format combined with the provably correct markup and type-safety of formats like XML and JSON.

A CMF message is a flat list of tokens. Each token is comprised of 3 elements: a tag name, a type, and a value. Tag names are written to the message as numbers, so an external schema dictionary is typically used to map the tag numbers to names.

Each CMF token is completely self-contained. Even a reader that doesn't know the schema of the message it is parsing can still extract all tokens from the message. This makes the format exceptionally useful for extensibility because a reader can just skip over unknown tokens.

Installation

This library is distributed as a gem named cmf at RubyGems.org. To install it, run:

gem install cmf

Usage

First, require the gem:

require 'cmf'

Next, we'll build and parse a simple message with two tokens. The message will contain the string "Proxima Centauri", associated with the tag 0, and the floating point number 4.2421 associated with the tag 1.

message = CMF.build({0 => "Proxima Centauri", 1 => 4.2421})
# => "\x02\x10Proxima Centauri\x0EGr\xF9\x0F\xE9\xF7\x10@"

CMF.parse(message)
# => {0=>"Proxima Centauri", 1=>4.2421}

Rather than using the tags 0, and 1, we can define a schema dictionary which maps human-readable names to tag numbers.

dictionary = {star: 0, distance: 1}
message = CMF.build({star: "Proxima Centauri", distance: 4.2421}, dictionary)
# => "\x02\x10Proxima Centauri\x0EGr\xF9\x0F\xE9\xF7\x10@"

CMF.parse(message, dictionary)
# => {:star=>"Proxima Centauri", :distance=>4.2421}

For more flexibility in parsing and building messages, you can use the CMF::Builder and CMF::Parser classes.

builder = CMF::Builder.new(dictionary)
builder.add(:star, "Proxima Centauri")
builder.add(:distance, 4.2421)
message = builder.to_octet

parser = CMF::Parser.new(dictionary)
parser.message = message
parser.next_pair # => [:star, "Proxima Centauri"]
parser.next_pair # => [:distance, 4.2421]
parser.next_pair # => nil

parser.message = message     ##
parser.each do |tag, value|  # star: Proxima Centauri
  puts "#{tag}: #{value}"    # distance: 4.2421
end                          ##

Supported platforms

Ruby 2.1 and above, including jruby.

Documentation

For complete documentation, see the CMF page on RubyDoc.info.