halibut 0.0.1 → 0.1.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.
@@ -0,0 +1,11 @@
1
+ rvm:
2
+ - ree
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - ruby-head
7
+ - jruby-18mode
8
+ - jruby-19mode
9
+ - jruby-head
10
+ - rbx-18mode
11
+ - rbx-19mode
@@ -41,6 +41,16 @@ module Halibut
41
41
  @title = opts[:title]
42
42
  @hreflang = opts[:hreflang]
43
43
  end
44
+
45
+ def ==(other)
46
+ @href == other.href &&
47
+ @templated == other.templated &&
48
+ @type == other.type &&
49
+ @name == other.name &&
50
+ @profile == other.profile &&
51
+ @title == other.title &&
52
+ @hreflang == other.hreflang
53
+ end
44
54
  end
45
55
 
46
56
  end
@@ -29,6 +29,10 @@ module Halibut
29
29
  end
30
30
 
31
31
  end
32
+
33
+ def ==(other)
34
+ @relations == other.instance_variable_get(:@relations)
35
+ end
32
36
 
33
37
  end
34
38
 
@@ -5,50 +5,90 @@ module Halibut
5
5
 
6
6
  class Resource
7
7
  attr_reader :properties, :links
8
-
8
+
9
9
  def initialize(href=nil)
10
10
  @links = RelationMap.new
11
11
  @resources = RelationMap.new
12
12
  @properties = {}
13
-
13
+
14
14
  add_link('self', href) if href
15
15
  end
16
-
16
+
17
17
  def set_property property, value
18
18
  @properties[property] = value
19
19
  end
20
-
20
+
21
21
  def get_property property
22
22
  @properties[property]
23
23
  end
24
-
24
+
25
25
  def add_link(relation, href, templated=nil, opts={})
26
26
  @links.add relation, Halibut::Link.new(href, templated)
27
27
  end
28
-
28
+
29
29
  def embed_resource(relation, resource)
30
30
  @resources.add relation, resource
31
31
  end
32
-
33
-
32
+
33
+
34
34
  def embedded
35
35
  @resources
36
36
  end
37
-
37
+
38
38
 
39
39
  def as_json
40
40
  json = {}
41
41
  json = json.merge @properties
42
- json['_links'] = {}.merge @links unless @links.empty?
42
+ json['_links'] = {}.merge @links unless @links.empty?
43
43
  json['_resources'] = {}.merge @resources unless @resources.empty?
44
-
44
+
45
45
  json
46
46
  end
47
-
47
+
48
48
  def to_json
49
49
  JSON.dump as_json
50
50
  end
51
-
51
+
52
+ def self.from_json resource
53
+ json = JSON.load(resource)
54
+ halibut = Halibut::Resource.new
55
+
56
+ links = json.delete '_links'
57
+ resources = json.delete '_embedded'
58
+
59
+ json.each_pair do |k,v|
60
+ halibut.set_property k, v
61
+ end
62
+
63
+ links.each do |relation,v|
64
+ link = [] << v
65
+ link = link.flatten
66
+
67
+ link.each do |attrs|
68
+ href = attrs.delete 'href'
69
+ templated = attrs.delete 'templated'
70
+ options = attrs
71
+
72
+ halibut.add_link relation, href, templated, options
73
+ end
74
+ end if links
75
+
76
+ resources.each do |relation,value|
77
+ res = [] << value
78
+ res = res.flatten
79
+
80
+ res.each do |resource|
81
+ halibut.embed_resource relation, Halibut::Resource.from_json(JSON.dump resource)
82
+ end
83
+ end if resources
84
+
85
+ halibut
86
+ end
87
+
88
+ def ==(other)
89
+ @properties == other.properties &&
90
+ @links == other.links &&
91
+ @resources == other.embedded
92
+ end
52
93
  end
53
-
54
94
  end
@@ -1,4 +1,4 @@
1
1
  module Halibut
2
2
  # Halibut.VERSION denotes the version of this library.
3
- VERSION = "0.0.1"
3
+ VERSION = "0.1.0"
4
4
  end
@@ -0,0 +1,23 @@
1
+ { "_links": {
2
+ "self": { "href": "/orders" },
3
+ "find": { "href": "/orders{?id}", "templated": true },
4
+ "next": [
5
+ { "href": "/orders/1" },
6
+ { "href": "/orders/9" }
7
+ ]
8
+ },
9
+ "_embedded": {
10
+ "orders": [
11
+ {
12
+ "_links": {
13
+ "self": { "href": "/orders/123" }
14
+ },
15
+ "total": 30.00,
16
+ "currency": "USD",
17
+ "status": "shipped"
18
+ }
19
+ ]
20
+ },
21
+ "currentlyProcessing": 14,
22
+ "shippedToday": 20
23
+ }
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require_relative 'spec_helper'
2
2
 
3
3
  describe Halibut::Link do
4
4
  let(:normal_uri) { 'http://example.com' }
@@ -65,4 +65,25 @@ describe Halibut::Resource do
65
65
  JSON.load(subject).must_equal JSON.load(json)
66
66
  end
67
67
  end
68
+
69
+ describe "Deserialize" do
70
+ subject { Halibut::Resource.from_json(load_json "serialize") }
71
+
72
+ it "deserializes from JSON" do
73
+ order = Halibut::Resource.new "/orders/123"
74
+ order.set_property "total", 30.00
75
+ order.set_property "currency", "USD"
76
+ order.set_property "status", "shipped"
77
+
78
+ resource = Halibut::Resource.new "/orders"
79
+ resource.add_link "find", "/orders{?id}", true
80
+ resource.add_link "next", "/orders/1"
81
+ resource.add_link "next", "/orders/9"
82
+ resource.set_property "currentlyProcessing", 14
83
+ resource.set_property "shippedToday", 20
84
+ resource.embed_resource "orders", order
85
+
86
+ subject.must_equal resource
87
+ end
88
+ end
68
89
  end
@@ -3,6 +3,7 @@ Bundler.setup
3
3
 
4
4
  require 'minitest/autorun'
5
5
  require 'pry'
6
+
6
7
  require 'halibut'
7
8
 
8
9
  # Testing helper to load JSON files. Returns a string containing JSON.
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.0.1
4
+ version: 0.1.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-09-08 00:00:00.000000000 Z
12
+ date: 2012-09-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -212,6 +212,7 @@ extra_rdoc_files: []
212
212
  files:
213
213
  - .gitignore
214
214
  - .rvmrc
215
+ - .travis.yml
215
216
  - Gemfile
216
217
  - Guardfile
217
218
  - LICENSE
@@ -226,6 +227,7 @@ files:
226
227
  - spec/fixtures/example.json
227
228
  - spec/fixtures/example.xml
228
229
  - spec/fixtures/minimal.json
230
+ - spec/fixtures/serialize.json
229
231
  - spec/fixtures/simple.json
230
232
  - spec/link_spec.rb
231
233
  - spec/relation_map_spec.rb
@@ -259,6 +261,7 @@ test_files:
259
261
  - spec/fixtures/example.json
260
262
  - spec/fixtures/example.xml
261
263
  - spec/fixtures/minimal.json
264
+ - spec/fixtures/serialize.json
262
265
  - spec/fixtures/simple.json
263
266
  - spec/link_spec.rb
264
267
  - spec/relation_map_spec.rb