arrest 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/lib/arrest.rb CHANGED
@@ -8,11 +8,11 @@ require "arrest/helper/child_collection"
8
8
  require "arrest/exceptions"
9
9
  require "arrest/http_source"
10
10
  require "arrest/mem_source"
11
+ require "arrest/source"
11
12
  require "arrest/nested_resource"
12
13
  require "arrest/abstract_resource"
13
14
  require "arrest/root_resource"
14
15
  require "arrest/rest_child"
15
16
 
16
17
  module Arrest
17
-
18
18
  end
@@ -7,10 +7,9 @@ Scope = Struct.new(:name, :block)
7
7
  module Arrest
8
8
  class AbstractResource
9
9
  include HasAttributes
10
+ attribute :id, String
10
11
  class << self
11
-
12
12
  attr_reader :scopes
13
-
14
13
 
15
14
  def source
16
15
  Arrest::Source::source
@@ -29,11 +28,7 @@ module Arrest
29
28
  end
30
29
 
31
30
  def build hash
32
- underscored_hash = {}
33
- hash.each_pair do |k, v|
34
- underscored_hash[StringUtils.underscore k] = v
35
- end
36
- self.new underscored_hash
31
+ self.new hash, true
37
32
  end
38
33
 
39
34
  def custom_resource_name new_name
@@ -97,42 +92,9 @@ module Arrest
97
92
  include BelongsTo
98
93
 
99
94
  attr_accessor :id
100
- attr_reader :stub
101
-
102
- def self.stub id
103
- self.new({:id => id}, true)
104
- end
105
-
106
- def initialize hash={},stubbed=false
107
- @stub = stubbed
108
- init_from_hash(hash) unless stubbed
109
- self.id = hash[:id]
110
- self.id ||= hash['id']
111
- end
112
-
113
- def init_from_hash as_i={}
114
- @stub = false
115
- super
116
- end
117
-
118
-
119
- def to_hash
120
- result = {}
121
- unless self.class.all_fields == nil
122
- self.class.all_fields.find_all{|a| !a.read_only}.each do |field|
123
- json_name = StringUtils.classify(field.name.to_s,false)
124
- val = self.instance_variable_get("@#{field.name.to_s}")
125
- if val != nil && val.is_a?(NestedResource)
126
- val = val.to_hash
127
- elsif val != nil && field.is_a?(NestedCollection)
128
- val = val.map {|v| v.to_hash}
129
- end
130
- result[json_name] = val
131
- end
132
- end
133
- result[:id] = self.id
134
- result
135
95
 
96
+ def initialize hash={}, from_json = false
97
+ initialize_has_attributes hash, from_json
136
98
  end
137
99
 
138
100
  def save
@@ -158,7 +120,5 @@ module Arrest
158
120
 
159
121
  "curl #{hs} -v '#{Arrest::Source.source.url}/#{self.resource_location}'"
160
122
  end
161
-
162
-
163
123
  end
164
124
  end
@@ -5,14 +5,15 @@ end
5
5
  module Arrest
6
6
 
7
7
  class Attribute
8
- attr_accessor :name, :read_only, :clazz
8
+ attr_accessor :name, :read_only, :clazz, :json_name
9
9
  def initialize name, read_only, clazz
10
- @name = name
10
+ @name = name.to_sym
11
11
  @read_only = read_only
12
12
  @clazz = clazz
13
+ @json_name = Source.json_key_converter.key_to_json(name).to_sym
13
14
  end
14
15
 
15
- def convert value
16
+ def from_hash value
16
17
  return if value == nil
17
18
  converter = CONVERTER[@clazz]
18
19
  if converter == nil
@@ -21,6 +22,11 @@ module Arrest
21
22
  end
22
23
  converter.convert value
23
24
  end
25
+
26
+ def to_hash value
27
+ return nil unless value != nil
28
+ value
29
+ end
24
30
  end
25
31
 
26
32
  class NestedAttribute < Attribute
@@ -28,10 +34,15 @@ module Arrest
28
34
  super name, read_only, clazz
29
35
  end
30
36
 
31
- def convert value
32
- return unless value
37
+ def from_hash value
38
+ return nil unless value != nil
33
39
  @clazz.new value
34
40
  end
41
+
42
+ def to_hash val
43
+ return nil unless val!= nil
44
+ val.to_hash
45
+ end
35
46
  end
36
47
 
37
48
  class NestedCollection < Attribute
@@ -39,14 +50,20 @@ module Arrest
39
50
  super name, read_only, clazz
40
51
  end
41
52
 
42
- def convert value
43
- return unless value
53
+ def from_hash value
54
+ return nil unless value != nil
44
55
  raise "Expected an array but got #{value.class.name}" unless value.is_a?(Array)
45
56
  value.map do |v|
46
57
  @clazz.new v
47
58
  end
48
59
  end
49
60
 
61
+ def to_hash value
62
+ return nil unless value != nil
63
+ raise "Expected an array but got #{value.class.name}" unless value.is_a?(Array)
64
+ value.map(&:to_hash)
65
+ end
66
+
50
67
  end
51
68
 
52
69
  CONVERTER = {}
@@ -1,58 +1,86 @@
1
+ require "arrest/source"
1
2
  module Arrest
2
3
  module HasAttributes
3
-
4
- def self.included(base) # :nodoc:
5
- base.extend HasAttributesMethods
4
+ attr_accessor :attribute_values
5
+
6
+ def initialize_has_attributes hash, from_json = false, &blk
7
+ if block_given?
8
+ @stubbed = true
9
+ @load_blk = blk
10
+ else
11
+ @stubbed = false
12
+ end
13
+ init_from_hash hash, from_json
6
14
  end
7
15
 
8
- def unstub
16
+ def initialize hash = {}, from_json = false, &blk
17
+ if block_given?
18
+ @stubbed = true
19
+ @load_blk = blk
20
+ else
21
+ init_from_hash hash, from_json
22
+ end
23
+ end
9
24
 
25
+ def self.included(base) # :nodoc:
26
+ base.extend HasAttributesMethods
10
27
  end
11
28
 
12
- def init_from_hash as_i={}
29
+ def init_from_hash as_i={}, from_json = false
30
+ @attribute_values = {} unless @attribute_values != nil
13
31
  as = {}
14
32
  as_i.each_pair do |k,v|
15
33
  as[k.to_sym] = v
16
34
  end
17
- unless self.class.all_fields == nil
18
- self.class.all_fields.each do |field|
19
- value = as[field.name.to_sym]
20
- converted = field.convert(value)
21
- self.send("#{field.name.to_s}=", converted)
35
+ self.class.all_fields.each do |field|
36
+ if from_json
37
+ key = field.json_name
38
+ else
39
+ key = field.name
22
40
  end
41
+ value = as[key]
42
+ converted = field.from_hash(value)
43
+ self.send(field.name.to_s + '=', converted) unless converted == nil
23
44
  end
24
45
  end
25
46
 
26
- def to_hash
47
+ def load_from_stub
48
+ @load_blk.call
49
+ @stubbed = false
50
+ end
51
+
52
+
53
+ def to_jhash
54
+ to_hash(false, true)
55
+ end
56
+
57
+ def to_hash(show_all_fields = true, json_names = false)
27
58
  result = {}
28
- unless self.class.all_fields == nil
29
- self.class.all_fields.find_all{|a| !a.read_only}.each do |field|
30
- json_name = StringUtils.classify(field.name.to_s,false)
31
- val = self.instance_variable_get("@#{field.name.to_s}")
32
- if val != nil && val.is_a?(NestedResource)
33
- val = val.to_hash
34
- end
35
- result[json_name] = val
59
+ self.class.all_fields.find_all{|a| show_all_fields || !a.read_only}.each do |field|
60
+ if json_names
61
+ json_name = field.json_name
62
+ else
63
+ json_name = field.name
64
+ end
65
+ val = self.send(field.name)
66
+ converted = field.to_hash val
67
+ if converted != nil
68
+ result[json_name] = converted
36
69
  end
37
70
  end
38
71
  result
39
72
  end
40
73
 
41
74
  module HasAttributesMethods
75
+
42
76
  attr_accessor :fields
43
77
 
44
-
78
+ def initialize
79
+ @fields = []
80
+ end
81
+
45
82
  def attribute name, clazz
46
- add_attribute Attribute.new(name, false, clazz)
47
-
48
- send :define_method, "#{name}=" do |v|
49
- self.unstub
50
- self.instance_variable_set("@#{name}", v)
51
- end
52
- send :define_method, "#{name}" do
53
- self.unstub
54
- self.instance_variable_get("@#{name}")
55
- end
83
+ add_attribute Attribute.new(name, false, clazz)
56
84
  end
57
85
 
58
86
  def attributes(args)
@@ -62,52 +90,43 @@ module Arrest
62
90
  end
63
91
 
64
92
  def add_attribute attribute
65
- if @fields == nil
66
- @fields = []
67
- end
68
- @fields << attribute
93
+ if @fields == nil
94
+ @fields = []
95
+ end
96
+ send :define_method, "#{attribute.name}=" do |v|
97
+ Arrest::debug "setter #{self.class.name} #{attribute.name} = #{v}"
98
+ self.attribute_values[attribute.name] = v
99
+ end
100
+ send :define_method, "#{attribute.name}" do
101
+ Arrest::debug "getter #{self.class.name} #{attribute.name}"
102
+ self.load_from_stub if @stubbed
103
+ self.attribute_values[attribute.name]
104
+ end
105
+ @fields << attribute
69
106
  end
70
107
 
71
108
  def all_fields
72
109
  self_fields = self.fields
73
110
  self_fields ||= []
74
- if self.superclass.respond_to?('fields') && self.superclass.fields != nil
75
- self_fields + self.superclass.fields
111
+ if self.superclass.respond_to?('fields') && self.superclass.all_fields != nil
112
+ res = self_fields + self.superclass.all_fields
76
113
  else
77
- self_fields
114
+ res = self_fields
78
115
  end
116
+ res
79
117
  end
80
118
 
81
119
  def nested name, clazz
82
- add_attribute NestedAttribute.new(name, false, clazz)
83
-
84
- send :define_method, "#{name}=" do |v|
85
- self.unstub
86
- self.instance_variable_set("@#{name}", v)
87
- end
88
- send :define_method, "#{name}" do
89
- self.unstub
90
- self.instance_variable_get("@#{name}")
91
- end
92
-
120
+ add_attribute NestedAttribute.new(name, false, clazz)
93
121
  end
94
122
 
95
123
  def nested_array name, clazz
96
- add_attribute NestedCollection.new(name, false, clazz)
97
-
98
- send :define_method, "#{name}=" do |v|
99
- self.unstub
100
- self.instance_variable_set("@#{name}", v)
101
- end
102
- send :define_method, "#{name}" do
103
- self.unstub
104
- self.instance_variable_get("@#{name}")
105
- end
106
-
124
+ add_attribute NestedCollection.new(name, false, clazz)
107
125
  end
108
-
109
126
  end
110
127
 
111
-
128
+ def stubbed?
129
+ @stubbed
130
+ end
112
131
  end
113
132
  end
@@ -1,21 +1,20 @@
1
1
  module Arrest
2
- class ChildCollection < BasicObject
3
- def initialize parentX, clazz_name
4
- @parent_clazz = parentX
2
+ class ChildCollection < BasicObject
3
+ def initialize parent, clazz_name
4
+ @parent = parent
5
5
  @clazz_name = clazz_name
6
6
  @children = nil
7
7
  end
8
8
 
9
9
  def build attributes = {}
10
- resolved_class.new @parent_clazz, attributes
10
+ resolved_class.new @parent, attributes
11
11
  end
12
12
 
13
13
  def method_missing(*args, &block)
14
14
  if resolved_class.respond_to?(args[0])
15
- resolved_class.send(args[0], @parent_clazz)
15
+ resolved_class.send(args[0], @parent)
16
16
  else
17
17
  children.send(*args, &block)
18
-
19
18
  end
20
19
  end
21
20
 
@@ -24,7 +23,7 @@ module Arrest
24
23
 
25
24
  def children
26
25
  if @children == nil
27
- @children = resolved_class.all_for @parent_clazz
26
+ @children = resolved_class.all_for @parent
28
27
  end
29
28
  @children
30
29
  end
@@ -58,7 +58,7 @@ module Arrest
58
58
  def post rest_resource
59
59
  raise "new object must have setter for id" unless rest_resource.respond_to?(:id=)
60
60
  raise "new object must not have id" if rest_resource.respond_to?(:id) && rest_resource.id != nil
61
- hash = rest_resource.to_hash
61
+ hash = rest_resource.to_jhash
62
62
  hash.delete(:id)
63
63
  hash.delete('id')
64
64
 
@@ -25,24 +25,19 @@ module Arrest
25
25
  end
26
26
 
27
27
  def initialize
28
- @@all_objects = {} # holds all objects of all types,
28
+ @@all_objects = {} # holds all objects of all types,
29
29
 
30
- @@collections = {} # maps urls to collections of ids of objects
31
- @@random = Random.new(42)
30
+ @@collections = {} # maps urls to collections of ids of objects
31
+ @@random = Random.new(42)
32
32
 
33
33
  end
34
34
 
35
- def debug s
36
- if Arrest::Source.debug
37
- puts s
38
- end
39
- end
40
35
 
41
36
  # only to stub collection for development
42
37
  #
43
38
  def set_collection clazz, scope, objects
44
39
  url = clazz.scoped_path scope
45
- self.class.debug "url:#{url}"
40
+ Arrest::debug "url:#{url}"
46
41
  @@data[url] = objects
47
42
  end
48
43
 
@@ -67,7 +62,7 @@ module Arrest
67
62
  end
68
63
 
69
64
  def get_many sub, filters = {}
70
- debug sub + (hash_to_query filters)
65
+ Arrest::debug sub + (hash_to_query filters)
71
66
  # filters are ignored by mem impl so far
72
67
 
73
68
  id_list = @@collections[sub] || []
@@ -80,7 +75,7 @@ module Arrest
80
75
  end
81
76
 
82
77
  def get_one sub, filters = {}
83
- debug sub + (hash_to_query filters)
78
+ Arrest::debug sub + (hash_to_query filters)
84
79
  # filters are ignored by mem impl so far
85
80
  idx = sub.rindex '/'
86
81
  if idx
@@ -90,12 +85,12 @@ module Arrest
90
85
  if val == nil
91
86
  raise Errors::DocumentNotFoundError
92
87
  end
93
- wrap val.to_hash.to_json, 1
88
+ wrap val.to_jhash.to_json, 1
94
89
  end
95
90
 
96
91
  def collection_json values
97
92
  single_jsons = values.map do |v|
98
- v.to_hash.to_json
93
+ v.to_jhash.to_json
99
94
  end
100
95
  "[#{single_jsons.join(',')}]"
101
96
  end
@@ -133,6 +128,7 @@ module Arrest
133
128
  end
134
129
 
135
130
  def post rest_resource
131
+ Arrest::debug "post -> #{rest_resource.class.name} #{rest_resource.to_hash} #{rest_resource.class.all_fields.map(&:name)}"
136
132
  raise "new object must have setter for id" unless rest_resource.respond_to?(:id=)
137
133
  raise "new object must not have id" if rest_resource.respond_to?(:id) && rest_resource.id != nil
138
134
  rest_resource.id = next_id
@@ -140,7 +136,7 @@ module Arrest
140
136
  unless @@data[rest_resource.resource_path()] != nil
141
137
  @@data[rest_resource.resource_path()] = {}
142
138
  end
143
- debug "child path #{rest_resource.resource_path()}"
139
+ Arrest::debug "child path #{rest_resource.resource_path()}"
144
140
  @@data[rest_resource.resource_path()][next_id.to_s] = rest_resource.id
145
141
  if @@collections[rest_resource.resource_path] == nil
146
142
  @@collections[rest_resource.resource_path] = []
@@ -9,21 +9,5 @@ module Arrest
9
9
  def initialize h
10
10
  init_from_hash h
11
11
  end
12
-
13
- class << self
14
- def to_hash
15
- result = {}
16
- unless self.class.all_fields == nil
17
- self.class.all_fields.find_all{|a| !a.read_only}.each do |field|
18
- json_name = StringUtils.classify(field.name.to_s,false)
19
- result[json_name] = self.instance_variable_get("@#{field.name.to_s}")
20
- end
21
- end
22
- result[:id] = self.id
23
- result
24
-
25
- end
26
-
27
- end
28
12
  end
29
13
  end
@@ -21,7 +21,7 @@ module Arrest
21
21
  if body == nil || body.empty?
22
22
  raise Errors::DocumentNotFoundError.new
23
23
  end
24
- self.build body
24
+ self.build body.merge({:id => id})
25
25
  end
26
26
 
27
27
  def scope name, &block
@@ -43,6 +43,16 @@ module Arrest
43
43
  def scoped_path scope_name
44
44
  resource_path + '/' + scope_name.to_s
45
45
  end
46
+
47
+ def stub stub_id
48
+ n = self.new
49
+ n.initialize_has_attributes({:id => stub_id}) do
50
+ r = n.class.source().get_one "#{self.resource_path}/#{stub_id}"
51
+ body = n.class.body_root(r)
52
+ n.init_from_hash(body, true)
53
+ end
54
+ n
55
+ end
46
56
  end
47
57
 
48
58
  def resource_path
@@ -53,18 +63,6 @@ module Arrest
53
63
  self.class.resource_path + '/' + self.id.to_s
54
64
  end
55
65
 
56
-
57
- def unstub
58
- return unless @stub
59
- r = self.class.source().get_one "#{self.resource_path}/#{id}"
60
- body = self.class.body_root(r)
61
- underscored_hash = {}
62
- body.each_pair do |k, v|
63
- underscored_hash[StringUtils.underscore k] = v
64
- end
65
- init_from_hash underscored_hash
66
- end
67
-
68
66
  end
69
67
  end
70
68
 
data/lib/arrest/source.rb CHANGED
@@ -1,4 +1,9 @@
1
1
  module Arrest
2
+ def self.debug s
3
+ if Arrest::Source.debug
4
+ puts s
5
+ end
6
+ end
2
7
 
3
8
  class Source
4
9
  class << self
@@ -6,6 +11,7 @@ module Arrest
6
11
  attr_reader :source
7
12
  attr_reader :mod
8
13
  attr_reader :header_decorator
14
+ attr_accessor :json_key_converter
9
15
 
10
16
  def source=(host=nil)
11
17
  if host == nil || host.blank?
@@ -27,7 +33,7 @@ module Arrest
27
33
  end
28
34
 
29
35
  def header_decorator=(hd=nil)
30
- puts "Setting headerd to #{hd}"
36
+ Arrest::debug "Setting headerd to #{hd}"
31
37
  if hd == nil
32
38
  @header_decorator = self
33
39
  elsif hd.respond_to?(:headers)
@@ -41,9 +47,19 @@ module Arrest
41
47
  {}
42
48
  end
43
49
 
50
+ def key_from_json name
51
+ StringUtils.underscore(name.to_s)
52
+ end
53
+
54
+ def key_to_json name
55
+ StringUtils.classify(name.to_s,false)
56
+ end
57
+
44
58
  end
45
59
  end
46
60
  Source.mod = nil
47
61
  Source.header_decorator = Source
48
62
  Source.debug = false
63
+ Source.json_key_converter = Source
64
+
49
65
  end
@@ -1,3 +1,3 @@
1
1
  module Arrest
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -0,0 +1,68 @@
1
+ require 'arrest'
2
+ require 'test/unit'
3
+ class HasAttributesTest < Test::Unit::TestCase
4
+
5
+ class ItHas
6
+ include Arrest::HasAttributes
7
+
8
+ attribute :name, String
9
+ attribute :my_name, String
10
+ end
11
+
12
+
13
+ def test_empty_new
14
+ ih = ItHas.new
15
+ ih.name = "NAME"
16
+ ih.my_name = "MYNAME"
17
+ assert_equal "NAME", ih.name
18
+ assert_equal "MYNAME", ih.my_name
19
+ end
20
+
21
+ def test_new
22
+ ih = ItHas.new({:name => "NAME", :my_name => "MYNAME"})
23
+ assert_equal "NAME", ih.name
24
+ assert_equal "MYNAME", ih.my_name
25
+ end
26
+
27
+ class ItHasMore < ItHas
28
+
29
+ attribute :my_other_name, String
30
+ end
31
+
32
+ def test_new_inherit
33
+ ih = ItHasMore.new({:name => "NAME", :my_name => "MYNAME", :my_other_name => "OTHER"})
34
+ assert_equal "NAME", ih.name
35
+ assert_equal "MYNAME", ih.my_name
36
+ assert_equal "OTHER", ih.my_other_name
37
+ assert_equal 3, ih.class.all_fields.length
38
+ end
39
+
40
+ def test_to_json
41
+ ih = ItHasMore.new({:name => "NAME", :my_name => "MYNAME", :my_other_name => "OTHER"})
42
+ h = ih.to_hash
43
+ assert_equal "NAME", h[:name]
44
+ assert_equal "MYNAME", h[:my_name]
45
+ assert_equal "OTHER", h[:my_other_name]
46
+
47
+ end
48
+
49
+ class ItHasMoreAndId < ItHasMore
50
+ attribute :id, String
51
+ end
52
+
53
+ def test_to_json_with_id
54
+ assert_equal [:name, :my_name].sort, ItHas.all_fields.map(&:name).sort
55
+ assert_equal [:name, :my_name, :my_other_name].sort, ItHasMore.all_fields.map(&:name).sort
56
+ assert_equal [:name, :my_name, :my_other_name, :id].sort, ItHasMoreAndId.all_fields.map(&:name).sort
57
+
58
+ ih = ItHasMoreAndId.new({:id => 'vr23', :name => "NAME", :my_name => "MYNAME", :my_other_name => "OTHER"})
59
+ ih.id = 'foo42'
60
+ h = ih.to_hash
61
+ assert_equal "NAME", h[:name]
62
+ assert_equal "MYNAME", h[:my_name]
63
+ assert_equal "OTHER", h[:my_other_name]
64
+ assert_equal 'foo42', h[:id]
65
+ end
66
+
67
+ end
68
+
data/test/models.rb CHANGED
@@ -32,6 +32,7 @@ end
32
32
 
33
33
  class ANestedClass < Arrest::NestedResource
34
34
  attribute :name, String
35
+ attribute :underscore_name, String
35
36
  attribute :bool, Boolean
36
37
  end
37
38
 
@@ -9,8 +9,9 @@ class NestedResourcesTest < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  def test_instance_test
12
- n = ANestedClass.new({:name => "foo"})
12
+ n = ANestedClass.new({:name => "foo", :underscore_name => "Bar"})
13
13
  assert_equal "foo", n.name
14
+ assert_equal "Bar", n.underscore_name
14
15
  end
15
16
 
16
17
  def test_from_hash
@@ -19,6 +20,7 @@ class NestedResourcesTest < Test::Unit::TestCase
19
20
  :bool => false,
20
21
  :nested_object => {
21
22
  :name => 'iamnested',
23
+ :underscore_name => 'foo',
22
24
  :bool => true
23
25
  }
24
26
  }
@@ -37,23 +39,14 @@ class NestedResourcesTest < Test::Unit::TestCase
37
39
  :bool => false,
38
40
  :nested_object => {
39
41
  :name => 'iamnested',
42
+ :underscore_name => 'foo',
40
43
  :bool => true
41
44
  }
42
45
  }
43
46
 
44
47
  actual = WithNested.new(input)
45
48
 
46
- # we expect camel cased keys
47
- expected = {
48
- 'parentName' => 'parent',
49
- 'bool' => false,
50
- 'nestedObject' => {
51
- 'name' => 'iamnested',
52
- 'bool' => true
53
- }
54
- }
55
-
56
- assert_equal_hashes expected, actual.to_hash
49
+ assert_equal_hashes input, actual.to_hash
57
50
 
58
51
  end
59
52
 
@@ -74,22 +67,7 @@ class NestedResourcesTest < Test::Unit::TestCase
74
67
 
75
68
  actual = WithManyNested.new(input)
76
69
 
77
- # we expect camel cased keys
78
- expected = {
79
- 'parentName' => 'parent',
80
- 'bool' => false,
81
- 'nestedObjects' => [
82
- {
83
- 'name' => 'iamnested_one',
84
- 'bool' => true
85
- },{
86
- 'name' => 'iamnested_two',
87
- 'bool' => false
88
- }
89
- ]
90
- }
91
-
92
- assert_equal_hashes expected, actual.to_hash
70
+ assert_equal_hashes input, actual.to_hash
93
71
 
94
72
  end
95
73
 
@@ -109,19 +87,7 @@ class NestedResourcesTest < Test::Unit::TestCase
109
87
 
110
88
  actual = WithNestedBelongingTo.new(input)
111
89
 
112
- # we expect camel cased keys
113
- expected = {
114
- 'parentName' => 'parent',
115
- 'bool' => false,
116
- 'nestedObject' => {
117
- 'name' => 'iamnested',
118
- 'bool' => true,
119
- 'zooId' => new_zoo.id
120
-
121
- }
122
- }
123
-
124
- assert_equal_hashes expected, actual.to_hash
90
+ assert_equal_hashes input, actual.to_hash
125
91
 
126
92
  zoo = actual.nested_object.zoo
127
93
  assert_equal "Foo", zoo.name
data/test/unit.rb CHANGED
@@ -5,7 +5,7 @@ class FirstTest < Test::Unit::TestCase
5
5
 
6
6
  def setup
7
7
  Arrest::Source.source = nil
8
- #Arrest::Source.debug = true
8
+ Arrest::Source.debug = true
9
9
  end
10
10
 
11
11
  def test_mem_src
@@ -15,9 +15,14 @@ class FirstTest < Test::Unit::TestCase
15
15
  end
16
16
 
17
17
  def test_init
18
+ puts "test_init NOWWWWWW #{Arrest::Source::source.objects.length}"
18
19
  zooname = "Hagenbecks"
19
20
  z = Zoo.new({:name => zooname})
21
+ puts "aaa #{z.attribute_values.inspect}"
20
22
  assert_equal zooname, z.name
23
+ #assert_not_empty Arrest::AbstractResource.all_fields.select {|f| f.name == :id}, "AbstractResource defines the id field itself"
24
+ #assert_not_empty Arrest::RootResource.all_fields.select {|f| f.name == :id}, "RootResource should inherit id from AbstractResource"
25
+ #assert_not_empty Zoo.all_fields.select {|f| f.name == :id}, "Zoo should inherit id field from RootResource"
21
26
  end
22
27
 
23
28
  def test_create
@@ -25,15 +30,18 @@ class FirstTest < Test::Unit::TestCase
25
30
  new_zoo = Zoo.new({:name => "Foo"})
26
31
  new_zoo.save
27
32
  zoo_count_after = Zoo.all.length
33
+ assert_not_nil new_zoo.id
28
34
 
29
35
  assert_equal (zoo_count_before + 1), zoo_count_after
30
36
  assert new_zoo.id != nil
31
37
 
32
38
  zoo_the_last = Zoo.all.last
33
39
  assert_equal new_zoo.name, zoo_the_last.name
40
+ assert_equal new_zoo.id, zoo_the_last.id
34
41
 
35
42
  zoo_reloaded = Zoo.find(new_zoo.id)
36
43
  assert_equal new_zoo.name, zoo_reloaded.name
44
+ assert_equal new_zoo.id, zoo_reloaded.id
37
45
  end
38
46
 
39
47
  def test_delete
@@ -75,6 +83,8 @@ class FirstTest < Test::Unit::TestCase
75
83
  assert new_zoo.id != nil
76
84
 
77
85
  zoo_reloaded = Zoo.find(new_zoo.id)
86
+ assert_not_nil zoo_reloaded
87
+ assert_equal new_zoo.id, zoo_reloaded.id
78
88
 
79
89
  assert_equal new_zoo_name, zoo_reloaded.name
80
90
  end
@@ -82,6 +92,8 @@ class FirstTest < Test::Unit::TestCase
82
92
  def test_child
83
93
  new_zoo = Zoo.new({:name => "Foo"})
84
94
  new_zoo.save
95
+ assert_not_nil new_zoo.id
96
+ #assert_not_nil new_zoo.class.all_fields.select {|f| f.name = :id}
85
97
 
86
98
  animal_kind = "mouse"
87
99
  new_animal = Animal.new new_zoo, {:kind => animal_kind, :age => 42}
@@ -94,7 +106,9 @@ class FirstTest < Test::Unit::TestCase
94
106
  assert new_animal.id != nil
95
107
 
96
108
  zoo_reloaded = Zoo.find(new_zoo.id)
97
-
109
+ puts "--1 #{zoo_reloaded.to_hash}"
110
+ assert_equal new_zoo.id, zoo_reloaded.id
111
+ assert_equal new_animal.parent.id, zoo_reloaded.id
98
112
 
99
113
  assert_equal 1, zoo_reloaded.animals.length
100
114
  assert_equal Animal, zoo_reloaded.animals.first.class
@@ -126,11 +140,15 @@ class FirstTest < Test::Unit::TestCase
126
140
  end
127
141
 
128
142
  def test_inheritance
143
+ puts "NOWWWWWW #{Arrest::Source::source.objects.length}"
129
144
  new_zoo = SpecialZoo.new({:name => "Foo", :is_magic => true})
145
+ assert_equal "Foo", new_zoo.name
146
+ assert_equal true, new_zoo.is_magic
130
147
  new_zoo.save
131
148
 
132
149
  assert new_zoo.id != nil, "Zoo must have id after save"
133
150
  zoo_reloaded = SpecialZoo.find(new_zoo.id)
151
+ assert_equal new_zoo.id, zoo_reloaded.id
134
152
  assert_equal true, zoo_reloaded.is_magic
135
153
  assert_equal "Foo", zoo_reloaded.name
136
154
  end
@@ -172,7 +190,7 @@ class FirstTest < Test::Unit::TestCase
172
190
  assert_equal "two", zoo.ro2
173
191
  assert_equal true, zoo.is_magic
174
192
 
175
- hash = zoo.to_hash
193
+ hash = zoo.to_jhash
176
194
 
177
195
  assert_nil hash[:ro1]
178
196
  assert_nil hash[:ro2]
@@ -188,9 +206,9 @@ class FirstTest < Test::Unit::TestCase
188
206
  assert_not_nil new_zoo.id
189
207
 
190
208
  stubbed = Zoo.stub(new_zoo.id)
191
- assert stubbed.stub, "Zoo should be a stub, so not loaded yet"
209
+ assert stubbed.stubbed?, "Zoo should be a stub, so not loaded yet"
192
210
  new_name = stubbed.name
193
- assert !stubbed.stub, "Zoo should not be a stub, so loaded now"
211
+ assert !stubbed.stubbed?, "Zoo should not be a stub, so loaded now"
194
212
 
195
213
  assert_equal "Foo", new_name
196
214
  end
@@ -202,24 +220,21 @@ class FirstTest < Test::Unit::TestCase
202
220
  assert_not_nil new_zoo.id
203
221
  # this is where the magic hapens
204
222
  stubbed = Zoo.stub(new_zoo.id)
205
- return
206
223
 
207
224
  new_animal = Animal.new new_zoo, {:kind => "foo", :age => 42}
208
225
  new_animal.save
209
226
 
210
- assert stubbed.stub, "Zoo should be a stub, so not loaded yet"
227
+ assert stubbed.stubbed?, "Zoo should be a stub, so not loaded yet"
211
228
 
212
229
  animals = stubbed.animals
213
230
 
214
- assert stubbed.stub, "Zoo should still be a stub, so not loaded yet"
231
+ assert stubbed.stubbed?, "Zoo should still be a stub, so not loaded yet"
215
232
  assert_equal 1, animals.length
216
233
 
217
234
  new_name = stubbed.name
218
- assert !stubbed.stub, "Zoo should not be a stub, so loaded now"
235
+ assert !stubbed.stubbed?, "Zoo should not be a stub, so loaded now"
219
236
 
220
237
  assert_equal "Foo", new_name
221
-
222
-
223
238
  end
224
239
 
225
240
  def test_root_scope
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arrest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-05 00:00:00.000000000Z
12
+ date: 2011-12-07 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
16
- requirement: &2154189380 !ruby/object:Gem::Requirement
16
+ requirement: &2154088800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2154189380
24
+ version_requirements: *2154088800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: faraday
27
- requirement: &2154188840 !ruby/object:Gem::Requirement
27
+ requirement: &2154087020 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.7.5
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2154188840
35
+ version_requirements: *2154087020
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &2154188080 !ruby/object:Gem::Requirement
38
+ requirement: &2154085760 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.0.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2154188080
46
+ version_requirements: *2154085760
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &2154187220 !ruby/object:Gem::Requirement
49
+ requirement: &2154084940 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2154187220
57
+ version_requirements: *2154084940
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rdoc
60
- requirement: &2154186100 !ruby/object:Gem::Requirement
60
+ requirement: &2154083900 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2154186100
68
+ version_requirements: *2154083900
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &2154185300 !ruby/object:Gem::Requirement
71
+ requirement: &2154082700 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '2'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2154185300
79
+ version_requirements: *2154082700
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rr
82
- requirement: &2154184880 !ruby/object:Gem::Requirement
82
+ requirement: &2154082100 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2154184880
90
+ version_requirements: *2154082100
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: simplecov
93
- requirement: &2154184380 !ruby/object:Gem::Requirement
93
+ requirement: &2154081620 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2154184380
101
+ version_requirements: *2154081620
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rack
104
- requirement: &2154183740 !ruby/object:Gem::Requirement
104
+ requirement: &2154081180 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2154183740
112
+ version_requirements: *2154081180
113
113
  description: Consume a rest API in a AR like fashion
114
114
  email:
115
115
  - axel.tetzlaff@fortytools.com
@@ -141,6 +141,7 @@ files:
141
141
  - spec/arrest_spec.rb
142
142
  - spec/spec_helper.rb
143
143
  - spec/support/models/user.rb
144
+ - test/has_attributed.rb
144
145
  - test/models.rb
145
146
  - test/nested_resource.rb
146
147
  - test/unit.rb
@@ -172,6 +173,7 @@ test_files:
172
173
  - spec/arrest_spec.rb
173
174
  - spec/spec_helper.rb
174
175
  - spec/support/models/user.rb
176
+ - test/has_attributed.rb
175
177
  - test/models.rb
176
178
  - test/nested_resource.rb
177
179
  - test/unit.rb