media_magick 0.2.0 → 0.3.0
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 +2 -1
- data/CHANGELOG.md +53 -1
- data/Gemfile +0 -2
- data/Guardfile +5 -0
- data/LICENSE +1 -1
- data/README.md +32 -22
- data/Rakefile +1 -13
- data/app/assets/javascripts/media_magick/plupload_it.js +54 -45
- data/app/controllers/media_magick/attach_controller.rb +6 -6
- data/app/helpers/media_magick/application_helper.rb +58 -48
- data/app/views/_loader.html.erb +14 -0
- data/app/views/_uploader.html.erb +13 -0
- data/app/views/_video_uploader.html.erb +2 -0
- data/config/locales/en.yml +1 -0
- data/gemfiles/mongoid-3.0.gemfile +1 -2
- data/lib/media_magick.rb +1 -1
- data/lib/media_magick/controller/helpers.rb +25 -5
- data/lib/media_magick/engine.rb +1 -1
- data/lib/media_magick/image/dimensions.rb +23 -0
- data/lib/media_magick/model.rb +22 -5
- data/lib/media_magick/version.rb +2 -2
- data/media_magick.gemspec +10 -13
- data/spec/controllers/media_magick/attach_controller_spec.rb +35 -21
- data/spec/dummy/app/assets/javascripts/store/products.js +2 -0
- data/spec/dummy/app/assets/stylesheets/store/products.css +4 -0
- data/spec/dummy/app/controllers/store/products_controller.rb +83 -0
- data/spec/dummy/app/helpers/store/products_helper.rb +2 -0
- data/spec/dummy/app/models/post.rb +1 -0
- data/spec/dummy/app/models/store/product.rb +10 -0
- data/spec/dummy/app/models/user.rb +3 -2
- data/spec/dummy/app/uploaders/post_uploader.rb +11 -3
- data/spec/dummy/app/views/posts/_form.html.erb +16 -5
- data/spec/dummy/app/views/posts/index.html.erb +1 -1
- data/spec/dummy/app/views/store/products/_form.html.erb +34 -0
- data/spec/dummy/app/views/store/products/edit.html.erb +6 -0
- data/spec/dummy/app/views/store/products/index.html.erb +21 -0
- data/spec/dummy/app/views/store/products/new.html.erb +5 -0
- data/spec/dummy/app/views/store/products/show.html.erb +5 -0
- data/spec/dummy/config/boot.rb +1 -1
- data/spec/dummy/config/environments/development.rb +2 -1
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/fixtures/example.jpg +0 -0
- data/spec/helpers/media_magick/application_helper_spec.rb +86 -33
- data/spec/lib/media_magick/controller/helper_spec.rb +40 -15
- data/spec/lib/media_magick/image/dimensions_spec.rb +62 -0
- data/spec/lib/media_magick/model_spec.rb +9 -3
- data/spec/views/_upload.html.erb_spec.rb +3 -3
- data/tmp/rspec_guard_result +1 -0
- metadata +52 -48
- data/app/views/_file.html.erb +0 -6
- data/app/views/_image.html.erb +0 -6
- data/app/views/_upload.html.erb +0 -12
- data/app/views/_video.html.erb +0 -8
@@ -0,0 +1,14 @@
|
|
1
|
+
<li class="attachment" id="<%= attachment.to_param %>" data-id="<%= attachment.to_param %>">
|
2
|
+
<% # smell %>
|
3
|
+
<% if attachment.file %>
|
4
|
+
<% if attachment.class::TYPE == "file" %>
|
5
|
+
<%= link_to attachment.filename, attachment.url, download: attachment.filename %>
|
6
|
+
<% else %>
|
7
|
+
<%= image_tag attachment.url, alt: attachment.filename %>
|
8
|
+
<% end %>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<%= link_to t('media_magick.remove'), "javascript://", method: "delete", class: "remove btn btn-mini btn-danger", data: { confirmation: t('media_magick.confirm_removal') } %>
|
12
|
+
|
13
|
+
<%= hidden_field_tag "#{model.parameterize}[#{relation.singularize}_ids][]", attachment.id if model && relation %>
|
14
|
+
</li>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div class="newAttachments ">
|
2
|
+
<ul class="attachmentQueue">
|
3
|
+
</ul>
|
4
|
+
|
5
|
+
<div class="dropAttachments">
|
6
|
+
</div>
|
7
|
+
<%= link_to "javascript://", class: "pickAttachments btn" do %>
|
8
|
+
<%= t('media_magick.select') %>
|
9
|
+
<% end %>
|
10
|
+
<%= link_to "javascript://", class: "uploadAttachments btn" do %>
|
11
|
+
<%= t('media_magick.upload') %>
|
12
|
+
<% end %>
|
13
|
+
</div>
|
data/config/locales/en.yml
CHANGED
data/lib/media_magick.rb
CHANGED
@@ -3,18 +3,38 @@ module MediaMagick
|
|
3
3
|
module Helpers
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
# {"embedded_in_model"=>"embedded_model",
|
7
|
-
# "embedded_in_id"=>"embedded_id", "model"=>"model",
|
6
|
+
# {"embedded_in_model"=>"embedded_model",
|
7
|
+
# "embedded_in_id"=>"embedded_id", "model"=>"model",
|
8
8
|
# "model_id"=>"id"
|
9
9
|
# }
|
10
10
|
def find_doc_by_params(params)
|
11
|
-
if params[:embedded_in_model].blank?
|
11
|
+
if params[:embedded_in_model].blank?
|
12
12
|
doc = params[:model].classify.constantize.find(params[:model_id])
|
13
13
|
else
|
14
|
-
doc = params[:embedded_in_model].classify.constantize.find(params[:embedded_in_id]).send(params[:model].pluralize.downcase).find(params[:model_id])
|
14
|
+
doc = params[:embedded_in_model].classify.constantize.find(params[:embedded_in_id]).send(params[:model].pluralize.downcase).find(params[:model_id])
|
15
15
|
end
|
16
16
|
doc
|
17
17
|
end
|
18
|
+
|
19
|
+
# Creates a video based on a url
|
20
|
+
#
|
21
|
+
# @example Creates a video for an user
|
22
|
+
# user = User.create
|
23
|
+
# params = {relation: "photo", video: "youtube.com/watch?v=FfUHkPf9D9k"}
|
24
|
+
# create_video(user, params)
|
25
|
+
#
|
26
|
+
# @param [ Mongoid::Document ] Mongoid document object
|
27
|
+
# @param [ Hash ] Hash with relation name and video url
|
28
|
+
#
|
29
|
+
# @return [ Mongoid::Document ] The mongoid document object
|
30
|
+
def create_video(obj, params)
|
31
|
+
relation_metadata = obj.class.relations[params[:relation]]
|
32
|
+
|
33
|
+
unless relation_metadata.many? # one
|
34
|
+
return obj.send("create_#{params[:relation]}", {video: params[:video]})
|
35
|
+
end
|
36
|
+
obj.send(params[:relation]).create(video: params[:video])
|
37
|
+
end
|
18
38
|
end
|
19
39
|
end
|
20
|
-
end
|
40
|
+
end
|
data/lib/media_magick/engine.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
module MediaMagick
|
2
|
+
module Image
|
3
|
+
module Dimensions
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def size
|
7
|
+
version_key = version_name.present? ? version_name : "_original"
|
8
|
+
|
9
|
+
begin
|
10
|
+
if model.dimensions[version_key.to_s].nil?
|
11
|
+
image = MiniMagick::Image.open(file.path)
|
12
|
+
model.dimensions[version_key.to_s] = {"width" => image[:width], "height" => image[:height]}
|
13
|
+
model.save
|
14
|
+
end
|
15
|
+
|
16
|
+
return model.dimensions[version_key.to_s]
|
17
|
+
rescue
|
18
|
+
return {"width" => 0, "height" => 0}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/media_magick/model.rb
CHANGED
@@ -8,11 +8,15 @@ module MediaMagick
|
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
10
|
module ClassMethods
|
11
|
+
# smell
|
11
12
|
def attaches_many(name, options = {})
|
12
13
|
attaches_block = block_given? ? Proc.new : nil
|
13
14
|
|
14
15
|
name_camelcase = create_attaches_class(name, options, attaches_block) do
|
15
|
-
|
16
|
+
if options[:allow_videos]
|
17
|
+
raise "name 'videos' not allowed" if name.to_s == "videos"
|
18
|
+
create_video_methods(name)
|
19
|
+
end
|
16
20
|
|
17
21
|
field :priority, type: Integer, default: 0
|
18
22
|
|
@@ -24,11 +28,15 @@ module MediaMagick
|
|
24
28
|
embeds_many(name, :as => :attachmentable, class_name: "#{self}#{name_camelcase}")
|
25
29
|
end
|
26
30
|
|
31
|
+
# smell
|
27
32
|
def attaches_one(name, options = {})
|
28
33
|
attaches_block = block_given? ? Proc.new : nil
|
29
34
|
|
30
35
|
name_camelcase = create_attaches_class(name, options, attaches_block) do
|
31
|
-
|
36
|
+
if options[:allow_videos]
|
37
|
+
raise "name 'video' not allowed" if name.to_s == "video"
|
38
|
+
create_video_methods(name)
|
39
|
+
end
|
32
40
|
|
33
41
|
embedded_in(name)
|
34
42
|
end
|
@@ -44,6 +52,7 @@ module MediaMagick
|
|
44
52
|
extend CarrierWave::Mount
|
45
53
|
|
46
54
|
field :type, type: String, default: options[:as] || 'image'
|
55
|
+
field :dimensions, type: Hash, default: {}
|
47
56
|
|
48
57
|
def self.create_video_methods(name)
|
49
58
|
field :video, type: String
|
@@ -53,13 +62,11 @@ module MediaMagick
|
|
53
62
|
super
|
54
63
|
|
55
64
|
video = MediaMagick::Video::Parser.new(url)
|
56
|
-
|
57
65
|
send(self.class::ATTACHMENT).store!(video.to_image) if video.valid?
|
58
66
|
end
|
59
67
|
|
60
68
|
def source(options = {})
|
61
69
|
video = MediaMagick::Video::Parser.new(self.video)
|
62
|
-
|
63
70
|
video.to_html(options) if video.valid?
|
64
71
|
end
|
65
72
|
end
|
@@ -80,10 +87,20 @@ module MediaMagick
|
|
80
87
|
end
|
81
88
|
|
82
89
|
name_camelcase = name.to_s.camelcase
|
83
|
-
|
90
|
+
|
91
|
+
# sets klass to a constant
|
92
|
+
# ProductImages = klass
|
93
|
+
constantize_embedded_klass(self, name_camelcase, klass)
|
84
94
|
|
85
95
|
return name_camelcase
|
86
96
|
end
|
97
|
+
|
98
|
+
def constantize_embedded_klass(klass_self, relation_name, embedded_klass)
|
99
|
+
parent = klass_self.parents.first # module or Object
|
100
|
+
embedded_klass_name = "#{klass_self.to_s.demodulize}#{relation_name}"
|
101
|
+
parent.const_set embedded_klass_name, embedded_klass
|
102
|
+
end
|
103
|
+
|
87
104
|
end
|
88
105
|
end
|
89
106
|
end
|
data/lib/media_magick/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module MediaMagick
|
2
|
-
VERSION = '0.
|
3
|
-
end
|
2
|
+
VERSION = '0.3.0'
|
3
|
+
end
|
data/media_magick.gemspec
CHANGED
@@ -14,19 +14,16 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.name = 'media_magick'
|
15
15
|
gem.require_paths = ['lib']
|
16
16
|
gem.version = MediaMagick::VERSION
|
17
|
-
|
18
|
-
gem.add_dependency 'carrierwave', '~> 0.
|
19
|
-
gem.add_dependency 'mongoid', '>= 2.
|
17
|
+
|
18
|
+
gem.add_dependency 'carrierwave', '~> 0.8.0'
|
19
|
+
gem.add_dependency 'mongoid', '>= 2.7.0'
|
20
20
|
gem.add_dependency 'plupload-rails', '~> 1.0.6'
|
21
21
|
gem.add_dependency 'rails', '~> 3.2.0'
|
22
|
-
|
23
|
-
gem.add_development_dependency 'bson_ext', '~> 1.7.0'
|
24
|
-
gem.add_development_dependency 'mini_magick', '~> 3.4'
|
25
|
-
gem.add_development_dependency 'rake', '~> 0.9'
|
26
|
-
gem.add_development_dependency 'rspec-rails', '~> 2.11.0'
|
27
|
-
gem.add_development_dependency 'simplecov', '~> 0.7.0'
|
22
|
+
gem.add_dependency 'mini_magick', '~> 3.6.0'
|
28
23
|
|
29
|
-
|
30
|
-
gem.add_development_dependency '
|
31
|
-
gem.add_development_dependency '
|
32
|
-
|
24
|
+
gem.add_development_dependency 'rake', '~> 10.1.0'
|
25
|
+
gem.add_development_dependency 'rspec-rails', '~> 2.13.2'
|
26
|
+
gem.add_development_dependency 'simplecov', '~> 0.7.1'
|
27
|
+
gem.add_development_dependency 'guard-rspec', '~> 3.0.2'
|
28
|
+
gem.add_development_dependency 'rb-fsevent', '~> 0.9.3'
|
29
|
+
end
|
@@ -12,23 +12,10 @@ describe MediaMagick::AttachController do
|
|
12
12
|
post :create, { model: 'Album', id: album.id, relation: 'photos', file: fixture_file_upload("#{File.expand_path('../../..', __FILE__)}/support/fixtures/nu.jpg") }
|
13
13
|
}.to change { album.reload.photos.count }.by(1)
|
14
14
|
|
15
|
-
response.should render_template('
|
16
|
-
|
15
|
+
response.should render_template('_loader')
|
17
16
|
response.body.should =~ /nu.jpg/m
|
18
17
|
end
|
19
18
|
|
20
|
-
it "creates a new video" do
|
21
|
-
album = Album.create
|
22
|
-
|
23
|
-
expect {
|
24
|
-
post :create, { model: 'Album', id: album.id, relation: 'photos_and_videos', video: 'youtube.com/watch?v=FfUHkPf9D9k' }
|
25
|
-
}.to change { album.reload.photos_and_videos.count }.by(1)
|
26
|
-
|
27
|
-
response.should render_template('_image')
|
28
|
-
|
29
|
-
response.body.should =~ /FfUHkPf9D9k/m
|
30
|
-
end
|
31
|
-
|
32
19
|
it "creates a new photo for embedded models" do
|
33
20
|
album = Album.create
|
34
21
|
track = album.tracks.create
|
@@ -37,16 +24,43 @@ describe MediaMagick::AttachController do
|
|
37
24
|
post :create, { embedded_in_id: album.id, embedded_in_model: 'Album', model: 'Track', id: track.id, relation: 'files', file: fixture_file_upload("#{File.expand_path('../../..', __FILE__)}/support/fixtures/nu.jpg") }
|
38
25
|
}.to change { track.reload.files.count }.by(1)
|
39
26
|
|
40
|
-
response.should render_template('
|
41
|
-
|
27
|
+
response.should render_template('_loader')
|
42
28
|
response.body.should =~ /nu.jpg/m
|
43
29
|
end
|
44
30
|
|
45
|
-
it "
|
31
|
+
it "renders a custom partial" do
|
46
32
|
album = Album.create
|
47
|
-
post :create, { model: 'Album', id: album.id, relation: 'photos',
|
33
|
+
post :create, { model: 'Album', id: album.id, relation: 'photos', loader_partial: 'albums/photo', file: fixture_file_upload("#{File.expand_path('../../..', __FILE__)}/support/fixtures/nu.jpg") }
|
48
34
|
response.should render_template('albums/_photo')
|
49
35
|
end
|
36
|
+
|
37
|
+
describe "creating videos" do
|
38
|
+
context "relation is attaches many" do
|
39
|
+
it "creates a new video" do
|
40
|
+
album = Album.create
|
41
|
+
|
42
|
+
expect {
|
43
|
+
post :create, { model: 'Album', id: album.id, relation: 'photos_and_videos', video: 'youtube.com/watch?v=FfUHkPf9D9k' }
|
44
|
+
}.to change { album.reload.photos_and_videos.count }.by(1)
|
45
|
+
|
46
|
+
response.should render_template('_loader')
|
47
|
+
response.body.should =~ /FfUHkPf9D9k/m
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "relation is attaches one" do
|
52
|
+
it "creates a new video" do
|
53
|
+
user = User.create
|
54
|
+
video_url = 'youtube.com/watch?v=FfUHkPf9D9k'
|
55
|
+
|
56
|
+
post :create, { model: 'User', id: user.id, relation: 'photo_and_video', video: video_url }
|
57
|
+
|
58
|
+
user.reload.photo_and_video.video.should eq(video_url)
|
59
|
+
response.should render_template('_loader')
|
60
|
+
response.body.should =~ /FfUHkPf9D9k/m
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
50
64
|
end
|
51
65
|
end
|
52
66
|
|
@@ -102,8 +116,8 @@ describe MediaMagick::AttachController do
|
|
102
116
|
end
|
103
117
|
end
|
104
118
|
|
105
|
-
describe "
|
106
|
-
it "
|
119
|
+
describe "recreate versions" do
|
120
|
+
it "recreate images versions" do
|
107
121
|
album = Album.create
|
108
122
|
|
109
123
|
request.env["HTTP_REFERER"] = "/"
|
@@ -112,7 +126,7 @@ describe MediaMagick::AttachController do
|
|
112
126
|
response.status.should be(302)
|
113
127
|
end
|
114
128
|
|
115
|
-
it "
|
129
|
+
it "recreate images versions for embedded models" do
|
116
130
|
album = Album.create
|
117
131
|
track = album.tracks.create
|
118
132
|
|
@@ -0,0 +1,83 @@
|
|
1
|
+
class Store::ProductsController < ApplicationController
|
2
|
+
# GET /store/products
|
3
|
+
# GET /store/products.json
|
4
|
+
def index
|
5
|
+
@store_products = Store::Product.all
|
6
|
+
|
7
|
+
respond_to do |format|
|
8
|
+
format.html # index.html.erb
|
9
|
+
format.json { render json: @store_products }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# GET /store/products/1
|
14
|
+
# GET /store/products/1.json
|
15
|
+
def show
|
16
|
+
@store_product = Store::Product.find(params[:id])
|
17
|
+
|
18
|
+
respond_to do |format|
|
19
|
+
format.html # show.html.erb
|
20
|
+
format.json { render json: @store_product }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# GET /store/products/new
|
25
|
+
# GET /store/products/new.json
|
26
|
+
def new
|
27
|
+
@store_product = Store::Product.new
|
28
|
+
|
29
|
+
respond_to do |format|
|
30
|
+
format.html # new.html.erb
|
31
|
+
format.json { render json: @store_product }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# GET /store/products/1/edit
|
36
|
+
def edit
|
37
|
+
@store_product = Store::Product.find(params[:id])
|
38
|
+
end
|
39
|
+
|
40
|
+
# POST /store/products
|
41
|
+
# POST /store/products.json
|
42
|
+
def create
|
43
|
+
@store_product = Store::Product.new(params[:store_product])
|
44
|
+
|
45
|
+
respond_to do |format|
|
46
|
+
if @store_product.save
|
47
|
+
format.html { redirect_to @store_product, notice: 'Product was successfully created.' }
|
48
|
+
format.json { render json: @store_product, status: :created, location: @store_product }
|
49
|
+
else
|
50
|
+
format.html { render action: "new" }
|
51
|
+
format.json { render json: @store_product.errors, status: :unprocessable_entity }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# PUT /store/products/1
|
57
|
+
# PUT /store/products/1.json
|
58
|
+
def update
|
59
|
+
@store_product = Store::Product.find(params[:id])
|
60
|
+
|
61
|
+
respond_to do |format|
|
62
|
+
if @store_product.update_attributes(params[:store_product])
|
63
|
+
format.html { redirect_to @store_product, notice: 'Product was successfully updated.' }
|
64
|
+
format.json { head :no_content }
|
65
|
+
else
|
66
|
+
format.html { render action: "edit" }
|
67
|
+
format.json { render json: @store_product.errors, status: :unprocessable_entity }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# DELETE /store/products/1
|
73
|
+
# DELETE /store/products/1.json
|
74
|
+
def destroy
|
75
|
+
@store_product = Store::Product.find(params[:id])
|
76
|
+
@store_product.destroy
|
77
|
+
|
78
|
+
respond_to do |format|
|
79
|
+
format.html { redirect_to store_products_url }
|
80
|
+
format.json { head :no_content }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|