paperclip-meta 0.3.1 → 0.4.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 +1 -0
- data/.travis.yml +7 -0
- data/README.rdoc +2 -1
- data/init.rb +4 -2
- data/lib/paperclip-meta.rb +2 -89
- data/lib/paperclip-meta/attachment.rb +99 -0
- data/lib/paperclip-meta/railtie.rb +24 -0
- data/lib/paperclip-meta/version.rb +1 -1
- data/paperclip-meta.gemspec +1 -0
- data/spec/paperclip-meta/paperclip-meta_spec.rb +23 -0
- data/spec/spec_helper.rb +1 -0
- metadata +28 -14
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.rdoc
CHANGED
data/init.rb
CHANGED
data/lib/paperclip-meta.rb
CHANGED
@@ -1,91 +1,4 @@
|
|
1
1
|
require "paperclip"
|
2
2
|
require "paperclip-meta/version"
|
3
|
-
|
4
|
-
|
5
|
-
module Meta
|
6
|
-
# TODO: Move most of paperclip-meta crap here.
|
7
|
-
end
|
8
|
-
|
9
|
-
# TODO: Make paperclip-meta less monkey-style.
|
10
|
-
class Attachment
|
11
|
-
alias :original_post_process_styles :post_process_styles
|
12
|
-
alias :original_save :save
|
13
|
-
|
14
|
-
# If attachment deleted - destroy meta data
|
15
|
-
def save
|
16
|
-
if (not @queued_for_delete.empty?) and @queued_for_write.empty?
|
17
|
-
instance_write(:meta, meta_encode({})) if instance.respond_to?(:"#{name}_meta=")
|
18
|
-
end
|
19
|
-
original_save
|
20
|
-
end
|
21
|
-
|
22
|
-
# If model has #{name}_meta column we getting sizes of processed
|
23
|
-
# thumbnails and saving it to #{name}_meta column.
|
24
|
-
def post_process_styles(*style_args)
|
25
|
-
# Check arity of :original_post_process_styles to maintain compatibility with
|
26
|
-
# Paperclip 2.3.9 and older.
|
27
|
-
method(:original_post_process_styles).arity == 0 ? original_post_process_styles : original_post_process_styles(*style_args)
|
28
|
-
|
29
|
-
if instance.respond_to?(:"#{name}_meta=")
|
30
|
-
meta = {}
|
31
|
-
|
32
|
-
@queued_for_write.each do |style, file|
|
33
|
-
begin
|
34
|
-
geo = Geometry.from_file file
|
35
|
-
meta[style] = {:width => geo.width.to_i, :height => geo.height.to_i, :size => File.size(file) }
|
36
|
-
rescue NotIdentifiedByImageMagickError => e
|
37
|
-
meta[style] = {}
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
instance_write(:meta, meta_encode(meta))
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Define meta accessors methods
|
46
|
-
[:width, :height, :size].each do |meth|
|
47
|
-
define_method(meth) do |*args|
|
48
|
-
style = args.first || default_style
|
49
|
-
meta_read(style, meth)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# Returns image dimesions ("WxH") for given style name. If style name not given,
|
54
|
-
# returns dimesions for default_style.
|
55
|
-
def image_size(style = default_style)
|
56
|
-
"#{width(style)}x#{height(style)}"
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
# Returns meta data for given style
|
61
|
-
def meta_read(style, item)
|
62
|
-
if instance.respond_to?(:"#{name}_meta") && instance_read(:meta)
|
63
|
-
if meta = meta_decode(instance_read(:meta))
|
64
|
-
meta.key?(style) ? meta[style][item] : nil
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# Return encoded metadata as String
|
70
|
-
def meta_encode(meta)
|
71
|
-
# Use Base64 class if aviliable, to prevent
|
72
|
-
# ActiveSupport deprecation warnings.
|
73
|
-
if Module.const_defined? "Base64"
|
74
|
-
::Base64.encode64(Marshal.dump(meta))
|
75
|
-
else
|
76
|
-
ActiveSupport::Base64.encode64(Marshal.dump(meta))
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# Return decoded metadata as Object
|
81
|
-
def meta_decode(meta)
|
82
|
-
# Use Base64 class if aviliable, to prevent
|
83
|
-
# ActiveSupport deprecation warnings.
|
84
|
-
if Module.const_defined? "Base64"
|
85
|
-
Marshal.load(::Base64.decode64(meta))
|
86
|
-
else
|
87
|
-
Marshal.load(ActiveSupport::Base64.decode64(meta))
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
3
|
+
require 'paperclip-meta/railtie'
|
4
|
+
require 'paperclip-meta/attachment'
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Paperclip
|
2
|
+
module Meta
|
3
|
+
module Attachment
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.send :include, InstanceMethods
|
7
|
+
base.alias_method_chain :save, :meta_data
|
8
|
+
base.alias_method_chain :post_process_styles, :meta_data
|
9
|
+
base.alias_method_chain :size, :meta_data
|
10
|
+
end
|
11
|
+
|
12
|
+
module InstanceMethods
|
13
|
+
|
14
|
+
def save_with_meta_data
|
15
|
+
if (not @queued_for_delete.empty?) and @queued_for_write.empty?
|
16
|
+
instance_write(:meta, meta_encode({})) if instance.respond_to?(:"#{name}_meta=")
|
17
|
+
end
|
18
|
+
save_without_meta_data
|
19
|
+
end
|
20
|
+
|
21
|
+
def post_process_styles_with_meta_data(*style_args)
|
22
|
+
post_process_styles_without_meta_data(*style_args)
|
23
|
+
|
24
|
+
if instance.respond_to?(:"#{name}_meta=")
|
25
|
+
meta = {}
|
26
|
+
@queued_for_write.each do |style, file|
|
27
|
+
begin
|
28
|
+
geo = Geometry.from_file file
|
29
|
+
meta[style] = {:width => geo.width.to_i, :height => geo.height.to_i, :size => File.size(file) }
|
30
|
+
rescue NotIdentifiedByImageMagickError => e
|
31
|
+
meta[style] = {}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
unless meta == {}
|
36
|
+
instance.send("#{name}_meta=", meta_encode(meta))
|
37
|
+
instance.class.update_all({ "#{name}_meta" => meta_encode(meta) }, instance.class.primary_key => instance.id)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
#Use meta info for style if required
|
43
|
+
def size_with_meta_data(passed_style = nil)
|
44
|
+
passed_style ? meta_read(passed_style, :size) : size_without_meta_data
|
45
|
+
end
|
46
|
+
|
47
|
+
# Define meta accessors methods
|
48
|
+
[:width, :height ].each do |meth|
|
49
|
+
define_method(meth) do |*args|
|
50
|
+
style = args.first || default_style
|
51
|
+
meta_read(style, meth)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns image dimesions ("WxH") for given style name. If style name not given,
|
56
|
+
# returns dimesions for default_style.
|
57
|
+
def image_size(style = default_style)
|
58
|
+
"#{width(style)}x#{height(style)}"
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
# Returns meta data for given style
|
64
|
+
def meta_read(style, item)
|
65
|
+
if instance.respond_to?(:"#{name}_meta") && instance_read(:meta)
|
66
|
+
if meta = meta_decode(instance_read(:meta))
|
67
|
+
meta.key?(style) ? meta[style][item] : nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Return encoded metadata as String
|
73
|
+
def meta_encode(meta)
|
74
|
+
# Use Base64 class if aviliable, to prevent
|
75
|
+
# ActiveSupport deprecation warnings.
|
76
|
+
if Module.const_defined? "Base64"
|
77
|
+
::Base64.encode64(Marshal.dump(meta))
|
78
|
+
else
|
79
|
+
ActiveSupport::Base64.encode64(Marshal.dump(meta))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Return decoded metadata as Object
|
84
|
+
def meta_decode(meta)
|
85
|
+
# Use Base64 class if aviliable, to prevent
|
86
|
+
# ActiveSupport deprecation warnings.
|
87
|
+
if Module.const_defined? "Base64"
|
88
|
+
Marshal.load(::Base64.decode64(meta))
|
89
|
+
else
|
90
|
+
Marshal.load(ActiveSupport::Base64.decode64(meta))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'paperclip-meta'
|
2
|
+
|
3
|
+
module Paperclip
|
4
|
+
module Meta
|
5
|
+
|
6
|
+
if defined? Rails::Railtie
|
7
|
+
require 'rails'
|
8
|
+
class Railtie < Rails::Railtie
|
9
|
+
initializer 'paperclip_meta.insert_into_active_record' do
|
10
|
+
ActiveSupport.on_load :active_record do
|
11
|
+
Paperclip::Meta::Railtie.insert
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Railtie
|
18
|
+
def self.insert
|
19
|
+
Paperclip::Attachment.send(:include, Paperclip::Meta::Attachment)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/paperclip-meta.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
# Development depensencies
|
22
22
|
s.add_development_dependency "bundler", ">= 1.0.0"
|
23
|
+
s.add_development_dependency "rake"
|
23
24
|
s.add_development_dependency "paperclip"
|
24
25
|
s.add_development_dependency "rspec"
|
25
26
|
s.add_development_dependency "activerecord"
|
@@ -33,6 +33,28 @@ describe "Geometry saver plugin" do
|
|
33
33
|
img.big_image.height(:small).should == 100
|
34
34
|
end
|
35
35
|
|
36
|
+
describe 'file size' do
|
37
|
+
before do
|
38
|
+
@image = Image.new
|
39
|
+
@image.big_image = @big_image
|
40
|
+
@image.save!
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should save file size with meta data ' do
|
44
|
+
@image.big_image.size(:small).should == 3526
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should access normal paperclip method when no style passed' do
|
48
|
+
@image.big_image.should_receive(:size_without_meta_data).once.and_return(1234)
|
49
|
+
@image.big_image.size.should == 1234
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should have access to original file size' do
|
53
|
+
@image.big_image.size.should == 37042
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
36
58
|
it "clears geometry fields when image is destroyed" do
|
37
59
|
img = Image.new
|
38
60
|
img.small_image = @small_image
|
@@ -53,4 +75,5 @@ describe "Geometry saver plugin" do
|
|
53
75
|
lambda { img.save! }.should_not raise_error
|
54
76
|
img.small_image.width(:small).should be_nil
|
55
77
|
end
|
78
|
+
|
56
79
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paperclip-meta
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
16
|
-
requirement: &
|
16
|
+
requirement: &70335412175260 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: 1.0.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70335412175260
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70335412173700 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70335412173700
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: paperclip
|
27
|
-
requirement: &
|
38
|
+
requirement: &70335412172380 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: '0'
|
33
44
|
type: :development
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70335412172380
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: rspec
|
38
|
-
requirement: &
|
49
|
+
requirement: &70335412171460 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,10 +54,10 @@ dependencies:
|
|
43
54
|
version: '0'
|
44
55
|
type: :development
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70335412171460
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: activerecord
|
49
|
-
requirement: &
|
60
|
+
requirement: &70335412170640 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: '0'
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70335412170640
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: sqlite3-ruby
|
60
|
-
requirement: &
|
71
|
+
requirement: &70335412169360 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70335412169360
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: paperclip
|
71
|
-
requirement: &
|
82
|
+
requirement: &70335412168500 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,7 +87,7 @@ dependencies:
|
|
76
87
|
version: '0'
|
77
88
|
type: :runtime
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70335412168500
|
80
91
|
description: Add width, height and size methods to paperclip thumbnails
|
81
92
|
email:
|
82
93
|
- y8@ya.ru
|
@@ -86,12 +97,15 @@ extra_rdoc_files: []
|
|
86
97
|
files:
|
87
98
|
- .gitignore
|
88
99
|
- .rspec
|
100
|
+
- .travis.yml
|
89
101
|
- Gemfile
|
90
102
|
- Gemfile.lock
|
91
103
|
- README.rdoc
|
92
104
|
- Rakefile
|
93
105
|
- init.rb
|
94
106
|
- lib/paperclip-meta.rb
|
107
|
+
- lib/paperclip-meta/attachment.rb
|
108
|
+
- lib/paperclip-meta/railtie.rb
|
95
109
|
- lib/paperclip-meta/version.rb
|
96
110
|
- paperclip-meta.gemspec
|
97
111
|
- spec/fixtures/big.jpg
|