paperclip-globalize3 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
3
  - 1.9.2
5
4
  - 1.9.3
6
- - ree
7
5
  script: "bundle exec rake spec"
8
6
  gemfile:
9
7
  - gemfiles/rails_3.0.gemfile
data/README.md CHANGED
@@ -10,7 +10,9 @@ Note that this implementation patches some methods in the `Paperclip::Attachment
10
10
 
11
11
  ## Compatibility
12
12
 
13
- Currently, paperclip 2.x (>= 2.5) and globalize3 0.3 are supported. Support for paperclip 3.x is planned.
13
+ Currently, paperclip 3.x (>= 3.3) and globalize3 0.3 are supported.
14
+
15
+ For paperclip 2.x support please use the 0.x versions of this gem.
14
16
 
15
17
  ## Installation
16
18
 
@@ -46,7 +48,6 @@ Example:
46
48
 
47
49
  ## Todo / Future Plans
48
50
 
49
- * Support paperclip 3.x
50
51
  * Make it easier to specify translated attachments, e.g. using one of these options:
51
52
  * support `translates :attachment_name`
52
53
  * support `:translated` option for `has_attached_file`
@@ -6,4 +6,8 @@ require "paperclip"
6
6
 
7
7
  Paperclip.interpolates(:locale) { |_, _| Globalize.locale.to_s }
8
8
 
9
+ unless Paperclip::Attachment.instance_methods.include?(:only_process)
10
+ Paperclip::Attachment.send(:include, Paperclip::Globalize3::Attachment::Compatibility::Paperclip33)
11
+ end
12
+
9
13
  Paperclip::Attachment.send(:include, Paperclip::Globalize3::Attachment)
@@ -4,94 +4,94 @@ module Paperclip
4
4
 
5
5
  def self.included(base)
6
6
  base.send :include, InstanceMethods
7
- base.send :alias_method_chain, :instance_write, :globalize3
8
- base.send :alias_method_chain, :instance_read, :globalize3
9
7
  base.send :alias_method_chain, :assign, :globalize3
10
8
  base.send :alias_method_chain, :clear, :globalize3
11
- base.send :alias_method_chain, :queue_existing_for_delete, :globalize3
9
+ base.send :alias_method_chain, :queue_all_for_delete, :globalize3
10
+ base.send :alias_method_chain, :queue_some_for_delete, :globalize3
12
11
  end
13
12
 
14
13
  module InstanceMethods
15
14
 
16
- # use a localized cache if required
17
- def cached_instance_variable_name(getter)
18
- if instance.respond_to?(:translated?) && instance.translated?(getter.to_sym)
19
- :"@_#{getter}_#{Globalize.locale}"
20
- else
21
- :"@_#{getter}"
22
- end
23
- end
24
-
25
- def instance_write_with_globalize3(attr, value)
26
- setter = :"#{name}_#{attr}="
27
- responds = instance.respond_to?(setter)
28
- self.instance_variable_set(cached_instance_variable_name(setter.to_s.chop), value)
29
- instance.send(setter, value) if responds || attr.to_s == "file_name"
30
- end
31
-
32
- def instance_read_with_globalize3(attr)
33
- getter = :"#{name}_#{attr}"
34
- responds = instance.respond_to?(getter)
35
- cached = self.instance_variable_get(cached_instance_variable_name(getter))
36
- return cached if cached
37
- instance.send(getter) if responds || attr.to_s == "file_name"
38
- end
39
-
40
15
  def assign_with_globalize3(uploaded_file)
41
16
  ensure_required_accessors!
17
+ file = Paperclip.io_adapters.for(uploaded_file)
42
18
 
43
- if uploaded_file.is_a?(Paperclip::Attachment)
44
- uploaded_filename = uploaded_file.original_filename
45
- uploaded_file = uploaded_file.to_file(:original)
46
- close_uploaded_file = uploaded_file.respond_to?(:close)
47
- else
48
- instance_write(:uploaded_file, uploaded_file) if uploaded_file
49
- end
50
-
51
- return nil unless valid_assignment?(uploaded_file)
19
+ self.clear(*only_process, :locales => Globalize.locale) # [paperclip-globalize3] only clear current locale
20
+ return nil if file.nil?
52
21
 
53
- uploaded_file.binmode if uploaded_file.respond_to? :binmode
54
- self.clear(Globalize.locale) # [paperclip-globalize3] only clear current locale
55
-
56
- return nil if uploaded_file.nil?
57
-
58
- uploaded_filename ||= uploaded_file.original_filename
59
- stores_fingerprint = @instance.respond_to?("#{name}_fingerprint".to_sym)
60
- @queued_for_write[:original] = to_tempfile(uploaded_file)
61
- instance_write(:file_name, cleanup_filename(uploaded_filename.strip))
62
- instance_write(:content_type, uploaded_file.content_type.to_s.strip)
63
- instance_write(:file_size, uploaded_file.size.to_i)
64
- instance_write(:fingerprint, generate_fingerprint(uploaded_file)) if stores_fingerprint
22
+ @queued_for_write[:original] = file
23
+ instance_write(:file_name, cleanup_filename(file.original_filename))
24
+ instance_write(:content_type, file.content_type.to_s.strip)
25
+ instance_write(:file_size, file.size)
26
+ instance_write(:fingerprint, file.fingerprint) if instance_respond_to?(:fingerprint)
27
+ instance_write(:created_at, Time.now) if has_enabled_but_unset_created_at?
65
28
  instance_write(:updated_at, Time.now)
66
29
 
67
30
  @dirty = true
68
31
 
69
- post_process(*@options[:only_process]) if post_processing
32
+ if post_processing &&
33
+ (Paperclip::Attachment.instance_method(:valid_assignment?).parameters.present? || # paperclip <=3.3 compatibility
34
+ valid_assignment?)
35
+ post_process(*only_process)
36
+ end
70
37
 
71
- # Reset the file size if the original file was reprocessed.
72
- instance_write(:file_size, @queued_for_write[:original].size.to_i)
73
- instance_write(:fingerprint, generate_fingerprint(@queued_for_write[:original])) if stores_fingerprint
74
- ensure
75
- uploaded_file.close if close_uploaded_file
38
+ instance_write(:file_size, @queued_for_write[:original].size)
39
+ instance_write(:fingerprint, @queued_for_write[:original].fingerprint) if instance_respond_to?(:fingerprint)
40
+ updater = :"#{name}_file_name_will_change!"
41
+ instance.send updater if instance.respond_to? updater
76
42
  end
77
43
 
78
44
 
79
- def clear_with_globalize3(with_locales = nil)
80
- queue_existing_for_delete(with_locales)
81
- @queued_for_write = {}
82
- @errors = {}
45
+ def clear_with_globalize3(*args)
46
+ options = args.extract_options!
47
+ styles_to_clear = args
48
+ if styles_to_clear.any?
49
+ queue_some_for_delete(*styles_to_clear, options)
50
+ else
51
+ queue_all_for_delete(options)
52
+ @queued_for_write = {}
53
+ @errors = {}
54
+ end
83
55
  end
84
56
 
85
57
  private
86
58
 
87
- def queue_existing_for_delete_with_globalize3(with_locales = nil) #:nodoc:
59
+ def queue_all_for_delete_with_globalize3(options = {}) #:nodoc:
60
+ with_locales_if_translated(options[:locales]) do
61
+ queue_all_for_delete_without_globalize3
62
+ end
63
+ end
64
+
65
+ def queue_some_for_delete_with_globalize3(*args)
66
+ options = args.extract_options!
67
+ styles = args
68
+ with_locales_if_translated(options[:locales]) do
69
+ queue_some_for_delete_without_globalize3(styles)
70
+ end
71
+ end
72
+
73
+ # If translated, execute the block for the given locales only (or for all translated locales if none are given).
74
+ # Otherwise, simply execute the block.
75
+ def with_locales_if_translated(with_locales = nil, &block)
88
76
  if instance.respond_to?(:translated_locales) && instance.translated?(:"#{name}_file_name")
89
- # do it for the given locales only (or for all translated locales if none are given)
90
77
  # TODO translated_locales are not present any more when this is called via destroy callback (unless 'translates' is defined AFTER 'has_attached_file' in the model class)
91
78
  with_locales = instance.translated_locales if with_locales.nil?
92
- Globalize.with_locales([*with_locales]) { queue_existing_for_delete_without_globalize3 }
79
+ Globalize.with_locales([*with_locales]) { yield }
93
80
  else
94
- queue_existing_for_delete_without_globalize3
81
+ yield
82
+ end
83
+ end
84
+
85
+ end
86
+
87
+ module Compatibility
88
+
89
+ # For compatibility with paperclip 3.3
90
+ module Paperclip33
91
+ def only_process
92
+ only_process = @options[:only_process].dup
93
+ only_process = only_process.call(self) if only_process.respond_to?(:call)
94
+ only_process.map(&:to_sym)
95
95
  end
96
96
  end
97
97
 
@@ -1,5 +1,5 @@
1
1
  module Paperclip
2
2
  module Globalize3
3
- VERSION = "0.1.0"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_runtime_dependency "paperclip", "~> 2.5"
21
+ spec.add_runtime_dependency "paperclip", "~> 3.3"
22
22
  spec.add_runtime_dependency "globalize3", "~> 0.3"
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 1.3"
@@ -10,12 +10,16 @@ describe 'Paperclip::Globalize3::Attachment' do
10
10
  Rails.stub(:const_defined?).with(:Railtie).and_return(false)
11
11
  end
12
12
 
13
+ let (:test_image_dir) do
14
+ File.expand_path(File.join(File.dirname(__FILE__), 'data'))
15
+ end
16
+
13
17
  let(:test_image_file) do
14
- File.new(File.expand_path(File.join(File.dirname(__FILE__), 'data/test.png')))
18
+ File.new(File.join(test_image_dir,'test.png'))
15
19
  end
16
20
 
17
21
  let(:test_image_file2) do
18
- File.new(File.expand_path(File.join(File.dirname(__FILE__), 'data/test2.png')))
22
+ File.new(File.join(test_image_dir, 'test2.png'))
19
23
  end
20
24
 
21
25
  context 'with translations' do
@@ -84,6 +88,20 @@ describe 'Paperclip::Globalize3::Attachment' do
84
88
  File.exist?(path_de).should be_false
85
89
  end
86
90
 
91
+ context 'with :only_process' do
92
+
93
+ it 'should only clear the provided style in the current locale on assign' do
94
+ p = OnlyProcessPost.create
95
+ p.image.should_receive(:queue_some_for_delete).with(:thumb, :locales => :en)
96
+ p.image.should_not_receive(:queue_all_for_delete)
97
+
98
+ Globalize.with_locale(:en) do
99
+ p.update_attributes!(:image => test_image_file)
100
+ end
101
+ end
102
+
103
+ end
104
+
87
105
  end
88
106
 
89
107
  context 'without translations' do
@@ -1,10 +1,23 @@
1
- class Post < ActiveRecord::Base
1
+ class BasePost < ActiveRecord::Base
2
+ self.table_name = 'posts'
3
+ end
4
+
5
+ class Post < BasePost
2
6
  has_attached_file :image,
3
7
  :url => "/system/:class/:attachment/:id/:locale/:style-:fingerprint.:extension"
4
8
 
5
9
  translates :image_file_name, :image_content_type, :image_file_size, :image_updated_at, :image_fingerprint
6
10
  end
7
11
 
12
+ class OnlyProcessPost < BasePost
13
+ has_attached_file :image,
14
+ :url => "/system/:class/:attachment/:id/:locale/:style-:fingerprint.:extension",
15
+ :styles => { :thumb => "10x10", :large => "40x40" },
16
+ :only_process => [:thumb]
17
+
18
+ translates :image_file_name, :image_content_type, :image_file_size, :image_updated_at, :image_fingerprint
19
+ end
20
+
8
21
  class Untranslated < ActiveRecord::Base
9
22
  has_attached_file :image,
10
23
  :url => "/system/:class/:attachment/:id/:style-:fingerprint.:extension"
metadata CHANGED
@@ -1,120 +1,137 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: paperclip-globalize3
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
5
11
  platform: ruby
6
- authors:
12
+ authors:
7
13
  - Maximilian Herold
8
14
  autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
- date: 2013-04-30 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2013-05-07 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
14
21
  name: paperclip
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '2.5'
20
- type: :runtime
21
22
  prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- version: '2.5'
27
- - !ruby/object:Gem::Dependency
28
- name: globalize3
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
31
26
  - - ~>
32
- - !ruby/object:Gem::Version
33
- version: '0.3'
27
+ - !ruby/object:Gem::Version
28
+ hash: 1
29
+ segments:
30
+ - 3
31
+ - 3
32
+ version: "3.3"
34
33
  type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: globalize3
35
37
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
38
41
  - - ~>
39
- - !ruby/object:Gem::Version
40
- version: '0.3'
41
- - !ruby/object:Gem::Dependency
42
+ - !ruby/object:Gem::Version
43
+ hash: 13
44
+ segments:
45
+ - 0
46
+ - 3
47
+ version: "0.3"
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
42
51
  name: bundler
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: '1.3'
48
- type: :development
49
52
  prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
52
56
  - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '1.3'
55
- - !ruby/object:Gem::Dependency
56
- name: appraisal
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 0.5.1
57
+ - !ruby/object:Gem::Version
58
+ hash: 9
59
+ segments:
60
+ - 1
61
+ - 3
62
+ version: "1.3"
62
63
  type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: appraisal
63
67
  prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
66
71
  - - ~>
67
- - !ruby/object:Gem::Version
72
+ - !ruby/object:Gem::Version
73
+ hash: 9
74
+ segments:
75
+ - 0
76
+ - 5
77
+ - 1
68
78
  version: 0.5.1
69
- - !ruby/object:Gem::Dependency
70
- name: rspec-rails
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- version: 2.8.0
76
79
  type: :development
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec-rails
77
83
  prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
80
87
  - - ~>
81
- - !ruby/object:Gem::Version
88
+ - !ruby/object:Gem::Version
89
+ hash: 47
90
+ segments:
91
+ - 2
92
+ - 8
93
+ - 0
82
94
  version: 2.8.0
83
- - !ruby/object:Gem::Dependency
84
- name: sqlite3
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ! '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
95
  type: :development
96
+ version_requirements: *id005
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
91
99
  prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ! '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ! '>='
102
- - !ruby/object:Gem::Version
103
- version: '0'
100
+ requirement: &id006 !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
104
109
  type: :development
110
+ version_requirements: *id006
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
105
113
  prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ! '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
114
+ requirement: &id007 !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 3
120
+ segments:
121
+ - 0
122
+ version: "0"
123
+ type: :development
124
+ version_requirements: *id007
111
125
  description: locale-specific attachments with paperclip and globalize3
112
- email:
126
+ email:
113
127
  - herold@emjot.de
114
128
  executables: []
129
+
115
130
  extensions: []
131
+
116
132
  extra_rdoc_files: []
117
- files:
133
+
134
+ files:
118
135
  - .gitignore
119
136
  - .rspec
120
137
  - .travis.yml
@@ -137,33 +154,43 @@ files:
137
154
  - spec/data/test2.png
138
155
  - spec/spec_helper.rb
139
156
  homepage: https://github.com/emjot/paperclip-globalize3
140
- licenses:
157
+ licenses:
141
158
  - MIT
142
- metadata: {}
143
159
  post_install_message:
144
160
  rdoc_options: []
145
- require_paths:
161
+
162
+ require_paths:
146
163
  - lib
147
- required_ruby_version: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - ! '>='
150
- - !ruby/object:Gem::Version
151
- version: '0'
152
- required_rubygems_version: !ruby/object:Gem::Requirement
153
- requirements:
154
- - - ! '>='
155
- - !ruby/object:Gem::Version
156
- version: '0'
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ none: false
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ hash: 3
170
+ segments:
171
+ - 0
172
+ version: "0"
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
174
+ none: false
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ hash: 3
179
+ segments:
180
+ - 0
181
+ version: "0"
157
182
  requirements: []
183
+
158
184
  rubyforge_project:
159
- rubygems_version: 2.0.3
185
+ rubygems_version: 1.8.15
160
186
  signing_key:
161
- specification_version: 4
187
+ specification_version: 3
162
188
  summary: locale-specific attachments with paperclip and globalize3
163
- test_files:
189
+ test_files:
164
190
  - spec/attachment_helper_spec.rb
165
191
  - spec/data/models.rb
166
192
  - spec/data/schema.rb
167
193
  - spec/data/test.png
168
194
  - spec/data/test2.png
169
195
  - spec/spec_helper.rb
196
+ has_rdoc:
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- Y2FmNjZlMGNjMGNkNzg4MDZkNGEwMDI4MmI4M2UzN2ZmZjA5NGYzZg==
5
- data.tar.gz: !binary |-
6
- NmI0ZTc1OGZmMjBiZDhjYjJlY2JlMDBmMDgzZGQ0ZmMzNjc5YTI4Zg==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- MjE1ODcxNzc0MjA4MDNkOGRiNjQyMmM1Yzc0OGExOTNiNTYxOWIyNmI1ZDZi
10
- NjY1ZmY1YTQ4NjYwNmFhNmEyOWM2MGE4OTU0ZDQ4NTAyYzJhMDk1YjhhN2Zi
11
- ZDU5NDY4ZTc3YjJiMzZiMjdkYWI3MzQzOGY1MDUzYWRjNDI1MWI=
12
- data.tar.gz: !binary |-
13
- YTBmZTU2ZGNlM2JjOTAzZWY0ZDg0Y2NmMWYxZTAxZjc0MDA3OGQ2NzAxOWRl
14
- NTE3ZWQxOTlhYmI4NzZmNDY5NWNjNzA4ZDA1ODIwY2MzN2U1MTQzNDYwNDQx
15
- ODFiZDE1MmJhZDg4YzZlNTM5OTc0YThiYmJhYTFlOGU2YzkyOTU=