has_media 0.1.2 → 0.1.3
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/.gitignore +1 -0
- data/README.rdoc +27 -7
- data/Rakefile +36 -32
- data/VERSION +1 -1
- data/has_media.gemspec +99 -0
- data/lib/has_media/models/medium.rb +31 -22
- data/lib/has_media.rb +13 -0
- data/lib/tasks/rspec.rake +39 -0
- data/spec/has_media_spec.rb +163 -149
- data/spec/spec_helper.rb +48 -10
- metadata +55 -25
- /data/{spec/spec.opts → .rspec} +0 -0
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
=
|
1
|
+
= Has Media
|
2
2
|
|
3
3
|
Media Managment Library for ActiveRecord and Carrierwave
|
4
4
|
|
5
|
-
Easy way to link media (ie image, audio, pdf
|
5
|
+
Easy way to link media (ie image, audio, video, pdf, ...) on other activerecords models
|
6
|
+
|
7
|
+
Use branch rails2.3 for Rails 2.3.x and rails3 for Rails 3
|
6
8
|
|
7
9
|
=== Create migrations
|
8
10
|
|
@@ -27,8 +29,7 @@ Examples are in the /examples directory...
|
|
27
29
|
|
28
30
|
== Configuration
|
29
31
|
|
30
|
-
*
|
31
|
-
HasMedia.custom_models_path = File.dirname(__FILE__) + '/../../app/models/has_media'
|
32
|
+
* Configuration take place in config/initializers/has_media.rb
|
32
33
|
|
33
34
|
* Set the directory path to use to store media
|
34
35
|
HasMedia.directory_path = "media"
|
@@ -39,6 +40,21 @@ Examples are in the /examples directory...
|
|
39
40
|
* Set custom error messages
|
40
41
|
HasMedia.errors_messages = {:type_error => I18n.t('has_media.errors.type_error')}
|
41
42
|
|
43
|
+
* Set the allowed medium types for your application (used if no :only option given)
|
44
|
+
HasMedia.medium_types = [Image, Video, Audio]
|
45
|
+
|
46
|
+
* Set the extension of encoded files to use for each medium types (used in file_uri and file_path)
|
47
|
+
HasMedia.encoded_extensions = {
|
48
|
+
:image => 'png',
|
49
|
+
:audio => 'ogg',
|
50
|
+
:video => 'flv'
|
51
|
+
}
|
52
|
+
|
53
|
+
* Require you uploaders
|
54
|
+
Dir.glob(File.dirname(__FILE__) + '/../app/uploaders/*.rb').each do |uploader|
|
55
|
+
require uploader
|
56
|
+
end
|
57
|
+
|
42
58
|
== Testing
|
43
59
|
|
44
60
|
Factory example using factory_girl :
|
@@ -52,9 +68,13 @@ Factory example using factory_girl :
|
|
52
68
|
f.file {ActionController::TestUploadedFile.new(File.join(Rails.root, '/spec/factories/image.jpg'), 'image/jpeg')}
|
53
69
|
end
|
54
70
|
|
55
|
-
== TODO
|
56
|
-
|
57
|
-
*
|
71
|
+
== TODO
|
72
|
+
* Doc for testing (ActionController::TestUploadedFile is now obsolete in rails 3), add HasMediaTestHelper with stub_temp_file method
|
73
|
+
* Generator for initializer
|
74
|
+
* Add controller and views examples with overload system (form fields, display, ...)
|
75
|
+
* Fix problem with migrations generator timestamps
|
76
|
+
* Generator for models and uploaders (Type in Image, Video, Audio, Pdf) :
|
77
|
+
rails generate has_media_model Type Name
|
58
78
|
|
59
79
|
== Contributors
|
60
80
|
|
data/Rakefile
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require '
|
1
|
+
#require 'rake'
|
2
|
+
#require 'rake/rdoctask'
|
3
|
+
#require 'rubygems'
|
4
|
+
#require 'rspec'
|
5
|
+
#require 'rspec/core'
|
6
|
+
#require 'rspec/core/rake_task'
|
7
|
+
#Spec::Core::RakeTask.new(:spec)
|
3
8
|
|
4
9
|
begin
|
5
10
|
require 'jeweler'
|
@@ -8,40 +13,39 @@ begin
|
|
8
13
|
gem.summary = %Q{Media Managment Library for ActiveRecord and Carrierwave}
|
9
14
|
gem.description = %Q{Media Managment Library for ActiveRecord and Carrierwave}
|
10
15
|
gem.email = "kevinlacointe@gmail.com"
|
11
|
-
gem.homepage = "http://github.com/
|
16
|
+
gem.homepage = "http://github.com/klacointe/has_media"
|
12
17
|
gem.authors = ["klacointe", "spk"]
|
13
|
-
gem.add_development_dependency "rspec", "
|
14
|
-
gem.add_dependency('carrierwave', '
|
15
|
-
gem.add_dependency('activerecord', '
|
16
|
-
gem.add_dependency('activesupport', '
|
18
|
+
gem.add_development_dependency "rspec", "<=1.3.0"
|
19
|
+
gem.add_dependency('carrierwave', '=0.4.5')
|
20
|
+
gem.add_dependency('activerecord', '=2.3.8')
|
21
|
+
gem.add_dependency('activesupport', '=2.3.8')
|
22
|
+
gem.add_dependency('mime-types', '>=1.16')
|
17
23
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
18
24
|
end
|
19
25
|
rescue LoadError
|
20
26
|
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
21
27
|
end
|
22
28
|
|
23
|
-
|
24
|
-
|
25
|
-
spec.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
spec.
|
31
|
-
spec.
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
rdoc.
|
44
|
-
rdoc.
|
45
|
-
|
46
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
47
|
-
end
|
29
|
+
#Spec::Rake::SpecTask.new(:spec) do |spec|
|
30
|
+
# spec.libs << 'lib' << 'spec'
|
31
|
+
# spec.spec_files = FileList['spec/**/*_spec.rb']
|
32
|
+
#end
|
33
|
+
#
|
34
|
+
#Spec::Rake::SpecTask.new(:rcov) do |spec|
|
35
|
+
# spec.libs << 'lib' << 'spec'
|
36
|
+
# spec.pattern = 'spec/**/*_spec.rb'
|
37
|
+
# spec.rcov = true
|
38
|
+
#end
|
39
|
+
#
|
40
|
+
#task :spec => :check_dependencies
|
41
|
+
#
|
42
|
+
#task :default => :spec
|
43
|
+
#
|
44
|
+
#Rake::RDocTask.new do |rdoc|
|
45
|
+
# version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
46
|
+
#
|
47
|
+
# rdoc.rdoc_dir = 'rdoc'
|
48
|
+
# rdoc.title = "has_media #{version}"
|
49
|
+
# rdoc.rdoc_files.include('README*')
|
50
|
+
# rdoc.rdoc_files.include('lib/**/*.rb')
|
51
|
+
#end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/has_media.gemspec
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{has_media}
|
8
|
+
s.version = "0.1.3"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["klacointe", "spk"]
|
12
|
+
s.date = %q{2010-10-06}
|
13
|
+
s.description = %q{Media Managment Library for ActiveRecord and Carrierwave}
|
14
|
+
s.email = %q{kevinlacointe@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
".rspec",
|
23
|
+
"LICENSE",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"examples/models/audio.rb",
|
28
|
+
"examples/models/image.rb",
|
29
|
+
"examples/models/pdf.rb",
|
30
|
+
"examples/models/video.rb",
|
31
|
+
"examples/uploaders/audio_uploader.rb",
|
32
|
+
"examples/uploaders/image_uploader.rb",
|
33
|
+
"examples/uploaders/pdf_uploader.rb",
|
34
|
+
"examples/uploaders/video_uploader.rb",
|
35
|
+
"generators/has_media/has_media_generator.rb",
|
36
|
+
"generators/has_media/templates/create_media.rb",
|
37
|
+
"generators/has_media/templates/create_media_links.rb",
|
38
|
+
"has_media.gemspec",
|
39
|
+
"lib/has_media.rb",
|
40
|
+
"lib/has_media/models/media_link.rb",
|
41
|
+
"lib/has_media/models/medium.rb",
|
42
|
+
"lib/has_media/uploaders/medium_uploader.rb",
|
43
|
+
"lib/tasks/rspec.rake",
|
44
|
+
"spec/fixtures/media/Conversational_Capital _Explained.pdf",
|
45
|
+
"spec/fixtures/media/audio.wav",
|
46
|
+
"spec/fixtures/media/image.jpg",
|
47
|
+
"spec/fixtures/media/image_bis.jpg",
|
48
|
+
"spec/fixtures/media/lc_pdf_overview_format.pdf",
|
49
|
+
"spec/fixtures/models/image.rb",
|
50
|
+
"spec/fixtures/uploaders/uploader_with_exception.rb",
|
51
|
+
"spec/has_media_spec.rb",
|
52
|
+
"spec/spec_helper.rb"
|
53
|
+
]
|
54
|
+
s.homepage = %q{http://github.com/klacointe/has_media}
|
55
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
56
|
+
s.require_paths = ["lib"]
|
57
|
+
s.rubygems_version = %q{1.3.7}
|
58
|
+
s.summary = %q{Media Managment Library for ActiveRecord and Carrierwave}
|
59
|
+
s.test_files = [
|
60
|
+
"spec/spec_helper.rb",
|
61
|
+
"spec/fixtures/models/image.rb",
|
62
|
+
"spec/fixtures/uploaders/uploader_with_exception.rb",
|
63
|
+
"spec/has_media_spec.rb",
|
64
|
+
"examples/models/image.rb",
|
65
|
+
"examples/models/pdf.rb",
|
66
|
+
"examples/models/audio.rb",
|
67
|
+
"examples/models/video.rb",
|
68
|
+
"examples/uploaders/pdf_uploader.rb",
|
69
|
+
"examples/uploaders/audio_uploader.rb",
|
70
|
+
"examples/uploaders/video_uploader.rb",
|
71
|
+
"examples/uploaders/image_uploader.rb"
|
72
|
+
]
|
73
|
+
|
74
|
+
if s.respond_to? :specification_version then
|
75
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
76
|
+
s.specification_version = 3
|
77
|
+
|
78
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
79
|
+
s.add_development_dependency(%q<rspec>, ["<= 1.3.0"])
|
80
|
+
s.add_runtime_dependency(%q<carrierwave>, ["= 0.4.5"])
|
81
|
+
s.add_runtime_dependency(%q<activerecord>, ["= 2.3.8"])
|
82
|
+
s.add_runtime_dependency(%q<activesupport>, ["= 2.3.8"])
|
83
|
+
s.add_runtime_dependency(%q<mime-types>, [">= 1.16"])
|
84
|
+
else
|
85
|
+
s.add_dependency(%q<rspec>, ["<= 1.3.0"])
|
86
|
+
s.add_dependency(%q<carrierwave>, ["= 0.4.5"])
|
87
|
+
s.add_dependency(%q<activerecord>, ["= 2.3.8"])
|
88
|
+
s.add_dependency(%q<activesupport>, ["= 2.3.8"])
|
89
|
+
s.add_dependency(%q<mime-types>, [">= 1.16"])
|
90
|
+
end
|
91
|
+
else
|
92
|
+
s.add_dependency(%q<rspec>, ["<= 1.3.0"])
|
93
|
+
s.add_dependency(%q<carrierwave>, ["= 0.4.5"])
|
94
|
+
s.add_dependency(%q<activerecord>, ["= 2.3.8"])
|
95
|
+
s.add_dependency(%q<activesupport>, ["= 2.3.8"])
|
96
|
+
s.add_dependency(%q<mime-types>, [">= 1.16"])
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
@@ -15,13 +15,6 @@ class Medium < ActiveRecord::Base
|
|
15
15
|
ENCODE_NOT_READY = 4
|
16
16
|
NO_ENCODING = 5
|
17
17
|
|
18
|
-
EXTENSIONS = {
|
19
|
-
:image => 'png',
|
20
|
-
:audio => 'mp3',
|
21
|
-
:pdf => 'pdf',
|
22
|
-
:video => 'flv'
|
23
|
-
}
|
24
|
-
|
25
18
|
# Allowed MIME types for upload
|
26
19
|
# need custom configuration
|
27
20
|
# TODO: add errors if not type of file
|
@@ -51,16 +44,20 @@ class Medium < ActiveRecord::Base
|
|
51
44
|
return name.downcase
|
52
45
|
end
|
53
46
|
|
54
|
-
# FIXME : get medium types from available classes, use has_media.medium_types
|
55
47
|
def self.new_from_value(object, value, context, encode, only)
|
48
|
+
if value.respond_to?(:content_type)
|
49
|
+
mime_type = value.content_type
|
50
|
+
else
|
51
|
+
mime_type = MIME::Types.type_for(value.path).first.content_type
|
52
|
+
end
|
56
53
|
only ||= ""
|
57
54
|
medium_types = HasMedia.medium_types
|
58
|
-
if only != "" and klass = Kernel.const_get(only.
|
55
|
+
if only != "" and klass = Kernel.const_get(only.camelize)
|
59
56
|
medium_types = [klass]
|
60
57
|
end
|
61
58
|
klass = medium_types.find do |k|
|
62
59
|
if k.respond_to?(:handle_content_type?)
|
63
|
-
k.handle_content_type?(
|
60
|
+
k.handle_content_type?(mime_type)
|
64
61
|
end
|
65
62
|
end
|
66
63
|
if klass.nil?
|
@@ -68,9 +65,13 @@ class Medium < ActiveRecord::Base
|
|
68
65
|
return
|
69
66
|
end
|
70
67
|
medium = klass.new
|
71
|
-
|
68
|
+
if value.respond_to?(:original_filename)
|
69
|
+
medium.filename = self.sanitize(value.original_filename)
|
70
|
+
else
|
71
|
+
medium.filename = self.sanitize(File.basename(value.path))
|
72
|
+
end
|
72
73
|
medium.file = value
|
73
|
-
medium.content_type =
|
74
|
+
medium.content_type = mime_type
|
74
75
|
medium.context = context
|
75
76
|
medium.encode_status = (encode == "false" ? NO_ENCODING : ENCODE_WAIT)
|
76
77
|
medium.save
|
@@ -121,18 +122,22 @@ class Medium < ActiveRecord::Base
|
|
121
122
|
self.file.store_dir
|
122
123
|
end
|
123
124
|
# system path for a medium
|
124
|
-
def file_path(
|
125
|
-
|
126
|
-
final_name[-4,0] = "_#{thumbnail}" if thumbnail
|
127
|
-
File.join(directory_path, final_name)
|
125
|
+
def file_path(version = nil)
|
126
|
+
File.join(directory_path, encoded_file_name(version))
|
128
127
|
end
|
129
128
|
|
130
129
|
# http uri for a medium
|
131
|
-
def file_uri(
|
132
|
-
|
133
|
-
final_name[-4,0] = "_#{thumbnail}" if thumbnail
|
134
|
-
File.join(directory_uri, final_name)
|
130
|
+
def file_uri(version = nil)
|
131
|
+
File.join(directory_uri, encoded_file_name(version))
|
135
132
|
end
|
133
|
+
|
134
|
+
def encoded_file_name(version = nil)
|
135
|
+
# remove original extension and add the encoded extension
|
136
|
+
final_name = filename.gsub(/\.[^.]{1,4}$/, "") + '.' + file_extension
|
137
|
+
final_name[-4,0] = "_#{version}" if version
|
138
|
+
final_name
|
139
|
+
end
|
140
|
+
|
136
141
|
# http uri of directory which stores media
|
137
142
|
def directory_uri
|
138
143
|
File.join(HasMedia.directory_uri,
|
@@ -145,7 +150,11 @@ class Medium < ActiveRecord::Base
|
|
145
150
|
end
|
146
151
|
|
147
152
|
def file_extension
|
148
|
-
|
153
|
+
sym = type.underscore.to_sym
|
154
|
+
unless HasMedia.encoded_extensions.keys.include?(sym)
|
155
|
+
raise Exception.new("You need to add encoded extension configuration for :#{sym}")
|
156
|
+
end
|
157
|
+
HasMedia.encoded_extensions[sym]
|
149
158
|
end
|
150
159
|
|
151
160
|
private
|
@@ -161,6 +170,6 @@ private
|
|
161
170
|
# TODO : remove all files, not only the original one
|
162
171
|
def remove_file_from_fs
|
163
172
|
require 'fileutils'
|
164
|
-
FileUtils.rm_rf(self.
|
173
|
+
FileUtils.rm_rf(self.directory_path)
|
165
174
|
end
|
166
175
|
end
|
data/lib/has_media.rb
CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'active_record'
|
3
3
|
require 'active_support'
|
4
4
|
require 'carrierwave'
|
5
|
+
require 'mime/types'
|
5
6
|
|
6
7
|
module HasMedia
|
7
8
|
|
@@ -51,6 +52,12 @@ module HasMedia
|
|
51
52
|
'video/x-flv',
|
52
53
|
'video/x-msvideo'
|
53
54
|
]
|
55
|
+
@@encoded_extensions = {
|
56
|
+
:image => 'png',
|
57
|
+
:audio => 'mp3',
|
58
|
+
:pdf => 'pdf',
|
59
|
+
:video => 'flv'
|
60
|
+
}
|
54
61
|
|
55
62
|
def self.medium_types=(value)
|
56
63
|
@@medium_types = value
|
@@ -58,6 +65,12 @@ module HasMedia
|
|
58
65
|
def self.medium_types
|
59
66
|
@@medium_types
|
60
67
|
end
|
68
|
+
def self.encoded_extensions=(value)
|
69
|
+
@@encoded_extensions = value
|
70
|
+
end
|
71
|
+
def self.encoded_extensions
|
72
|
+
@@encoded_extensions
|
73
|
+
end
|
61
74
|
def self.directory_path=(value)
|
62
75
|
@@store_dir = value
|
63
76
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
rescue MissingSourceFile
|
5
|
+
module RSpec
|
6
|
+
module Core
|
7
|
+
class RakeTask
|
8
|
+
def initialize(name)
|
9
|
+
task name do
|
10
|
+
# if rspec-rails is a configured gem, this will output helpful material and exit ...
|
11
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../config/environment")
|
12
|
+
|
13
|
+
# ... otherwise, do this:
|
14
|
+
raise <<-MSG
|
15
|
+
|
16
|
+
#{"*" * 80}
|
17
|
+
* You are trying to run an rspec rake task defined in
|
18
|
+
* #{__FILE__},
|
19
|
+
* but rspec can not be found in vendor/gems, vendor/plugins or system gems.
|
20
|
+
#{"*" * 80}
|
21
|
+
MSG
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Rake.application.instance_variable_get('@tasks').delete('default')
|
30
|
+
|
31
|
+
task :default => :spec
|
32
|
+
|
33
|
+
namespace :spec do
|
34
|
+
desc "Run the code examples in spec"
|
35
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
36
|
+
t.pattern = "./spec/*_spec.rb"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
data/spec/has_media_spec.rb
CHANGED
@@ -1,182 +1,196 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
+
# load models and uploaders examples
|
4
|
+
Dir.glob(File.dirname(__FILE__) + '/../examples/uploaders/*.rb').each do |uploader|
|
5
|
+
require uploader
|
6
|
+
end
|
7
|
+
|
8
|
+
Dir.glob(File.dirname(__FILE__) + '/../examples/models/*.rb').each do |model|
|
9
|
+
require model
|
10
|
+
end
|
11
|
+
class MediumRelatedTest < ActiveRecord::Base
|
12
|
+
include HasMedia
|
13
|
+
has_one_medium :image, :only => :image
|
14
|
+
has_many_media :images, :only => :image
|
15
|
+
has_one_medium :audio, :only => :audio
|
16
|
+
has_many_media :audios, :only => :audio
|
17
|
+
has_one_medium :image_no_encode, :only => :image, :encode => false
|
18
|
+
has_one_medium :pdf, :encode => false
|
19
|
+
end
|
20
|
+
|
21
|
+
|
3
22
|
describe "HasMedia" do
|
4
23
|
|
5
24
|
before :all do
|
6
|
-
# load models and uploaders examples
|
7
|
-
Dir.glob(File.dirname(__FILE__) + '/../examples/uploaders/*.rb').each do |uploader|
|
8
|
-
require uploader
|
9
|
-
end
|
10
|
-
|
11
|
-
Dir.glob(File.dirname(__FILE__) + '/../examples/models/*.rb').each do |model|
|
12
|
-
require model
|
13
|
-
end
|
14
|
-
|
15
|
-
class MediumRelatedTest < ActiveRecord::Base
|
16
|
-
include HasMedia
|
17
|
-
has_one_medium :image, :only => :image
|
18
|
-
has_many_media :images, :only => :image
|
19
|
-
has_one_medium :audio, :only => :audio
|
20
|
-
has_many_media :audios, :only => :audio
|
21
|
-
has_one_medium :image_no_encode, :only => :image, :encode => false
|
22
|
-
has_one_medium :pdf, :encode => false
|
23
|
-
end
|
24
25
|
HasMedia.directory_path = 'tmp'
|
25
26
|
HasMedia.directory_uri = '/media'
|
26
|
-
HasMedia.medium_types = [Image, Video, Pdf, Audio]
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
@medium = MediumRelatedTest.new
|
31
|
-
@image = ActionController::TestUploadedFile.new('spec/fixtures/media/image.jpg', 'image/jpeg')
|
32
|
-
@audio = ActionController::TestUploadedFile.new('spec/fixtures/media/audio.wav', 'audio/wav')
|
33
|
-
@image_bis = ActionController::TestUploadedFile.new('spec/fixtures/media/image_bis.jpg', 'image/jpeg')
|
34
|
-
@pdf = ActionController::TestUploadedFile.new('spec/fixtures/media/Conversational_Capital _Explained.pdf', 'application/pdf')
|
35
|
-
end
|
29
|
+
describe "fonctionalities" do
|
36
30
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
31
|
+
before :each do
|
32
|
+
HasMedia.medium_types = [Image, Video, Pdf, Audio]
|
33
|
+
@medium = MediumRelatedTest.new
|
34
|
+
@image = stub_temp_file('image.jpg', 'image/jpeg')
|
35
|
+
@audio = stub_temp_file('audio.wav', 'audio/wav')
|
36
|
+
@image_bis = stub_temp_file('image_bis.jpg', 'image/jpeg')
|
37
|
+
@pdf = stub_temp_file('Conversational_Capital _Explained.pdf', 'application/pdf')
|
43
38
|
end
|
44
|
-
}.should raise_error(Exception)
|
45
|
-
end
|
46
39
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
40
|
+
it 'should not have 2 has_one_medium with same context' do
|
41
|
+
lambda {
|
42
|
+
class Prout < ActiveRecord::Base
|
43
|
+
include HasMedia
|
44
|
+
has_one_medium :prout, :only => :image
|
45
|
+
has_one_medium :prout, :only => :audio
|
46
|
+
end
|
47
|
+
}.should raise_error(Exception)
|
48
|
+
end
|
54
49
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
50
|
+
it "should define accessors" do
|
51
|
+
@medium.methods.should include("image")
|
52
|
+
@medium.methods.should include("images")
|
53
|
+
@medium.methods.should include("audio")
|
54
|
+
@medium.methods.should include("audios")
|
55
|
+
@medium.methods.should include("pdf")
|
56
|
+
end
|
62
57
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
58
|
+
it "should define setters" do
|
59
|
+
@medium.methods.should include("image=")
|
60
|
+
@medium.methods.should include("images=")
|
61
|
+
@medium.methods.should include("audio=")
|
62
|
+
@medium.methods.should include("audios=")
|
63
|
+
@medium.methods.should include("pdf=")
|
64
|
+
end
|
69
65
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
66
|
+
it "should associate image to mediated object" do
|
67
|
+
@medium.image = @image
|
68
|
+
@medium.save!
|
69
|
+
@medium.image.should_not be_nil
|
70
|
+
@medium.image.class.should == Image
|
71
|
+
end
|
76
72
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
73
|
+
it "should associate audio to mediated object" do
|
74
|
+
@medium.audio = @audio
|
75
|
+
@medium.save!
|
76
|
+
@medium.audio.should_not be_nil
|
77
|
+
@medium.audio.class.should == Audio
|
78
|
+
end
|
83
79
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
@medium.audio.filename.should == @audio.original_filename
|
91
|
-
@medium.audio.content_type.should == "audio/wav"
|
92
|
-
@medium.audio
|
93
|
-
@medium.image.should_not be_nil
|
94
|
-
@medium.image.class.should == Image
|
95
|
-
@medium.image.filename.should == @image.original_filename
|
96
|
-
@medium.image.content_type.should == "image/jpeg"
|
97
|
-
end
|
80
|
+
it "should associate pdf to mediated object" do
|
81
|
+
@medium.pdf = @pdf
|
82
|
+
@medium.save!
|
83
|
+
@medium.pdf.should_not be_nil
|
84
|
+
@medium.pdf.class.should == Pdf
|
85
|
+
end
|
98
86
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
87
|
+
it "should add both audio and image " do
|
88
|
+
@medium.image = @image
|
89
|
+
@medium.audio = @audio
|
90
|
+
@medium.save!
|
91
|
+
@medium.audio.should_not be_nil
|
92
|
+
@medium.audio.class.should == Audio
|
93
|
+
@medium.audio.filename.should == @audio.original_filename
|
94
|
+
@medium.audio.content_type.should == "audio/wav"
|
95
|
+
@medium.audio
|
96
|
+
@medium.image.should_not be_nil
|
97
|
+
@medium.image.class.should == Image
|
98
|
+
@medium.image.filename.should == @image.original_filename
|
99
|
+
@medium.image.content_type.should == "image/jpeg"
|
100
|
+
end
|
107
101
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
102
|
+
it "should replace media when in has_one_medium relations" do
|
103
|
+
@medium.image = @image_bis
|
104
|
+
@medium.save
|
105
|
+
@medium.image.filename.should == @image_bis.original_filename
|
106
|
+
@medium.reload
|
107
|
+
@medium.image = @image
|
108
|
+
@medium.save
|
109
|
+
@medium.image.filename.should == @image.original_filename
|
110
|
+
end
|
116
111
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
112
|
+
it "should destroy files from fs when Related Model is destroyed" do
|
113
|
+
@medium.image = @image
|
114
|
+
@medium.save!
|
115
|
+
path = @medium.image.original_file_path
|
116
|
+
File.exist?(path).should be_true
|
117
|
+
@medium.destroy
|
118
|
+
File.exist?(path).should be_false
|
119
|
+
end
|
120
|
+
|
121
|
+
[:encoding?, :ready?, :failed?].each do |method|
|
122
|
+
[:image, :audio, :images, :audios].each do |context|
|
123
|
+
class_eval %{
|
124
|
+
it "should responds to #{context}.#{method}" do
|
125
|
+
@medium.send("#{context}=", @#{context})
|
126
|
+
@medium.save!
|
127
|
+
media = @medium.send("#{context}")
|
128
|
+
if media.is_a? Array
|
129
|
+
media.each do |medium|
|
130
|
+
[true, false].include?(medium.send("#{method}"))
|
131
|
+
end
|
132
|
+
else
|
133
|
+
[true, false].include?(media.send("#{method}"))
|
127
134
|
end
|
128
|
-
else
|
129
|
-
[true, false].include?(media.send("#{method}"))
|
130
135
|
end
|
131
|
-
|
132
|
-
|
136
|
+
}
|
137
|
+
end
|
133
138
|
end
|
134
|
-
end
|
135
139
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
140
|
+
it "should add several has_many_media for the same context" do
|
141
|
+
@medium.images = [@image, @image_bis]
|
142
|
+
@medium.save!
|
143
|
+
@medium.media.size.should == 2
|
144
|
+
end
|
141
145
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
146
|
+
it "should have the right encode status" do
|
147
|
+
@medium.image_no_encode = @image
|
148
|
+
@medium.save!
|
149
|
+
@medium.image_no_encode.encode_status.should == Medium::NO_ENCODING
|
150
|
+
@medium.image = @image_bis
|
151
|
+
@medium.save!
|
152
|
+
@medium.image.encode_status.should == Medium::ENCODE_WAIT
|
153
|
+
end
|
150
154
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
155
|
+
it "should have an original uri" do
|
156
|
+
@medium.image = @image
|
157
|
+
@medium.save!
|
158
|
+
@medium.image.original_file_uri.should == File.join(HasMedia.directory_uri,
|
159
|
+
ActiveSupport::Inflector.underscore(@medium.image.type),
|
160
|
+
@medium.image.id.to_s,
|
161
|
+
@medium.image.filename)
|
162
|
+
end
|
159
163
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
164
|
+
it "pdf should exist" do
|
165
|
+
@medium.pdf = @pdf
|
166
|
+
@medium.save!
|
167
|
+
path = @medium.pdf.file_path
|
168
|
+
File.exist?(path).should be_true
|
169
|
+
end
|
166
170
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
171
|
+
it "should add errors on parent model if type is not allowed" do
|
172
|
+
@image = stub_temp_file('image.jpg', 'image/jpeg')
|
173
|
+
@medium.audio = @image
|
174
|
+
@medium.valid?
|
175
|
+
@medium.should_not be_valid
|
176
|
+
@medium.save.should be_false
|
177
|
+
@medium.errors.full_messages.include?(HasMedia.errors_messages[:type_error])
|
178
|
+
end
|
174
179
|
end
|
175
180
|
|
176
|
-
|
177
|
-
|
178
|
-
HasMedia.
|
179
|
-
|
181
|
+
describe "Configuration" do
|
182
|
+
it "should check allowed medium types if no :only option given" do
|
183
|
+
HasMedia.medium_types = [Image]
|
184
|
+
@pdf = stub_temp_file('Conversational_Capital _Explained.pdf', 'application/pdf')
|
185
|
+
@medium = MediumRelatedTest.new
|
186
|
+
@medium.pdf = @pdf
|
187
|
+
@medium.valid?
|
188
|
+
@medium.should_not be_valid
|
189
|
+
@medium.save.should be_false
|
190
|
+
@medium.errors.full_messages.include?(HasMedia.errors_messages[:type_error])
|
191
|
+
end
|
192
|
+
|
193
|
+
|
180
194
|
end
|
181
195
|
|
182
196
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
-
require 'spec'
|
4
|
-
require 'spec/autorun'
|
5
3
|
require 'rubygems'
|
4
|
+
require 'rspec'
|
5
|
+
require 'rspec/core'
|
6
|
+
require 'rspec/core/rake_task'
|
6
7
|
require 'action_controller'
|
7
|
-
require 'action_controller/test_process'
|
8
|
+
#require 'action_controller/test_process'
|
9
|
+
require 'action_dispatch'
|
10
|
+
require 'action_dispatch/testing/test_process'
|
8
11
|
require 'has_media'
|
9
12
|
|
10
13
|
dbconfig = {
|
11
|
-
:adapter => '
|
12
|
-
:database => '
|
13
|
-
|
14
|
+
:adapter => 'mysql',
|
15
|
+
:database => 'has_media',
|
16
|
+
:username => 'test',
|
17
|
+
:password => 'test'
|
14
18
|
}
|
15
19
|
|
16
20
|
ActiveRecord::Base.establish_connection(dbconfig)
|
@@ -46,8 +50,42 @@ class TestMigration < ActiveRecord::Migration
|
|
46
50
|
end
|
47
51
|
end
|
48
52
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
+
RSpec.configure do |c|
|
54
|
+
c.before(:all) do
|
55
|
+
TestMigration.up
|
56
|
+
end
|
57
|
+
c.before(:each) do
|
58
|
+
@real_world = RSpec.world
|
59
|
+
RSpec.instance_variable_set(:@world, RSpec::Core::World.new)
|
60
|
+
end
|
61
|
+
c.after(:all) do
|
62
|
+
TestMigration.down
|
63
|
+
end
|
64
|
+
c.after(:each) do
|
65
|
+
RSpec.instance_variable_set(:@world, @real_world)
|
66
|
+
Medium.destroy_all
|
67
|
+
MediaLink.destroy_all
|
68
|
+
MediumRelatedTest.destroy_all
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def file_path( *paths )
|
74
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'media', *paths))
|
75
|
+
end
|
76
|
+
|
77
|
+
def stub_temp_file(filename, mime_type=nil, fake_name=nil)
|
78
|
+
raise "#{file_path(filename)} file does not exist" unless File.exist?(file_path(filename))
|
79
|
+
|
80
|
+
t = Tempfile.new(filename)
|
81
|
+
FileUtils.copy_file(file_path(filename), t.path)
|
82
|
+
|
83
|
+
# This is stupid, but for some reason rspec won't play nice...
|
84
|
+
eval <<-EOF
|
85
|
+
def t.original_filename; '#{fake_name || filename}'; end
|
86
|
+
def t.content_type; '#{mime_type}'; end
|
87
|
+
def t.local_path; path; end
|
88
|
+
EOF
|
89
|
+
|
90
|
+
return t
|
53
91
|
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_media
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
9
|
+
- 3
|
10
|
+
version: 0.1.3
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- klacointe
|
@@ -15,65 +16,88 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2010-06
|
19
|
+
date: 2010-10-06 00:00:00 +02:00
|
19
20
|
default_executable:
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
22
23
|
name: rspec
|
23
24
|
prerelease: false
|
24
25
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
25
27
|
requirements:
|
26
|
-
- -
|
28
|
+
- - <=
|
27
29
|
- !ruby/object:Gem::Version
|
30
|
+
hash: 27
|
28
31
|
segments:
|
29
32
|
- 1
|
30
|
-
-
|
31
|
-
-
|
32
|
-
version: 1.
|
33
|
+
- 3
|
34
|
+
- 0
|
35
|
+
version: 1.3.0
|
33
36
|
type: :development
|
34
37
|
version_requirements: *id001
|
35
38
|
- !ruby/object:Gem::Dependency
|
36
39
|
name: carrierwave
|
37
40
|
prerelease: false
|
38
41
|
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
39
43
|
requirements:
|
40
|
-
- - "
|
44
|
+
- - "="
|
41
45
|
- !ruby/object:Gem::Version
|
46
|
+
hash: 5
|
42
47
|
segments:
|
43
48
|
- 0
|
44
49
|
- 4
|
45
|
-
-
|
46
|
-
version: 0.4.
|
50
|
+
- 5
|
51
|
+
version: 0.4.5
|
47
52
|
type: :runtime
|
48
53
|
version_requirements: *id002
|
49
54
|
- !ruby/object:Gem::Dependency
|
50
55
|
name: activerecord
|
51
56
|
prerelease: false
|
52
57
|
requirement: &id003 !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
53
59
|
requirements:
|
54
|
-
- - "
|
60
|
+
- - "="
|
55
61
|
- !ruby/object:Gem::Version
|
62
|
+
hash: 19
|
56
63
|
segments:
|
57
64
|
- 2
|
58
65
|
- 3
|
59
|
-
-
|
60
|
-
version: 2.3.
|
66
|
+
- 8
|
67
|
+
version: 2.3.8
|
61
68
|
type: :runtime
|
62
69
|
version_requirements: *id003
|
63
70
|
- !ruby/object:Gem::Dependency
|
64
71
|
name: activesupport
|
65
72
|
prerelease: false
|
66
73
|
requirement: &id004 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
67
75
|
requirements:
|
68
|
-
- - "
|
76
|
+
- - "="
|
69
77
|
- !ruby/object:Gem::Version
|
78
|
+
hash: 19
|
70
79
|
segments:
|
71
80
|
- 2
|
72
81
|
- 3
|
73
|
-
-
|
74
|
-
version: 2.3.
|
82
|
+
- 8
|
83
|
+
version: 2.3.8
|
75
84
|
type: :runtime
|
76
85
|
version_requirements: *id004
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: mime-types
|
88
|
+
prerelease: false
|
89
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
hash: 47
|
95
|
+
segments:
|
96
|
+
- 1
|
97
|
+
- 16
|
98
|
+
version: "1.16"
|
99
|
+
type: :runtime
|
100
|
+
version_requirements: *id005
|
77
101
|
description: Media Managment Library for ActiveRecord and Carrierwave
|
78
102
|
email: kevinlacointe@gmail.com
|
79
103
|
executables: []
|
@@ -86,6 +110,7 @@ extra_rdoc_files:
|
|
86
110
|
files:
|
87
111
|
- .document
|
88
112
|
- .gitignore
|
113
|
+
- .rspec
|
89
114
|
- LICENSE
|
90
115
|
- README.rdoc
|
91
116
|
- Rakefile
|
@@ -101,10 +126,12 @@ files:
|
|
101
126
|
- generators/has_media/has_media_generator.rb
|
102
127
|
- generators/has_media/templates/create_media.rb
|
103
128
|
- generators/has_media/templates/create_media_links.rb
|
129
|
+
- has_media.gemspec
|
104
130
|
- lib/has_media.rb
|
105
131
|
- lib/has_media/models/media_link.rb
|
106
132
|
- lib/has_media/models/medium.rb
|
107
133
|
- lib/has_media/uploaders/medium_uploader.rb
|
134
|
+
- lib/tasks/rspec.rake
|
108
135
|
- spec/fixtures/media/Conversational_Capital _Explained.pdf
|
109
136
|
- spec/fixtures/media/audio.wav
|
110
137
|
- spec/fixtures/media/image.jpg
|
@@ -113,10 +140,9 @@ files:
|
|
113
140
|
- spec/fixtures/models/image.rb
|
114
141
|
- spec/fixtures/uploaders/uploader_with_exception.rb
|
115
142
|
- spec/has_media_spec.rb
|
116
|
-
- spec/spec.opts
|
117
143
|
- spec/spec_helper.rb
|
118
144
|
has_rdoc: true
|
119
|
-
homepage: http://github.com/
|
145
|
+
homepage: http://github.com/klacointe/has_media
|
120
146
|
licenses: []
|
121
147
|
|
122
148
|
post_install_message:
|
@@ -125,36 +151,40 @@ rdoc_options:
|
|
125
151
|
require_paths:
|
126
152
|
- lib
|
127
153
|
required_ruby_version: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
128
155
|
requirements:
|
129
156
|
- - ">="
|
130
157
|
- !ruby/object:Gem::Version
|
158
|
+
hash: 3
|
131
159
|
segments:
|
132
160
|
- 0
|
133
161
|
version: "0"
|
134
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
135
164
|
requirements:
|
136
165
|
- - ">="
|
137
166
|
- !ruby/object:Gem::Version
|
167
|
+
hash: 3
|
138
168
|
segments:
|
139
169
|
- 0
|
140
170
|
version: "0"
|
141
171
|
requirements: []
|
142
172
|
|
143
173
|
rubyforge_project:
|
144
|
-
rubygems_version: 1.3.
|
174
|
+
rubygems_version: 1.3.7
|
145
175
|
signing_key:
|
146
176
|
specification_version: 3
|
147
177
|
summary: Media Managment Library for ActiveRecord and Carrierwave
|
148
178
|
test_files:
|
149
179
|
- spec/spec_helper.rb
|
150
|
-
- spec/has_media_spec.rb
|
151
|
-
- spec/fixtures/uploaders/uploader_with_exception.rb
|
152
180
|
- spec/fixtures/models/image.rb
|
153
|
-
-
|
154
|
-
-
|
155
|
-
- examples/uploaders/video_uploader.rb
|
156
|
-
- examples/uploaders/audio_uploader.rb
|
181
|
+
- spec/fixtures/uploaders/uploader_with_exception.rb
|
182
|
+
- spec/has_media_spec.rb
|
157
183
|
- examples/models/image.rb
|
158
184
|
- examples/models/pdf.rb
|
159
185
|
- examples/models/audio.rb
|
160
186
|
- examples/models/video.rb
|
187
|
+
- examples/uploaders/pdf_uploader.rb
|
188
|
+
- examples/uploaders/audio_uploader.rb
|
189
|
+
- examples/uploaders/video_uploader.rb
|
190
|
+
- examples/uploaders/image_uploader.rb
|
/data/{spec/spec.opts → .rspec}
RENAMED
File without changes
|