Pathy

JSON validation helper.

Installation

gem install pathy

Usage

require 'spec_helper'

describe Pathy do
  before :all do

    # add the helper methods to any object.
    # this can be called on any class.
    Object.pathy! 

    @json = %[ 
      {
        "string"  : "barr",
        "number"  : 1,
        "array"   : [1,2,3],
        "hash"    : {"one":{"two" : 2}}
        }
    ]

    @json_array = %[ 
      [{
        "string"  : "barr",
        "number"  : 1,
        "array"   : [1,2,3],
        "hash"    : {"one":{"two" : 2}}
      }]
    ]

  end


  describe "for hashes" do
    before :all do
      @obj    = JSON.parse(@json)
      @array  = JSON.parse(@json_array)
    end

    it "should parse 'number' as 1" do
      @obj.at_json_path("number").should == 1
    end

    it "should parse 'array' as [1,2,3]" do
      @obj.at_json_path('array').should == [1,2,3]
    end

    it "should parse 'hash.one' as {'two' => 2}" do
      @json.at_json_path('hash.one').should == {'two' => 2}
    end

    it "should parse 'hash.one' as {'two': 2}" do
      @obj.at_json_path('hash.one.two').should == 2
    end

    describe "invalid paths" do
      it "should raise InvalidPathError" do
        lambda { 
          @obj.at_json_path('foo.bar')
        }.should raise_error Pathy::InvalidPathError
      end
    end

    describe "#has_json_path?" do
      it "should be true for valid paths" do
        @obj.has_json_path?('hash.one.two').should be_true
      end
      it "should be false for invalid paths" do
        @obj.has_json_path?('hash.one.foo').should be_false
      end

      it "should work as rspec matcher" do
        @obj.should have_json_path "hash.one"
      end

    end


  end

  describe "for arrays" do

    before :all do
      @array  = JSON.parse(@json_array)
    end

    it "should find the index" do
      @array.at_json_path('0.hash.one.two').should == 2
    end

  end

  describe "for json strings" do

    it "should parse 'number' as 1" do
      @json.at_json_path("number").should == 1
    end

    it "should parse 'array' as [1,2,3]" do
      @json.at_json_path('array').should == [1,2,3]
    end

    it "should parse 'hash.one' as {'two' => 2}" do
      @json.at_json_path('hash.one').should == {'two' => 2}
    end

    it "should parse 'hash.one.two' as 2" do
      @json.at_json_path('hash.one.two').should == 2
    end

  end

end

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright (c) 2011 Christopher Burnett. See LICENSE for details.