halibut 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Guardfile CHANGED
@@ -2,9 +2,9 @@
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
4
  guard 'bundler' do
5
- watch('Gemfile')
5
+ # watch('Gemfile')
6
6
  # Uncomment next line if Gemfile contain `gemspec' command
7
- watch(/^.+\.gemspec/)
7
+ # watch(/^.+\.gemspec/)
8
8
  end
9
9
 
10
10
  guard 'minitest' do
@@ -21,10 +21,10 @@ guard 'minitest' do
21
21
  # Rails 3.2
22
22
  # watch(%r|^app/controllers/(.*)\.rb|) { |m| "test/controllers/#{m[1]}_test.rb" }
23
23
  # watch(%r|^app/helpers/(.*)\.rb|) { |m| "test/helpers/#{m[1]}_test.rb" }
24
- # watch(%r|^app/models/(.*)\.rb|) { |m| "test/unit/#{m[1]}_test.rb" }
25
-
24
+ # watch(%r|^app/models/(.*)\.rb|) { |m| "test/unit/#{m[1]}_test.rb" }
25
+
26
26
  # Rails
27
27
  # watch(%r|^app/controllers/(.*)\.rb|) { |m| "test/functional/#{m[1]}_test.rb" }
28
28
  # watch(%r|^app/helpers/(.*)\.rb|) { |m| "test/helpers/#{m[1]}_test.rb" }
29
- # watch(%r|^app/models/(.*)\.rb|) { |m| "test/unit/#{m[1]}_test.rb" }
29
+ # watch(%r|^app/models/(.*)\.rb|) { |m| "test/unit/#{m[1]}_test.rb" }
30
30
  end
data/README.md CHANGED
@@ -1,4 +1,8 @@
1
- # Halibut
1
+ # Halibut [![endorse](http://api.coderwall.com/locks/endorsecount.png)](http://coderwall.com/locks)
2
+
3
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/locks/halibut)
4
+ [![Build Status](https://secure.travis-ci.org/locks/halibut.png?branch=master)](https://travis-ci.org/locks/halibut)
5
+ [![Dependency Status](https://gemnasium.com/locks/halibut.png)](https://gemnasium.com/locks/halibut)
2
6
 
3
7
  Halibut is a tiny gem that makes it easier to deal with the [HAL](http://stateless.co/hal_specification.html) format.
4
8
 
@@ -36,5 +36,4 @@ Gem::Specification.new do |gem|
36
36
 
37
37
  gem.add_development_dependency "rb-fsevent"
38
38
  gem.add_development_dependency "terminal-notifier-guard"
39
-
40
39
  end
@@ -2,8 +2,7 @@ require "halibut/version"
2
2
 
3
3
  # Halibut is the main namespace
4
4
  module Halibut
5
- autoload :Builder, 'halibut/builder'
6
-
5
+ autoload :Builder, 'halibut/builder'
7
6
  autoload :RelationMap, 'halibut/relation_map'
8
7
  end
9
8
 
@@ -16,6 +15,6 @@ end
16
15
 
17
16
  # Halibut::HAL contains the domain objects that reflect the HAL specs.
18
17
  module Halibut::HAL
19
- autoload :Link, 'halibut/hal/link'
18
+ autoload :Link, 'halibut/hal/link'
20
19
  autoload :Resource, 'halibut/hal/resource'
21
20
  end
@@ -3,10 +3,6 @@ require 'multi_json'
3
3
  module Halibut::Adapter
4
4
 
5
5
  module JSON
6
- def self.extended(base)
7
- base.extend InstanceMethods
8
- end
9
-
10
6
  def self.load(json)
11
7
  ResourceExtractor.new(json).resource
12
8
  end
@@ -16,6 +12,10 @@ module Halibut::Adapter
16
12
  end
17
13
 
18
14
  private
15
+ def self.extended(base)
16
+ base.extend InstanceMethods
17
+ end
18
+
19
19
  module InstanceMethods
20
20
  def to_json
21
21
  MultiJson.dump self.to_hash
@@ -61,7 +61,7 @@ module Halibut::Adapter
61
61
  def extract_resources(resources)
62
62
  resources.each do |relation,values|
63
63
  embeds = ([] << values).flatten
64
-
64
+
65
65
  embeds.map {|embed| MultiJson.dump embed }
66
66
  .map {|embed| Halibut::Adapter::JSON.load embed }
67
67
  .each {|embed| @halibut.embed_resource(relation, embed) }
@@ -3,31 +3,34 @@ require 'nokogiri'
3
3
  module Halibut::Adapter
4
4
 
5
5
  module XML
6
- def self.extended(base)
7
- base.extend InstanceMethods
8
- end
9
-
10
6
  def self.load(xml)
11
7
  ResourceExtractor.new(xml).resource
12
8
  end
13
9
 
14
10
  def self.dump(resource)
11
+ raise NotImplementedError
15
12
  end
16
13
 
17
14
  private
15
+ def self.extended(base)
16
+ base.extend InstanceMethods
17
+ end
18
+
18
19
  module InstanceMethods
19
20
  def to_xml
21
+ raise NotImplementedError
20
22
  end
21
23
  end
22
24
 
23
25
  class ResourceExtractor
26
+
27
+ attr_reader :resource
28
+
24
29
  def initialize(xml)
25
30
  xml = Nokogiri::XML(xml)
26
31
 
27
32
  @document = xml.root
28
- @halibut = Halibut::HAL::Resource.new extract_self_link
29
-
30
- # binding.pry
33
+ @resource = Halibut::HAL::Resource.new extract_self_link
31
34
 
32
35
  extract_curie
33
36
  extract_properties
@@ -35,10 +38,6 @@ module Halibut::Adapter
35
38
  extract_resources
36
39
  end
37
40
 
38
- def resource
39
- @halibut
40
- end
41
-
42
41
  private
43
42
  def extract_self_link
44
43
  @document.attr 'href'
@@ -48,7 +47,7 @@ module Halibut::Adapter
48
47
  @document.namespace_scopes
49
48
  .reject {|ns| ns.prefix.eql? 'xsi' }
50
49
  .each do |ns|
51
- @halibut.add_link 'curie', ns.href, name: ns.prefix
50
+ @resource.add_link 'curie', ns.href, name: ns.prefix
52
51
  end
53
52
  end
54
53
 
@@ -56,7 +55,7 @@ module Halibut::Adapter
56
55
  properties = @document.xpath '/resource/*[not(self::link) and not(self::resource)]'
57
56
 
58
57
  properties.each do |property|
59
- @halibut.set_property property.name, property.content
58
+ @resource.set_property property.name, property.content
60
59
  end
61
60
  end
62
61
 
@@ -64,25 +63,24 @@ module Halibut::Adapter
64
63
  links = @document.xpath('/resource/link')
65
64
 
66
65
  links.each do |link|
67
- @halibut.add_link link.attribute('rel').value,
68
- link.attribute('href').value,
69
- extract_link_options(link)
66
+ @resource.add_link link['rel'],
67
+ link['href'],
68
+ extract_link_options(link)
70
69
  end
71
70
  end
72
71
 
73
72
  # In case there are no options on the link, it returns an empty hash
74
73
  def extract_link_options(link)
75
- link.attributes.reject {|k,v| k=='rel' || k=='href' }
76
- .map {|k,v| { k => v.value } }
77
- .reduce(:merge) || {}
74
+ Hash[link.reject {|(key)| key.eql? 'rel' }
75
+ .reject {|(key)| key.eql? 'href' }]
78
76
  end
79
77
 
80
78
  def extract_resources
81
79
  @document.xpath('/resource/resource')
82
80
  .map {|r| [] << r['rel'] << ResourceExtractor.new(r.to_xml).resource }
83
- .each {|rel,res| @halibut.embed_resource rel, res }
81
+ .each {|rel,res| @resource.embed_resource rel, res }
84
82
  end
85
83
  end
86
84
  end
87
85
 
88
- end
86
+ end
@@ -4,8 +4,14 @@ module Halibut
4
4
 
5
5
  # Builder provides a very thin wrapper around creating a HAL resource.
6
6
  class Builder
7
- attr_accessor :resource
8
7
 
8
+ # The HAL resource built
9
+ attr_reader :resource
10
+
11
+ #
12
+ #
13
+ # @param [String] href
14
+ # @param [Proc] blk
9
15
  def initialize(href=nil, &blk)
10
16
  @resource = Halibut::HAL::Resource.new href
11
17
 
@@ -21,6 +27,10 @@ module Halibut
21
27
  end
22
28
 
23
29
  private
30
+
31
+ # This is the root context of Halibut::Builder.
32
+ #
33
+ #
24
34
  class RootContext
25
35
  extend Forwardable
26
36
 
@@ -33,8 +43,23 @@ module Halibut
33
43
  instance_eval(&blk) if block_given?
34
44
  end
35
45
 
46
+ # Adds a namespace to the resource.
47
+ #
48
+ # A namespace is a conceptual abstraction of CURIE links.
49
+ # Since the client of the library doesn't need to handle CURIE links
50
+ # directly because they're just for dereferencing link relations, no
51
+ # CURIE links are presented.
52
+ #
53
+ # resource = Halibut::Builder.new do
54
+ # namespace :john, 'http://appleseed.com'
55
+ # end.resource
56
+ # resource.namespace(:john).href
57
+ # # => "http://appleseed.com"
58
+ #
59
+ # @param [String,Symbol] name name of the namespace
60
+ # @param [String] href URI of the namespace
36
61
  def namespace(name, href)
37
- @resource.add_link("curie", href, name: name)
62
+ @resource.add_namespace(name, href)
38
63
  end
39
64
 
40
65
  def resource(rel, href=nil, &blk)
@@ -43,6 +68,23 @@ module Halibut
43
68
  @resource.embed_resource(rel, embedded.resource)
44
69
  end
45
70
 
71
+ # Adds links or resources to a relation.
72
+ #
73
+ # Relation allows the user to specify links, or resources, per relation,
74
+ # instead of individually.
75
+ # This feature was introduced as an attempt to reduce repeating the
76
+ # relation per link/resource, and thus reducing typos.
77
+ #
78
+ # resource = Halibut::Builder.new do
79
+ # relation :john do
80
+ # link 'http://appleseed.com/john'
81
+ # end
82
+ # end.resource
83
+ # resource.links[:john].first.href
84
+ #
85
+ # @param [String,Symbol] rel
86
+ # @param [Proc] blk Instructions to be executed in the relation
87
+ # context
46
88
  def relation(rel, &blk)
47
89
  RelationContext.new(@resource, rel, &blk)
48
90
  end
@@ -58,7 +100,6 @@ module Halibut
58
100
  instance_eval(&blk) if block_given?
59
101
  end
60
102
 
61
- private
62
103
  def link(href, opts={})
63
104
  @resource.add_link(@rel, href, opts)
64
105
  end
@@ -72,4 +113,4 @@ module Halibut
72
113
 
73
114
  end
74
115
 
75
- end
116
+ end
@@ -5,29 +5,56 @@ module Halibut::HAL
5
5
  class Link
6
6
  extend Forwardable
7
7
 
8
+ # The URI associated with this link.
8
9
  attr_reader :href
9
10
 
10
11
  def_delegators :@options, :templated, :templated?, :type,
11
12
  :name, :profile, :title, :hreflang
13
+
12
14
  # Returns an instance of a HAL Link object
13
15
  #
16
+ # # link with no options
17
+ # link = Link.new('http://homeopathy.org')
18
+ #
19
+ # # link with name and type options
20
+ # link = Link.new('http://homeopathy.org', name: 'Homeopath'
21
+ # , type: 'text/html')
22
+ #
23
+ # If you pass an options that is not one of the reserved link properties
24
+ # as defined by the spec, they are dropped.
25
+ # It should possibly raise an error, hafta think about it.
26
+ #
14
27
  # @param [String] href URI or URI Template
15
- # @param [Boolean] templated true if URI Template or false otherwise
16
28
  # @param [Hash] opts Options: type, name, profile, title, hreflang
17
29
  #
18
30
  # @return [Halibut::HAL::Link] HAL Link object
19
31
  def initialize(href, opts={})
20
- @href = href
32
+ @href = href
21
33
  @options = Options.new opts
22
34
  end
23
35
 
24
- # Returns the Link as a Hash
36
+ # Simply returns a hash of the href and the options that are not empty.
37
+ #
38
+ # link = Link.new('/links', name: 'Links')
39
+ # link.to_hash
40
+ # # => { "href" => "/links", "name" => "links" }
25
41
  #
26
42
  # @return [Hash] hash from Link Object
27
43
  def to_hash
28
44
  { 'href' => href }.merge @options
29
45
  end
30
46
 
47
+ # Generic comparison method.
48
+ #
49
+ # Two objects are the same if they have the same href and the same options.
50
+ #
51
+ # link_one = Link.new('/link', name: 'One', type: 'text/html')
52
+ # link_two = Link.new('/link', name: 'One', type: 'text/html')
53
+ # link_one == link_two
54
+ # # => true
55
+ #
56
+ # @param [Link] other Link object to compare to
57
+ # @return [true,false] return of the comparison of the two objects
31
58
  def ==(other)
32
59
  @href == other.href && @options == other.options
33
60
  end
@@ -36,6 +63,15 @@ module Halibut::HAL
36
63
  attr_reader :options
37
64
 
38
65
  private
66
+ # Options reifies the various optional properties of a link, as per the
67
+ # spec.
68
+ #
69
+ # hash = { name: 'John le Carré', templated: true }
70
+ # opts = Options.new(hash)
71
+ # opts.name # => John le Carré
72
+ # opts['name'] # => John le Carré
73
+ # opts[:name] # => John le Carré
74
+ #
39
75
  class Options
40
76
  attr_reader :templated, :type, :name,
41
77
  :profile, :title, :hreflang
@@ -59,23 +95,36 @@ module Halibut::HAL
59
95
  @templated || false
60
96
  end
61
97
 
98
+ # When converting to a hash, options that weren't set (.nil? == true) are
99
+ # kept out.
100
+ #
101
+ # This might have some implications, as it does not 'serialiaze' options
102
+ # that were explicitely set to nil. On the other hand, one can argue that
103
+ # if they were explicitly set to nil, then they shouldn't show up anyway.
62
104
  def to_hash
63
- instance_variables.each_with_object({}) do |name, output|
64
- next if (ivar = instance_variable_get(name)).nil?
105
+ instance_variables.each_with_object({}) do |ivar, hash|
106
+ name = ivar.to_s.reverse.chomp("@").reverse
107
+ value = instance_variable_get(ivar)
65
108
 
66
- output[name[1..-1]] = ivar
109
+ next if value.nil?
110
+
111
+ hash[name] = value
67
112
  end
68
113
  end
69
114
 
115
+ # Straight forward comparison between two Options objects.
116
+ #
117
+ # opts_one = Options.new(name: 'Link', templated: true)
118
+ # opts_two = Options.new(name: 'Link', templated: true)
119
+ # opts_one == opts_two
120
+ # # => true
121
+ #
122
+ # @param [Options] other Options object to compare to.
123
+ # @return [true,false] whether these two objects are equivalent or not.
70
124
  def ==(other)
71
- templated == other.templated &&
72
- type == other.type &&
73
- name == other.name &&
74
- profile == other.profile &&
75
- title == other.title &&
76
- hreflang == other.hreflang
125
+ to_hash == other.to_hash
77
126
  end
78
127
  end
79
128
  end
80
129
 
81
- end
130
+ end
@@ -4,12 +4,38 @@ module Halibut::HAL
4
4
  #
5
5
  # spec spec spec
6
6
  class Resource
7
- attr_reader :properties, :links, :embedded
8
7
 
9
- # TDK
8
+ # All the properties set in this resource
9
+ attr_reader :properties
10
+
11
+ # A collection of links, grouped by relation
12
+ attr_reader :links
13
+
14
+ # A collection of embedded resources, grouped by relation.
15
+ attr_reader :embedded
16
+
17
+ # A collection of namespaces defined in the document
18
+ attr_reader :namespace
19
+
20
+ # Initialize a new Resource.
21
+ #
22
+ # As defined in the spec, the resource SHOULD have a self link, but it
23
+ # isn't required.
24
+ # Also optionally, I'm toying with the idea of being able to pass in
25
+ # properties, links and embedded resources as parameters to this method,
26
+ # like suggested in https://github.com/locks/halibut/issues/1.
27
+ #
28
+ # # Resource without self link (e.g. POSTing a new resource)
29
+ # resource = Halibut::HAL::Resource.new
30
+ # resource.set_property :name, 'Halibut Rules'
31
+ # resource.set_property :winner, 'Tiger Blood'
32
+ #
33
+ # # Resource with a self link
34
+ # resource = Halibut::HAL::Resource.new
10
35
  #
11
36
  # @param [String] href Link that will be added to the self relation.
12
- def initialize(href=nil)
37
+ def initialize(href=nil, properties={}, links={}, embedded={})
38
+ @namespaces = Halibut::RelationMap.new
13
39
  @links = Halibut::RelationMap.new
14
40
  @embedded = Halibut::RelationMap.new
15
41
  @properties = {}
@@ -17,7 +43,28 @@ module Halibut::HAL
17
43
  add_link('self', href) if href
18
44
  end
19
45
 
20
- # TDK
46
+ # Returns the self link of the resource.
47
+ #
48
+ # @return [String,nil] the self link of the resource
49
+ def href
50
+ @links.fetch('self', []).map(&:href).first
51
+ end
52
+
53
+ def namespace(name)
54
+ @links['curie'].select {|ns| ns.name == name }.first
55
+ end
56
+ alias_method :ns, :namespace
57
+
58
+ def namespaces
59
+ @links['curie']
60
+ end
61
+
62
+ # Sets a property in the resource.
63
+ #
64
+ # resource = Halibut::HAL::Resource.new
65
+ # resource.set_property :name, 'FooBar'
66
+ # resource.property :name
67
+ # # => "FooBar"
21
68
  #
22
69
  # @param [Object] property the key
23
70
  # @param [Object] value the value
@@ -27,17 +74,38 @@ module Halibut::HAL
27
74
 
28
75
  # Returns the value of a property in the resource
29
76
  #
77
+ # resource = Halibut::HAL::Resource.new
78
+ # resource.set_property :name, 'FooBar'
79
+ # resource.property :name
80
+ # # => "FooBar"
81
+ #
30
82
  # @param [String] property property
31
- def get_property property
32
- @properties[property]
83
+ def property(property)
84
+ @properties.fetch(property, nil)
33
85
  end
34
86
 
35
- # Adds link to relation
87
+ # Adds a namespace to the resource.
88
+ #
89
+ # @param [String] name The name of the namespace
90
+ # @param [String] href The templated URI of the namespace
91
+ def add_namespace(name, href)
92
+ @links.add 'curie', Link.new(href, templated: true, name: name)
93
+ end
94
+
95
+ # Adds link to relation.
96
+ #
97
+ # resource = Halibut::HAL::Resource.new
98
+ # resource.add_link 'next', '/resource/2', name: 'Foo'
99
+ # link = resource.links['next'].first
100
+ # link.href
101
+ # # => "/resource/2"
102
+ # link.name
103
+ # # => "Foo"
36
104
  #
37
105
  # @param [String] relation relation
38
106
  # @param [String] href href
39
- # @param [true, false] templated templated
40
- # @param [Hash] opts options: name, type, hreflang
107
+ # @param [Hash] opts options: templated, type, name, profile,
108
+ # title, hreflang
41
109
  def add_link(relation, href, opts={})
42
110
  @links.add relation, Link.new(href, opts)
43
111
  end
@@ -6,7 +6,7 @@ module Halibut
6
6
  class RelationMap
7
7
  extend Forwardable
8
8
 
9
- def_delegators :@relations, :[], :empty?, :==
9
+ def_delegators :@relations, :[], :empty?, :==, :fetch
10
10
 
11
11
  def initialize
12
12
  @relations = {}
@@ -14,6 +14,14 @@ module Halibut
14
14
 
15
15
  # Adds an object to a relation.
16
16
  #
17
+ # relations = RelationMap.new
18
+ # relations.add 'self', Link.new('/resource/1')
19
+ # relations['self']
20
+ # # => [#<Halibut::HAL::Link:0x007fa0ca5b92b8 @href=\"/resource/1\",
21
+ # @options=#<Halibut::HAL::Link::Options:0x007fa0ca5b9240
22
+ # @templated=nil, @type=nil, @name=nil, @profile=nil,
23
+ # @title=nil, @hreflang=nil>>]
24
+ #
17
25
  # @param [String] relation relation that the object belongs to
18
26
  # @param [Object] item the object to add to the relation
19
27
  def add(relation, item)
@@ -1,3 +1,4 @@
1
1
  module Halibut
2
- VERSION = "0.2.0"
2
+ # Semver version (I'll try, pinkie promise)
3
+ VERSION = "0.3.0"
3
4
  end
@@ -15,7 +15,6 @@ describe Halibut::Adapter::XML do
15
15
  end
16
16
 
17
17
  it "deserializes from XML" do
18
- # skip "Test is failing god knows why."
19
18
  builder = Halibut::Builder.new 'https://example.com/api/customer/123456' do
20
19
  property 'age', "33"
21
20
  property 'expired', "false"
@@ -1,12 +1,11 @@
1
1
  require_relative 'spec_helper'
2
2
 
3
3
  describe Halibut::HAL::Resource do
4
+ subject { Halibut::HAL::Resource.new }
4
5
  let(:templated_uri) { "http://example.com/{path}{?query}" }
5
6
  let(:normal_uri) { "http://example.com" }
6
7
 
7
8
  describe "Properties" do
8
- subject { Halibut::HAL::Resource.new }
9
-
10
9
  it "set property" do
11
10
  subject.set_property "property", "value"
12
11
 
@@ -16,7 +15,7 @@ describe Halibut::HAL::Resource do
16
15
  it "read property" do
17
16
  subject.set_property "property", "value"
18
17
 
19
- subject.get_property('property').must_equal "value"
18
+ subject.property('property').must_equal "value"
20
19
  end
21
20
  end
22
21
 
@@ -24,8 +23,8 @@ describe Halibut::HAL::Resource do
24
23
 
25
24
  describe "self link" do
26
25
  it "no default" do
27
- resource = Halibut::HAL::Resource.new
28
- resource.links.must_be_empty
26
+ subject.links.must_be_empty
27
+ subject.href.must_be_nil
29
28
  end
30
29
 
31
30
  it "default" do
@@ -33,9 +32,47 @@ describe Halibut::HAL::Resource do
33
32
 
34
33
  resource.links.wont_be_empty
35
34
  resource.links['self'].first.href.must_equal normal_uri
35
+ resource.href.must_equal normal_uri
36
36
  end
37
37
  end
38
38
 
39
+ it "adds link to resource" do
40
+ subject.links.must_be_empty
41
+
42
+ subject.add_link 'lol', normal_uri
43
+ subject.links['lol'].first.href.must_equal normal_uri
44
+ end
45
+
46
+ end
47
+
48
+ describe "Namespaces" do
49
+ let(:href) { 'http://relations.com/{rel}' }
50
+
51
+ it "has a single namespace" do
52
+ subject.add_namespace 'lol', href
53
+
54
+ subject.namespaces.size.must_equal 1
55
+ subject.namespaces.first.must_equal subject.namespace('lol')
56
+
57
+ subject.namespace('lol').must_be :templated?
58
+ subject.namespace('lol').href.must_equal href
59
+ subject.namespace('lol').name.must_equal 'lol'
60
+ end
61
+
62
+ it "has multiple namespaces" do
63
+ subject.add_namespace 'lol', "http://lol.com/{rel}"
64
+ subject.add_namespace 'lmao', "http://lmao.com/{rel}"
65
+
66
+ subject.namespaces.size.must_equal 2
67
+
68
+ subject.namespace('lol').must_be :templated?
69
+ subject.namespace('lol').href.must_equal 'http://lol.com/{rel}'
70
+ subject.namespace('lol').name.must_equal 'lol'
71
+
72
+ subject.namespace('lmao').must_be :templated?
73
+ subject.namespace('lmao').href.must_equal 'http://lmao.com/{rel}'
74
+ subject.namespace('lmao').name.must_equal 'lmao'
75
+ end
39
76
  end
40
77
 
41
78
  describe "Embedded resources" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: halibut
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-27 00:00:00.000000000 Z
12
+ date: 2012-12-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json