carrierwave-riak 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format nested
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source :rubygems
2
+ gem "rake"
3
+ gem 'riak-client'
4
+ gem 'carrierwave'
5
+
6
+ group :test do
7
+ gem 'rails', '3.0.0'
8
+ gem 'rspec','~> 2.6.0'
9
+ end
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # CarrierWave for [Riak](http://wiki.basho.com/Riak.html)
2
+
3
+ This gem adds storage support for [Riak](http://wiki.basho.com/Riak.html) to [CarrierWave](https://github.com/jnicklas/carrierwave/)
4
+
5
+ This module should work for basic uploads, but hasn't been tested with all features of carrierrwave and is very new. The code was initially based
6
+ on [carrierwave-upyun](https://github.com/nowa/carrierwave-upyun) but also uses ideas taken from the built in Fog storage provider.
7
+
8
+ ## Installation
9
+
10
+ gem install carrierwave-riak
11
+
12
+ ## Or using Bundler, in `Gemfile`
13
+
14
+ gem 'riak-client'
15
+ gem 'carrierwave-riak', :require => "carrierwave/riak"
16
+
17
+ ## Configuration
18
+
19
+ You'll need to configure the Riak client in config/initializes/carrierwave.rb
20
+
21
+ ```ruby
22
+ CarrierWave.configure do |config|
23
+ config.storage = :riak
24
+ config.riak_host = 'localhost'
25
+ config.riak_port = 8098
26
+ end
27
+ ```
28
+
29
+ ## Usage example
30
+
31
+ Note that for your uploader, your should extend the CarrierWave::Uploader::Riak class.
32
+
33
+ ```ruby
34
+ class DocumentUploader < CarrierWave::Uploader::Riak
35
+
36
+ # If key method is not defined, Riak generated keys will be used and returned as the identifier
37
+
38
+ def key
39
+ original_filename
40
+ end
41
+
42
+ def bucket
43
+ "my_bucket"
44
+ end
45
+ end
46
+ ```
47
+
48
+ ### Using Riak generated keys ###
49
+
50
+ Because the orm record is saved before the storage object is, the orm record needs to be updated after
51
+ saving to storage if a Riak generated key is to be used as the identifier. The CarrierWave::Uploader::Riak
52
+ class defines an :after callback to facilitate this. This only works for ActiveRecord and is likely pretty
53
+ hacky. Maybe someone can suggest a better way to deal with this.
54
+
55
+ ## TODO ###
56
+
57
+ - Write specs. Bad programmer.
58
+
59
+ ## Contributing ##
60
+
61
+ If this is helpful to you, but isn't quite working please send me pull requests.
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "carrierwave-riak"
6
+ s.version = "0.1.0"
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Kevin Motschiedler"]
9
+ s.email = ["kdmotschiedler@gmail.com"]
10
+ s.homepage = "https://github.com/motske/carrierwave-riak"
11
+ s.summary = %q{Riak Storage support for CarrierWave}
12
+ s.description = %q{Riak Storage support for CarrierWave}
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.require_paths = ["lib"]
17
+
18
+ s.add_development_dependency "carrierwave"
19
+ s.add_development_dependency "riak-client", ["~> 1.0.0"]
20
+ s.add_development_dependency "rails", ["~> 3.0.5"]
21
+ s.add_development_dependency "rspec", ["~> 2.6"]
22
+ s.add_development_dependency "rake", ["~> 0.9"]
23
+ end
@@ -0,0 +1,8 @@
1
+ require "carrierwave/storage/riak"
2
+ require "carrierwave/riak/configuration"
3
+ CarrierWave.configure do |config|
4
+ config.storage_engines.merge!({:riak => "CarrierWave::Storage::Riak"})
5
+ end
6
+
7
+ CarrierWave::Uploader::Base.send(:include, CarrierWave::Riak::Configuration)
8
+ require "carrierwave/uploader/riak"
@@ -0,0 +1,35 @@
1
+ module CarrierWave
2
+ module Riak
3
+ module Configuration
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ add_config :riak_bucket
7
+ add_config :riak_host
8
+ add_config :riak_port
9
+ end
10
+ end
11
+
12
+ module ClassMethods
13
+ def add_config(name)
14
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
15
+ def self.#{name}(value=nil)
16
+ @#{name} = value if value
17
+ return @#{name} if self.object_id == #{self.object_id} || defined?(@#{name})
18
+ name = superclass.#{name}
19
+ return nil if name.nil? && !instance_variable_defined?("@#{name}")
20
+ @#{name} = name && !name.is_a?(Module) && !name.is_a?(Symbol) && !name.is_a?(Numeric) && !name.is_a?(TrueClass) && !name.is_a?(FalseClass) ? name.dup : name
21
+ end
22
+
23
+ def self.#{name}=(value)
24
+ @#{name} = value
25
+ end
26
+
27
+ def #{name}
28
+ value = self.class.#{name}
29
+ value.instance_of?(Proc) ? value.call : value
30
+ end
31
+ RUBY
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,228 @@
1
+ # encoding: utf-8
2
+ require 'carrierwave'
3
+ require 'riak'
4
+
5
+ module CarrierWave
6
+ module Storage
7
+
8
+ ##
9
+ #
10
+ # CarrierWave.configure do |config|
11
+ # config.riak_host = "http://localhost
12
+ # config.riak_port = 8098
13
+ # end
14
+ #
15
+ #
16
+ class Riak < Abstract
17
+
18
+ class Connection
19
+ def initialize(options={})
20
+ @riak_bucket = options[:riak_bucket]
21
+ @host = options[:riak_host]
22
+ @port = options[:riak_port]
23
+ @client = ::Riak::Client.new(:host => @host, :http_port => @port)
24
+ end
25
+
26
+ def store(bucket, key, payload, headers = {})
27
+ bucket = @client.bucket(bucket)
28
+ robject = ::Riak::RObject.new(bucket, key)
29
+ robject.content_type = headers[:content_type]
30
+ robject.raw_data = payload
31
+ robject.store
32
+ end
33
+
34
+ def get(bucket, key)
35
+ bucket = @client.bucket(bucket)
36
+ bucket.get(key)
37
+ end
38
+
39
+ def delete(bucket, key)
40
+ bucket = @client.bucket(bucket)
41
+ bucket.delete(key)
42
+ end
43
+
44
+ def post(path, payload, headers = {})
45
+ @http["#{escaped(path)}"].post(payload, headers)
46
+ end
47
+
48
+ def escaped(path)
49
+ CGI.escape(path)
50
+ end
51
+ end
52
+
53
+ class File
54
+
55
+ def initialize(uploader, base, bucket, key)
56
+ @uploader = uploader
57
+ @bucket = bucket
58
+ @key = key
59
+ @base = base
60
+ end
61
+
62
+ ##
63
+ # Returns the key of the riak file
64
+ #
65
+ # === Returns
66
+ #
67
+ # [String] A filename
68
+ #
69
+ def key
70
+ @key
71
+ end
72
+
73
+ ##
74
+ # Lookup value for file content-type header
75
+ #
76
+ # === Returns
77
+ #
78
+ # [String] value of content-type
79
+ #
80
+ def content_type
81
+ @content_type || file.content_type
82
+ end
83
+
84
+ ##
85
+ # Set non-default content-type header (default is file.content_type)
86
+ #
87
+ # === Returns
88
+ #
89
+ # [String] returns new content type value
90
+ #
91
+ def content_type=(new_content_type)
92
+ @content_type = new_content_type
93
+ end
94
+
95
+ ##
96
+ # Return riak meta data
97
+ #
98
+ # === Returns
99
+ #
100
+ # [Haash] A hash of X-Riak-Meta-* headers
101
+ #
102
+ def meta
103
+ file.meta
104
+ end
105
+
106
+ ##
107
+ # Return size of file body
108
+ #
109
+ # === Returns
110
+ #
111
+ # [Integer] size of file body
112
+ #
113
+ def size
114
+ file.raw_data.length
115
+ end
116
+
117
+ ##
118
+ # Reads the contents of the file from Riak
119
+ #
120
+ # === Returns
121
+ #
122
+ # [String] contents of the file
123
+ #
124
+ def read
125
+ file.raw_data
126
+ end
127
+
128
+ ##
129
+ # Remove the file from Riak
130
+ #
131
+ def delete
132
+ begin
133
+ riak_client.delete(@bucket, @key)
134
+ true
135
+ rescue Exception => e
136
+ # If the file's not there, don't panic
137
+ nil
138
+ end
139
+ end
140
+
141
+ ##
142
+ # Writes the supplied data into Riak
143
+ #
144
+ # === Returns
145
+ #
146
+ # boolean
147
+ #
148
+ def store(file)
149
+ @file = riak_client.store(@bucket, @key, file.read, {:content_type => file.content_type})
150
+ @key = @file.key
151
+ @uploader.key = @key
152
+ true
153
+ end
154
+
155
+ private
156
+
157
+ def headers
158
+ @headers ||= { }
159
+ end
160
+
161
+ def connection
162
+ @base.connection
163
+ end
164
+
165
+ ##
166
+ # lookup file
167
+ #
168
+ # === Returns
169
+ #
170
+ # [Riak::RObject] file data from remote service
171
+ #
172
+ def file
173
+ @file ||= riak_client.get(@bucket, @key)
174
+ end
175
+
176
+ def riak_client
177
+ if @riak_client
178
+ @riak_client
179
+ else
180
+ config = {
181
+ :riak_bucket => @uploader.riak_bucket,
182
+ :riak_host => @uploader.riak_host,
183
+ :riak_port => @uploader.riak_port
184
+ }
185
+ @riak_client ||= CarrierWave::Storage::Riak::Connection.new(config)
186
+ end
187
+ end
188
+
189
+ end
190
+
191
+ ##
192
+ # Store the file on Riak
193
+ #
194
+ # === Parameters
195
+ #
196
+ # [file (CarrierWave::SanitizedFile)] the file to store
197
+ #
198
+ # === Returns
199
+ #
200
+ # [CarrierWave::Storage::Riak::File] the stored file
201
+ #
202
+ def store!(file)
203
+ f = CarrierWave::Storage::Riak::File.new(uploader, self, uploader.bucket, uploader.key)
204
+ f.store(file)
205
+ f
206
+ end
207
+
208
+ # Do something to retrieve the file
209
+ #
210
+ # @param [String] identifier uniquely identifies the file
211
+ #
212
+ # [identifier (String)] uniquely identifies the file
213
+ #
214
+ # === Returns
215
+ #
216
+ # [CarrierWave::Storage::Riak::File] the stored file
217
+ #
218
+ def retrieve!(key)
219
+ CarrierWave::Storage::Riak::File.new(uploader, self, uploader.bucket, key)
220
+ end
221
+
222
+ def identifier
223
+ uploader.key
224
+ end
225
+
226
+ end # CloudFiles
227
+ end # Storage
228
+ end # CarrierWave
@@ -0,0 +1,23 @@
1
+ require 'carrierwave'
2
+ require 'riak'
3
+
4
+ module CarrierWave
5
+ module Uploader
6
+ class Riak < Base
7
+
8
+ attr_accessor :key
9
+
10
+ storage :riak
11
+
12
+ if defined?(Rails)
13
+ after :store, :updatemodel
14
+
15
+ def updatemodel(file)
16
+ if(model.read_attribute(:"#{self.mounted_as}").nil?)
17
+ model.update_attribute(:"#{self.mounted_as}", self.key)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ require 'rubygems'
2
+ require 'rspec'
3
+ require 'rspec/autorun'
4
+ require 'rails'
5
+ require 'active_record'
6
+ require "carrierwave"
7
+ require 'carrierwave/orm/activerecord'
8
+ require 'carrierwave/processing/mini_magick'
9
+
10
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
11
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
12
+
13
+ require "carrierwave/riak"
14
+
15
+
16
+ module Rails
17
+ class <<self
18
+ def root
19
+ [File.expand_path(__FILE__).split('/')[0..-3].join('/'),"spec"].join("/")
20
+ end
21
+ end
22
+ end
23
+
24
+ ActiveRecord::Migration.verbose = false
25
+
26
+ CarrierWave.configure do |config|
27
+ config.storage = :riak
28
+ config.riak_bucket = "rspec"
29
+ config.riak_host = "localhost"
30
+ end
31
+
32
+ def load_file(fname)
33
+ File.open([Rails.root,fname].join("/"))
34
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: carrierwave-riak
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Kevin Motschiedler
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-03-07 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: carrierwave
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: riak-client
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ hash: 23
43
+ segments:
44
+ - 1
45
+ - 0
46
+ - 0
47
+ version: 1.0.0
48
+ type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rails
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ hash: 13
59
+ segments:
60
+ - 3
61
+ - 0
62
+ - 5
63
+ version: 3.0.5
64
+ type: :development
65
+ version_requirements: *id003
66
+ - !ruby/object:Gem::Dependency
67
+ name: rspec
68
+ prerelease: false
69
+ requirement: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ~>
73
+ - !ruby/object:Gem::Version
74
+ hash: 15
75
+ segments:
76
+ - 2
77
+ - 6
78
+ version: "2.6"
79
+ type: :development
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: rake
83
+ prerelease: false
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ hash: 25
90
+ segments:
91
+ - 0
92
+ - 9
93
+ version: "0.9"
94
+ type: :development
95
+ version_requirements: *id005
96
+ description: Riak Storage support for CarrierWave
97
+ email:
98
+ - kdmotschiedler@gmail.com
99
+ executables: []
100
+
101
+ extensions: []
102
+
103
+ extra_rdoc_files: []
104
+
105
+ files:
106
+ - .rspec
107
+ - Gemfile
108
+ - README.md
109
+ - carrierwave-riak.gemspec
110
+ - lib/carrierwave/riak.rb
111
+ - lib/carrierwave/riak/configuration.rb
112
+ - lib/carrierwave/storage/riak.rb
113
+ - lib/carrierwave/uploader/riak.rb
114
+ - spec/spec_helper.rb
115
+ homepage: https://github.com/motske/carrierwave-riak
116
+ licenses: []
117
+
118
+ post_install_message:
119
+ rdoc_options: []
120
+
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ hash: 3
138
+ segments:
139
+ - 0
140
+ version: "0"
141
+ requirements: []
142
+
143
+ rubyforge_project:
144
+ rubygems_version: 1.8.10
145
+ signing_key:
146
+ specification_version: 3
147
+ summary: Riak Storage support for CarrierWave
148
+ test_files:
149
+ - spec/spec_helper.rb
150
+ has_rdoc: