chrisjm-paperclip-meta 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/README.rdoc +54 -0
  2. data/Rakefile +34 -0
  3. data/init.rb +1 -0
  4. data/lib/paperclip-meta.rb +65 -0
  5. 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: []