storage_room 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,6 @@
1
+ === Version 0.3.1
2
+ * Support for ArrayField and JsonField
3
+
1
4
  === Version 0.3.0
2
5
  * Complete refactoring of internals.
3
6
  * Added support for associations
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
@@ -8,7 +8,7 @@ guidebook_collection = StorageRoom::Collection.find('4dda7761b65245fde100005d')
8
8
  category_collection = StorageRoom::Collection.find('4dda7761b65245fde100001a')
9
9
 
10
10
  category = category_collection.entries.resources.first # find the first category
11
- guidebook = guidebook_collection.entry_class.new(:title => 'Bar', :price => 2.23, :category => category)
11
+ guidebook = guidebook_collection.entry_class.new(:title => 'Bar', :price => 2.23, :category => category, :tags => ['tag1', 'tag2'])
12
12
 
13
13
  if guidebook.save # save the guidebook with the associated category
14
14
  puts "Guidebook Entry saved (#{guidebook[:@url]})"
@@ -57,9 +57,9 @@ module StorageRoom
57
57
 
58
58
  self.attributes.each do |name, value|
59
59
  hash[name] = if value.is_a?(::Array)
60
- value.map{|x| x.respond_to?(:to_hash) ? x.to_hash(:nested => true) : x }
60
+ value.map {|x| x.respond_to?(:to_hash) ? call_method_with_optional_parameters(x, :to_hash, :nested => true) : x}
61
61
  elsif value.respond_to?(:to_hash)
62
- value.to_hash(:nested => true)
62
+ call_method_with_optional_parameters(value, :to_hash, :nested => true)
63
63
  elsif value.respond_to?(:as_json)
64
64
  value.as_json(:nested => true)
65
65
  else
@@ -69,7 +69,7 @@ module StorageRoom
69
69
 
70
70
  hash
71
71
  end
72
-
72
+
73
73
  def inspect # :nodoc:
74
74
  body = attributes.map{|k, v| "#{k}: #{attribute_for_inspect(v)}"}.join(', ')
75
75
  "#<#{self.class} #{body}>"
@@ -92,6 +92,17 @@ module StorageRoom
92
92
  end
93
93
 
94
94
  protected
95
+ # Helper to not call to_hash with the wrong number of arguments
96
+ def call_method_with_optional_parameters(object, method_name, parameters)
97
+ if object.respond_to?(method_name)
98
+ if object.method(method_name).arity == -1
99
+ object.send(method_name, parameters)
100
+ else
101
+ object.send(method_name)
102
+ end
103
+ end
104
+ end
105
+
95
106
  # Iterate over the response data and initialize the attributes
96
107
  def initialize_from_response_data # :nodoc:
97
108
  self.class.attribute_options.each do |name, options|
@@ -114,7 +125,7 @@ module StorageRoom
114
125
  if loaded?
115
126
  yield if block_given?
116
127
  else
117
- raise StorageRoom::ResourceNotLoaded
128
+ raise StorageRoom::ResourceNotLoadedError
118
129
  end
119
130
  end
120
131
 
@@ -0,0 +1,6 @@
1
+ module StorageRoom
2
+
3
+ class ArrayField < AtomicField
4
+
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module StorageRoom
2
+
3
+ class JsonField < AtomicField
4
+
5
+ end
6
+ end
@@ -21,15 +21,15 @@ module StorageRoom
21
21
 
22
22
  #
23
23
  def index_path # :nodoc:
24
- raise StorageRoom::AbstractMethod.new
24
+ raise StorageRoom::AbstractMethodError.new
25
25
  end
26
26
 
27
27
  def show_path(id) # :nodoc:
28
- raise StorageRoom::AbstractMethod.new
28
+ raise StorageRoom::AbstractMethodError.new
29
29
  end
30
30
 
31
31
  def json_name # :nodoc:
32
- raise StorageRoom::AbstractMethod.new
32
+ raise StorageRoom::AbstractMethodError.new
33
33
  end
34
34
  end
35
35
 
@@ -110,7 +110,10 @@ module StorageRoom
110
110
 
111
111
  if httparty.response.code == '200' || httparty.response.code == '201'
112
112
  self.set_from_response_data(httparty.parsed_response.first[1])
113
+ @errors = []
113
114
  true
115
+ elsif httparty.response.code == '409' # optimistic locking
116
+ raise OptimisticLockingError.new("The Model has been updated by somebody else")
114
117
  else
115
118
  @errors = httparty.parsed_response['error']['message']
116
119
  false
@@ -15,9 +15,9 @@ module StorageRoom
15
15
  # Handle known server errors
16
16
  def handle_critical_response_errors(httparty) # :nodoc:
17
17
  case httparty.response.code
18
- when '200', '201', '422' then true
18
+ when '200', '201', '409', '422' then true
19
19
  else
20
- raise StorageRoom::RequestFailed.new("Invalid HTTP Response: #{httparty.response.code}")
20
+ raise StorageRoom::RequestFailedError.new("Invalid HTTP Response: #{httparty.response.code}")
21
21
  end
22
22
  end
23
23
 
data/lib/storage_room.rb CHANGED
@@ -10,10 +10,11 @@ require 'storage_room/extensions/const_defined'
10
10
  require 'storage_room/plugins'
11
11
 
12
12
  module StorageRoom
13
- class AbstractMethod < RuntimeError; end
14
- class RequestFailed < RuntimeError; end
15
- class ResourceNotLoaded < RuntimeError; end
16
- class ClassNotFound < RuntimeError; end
13
+ class AbstractMethodError < RuntimeError; end
14
+ class RequestFailedError < RuntimeError; end
15
+ class ResourceNotLoadedError < RuntimeError; end
16
+ class ClassNotFoundError < RuntimeError; end
17
+ class OptimisticLockingError < RuntimeError; end
17
18
 
18
19
  autoload :Plugins, 'storage_room/plugins'
19
20
  autoload :Accessors, 'storage_room/accessors'
@@ -38,7 +39,9 @@ module StorageRoom
38
39
  autoload :FloatField, 'storage_room/embeddeds/fields/atomic/float_field'
39
40
  autoload :DateField, 'storage_room/embeddeds/fields/atomic/date_field'
40
41
  autoload :BooleanField, 'storage_room/embeddeds/fields/atomic/boolean_field'
41
-
42
+ autoload :ArrayField, 'storage_room/embeddeds/fields/atomic/array_field'
43
+ autoload :JsonField, 'storage_room/embeddeds/fields/atomic/json_field'
44
+
42
45
  autoload :CompoundField, 'storage_room/embeddeds/fields/compound_field'
43
46
  autoload :AttachmentField, 'storage_room/embeddeds/fields/compound/attachment_field'
44
47
  autoload :FileField, 'storage_room/embeddeds/fields/compound/file_field'
@@ -112,13 +115,18 @@ module StorageRoom
112
115
  # Return a Ruby class for a StorageRoom type
113
116
  def class_for_name(name)
114
117
  name_with_mapping = entry_class_for_name(name)
118
+
119
+ begin
120
+ if StorageRoom.is_constant_defined?(name)
121
+ return "StorageRoom::#{name}".constantize
122
+ end
123
+ rescue NameError # could contain spaces etc.
124
+ end
115
125
 
116
- if StorageRoom.is_constant_defined?(name)
117
- "StorageRoom::#{name}".constantize
118
- elsif Object.is_constant_defined?(name_with_mapping)
126
+ if Object.is_constant_defined?(name_with_mapping)
119
127
  name_with_mapping.constantize
120
128
  else
121
- raise ClassNotFound.new("Unknown class: #{name}")
129
+ raise ClassNotFoundError.new("Unknown class: #{name}")
122
130
  end
123
131
  end
124
132
 
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe StorageRoom::ArrayField do
4
+
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe StorageRoom::JsonField do
4
+
5
+ end
@@ -29,7 +29,7 @@ describe StorageRoom::Model do
29
29
  it "should raise" do
30
30
  lambda {
31
31
  StorageRoom::Model.show_path(1)
32
- }.should raise_error(StorageRoom::AbstractMethod)
32
+ }.should raise_error(StorageRoom::AbstractMethodError)
33
33
  end
34
34
  end
35
35
 
@@ -37,7 +37,7 @@ describe StorageRoom::Model do
37
37
  it "should raise" do
38
38
  lambda {
39
39
  StorageRoom::Model.index_path
40
- }.should raise_error(StorageRoom::AbstractMethod)
40
+ }.should raise_error(StorageRoom::AbstractMethodError)
41
41
  end
42
42
  end
43
43
 
@@ -45,7 +45,7 @@ describe StorageRoom::Model do
45
45
  it "should raise" do
46
46
  lambda {
47
47
  StorageRoom::Model.json_name
48
- }.should raise_error(StorageRoom::AbstractMethod)
48
+ }.should raise_error(StorageRoom::AbstractMethodError)
49
49
  end
50
50
  end
51
51
 
@@ -41,7 +41,7 @@ describe StorageRoom::Collection do
41
41
  end
42
42
 
43
43
  it "should have an error if not loaded" do
44
- lambda { @collection2.entries }.should raise_error(StorageRoom::ResourceNotLoaded)
44
+ lambda { @collection2.entries }.should raise_error(StorageRoom::ResourceNotLoadedError)
45
45
  end
46
46
  end
47
47
 
@@ -51,7 +51,7 @@ describe StorageRoom::Collection do
51
51
  end
52
52
 
53
53
  it "should have an error if not loaded" do
54
- lambda { @collection2.entry_class_name }.should raise_error(StorageRoom::ResourceNotLoaded)
54
+ lambda { @collection2.entry_class_name }.should raise_error(StorageRoom::ResourceNotLoadedError)
55
55
  end
56
56
  end
57
57
 
@@ -61,7 +61,7 @@ describe StorageRoom::Collection do
61
61
  end
62
62
 
63
63
  it "should have an error if not loaded" do
64
- lambda { @collection2.entry_class }.should raise_error(StorageRoom::ResourceNotLoaded)
64
+ lambda { @collection2.entry_class }.should raise_error(StorageRoom::ResourceNotLoadedError)
65
65
  end
66
66
  end
67
67
 
@@ -75,7 +75,7 @@ describe StorageRoom::Collection do
75
75
  end
76
76
 
77
77
  it "should have an error if not loaded" do
78
- lambda { @collection2.field('name') }.should raise_error(StorageRoom::ResourceNotLoaded)
78
+ lambda { @collection2.field('name') }.should raise_error(StorageRoom::ResourceNotLoadedError)
79
79
  end
80
80
  end
81
81
  end
@@ -44,7 +44,7 @@ describe StorageRoom::Resource do
44
44
 
45
45
  lambda {
46
46
  StorageRoom::Array.load('/collections')
47
- }.should raise_error(StorageRoom::RequestFailed)
47
+ }.should raise_error(StorageRoom::RequestFailedError)
48
48
 
49
49
  end
50
50
  end
@@ -73,7 +73,7 @@ describe StorageRoom::Resource do
73
73
  it "should raise error" do
74
74
  lambda {
75
75
  StorageRoom::Resource.handle_critical_response_errors(mock_httparty(500))
76
- }.should raise_error(StorageRoom::RequestFailed)
76
+ }.should raise_error(StorageRoom::RequestFailedError)
77
77
  end
78
78
  end
79
79
 
@@ -127,7 +127,7 @@ describe StorageRoom do
127
127
  it "should raise an error for unknown classes" do
128
128
  lambda {
129
129
  StorageRoom.class_for_name("Unknown")
130
- }.should raise_error(StorageRoom::ClassNotFound)
130
+ }.should raise_error(StorageRoom::ClassNotFoundError)
131
131
 
132
132
  end
133
133
  end
data/storage_room.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{storage_room}
8
- s.version = "0.3.0"
8
+ s.version = "0.3.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Sascha Konietzke"]
12
- s.date = %q{2011-06-20}
12
+ s.date = %q{2011-06-22}
13
13
  s.description = %q{StorageRoom is a CMS system for Mobile Applications (iPhone, Android, BlackBerry, ...). This library gives you an ActiveModel-like interface to your data.}
14
14
  s.email = %q{sascha@thriventures.com}
15
15
  s.extra_rdoc_files = [
@@ -41,10 +41,12 @@ Gem::Specification.new do |s|
41
41
  "lib/storage_room/embeddeds/fields/association_field.rb",
42
42
  "lib/storage_room/embeddeds/fields/associations/many_association_field.rb",
43
43
  "lib/storage_room/embeddeds/fields/associations/one_association_field.rb",
44
+ "lib/storage_room/embeddeds/fields/atomic/array_field.rb",
44
45
  "lib/storage_room/embeddeds/fields/atomic/boolean_field.rb",
45
46
  "lib/storage_room/embeddeds/fields/atomic/date_field.rb",
46
47
  "lib/storage_room/embeddeds/fields/atomic/float_field.rb",
47
48
  "lib/storage_room/embeddeds/fields/atomic/integer_field.rb",
49
+ "lib/storage_room/embeddeds/fields/atomic/json_field.rb",
48
50
  "lib/storage_room/embeddeds/fields/atomic/string_field.rb",
49
51
  "lib/storage_room/embeddeds/fields/atomic/time_field.rb",
50
52
  "lib/storage_room/embeddeds/fields/atomic_field.rb",
@@ -75,10 +77,12 @@ Gem::Specification.new do |s|
75
77
  "spec/storage_room/embeddeds/fields/association_field_spec.rb",
76
78
  "spec/storage_room/embeddeds/fields/associations/many_association_field_spec.rb",
77
79
  "spec/storage_room/embeddeds/fields/associations/one_association_field_spec.rb",
80
+ "spec/storage_room/embeddeds/fields/atomic/array_field_spec.rb",
78
81
  "spec/storage_room/embeddeds/fields/atomic/boolean_field_spec.rb",
79
82
  "spec/storage_room/embeddeds/fields/atomic/date_field_spec.rb",
80
83
  "spec/storage_room/embeddeds/fields/atomic/float_field_spec.rb",
81
84
  "spec/storage_room/embeddeds/fields/atomic/integer_field_spec.rb",
85
+ "spec/storage_room/embeddeds/fields/atomic/json_field_spec.rb",
82
86
  "spec/storage_room/embeddeds/fields/atomic/string_field_spec.rb",
83
87
  "spec/storage_room/embeddeds/fields/atomic/time_field_spec.rb",
84
88
  "spec/storage_room/embeddeds/fields/atomic_field_spec.rb",
@@ -1,3 +1,3 @@
1
- task :console2 do
1
+ task :development do
2
2
  sh("irb -I lib -r console.rb")
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 0
9
- version: 0.3.0
8
+ - 1
9
+ version: 0.3.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Sascha Konietzke
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-06-20 00:00:00 -03:00
17
+ date: 2011-06-22 00:00:00 -03:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -109,10 +109,12 @@ files:
109
109
  - lib/storage_room/embeddeds/fields/association_field.rb
110
110
  - lib/storage_room/embeddeds/fields/associations/many_association_field.rb
111
111
  - lib/storage_room/embeddeds/fields/associations/one_association_field.rb
112
+ - lib/storage_room/embeddeds/fields/atomic/array_field.rb
112
113
  - lib/storage_room/embeddeds/fields/atomic/boolean_field.rb
113
114
  - lib/storage_room/embeddeds/fields/atomic/date_field.rb
114
115
  - lib/storage_room/embeddeds/fields/atomic/float_field.rb
115
116
  - lib/storage_room/embeddeds/fields/atomic/integer_field.rb
117
+ - lib/storage_room/embeddeds/fields/atomic/json_field.rb
116
118
  - lib/storage_room/embeddeds/fields/atomic/string_field.rb
117
119
  - lib/storage_room/embeddeds/fields/atomic/time_field.rb
118
120
  - lib/storage_room/embeddeds/fields/atomic_field.rb
@@ -143,10 +145,12 @@ files:
143
145
  - spec/storage_room/embeddeds/fields/association_field_spec.rb
144
146
  - spec/storage_room/embeddeds/fields/associations/many_association_field_spec.rb
145
147
  - spec/storage_room/embeddeds/fields/associations/one_association_field_spec.rb
148
+ - spec/storage_room/embeddeds/fields/atomic/array_field_spec.rb
146
149
  - spec/storage_room/embeddeds/fields/atomic/boolean_field_spec.rb
147
150
  - spec/storage_room/embeddeds/fields/atomic/date_field_spec.rb
148
151
  - spec/storage_room/embeddeds/fields/atomic/float_field_spec.rb
149
152
  - spec/storage_room/embeddeds/fields/atomic/integer_field_spec.rb
153
+ - spec/storage_room/embeddeds/fields/atomic/json_field_spec.rb
150
154
  - spec/storage_room/embeddeds/fields/atomic/string_field_spec.rb
151
155
  - spec/storage_room/embeddeds/fields/atomic/time_field_spec.rb
152
156
  - spec/storage_room/embeddeds/fields/atomic_field_spec.rb