has_media 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -70,8 +70,13 @@ Configuration take place in config/initializers/has_media.rb
70
70
  # Set custom error messages
71
71
  HasMedia.errors_messages = {:type_error => I18n.t('has_media.errors.type_error')}
72
72
 
73
- # Set the allowed medium types for your application (used if no :only option given)
74
- HasMedia.medium_types = [Image, Video, Audio]
73
+ # Set the allowed medium types (used if no :only option given) for you application
74
+ # Set the allowed mime types for each medium type
75
+ HasMedia.medium_types = {
76
+ "Image" => ["image/jpeg", "image/png"],
77
+ "Video" => ["video/mp4"],
78
+ "Audio" => ["audio/mp3"]
79
+ }
75
80
 
76
81
  # Set the extension of encoded files to use for each medium types (used in file_uri and file_path)
77
82
  HasMedia.encoded_extensions = {
@@ -85,6 +90,53 @@ Configuration take place in config/initializers/has_media.rb
85
90
  require uploader
86
91
  end
87
92
 
93
+ == Encode with resque
94
+
95
+ Just add a callback on media class you want to encode via resque.
96
+
97
+ Example :
98
+
99
+ file : app/models/my_model_with_media.rb
100
+
101
+ class MyModelWithMedia < ActiveRecord::Base
102
+ has_one_medium :avatar, :only => :my_media
103
+ end
104
+
105
+ file : app/models/my_media.rb
106
+
107
+ class MyMedia < Medium
108
+ mount_uploader :file, MyMediaUploader
109
+ after_save :enqueue_encoding
110
+
111
+ def enqueue_encoding
112
+ Resque.enqueue(EncodeMyMedia, File.join(Rails.root, self.original_file_path))
113
+ end
114
+ end
115
+
116
+ file : resque/tasks/encode_my_media.rb
117
+
118
+ class EncodeMyMedia
119
+ @queue = :my_media
120
+ include Magick
121
+
122
+ def self.perform(file)
123
+ img = Image.read(file).first
124
+ img.thumbnail(50, 50).write(file.gsub(/\.[^.]+$/, "") + "_thumb.png")
125
+ end
126
+ end
127
+
128
+ Then you can manage your media like this :
129
+
130
+ @model = MyModelWithMedia.new
131
+ @model.avatar = File.open("my_file.jpg")
132
+ @model.save
133
+ @model.avatar.original_file_uri => "/media/my_media/:id/my_file.jpg"
134
+ @model.avatar.file_uri('thumb') => "/media/my_media/:id/my_file_thumb.jpg"
135
+
136
+ == Example application
137
+
138
+ https://github.com/klacointe/has_media_example
139
+
88
140
  == Testing
89
141
 
90
142
  Factory example using factory_girl :
@@ -100,9 +152,7 @@ Factory example using factory_girl :
100
152
 
101
153
  == Todo
102
154
  - Doc for testing (ActionController::TestUploadedFile is now obsolete in rails 3), add HasMediaTestHelper with stub_temp_file method
103
- - Generator for initializer
104
155
  - Add controller and views examples with overload system (form fields, display, ...)
105
- - Fix problem with migrations generator timestamps
106
156
  - Generator for models and uploaders (Type in Image, Video, Audio, Pdf) : rails generate has_media_model Type Name
107
157
  - Document code
108
158
  - add example app on github
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -1,9 +1,4 @@
1
1
  class Audio < Medium
2
2
  set_table_name 'media'
3
-
4
3
  mount_uploader :file, AudioUploader
5
-
6
- def self.handle_content_type?(content_type)
7
- content_type.starts_with? 'audio/'
8
- end
9
4
  end
@@ -1,9 +1,4 @@
1
1
  class Image < Medium
2
2
  set_table_name 'media'
3
-
4
3
  mount_uploader :file, ImageUploader
5
-
6
- def self.handle_content_type?(content_type)
7
- content_type.starts_with? 'image/'
8
- end
9
4
  end
@@ -1,9 +1,4 @@
1
1
  class Pdf < Medium
2
2
  set_table_name 'media'
3
-
4
3
  mount_uploader :file, PdfUploader
5
-
6
- def self.handle_content_type?(content_type)
7
- content_type.include?('pdf')
8
- end
9
4
  end
@@ -1,9 +1,4 @@
1
1
  class Video < Medium
2
2
  set_table_name 'media'
3
-
4
3
  mount_uploader :file, VideoUploader
5
-
6
- def self.handle_content_type?(content_type)
7
- content_type.starts_with? 'audio/'
8
- end
9
4
  end
data/has_media.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{has_media}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["klacointe", "spk"]
12
- s.date = %q{2010-11-02}
12
+ s.date = %q{2010-11-05}
13
13
  s.description = %q{Media Managment Library for ActiveRecord and Carrierwave}
14
14
  s.email = %q{kevinlacointe@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -9,7 +9,7 @@ module ActiveRecord
9
9
  source_root File.expand_path("../templates", __FILE__)
10
10
 
11
11
  def copy_has_media_migration
12
- migration_template "migration.rb", "db/migrate/has_media"
12
+ migration_template "migration.rb", "db/migrate/create_has_media"
13
13
  end
14
14
 
15
15
  # Implement the required interface for Rails::Generators::Migration.
@@ -1,4 +1,4 @@
1
- class HasMedia < ActiveRecord::Migration
1
+ class CreateHasMedia < ActiveRecord::Migration
2
2
  def self.up
3
3
  create_table :media do |t|
4
4
  t.integer :width
@@ -12,6 +12,7 @@ class HasMedia < ActiveRecord::Migration
12
12
  t.string :type # required
13
13
  t.string :status
14
14
  t.string :context # required
15
+ t.string :file # used by carrierwave
15
16
  t.timestamps
16
17
  end
17
18
  add_index :media, :encode_status
@@ -4,10 +4,16 @@ HasMedia.directory_path = "media"
4
4
  # Set the base uri to access media
5
5
  HasMedia.directory_uri = "/media"
6
6
 
7
- # Set the allowed medium types for your application (used if no :only option given)
8
- #HasMedia.medium_types = [Image, Video, Audio]
7
+ # Set the allowed medium types for you application
8
+ # Set the allowed mime types for each medium type
9
+ #HasMedia.medium_types = {
10
+ # "Image" => ["image/jpeg", "image/png"],
11
+ # "Video" => ["video/mp4"],
12
+ # "Audio" => ["audio/mp3"]
13
+ #}
9
14
 
10
- # Set the extension of encoded files to use for each medium types (used in file_uri and file_path)
15
+ # Set the extension of encoded files to use for each medium types
16
+ # This is used in file_uri and file_path
11
17
  #HasMedia.encoded_extensions = {
12
18
  # :image => 'png',
13
19
  # :audio => 'ogg',
@@ -15,22 +15,9 @@ class Medium < ActiveRecord::Base
15
15
  ENCODE_NOT_READY = 4
16
16
  NO_ENCODING = 5
17
17
 
18
- # Allowed MIME types for upload
19
- # need custom configuration
20
- # TODO: add errors if not type of file
21
- @@mime_types = {
22
- :video => HasMedia.videos_content_types,
23
- :image => HasMedia.images_content_types,
24
- :audio => ['audio/mpeg', 'audio/x-ms-wma', 'audio/x-wav'],
25
- :flash => ['application/x-shockwave-flash'],
26
- :pdf => ['application/pdf'],
27
- }
28
-
29
- # TODO : check that carrierwave destroy files on after detroy hook
30
18
  after_destroy :remove_file_from_fs
31
19
  after_initialize :set_default_encoding_status
32
20
 
33
-
34
21
  scope :with_context, lambda {|context|
35
22
  { :conditions => { :context => context.to_s} }
36
23
  }
@@ -51,14 +38,12 @@ class Medium < ActiveRecord::Base
51
38
  mime_type = MIME::Types.type_for(value.path).first.content_type
52
39
  end
53
40
  only ||= ""
54
- medium_types = HasMedia.medium_types
41
+ medium_types = HasMedia.medium_types.keys.collect{|c| Kernel.const_get(c)}
55
42
  if only != "" and klass = Kernel.const_get(only.camelize)
56
43
  medium_types = [klass]
57
44
  end
58
45
  klass = medium_types.find do |k|
59
- if k.respond_to?(:handle_content_type?)
60
- k.handle_content_type?(mime_type)
61
- end
46
+ HasMedia.medium_types[k.to_s].include?(mime_type)
62
47
  end
63
48
  if klass.nil?
64
49
  object.media_errors = [HasMedia.errors_messages[:type_error]]
@@ -2,9 +2,7 @@
2
2
 
3
3
  class MediumUploader < CarrierWave::Uploader::Base
4
4
 
5
- # Choose what kind of storage to use for this uploader
6
5
  storage :file
7
- # storage :s3
8
6
 
9
7
  # Override the directory where uploaded files will be stored
10
8
  # This is a sensible default for uploaders that are meant to be mounted:
@@ -12,4 +10,10 @@ class MediumUploader < CarrierWave::Uploader::Base
12
10
  type = ActiveSupport::Inflector.underscore(model.class.to_s)
13
11
  "#{HasMedia.directory_path}/#{type}/#{model.id}"
14
12
  end
13
+
14
+ # see https://gist.github.com/519484
15
+ def root
16
+ CarrierWave.root
17
+ end
18
+
15
19
  end
data/lib/has_media.rb CHANGED
@@ -8,50 +8,10 @@ module HasMedia
8
8
 
9
9
  VERSION = "0.0.1"
10
10
 
11
- @@medium_types = []
11
+ @@medium_types = {}
12
12
  @@store_dir = '/tmp'
13
13
  @@directory_uri = ''
14
- @@custom_models_path = nil
15
14
  @@errors_messages = {:type_error => 'Wrong type'}
16
- @@images_content_types = [
17
- 'image/jpeg',
18
- 'image/pjpeg',
19
- 'image/jpg',
20
- 'image/gif',
21
- 'image/png',
22
- 'image/x-png',
23
- 'image/jpg',
24
- 'image/x-ms-bmp',
25
- 'image/bmp',
26
- 'image/x-bmp',
27
- 'image/x-bitmap',
28
- 'image/x-xbitmap',
29
- 'image/x-win-bitmap',
30
- 'image/x-windows-bmp',
31
- 'image/ms-bmp',
32
- 'application/bmp',
33
- 'application/x-bmp',
34
- 'application/x-win-bitmap',
35
- 'application/preview',
36
- 'image/jp_',
37
- 'application/jpg',
38
- 'application/x-jpg',
39
- 'image/pipeg',
40
- 'image/vnd.swiftview-jpeg',
41
- 'image/x-xbitmap',
42
- 'application/png',
43
- 'application/x-png',
44
- 'image/gi_',
45
- 'image/x-citrix-pjpeg'
46
- ]
47
- @@videos_content_types = [
48
- 'video/mpeg',
49
- 'video/mp4',
50
- 'video/quicktime',
51
- 'video/x-ms-wmv',
52
- 'video/x-flv',
53
- 'video/x-msvideo'
54
- ]
55
15
  @@encoded_extensions = {
56
16
  :image => 'png',
57
17
  :audio => 'mp3',
@@ -83,24 +43,6 @@ module HasMedia
83
43
  def self.directory_uri
84
44
  @@directory_uri
85
45
  end
86
- def self.custom_models_path
87
- @@custom_models_path
88
- end
89
- def self.custom_models_path=(value)
90
- unless value.blank?
91
- @@custom_models_path = value
92
- Dir.glob(self.custom_models_path + '/*.rb').each do |model|
93
- require model
94
- end
95
- end
96
- end
97
- # taken from http://github.com/technoweenie/attachment_fu/blob/master/lib/technoweenie/attachment_fu.rb
98
- def self.images_content_types
99
- @@images_content_types
100
- end
101
- def self.videos_content_types
102
- @@videos_content_types
103
- end
104
46
  def self.errors_messages
105
47
  @@errors_messages
106
48
  end
@@ -24,12 +24,17 @@ describe "HasMedia" do
24
24
  before :all do
25
25
  HasMedia.directory_path = 'tmp'
26
26
  HasMedia.directory_uri = '/media'
27
+ HasMedia.medium_types = {
28
+ "Image" => ["image/jpeg"],
29
+ "Audio" => ["audio/wav"],
30
+ "Pdf" => ["application/pdf"],
31
+ "Video" => ["video/mp4"]
32
+ }
27
33
  end
28
34
 
29
35
  describe "fonctionalities" do
30
36
 
31
37
  before :each do
32
- HasMedia.medium_types = [Image, Video, Pdf, Audio]
33
38
  @medium = MediumRelatedTest.new
34
39
  @image = stub_temp_file('image.jpg', 'image/jpeg')
35
40
  @audio = stub_temp_file('audio.wav', 'audio/wav')
@@ -180,7 +185,21 @@ describe "HasMedia" do
180
185
 
181
186
  describe "Configuration" do
182
187
  it "should check allowed medium types if no :only option given" do
183
- HasMedia.medium_types = [Image]
188
+ HasMedia.medium_types = {
189
+ "Image" => ["image/jpeg"],
190
+ }
191
+ @pdf = stub_temp_file('Conversational_Capital _Explained.pdf', 'application/pdf')
192
+ @medium = MediumRelatedTest.new
193
+ @medium.pdf = @pdf
194
+ @medium.valid?
195
+ @medium.should_not be_valid
196
+ @medium.save.should be_false
197
+ @medium.errors.full_messages.include?(HasMedia.errors_messages[:type_error])
198
+ end
199
+ it "should check allowed mime type" do
200
+ HasMedia.medium_types = {
201
+ "Pdf" => ["image/jpeg"],
202
+ }
184
203
  @pdf = stub_temp_file('Conversational_Capital _Explained.pdf', 'application/pdf')
185
204
  @medium = MediumRelatedTest.new
186
205
  @medium.pdf = @pdf
@@ -189,8 +208,6 @@ describe "HasMedia" do
189
208
  @medium.save.should be_false
190
209
  @medium.errors.full_messages.include?(HasMedia.errors_messages[:type_error])
191
210
  end
192
-
193
-
194
211
  end
195
212
 
196
213
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_media
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - klacointe
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-11-02 00:00:00 +01:00
19
+ date: 2010-11-05 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency