storage_room 0.3.1 → 0.3.2

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.2
2
+ * Support for File and Image uploads
3
+
1
4
  === Version 0.3.1
2
5
  * Support for ArrayField and JsonField
3
6
 
data/README.rdoc CHANGED
@@ -8,7 +8,7 @@ This gem provides read and write access to the StorageRoom API (http://storagero
8
8
  * Automatic creation of Entry Classes from a Collection, you don't have to configure anything
9
9
  * Supports lazy-loading of associations (e.g. post.category will fetch a category transparently if it has not yet been loaded)
10
10
  * Supports caching through an identity map, so that Resources don't have to be loaded multiple times
11
-
11
+ * Easy file uploads and removals
12
12
 
13
13
  == Installation
14
14
 
data/Rakefile CHANGED
@@ -15,6 +15,7 @@ begin
15
15
 
16
16
  gem.add_dependency 'httparty', '>= 0.6.1'
17
17
  gem.add_dependency 'activesupport', '>= 3.0.0'
18
+ gem.add_dependency 'mime-types'
18
19
 
19
20
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
20
21
  end
data/TODO CHANGED
@@ -1,10 +1,9 @@
1
1
 
2
2
 
3
+
3
4
  == Version X
4
5
 
5
6
  - have a gemfile?
6
7
  - make on/many only accept objects of correct class?
7
8
  - executable/cli
8
- - file uploads/removals
9
- - get files via api
10
- - look at arguments with identity map
9
+ - arguments with identity map
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.3.2
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby -rubygems
2
+
3
+ require File.dirname(__FILE__) + '/authentication'
4
+
5
+ path = ::File.expand_path(File.dirname(__FILE__) + '/../spec/fixtures/image.png')
6
+ collection = StorageRoom::Collection.find('4e034b8db65245b72600002b')
7
+
8
+ # Upload Image or File
9
+ entry = collection.entry_class.new(:name => "StorageRoom Logo", :image => StorageRoom::Image.new_with_filename(path))
10
+
11
+ if entry.save
12
+ puts "Entry saved (#{entry[:@url]})"
13
+ puts "URL of the uploaded image is #{entry.image.url}"
14
+ puts "URL of the automatically generated thumbnail is #{entry.image.url(:thumbnail)}" # Multiple Image Versions can be specified in the interface
15
+ else
16
+ puts "Entry could not be saved: #{entry.errors.join(', ')}"
17
+ end
18
+
19
+ # Remove Image or File
20
+
21
+ entry.image.remove = true
22
+
23
+ if entry.save
24
+ puts "The Image of the Entry has been removed"
25
+ else
26
+ puts "The Image of the Entry could not be removed: #{entry.errors.join(', ')}"
27
+ end
@@ -1,6 +1,6 @@
1
1
  module StorageRoom
2
2
 
3
3
  class ImageField < CompoundField
4
-
4
+ many :versions
5
5
  end
6
6
  end
@@ -1,6 +1,28 @@
1
+
1
2
  module StorageRoom
2
3
  # Any file
3
4
  class File < Embedded
5
+ key :filename
6
+ key :content_type
7
+ key :data
8
+ key :remove
4
9
 
10
+ class << self
11
+ # Create a new File and set attributes from local file
12
+ def new_with_filename(path)
13
+ new.tap{|f| f.set_with_filename(path)}
14
+ end
15
+ end
16
+
17
+ # Sets the filename, content_type and data attributes from a local filename so that a File can be uploaded through the API
18
+ def set_with_filename(path)
19
+ return if path.blank?
20
+
21
+ self.filename = ::File.basename(path)
22
+ self.content_type = ::MIME::Types.type_for(path).first.content_type
23
+ self.data = ::Base64.encode64(::File.read(path))
24
+ end
25
+
26
+
5
27
  end
6
28
  end
@@ -1,6 +1,28 @@
1
1
  module StorageRoom
2
2
  # An Image with optional thumbnails
3
- class Image < Embedded
3
+ class Image < File
4
+ # Returns all valid ImageVersion identifiers for this Image
5
+ def version_identifiers
6
+ self[:@versions].keys
7
+ end
8
+
9
+ # Returns the URL of an Image or the URL of a version if a string or symbol is passed
10
+ def url(name = nil)
11
+ if name
12
+ if version_identifiers.include?(name.to_s)
13
+ self[:@versions][name.to_s][:@url]
14
+ else
15
+ raise "Invalid Image Version identifier: '#{name}' (must be #{version_identifiers.join(', ')})"
16
+ end
17
+ else
18
+ self[:@url]
19
+ end
20
+ end
21
+
22
+ # Are versions of the Image still being processed on the server?
23
+ def processing?
24
+ self[:@processing]
25
+ end
4
26
 
5
27
  end
6
28
  end
@@ -0,0 +1,12 @@
1
+ module StorageRoom
2
+ # Part of an ImageField
3
+ class ImageVersion < Embedded
4
+ key :identifier
5
+ key :format
6
+ key :resize_mode
7
+ key :width
8
+ key :height
9
+ key :scale
10
+
11
+ end
12
+ end
data/lib/storage_room.rb CHANGED
@@ -4,6 +4,8 @@ $:.unshift(File.dirname(__FILE__)) unless
4
4
  begin; require 'rubygems'; rescue LoadError; end
5
5
 
6
6
  require 'httparty'
7
+ require 'mime/types'
8
+ require 'base64'
7
9
  require 'active_support/all'
8
10
  require 'storage_room/extensions/const_defined'
9
11
 
@@ -55,6 +57,7 @@ module StorageRoom
55
57
  autoload :File, 'storage_room/embeddeds/file'
56
58
  autoload :Image, 'storage_room/embeddeds/image'
57
59
  autoload :Location, 'storage_room/embeddeds/location'
60
+ autoload :ImageVersion, 'storage_room/embeddeds/image_version'
58
61
 
59
62
 
60
63
  class << self
@@ -117,8 +120,8 @@ module StorageRoom
117
120
  name_with_mapping = entry_class_for_name(name)
118
121
 
119
122
  begin
120
- if StorageRoom.is_constant_defined?(name)
121
- return "StorageRoom::#{name}".constantize
123
+ if StorageRoom.is_constant_defined?(name_with_mapping)
124
+ return "StorageRoom::#{name_with_mapping}".constantize
122
125
  end
123
126
  rescue NameError # could contain spaces etc.
124
127
  end
Binary file
@@ -1,5 +1,44 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe StorageRoom::File do
4
-
4
+ before(:each) do
5
+ @file = StorageRoom::File.new
6
+ @name = ::File.expand_path(File.dirname(__FILE__) + '/../../fixtures/image.png')
7
+ end
8
+
9
+ context "Class Methods" do
10
+ describe "#new_with_filename" do
11
+ it "return a new file object" do
12
+ file = StorageRoom::File.new_with_filename(@name)
13
+ file.should be_an_instance_of(StorageRoom::File)
14
+ file.content_type.should == 'image/png'
15
+ file.filename.should == 'image.png'
16
+ file.data.should == ::Base64.encode64(::File.read(@name))
17
+ end
18
+ end
19
+ end
20
+
21
+ context "Methods" do
22
+ describe "#set_with_filename" do
23
+ it "should set with filename" do
24
+ @file.set_with_filename(@name)
25
+
26
+ @file.content_type.should == 'image/png'
27
+ @file.filename.should == 'image.png'
28
+ @file.data.should == ::Base64.encode64(::File.read(@name))
29
+ end
30
+
31
+ describe "#as_json" do
32
+ it "should return hash" do
33
+ @file.set_with_filename(@name)
34
+
35
+ hash = @file.as_json.with_indifferent_access
36
+ hash[:content_type].should == @file.content_type
37
+ hash[:filename].should == @file.filename
38
+ hash[:data].should == @file.data
39
+ end
40
+ end
41
+
42
+ end
43
+ end
5
44
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe StorageRoom::Image do
4
+ before(:each) do
5
+ @image = StorageRoom::Image.new
6
+ @image.response_data = {
7
+ '@type' => 'Image',
8
+ '@url' => 'URL',
9
+ '@processing' => false,
10
+ '@versions' => {
11
+ 'thumbnail' => {
12
+ '@url' => 'THUMBNAIL_URL'
13
+ }
14
+ }
15
+ }
16
+ end
17
+
18
+ context "Methods" do
19
+ describe "#image_versions" do
20
+ it "should return array" do
21
+ @image.version_identifiers.should == ['thumbnail']
22
+ end
23
+ end
24
+
25
+ describe "#url" do
26
+ it "should return URL for the image" do
27
+ @image.url.should == 'URL'
28
+ end
29
+
30
+ it "should return URL for a version" do
31
+ @image.url(:thumbnail).should == 'THUMBNAIL_URL'
32
+ end
33
+
34
+ it "should raise error on invalid version" do
35
+ lambda {
36
+ @image.url(:asdf)
37
+ }.should raise_error
38
+ end
39
+ end
40
+
41
+ describe "#processing?" do
42
+ it "should return true" do
43
+ @image.response_data['@processing'] = true
44
+ @image.should be_processing
45
+ end
46
+
47
+ it "should return false" do
48
+ @image.response_data['@processing'] = false
49
+ @image.should_not be_processing
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe StorageRoom::ImageVersion do
4
+ before(:each) do
5
+ @image_version = StorageRoom::ImageVersion.new(:identifier => 'thumb', :format => 'png', :resize_mode => 'fit', :width => 100, :height => 200)
6
+ end
7
+
8
+ context "Configuration" do
9
+ describe "#keys" do
10
+ it "should have keys" do
11
+ @image_version.identifier.should == 'thumb'
12
+ @image_version.format.should == 'png'
13
+ @image_version.resize_mode.should == 'fit'
14
+ @image_version.width.should == 100
15
+ @image_version.height.should == 200
16
+ end
17
+ end
18
+ end
19
+ 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.1"
8
+ s.version = "0.3.2"
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-22}
12
+ s.date = %q{2011-07-04}
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 = [
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
32
32
  "examples/import_csv.rb",
33
33
  "examples/search_entries.rb",
34
34
  "examples/update_entry.rb",
35
+ "examples/upload_remove_image.rb",
35
36
  "lib/console.rb",
36
37
  "lib/storage_room.rb",
37
38
  "lib/storage_room/accessors.rb",
@@ -57,6 +58,7 @@ Gem::Specification.new do |s|
57
58
  "lib/storage_room/embeddeds/fields/compound_field.rb",
58
59
  "lib/storage_room/embeddeds/file.rb",
59
60
  "lib/storage_room/embeddeds/image.rb",
61
+ "lib/storage_room/embeddeds/image_version.rb",
60
62
  "lib/storage_room/embeddeds/location.rb",
61
63
  "lib/storage_room/extensions/const_defined.rb",
62
64
  "lib/storage_room/identity_map.rb",
@@ -68,6 +70,7 @@ Gem::Specification.new do |s|
68
70
  "lib/storage_room/resource.rb",
69
71
  "spec/fixtures/collection.json",
70
72
  "spec/fixtures/collections.json",
73
+ "spec/fixtures/image.png",
71
74
  "spec/fixtures/validation_error.json",
72
75
  "spec/spec_helper.rb",
73
76
  "spec/storage_room/accessors_spec.rb",
@@ -92,6 +95,8 @@ Gem::Specification.new do |s|
92
95
  "spec/storage_room/embeddeds/fields/compound/location_field_spec.rb",
93
96
  "spec/storage_room/embeddeds/fields/compound_field_spec.rb",
94
97
  "spec/storage_room/embeddeds/file_spec.rb",
98
+ "spec/storage_room/embeddeds/image_spec.rb",
99
+ "spec/storage_room/embeddeds/image_version_spec.rb",
95
100
  "spec/storage_room/embeddeds/location_spec.rb",
96
101
  "spec/storage_room/identity_map_spec.rb",
97
102
  "spec/storage_room/model_spec.rb",
@@ -117,17 +122,20 @@ Gem::Specification.new do |s|
117
122
  s.add_development_dependency(%q<webmock>, [">= 0"])
118
123
  s.add_runtime_dependency(%q<httparty>, [">= 0.6.1"])
119
124
  s.add_runtime_dependency(%q<activesupport>, [">= 3.0.0"])
125
+ s.add_runtime_dependency(%q<mime-types>, [">= 0"])
120
126
  else
121
127
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
122
128
  s.add_dependency(%q<webmock>, [">= 0"])
123
129
  s.add_dependency(%q<httparty>, [">= 0.6.1"])
124
130
  s.add_dependency(%q<activesupport>, [">= 3.0.0"])
131
+ s.add_dependency(%q<mime-types>, [">= 0"])
125
132
  end
126
133
  else
127
134
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
128
135
  s.add_dependency(%q<webmock>, [">= 0"])
129
136
  s.add_dependency(%q<httparty>, [">= 0.6.1"])
130
137
  s.add_dependency(%q<activesupport>, [">= 3.0.0"])
138
+ s.add_dependency(%q<mime-types>, [">= 0"])
131
139
  end
132
140
  end
133
141
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 1
9
- version: 0.3.1
8
+ - 2
9
+ version: 0.3.2
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-22 00:00:00 -03:00
17
+ date: 2011-07-04 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -75,6 +75,19 @@ dependencies:
75
75
  version: 3.0.0
76
76
  type: :runtime
77
77
  version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: mime-types
80
+ prerelease: false
81
+ requirement: &id005 !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :runtime
90
+ version_requirements: *id005
78
91
  description: StorageRoom is a CMS system for Mobile Applications (iPhone, Android, BlackBerry, ...). This library gives you an ActiveModel-like interface to your data.
79
92
  email: sascha@thriventures.com
80
93
  executables: []
@@ -100,6 +113,7 @@ files:
100
113
  - examples/import_csv.rb
101
114
  - examples/search_entries.rb
102
115
  - examples/update_entry.rb
116
+ - examples/upload_remove_image.rb
103
117
  - lib/console.rb
104
118
  - lib/storage_room.rb
105
119
  - lib/storage_room/accessors.rb
@@ -125,6 +139,7 @@ files:
125
139
  - lib/storage_room/embeddeds/fields/compound_field.rb
126
140
  - lib/storage_room/embeddeds/file.rb
127
141
  - lib/storage_room/embeddeds/image.rb
142
+ - lib/storage_room/embeddeds/image_version.rb
128
143
  - lib/storage_room/embeddeds/location.rb
129
144
  - lib/storage_room/extensions/const_defined.rb
130
145
  - lib/storage_room/identity_map.rb
@@ -136,6 +151,7 @@ files:
136
151
  - lib/storage_room/resource.rb
137
152
  - spec/fixtures/collection.json
138
153
  - spec/fixtures/collections.json
154
+ - spec/fixtures/image.png
139
155
  - spec/fixtures/validation_error.json
140
156
  - spec/spec_helper.rb
141
157
  - spec/storage_room/accessors_spec.rb
@@ -160,6 +176,8 @@ files:
160
176
  - spec/storage_room/embeddeds/fields/compound/location_field_spec.rb
161
177
  - spec/storage_room/embeddeds/fields/compound_field_spec.rb
162
178
  - spec/storage_room/embeddeds/file_spec.rb
179
+ - spec/storage_room/embeddeds/image_spec.rb
180
+ - spec/storage_room/embeddeds/image_version_spec.rb
163
181
  - spec/storage_room/embeddeds/location_spec.rb
164
182
  - spec/storage_room/identity_map_spec.rb
165
183
  - spec/storage_room/model_spec.rb