chrisjm-paperclip-meta 0.1
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/README.rdoc +54 -0
- data/Rakefile +34 -0
- data/init.rb +1 -0
- data/lib/paperclip-meta.rb +65 -0
- metadata +127 -0
data/README.rdoc
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
=Paperclip Meta
|
2
|
+
|
3
|
+
Simple gem to let paperclip play nice with thumbnails width, height and size.
|
4
|
+
|
5
|
+
Paperclip Meta will get image dimensions right after post_process_styles using paperclips own Geometry.from_file. This should make paperclip-meta storage independent.
|
6
|
+
|
7
|
+
==Quick Start
|
8
|
+
|
9
|
+
Add paperclip-meta to Gemfile:
|
10
|
+
|
11
|
+
gem 'paperclip-meta'
|
12
|
+
|
13
|
+
Create migration:
|
14
|
+
|
15
|
+
class AddMetaToAvatar < ActiveRecord::Migration
|
16
|
+
def self.up
|
17
|
+
add_column :users, :avatar_meta, :text
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.down
|
21
|
+
remove_column :users, :avatar_meta
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Rebuild all thumbnails to fill meta column if you already have some attachments.
|
26
|
+
|
27
|
+
Now you can use meta-magic:
|
28
|
+
|
29
|
+
<%= image_tag @user.avatar.url, :size => @user.avatar.image_size %>
|
30
|
+
<%= image_tag @user.avatar.url(:medium), :size => @user.avatar.image_size(:medium) %>
|
31
|
+
<%= image_tag @user.avatar.url(:thumb), :size => @user.avatar.image_size(:thumb) %>
|
32
|
+
|
33
|
+
==Internals
|
34
|
+
|
35
|
+
Meta column is simple hash:
|
36
|
+
|
37
|
+
:style => {
|
38
|
+
:width => 100,
|
39
|
+
:height => 100,
|
40
|
+
:size => 42000
|
41
|
+
}
|
42
|
+
|
43
|
+
This hash will be marshaled and base64 encoded before writing to model attribute.
|
44
|
+
|
45
|
+
Meta methods provided:
|
46
|
+
- width
|
47
|
+
- height
|
48
|
+
- size
|
49
|
+
|
50
|
+
You can pass thumbnail style to all this methods. If style not passed, default_style will be used.
|
51
|
+
|
52
|
+
==TODO
|
53
|
+
|
54
|
+
* It will be nice to write some tests. :D
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rspec/core'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
task :default => :spec
|
8
|
+
|
9
|
+
begin
|
10
|
+
include_files = ["README*", "LICENSE", "Rakefile", "init.rb", "{lib,test}/**/*"].map do |glob|
|
11
|
+
Dir[glob]
|
12
|
+
end.flatten
|
13
|
+
|
14
|
+
require "jeweler"
|
15
|
+
Jeweler::Tasks.new do |s|
|
16
|
+
s.name = "chrisjm-paperclip-meta"
|
17
|
+
s.version = "0.1"
|
18
|
+
s.author = "Alexey Bondar"
|
19
|
+
s.email = "y8@ya.ru"
|
20
|
+
s.homepage = "http://github.com/y8/paperclip-meta"
|
21
|
+
s.description = "Add width, height and size methods to paperclip thumbnails, with SWF support"
|
22
|
+
s.summary = "Dimensions for paperclip"
|
23
|
+
s.platform = Gem::Platform::RUBY
|
24
|
+
s.files = include_files
|
25
|
+
s.require_path = "lib"
|
26
|
+
s.has_rdoc = false
|
27
|
+
s.add_dependency 'paperclip'
|
28
|
+
s.add_dependency 'swf_file'
|
29
|
+
end
|
30
|
+
|
31
|
+
Jeweler::GemcutterTasks.new
|
32
|
+
rescue LoadError
|
33
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
34
|
+
end
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "lib", "paperclip-meta")
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Paperclip
|
2
|
+
class Attachment
|
3
|
+
alias :original_post_process_styles :post_process_styles
|
4
|
+
alias :original_save :save
|
5
|
+
|
6
|
+
# If attachment deleted - destroy meta data
|
7
|
+
def save
|
8
|
+
if (not @queued_for_delete.empty?) and @queued_for_write.empty?
|
9
|
+
instance_write(:meta, ActiveSupport::Base64.encode64(Marshal.dump({}))) if instance.respond_to?(:"#{name}_meta=")
|
10
|
+
end
|
11
|
+
original_save
|
12
|
+
end
|
13
|
+
|
14
|
+
# If model has #{name}_meta column we getting sizes of processed
|
15
|
+
# thumbnails and saving it to #{name}_meta column.
|
16
|
+
def post_process_styles
|
17
|
+
original_post_process_styles
|
18
|
+
|
19
|
+
if instance.respond_to?(:"#{name}_meta=")
|
20
|
+
meta = {}
|
21
|
+
|
22
|
+
@queued_for_write.each do |style, file|
|
23
|
+
if File.extname(file) == 'swf'
|
24
|
+
begin
|
25
|
+
header = SwfFile::FlashFile.header file
|
26
|
+
meta[style] = {:width => header.width.to_i, :height => header.height.to_i, :size => File.size(file) }
|
27
|
+
rescue SwfFileHeaderError => e
|
28
|
+
meta[style] = {}
|
29
|
+
end
|
30
|
+
else
|
31
|
+
begin
|
32
|
+
geo = Geometry.from_file file
|
33
|
+
meta[style] = {:width => geo.width.to_i, :height => geo.height.to_i, :size => File.size(file) }
|
34
|
+
rescue NotIdentifiedByImageMagickError => e
|
35
|
+
meta[style] = {}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
instance_write(:meta, ActiveSupport::Base64.encode64(Marshal.dump(meta)))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Meta access methods
|
45
|
+
[:width, :height, :size].each do |meth|
|
46
|
+
define_method(meth) do |*args|
|
47
|
+
style = args.first || default_style
|
48
|
+
meta_read(style, meth)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def image_size(style = default_style)
|
53
|
+
"#{width(style)}x#{height(style)}"
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
def meta_read(style, item)
|
58
|
+
if instance.respond_to?(:"#{name}_meta") && instance_read(:meta)
|
59
|
+
if meta = Marshal.load(ActiveSupport::Base64.decode64(instance_read(:meta)))
|
60
|
+
meta.key?(style) ? meta[style][item] : nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: chrisjm-paperclip-meta
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Alexey Bondar
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-08 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: &70149667490100 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70149667490100
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: sqlite3-ruby
|
27
|
+
requirement: &70149667487680 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70149667487680
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: paperclip
|
38
|
+
requirement: &70149667484860 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70149667484860
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: swf_file
|
49
|
+
requirement: &70149667481740 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70149667481740
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rspec
|
60
|
+
requirement: &70149667479320 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70149667479320
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: paperclip
|
71
|
+
requirement: &70149667468260 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70149667468260
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: swf_file
|
82
|
+
requirement: &70149667466320 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70149667466320
|
91
|
+
description: Add width, height and size methods to paperclip thumbnails, with SWF
|
92
|
+
support
|
93
|
+
email: y8@ya.ru
|
94
|
+
executables: []
|
95
|
+
extensions: []
|
96
|
+
extra_rdoc_files:
|
97
|
+
- README.rdoc
|
98
|
+
files:
|
99
|
+
- README.rdoc
|
100
|
+
- Rakefile
|
101
|
+
- init.rb
|
102
|
+
- lib/paperclip-meta.rb
|
103
|
+
homepage: http://github.com/y8/paperclip-meta
|
104
|
+
licenses: []
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ! '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
requirements: []
|
122
|
+
rubyforge_project:
|
123
|
+
rubygems_version: 1.8.10
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: Dimensions for paperclip
|
127
|
+
test_files: []
|