storage_room 0.3.0 → 0.3.1

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