arrest 0.0.7 → 0.0.8

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/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