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.
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: []