kt-paperclip 6.2.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.
Files changed (191) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +17 -0
  3. data/.github/issue_template.md +3 -0
  4. data/.gitignore +19 -0
  5. data/.hound.yml +1050 -0
  6. data/.rubocop.yml +1 -0
  7. data/.travis.yml +47 -0
  8. data/Appraisals +24 -0
  9. data/CONTRIBUTING.md +86 -0
  10. data/Gemfile +18 -0
  11. data/LICENSE +24 -0
  12. data/NEWS +515 -0
  13. data/README.md +1053 -0
  14. data/RELEASING.md +17 -0
  15. data/Rakefile +52 -0
  16. data/UPGRADING +17 -0
  17. data/features/basic_integration.feature +85 -0
  18. data/features/migration.feature +29 -0
  19. data/features/rake_tasks.feature +62 -0
  20. data/features/step_definitions/attachment_steps.rb +110 -0
  21. data/features/step_definitions/html_steps.rb +15 -0
  22. data/features/step_definitions/rails_steps.rb +257 -0
  23. data/features/step_definitions/s3_steps.rb +14 -0
  24. data/features/step_definitions/web_steps.rb +106 -0
  25. data/features/support/env.rb +12 -0
  26. data/features/support/fakeweb.rb +11 -0
  27. data/features/support/file_helpers.rb +34 -0
  28. data/features/support/fixtures/boot_config.txt +15 -0
  29. data/features/support/fixtures/gemfile.txt +5 -0
  30. data/features/support/fixtures/preinitializer.txt +20 -0
  31. data/features/support/paths.rb +28 -0
  32. data/features/support/rails.rb +39 -0
  33. data/features/support/selectors.rb +19 -0
  34. data/gemfiles/4.2.gemfile +20 -0
  35. data/gemfiles/5.0.gemfile +20 -0
  36. data/gemfiles/5.1.gemfile +20 -0
  37. data/gemfiles/5.2.gemfile +20 -0
  38. data/gemfiles/6.0.gemfile +20 -0
  39. data/lib/generators/paperclip/USAGE +8 -0
  40. data/lib/generators/paperclip/paperclip_generator.rb +36 -0
  41. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +15 -0
  42. data/lib/paperclip.rb +215 -0
  43. data/lib/paperclip/attachment.rb +617 -0
  44. data/lib/paperclip/attachment_registry.rb +60 -0
  45. data/lib/paperclip/callbacks.rb +42 -0
  46. data/lib/paperclip/content_type_detector.rb +80 -0
  47. data/lib/paperclip/errors.rb +34 -0
  48. data/lib/paperclip/file_command_content_type_detector.rb +28 -0
  49. data/lib/paperclip/filename_cleaner.rb +15 -0
  50. data/lib/paperclip/geometry.rb +157 -0
  51. data/lib/paperclip/geometry_detector_factory.rb +45 -0
  52. data/lib/paperclip/geometry_parser_factory.rb +31 -0
  53. data/lib/paperclip/glue.rb +17 -0
  54. data/lib/paperclip/has_attached_file.rb +116 -0
  55. data/lib/paperclip/helpers.rb +60 -0
  56. data/lib/paperclip/interpolations.rb +201 -0
  57. data/lib/paperclip/interpolations/plural_cache.rb +18 -0
  58. data/lib/paperclip/io_adapters/abstract_adapter.rb +75 -0
  59. data/lib/paperclip/io_adapters/attachment_adapter.rb +47 -0
  60. data/lib/paperclip/io_adapters/data_uri_adapter.rb +22 -0
  61. data/lib/paperclip/io_adapters/empty_string_adapter.rb +19 -0
  62. data/lib/paperclip/io_adapters/file_adapter.rb +26 -0
  63. data/lib/paperclip/io_adapters/http_url_proxy_adapter.rb +16 -0
  64. data/lib/paperclip/io_adapters/identity_adapter.rb +17 -0
  65. data/lib/paperclip/io_adapters/nil_adapter.rb +37 -0
  66. data/lib/paperclip/io_adapters/registry.rb +36 -0
  67. data/lib/paperclip/io_adapters/stringio_adapter.rb +36 -0
  68. data/lib/paperclip/io_adapters/uploaded_file_adapter.rb +44 -0
  69. data/lib/paperclip/io_adapters/uri_adapter.rb +68 -0
  70. data/lib/paperclip/locales/en.yml +18 -0
  71. data/lib/paperclip/logger.rb +21 -0
  72. data/lib/paperclip/matchers.rb +64 -0
  73. data/lib/paperclip/matchers/have_attached_file_matcher.rb +54 -0
  74. data/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb +101 -0
  75. data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +59 -0
  76. data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +97 -0
  77. data/lib/paperclip/media_type_spoof_detector.rb +90 -0
  78. data/lib/paperclip/missing_attachment_styles.rb +84 -0
  79. data/lib/paperclip/processor.rb +56 -0
  80. data/lib/paperclip/processor_helpers.rb +52 -0
  81. data/lib/paperclip/rails_environment.rb +21 -0
  82. data/lib/paperclip/railtie.rb +31 -0
  83. data/lib/paperclip/schema.rb +81 -0
  84. data/lib/paperclip/storage.rb +3 -0
  85. data/lib/paperclip/storage/filesystem.rb +99 -0
  86. data/lib/paperclip/storage/fog.rb +252 -0
  87. data/lib/paperclip/storage/s3.rb +461 -0
  88. data/lib/paperclip/style.rb +106 -0
  89. data/lib/paperclip/tempfile.rb +42 -0
  90. data/lib/paperclip/tempfile_factory.rb +22 -0
  91. data/lib/paperclip/thumbnail.rb +131 -0
  92. data/lib/paperclip/url_generator.rb +76 -0
  93. data/lib/paperclip/validators.rb +73 -0
  94. data/lib/paperclip/validators/attachment_content_type_validator.rb +88 -0
  95. data/lib/paperclip/validators/attachment_file_name_validator.rb +75 -0
  96. data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +28 -0
  97. data/lib/paperclip/validators/attachment_presence_validator.rb +28 -0
  98. data/lib/paperclip/validators/attachment_size_validator.rb +109 -0
  99. data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +29 -0
  100. data/lib/paperclip/version.rb +3 -0
  101. data/lib/tasks/paperclip.rake +140 -0
  102. data/paperclip.gemspec +50 -0
  103. data/shoulda_macros/paperclip.rb +134 -0
  104. data/spec/database.yml +4 -0
  105. data/spec/paperclip/attachment_definitions_spec.rb +13 -0
  106. data/spec/paperclip/attachment_processing_spec.rb +79 -0
  107. data/spec/paperclip/attachment_registry_spec.rb +158 -0
  108. data/spec/paperclip/attachment_spec.rb +1590 -0
  109. data/spec/paperclip/content_type_detector_spec.rb +47 -0
  110. data/spec/paperclip/file_command_content_type_detector_spec.rb +40 -0
  111. data/spec/paperclip/filename_cleaner_spec.rb +13 -0
  112. data/spec/paperclip/geometry_detector_spec.rb +38 -0
  113. data/spec/paperclip/geometry_parser_spec.rb +73 -0
  114. data/spec/paperclip/geometry_spec.rb +255 -0
  115. data/spec/paperclip/glue_spec.rb +42 -0
  116. data/spec/paperclip/has_attached_file_spec.rb +78 -0
  117. data/spec/paperclip/integration_spec.rb +702 -0
  118. data/spec/paperclip/interpolations_spec.rb +270 -0
  119. data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +160 -0
  120. data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +140 -0
  121. data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +88 -0
  122. data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
  123. data/spec/paperclip/io_adapters/file_adapter_spec.rb +131 -0
  124. data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +137 -0
  125. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
  126. data/spec/paperclip/io_adapters/nil_adapter_spec.rb +25 -0
  127. data/spec/paperclip/io_adapters/registry_spec.rb +35 -0
  128. data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +64 -0
  129. data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +146 -0
  130. data/spec/paperclip/io_adapters/uri_adapter_spec.rb +221 -0
  131. data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
  132. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +108 -0
  133. data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
  134. data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
  135. data/spec/paperclip/media_type_spoof_detector_spec.rb +120 -0
  136. data/spec/paperclip/meta_class_spec.rb +30 -0
  137. data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +88 -0
  138. data/spec/paperclip/paperclip_spec.rb +196 -0
  139. data/spec/paperclip/plural_cache_spec.rb +37 -0
  140. data/spec/paperclip/processor_helpers_spec.rb +57 -0
  141. data/spec/paperclip/processor_spec.rb +26 -0
  142. data/spec/paperclip/rails_environment_spec.rb +30 -0
  143. data/spec/paperclip/rake_spec.rb +103 -0
  144. data/spec/paperclip/schema_spec.rb +252 -0
  145. data/spec/paperclip/storage/filesystem_spec.rb +79 -0
  146. data/spec/paperclip/storage/fog_spec.rb +560 -0
  147. data/spec/paperclip/storage/s3_live_spec.rb +188 -0
  148. data/spec/paperclip/storage/s3_spec.rb +1695 -0
  149. data/spec/paperclip/style_spec.rb +251 -0
  150. data/spec/paperclip/tempfile_factory_spec.rb +33 -0
  151. data/spec/paperclip/tempfile_spec.rb +35 -0
  152. data/spec/paperclip/thumbnail_spec.rb +504 -0
  153. data/spec/paperclip/url_generator_spec.rb +221 -0
  154. data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
  155. data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +159 -0
  156. data/spec/paperclip/validators/attachment_presence_validator_spec.rb +85 -0
  157. data/spec/paperclip/validators/attachment_size_validator_spec.rb +235 -0
  158. data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +48 -0
  159. data/spec/paperclip/validators_spec.rb +164 -0
  160. data/spec/spec_helper.rb +45 -0
  161. data/spec/support/assertions.rb +84 -0
  162. data/spec/support/fake_model.rb +24 -0
  163. data/spec/support/fake_rails.rb +12 -0
  164. data/spec/support/fixtures/12k.png +0 -0
  165. data/spec/support/fixtures/50x50.png +0 -0
  166. data/spec/support/fixtures/5k.png +0 -0
  167. data/spec/support/fixtures/animated +0 -0
  168. data/spec/support/fixtures/animated.gif +0 -0
  169. data/spec/support/fixtures/animated.unknown +0 -0
  170. data/spec/support/fixtures/bad.png +1 -0
  171. data/spec/support/fixtures/empty.html +1 -0
  172. data/spec/support/fixtures/empty.xlsx +0 -0
  173. data/spec/support/fixtures/fog.yml +8 -0
  174. data/spec/support/fixtures/rotated.jpg +0 -0
  175. data/spec/support/fixtures/s3.yml +8 -0
  176. data/spec/support/fixtures/spaced file.jpg +0 -0
  177. data/spec/support/fixtures/spaced file.png +0 -0
  178. data/spec/support/fixtures/text.txt +1 -0
  179. data/spec/support/fixtures/twopage.pdf +0 -0
  180. data/spec/support/fixtures/uppercase.PNG +0 -0
  181. data/spec/support/matchers/accept.rb +5 -0
  182. data/spec/support/matchers/exist.rb +5 -0
  183. data/spec/support/matchers/have_column.rb +23 -0
  184. data/spec/support/mock_attachment.rb +24 -0
  185. data/spec/support/mock_interpolator.rb +24 -0
  186. data/spec/support/mock_url_generator_builder.rb +26 -0
  187. data/spec/support/model_reconstruction.rb +72 -0
  188. data/spec/support/reporting.rb +11 -0
  189. data/spec/support/test_data.rb +13 -0
  190. data/spec/support/version_helper.rb +9 -0
  191. metadata +586 -0
@@ -0,0 +1,196 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip do
4
+ context ".run" do
5
+ before do
6
+ Paperclip.options[:log_command] = false
7
+ expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", {}).and_return(double(run: nil))
8
+ @original_command_line_path = Terrapin::CommandLine.path
9
+ end
10
+
11
+ after do
12
+ Paperclip.options[:log_command] = true
13
+ Terrapin::CommandLine.path = @original_command_line_path
14
+ end
15
+
16
+ it "runs the command with Terrapin" do
17
+ Paperclip.run("convert", "stuff")
18
+ end
19
+
20
+ it "saves Terrapin::CommandLine.path that set before" do
21
+ Terrapin::CommandLine.path = "/opt/my_app/bin"
22
+ Paperclip.run("convert", "stuff")
23
+ expect(Terrapin::CommandLine.path).to match("/opt/my_app/bin")
24
+ end
25
+
26
+ it "does not duplicate Terrapin::CommandLine.path on multiple runs" do
27
+ expect(Terrapin::CommandLine).to receive(:new).with("convert", "more_stuff", {}).and_return(double(run: nil))
28
+ Terrapin::CommandLine.path = nil
29
+ Paperclip.options[:command_path] = "/opt/my_app/bin"
30
+ Paperclip.run("convert", "stuff")
31
+ Paperclip.run("convert", "more_stuff")
32
+
33
+ cmd_path = Paperclip.options[:command_path]
34
+ assert_equal 1, Terrapin::CommandLine.path.scan(cmd_path).count
35
+ end
36
+ end
37
+
38
+ it "does not raise errors when doing a lot of running" do
39
+ Paperclip.options[:command_path] = ["/usr/local/bin"] * 1024
40
+ Terrapin::CommandLine.path = "/something/else"
41
+ 100.times do |x|
42
+ Paperclip.run("echo", x.to_s)
43
+ end
44
+ end
45
+
46
+ context "Calling Paperclip.log without options[:logger] set" do
47
+ before do
48
+ Paperclip.logger = nil
49
+ Paperclip.options[:logger] = nil
50
+ end
51
+
52
+ after do
53
+ Paperclip.options[:logger] = ActiveRecord::Base.logger
54
+ Paperclip.logger = ActiveRecord::Base.logger
55
+ end
56
+
57
+ it "does not raise an error when log is called" do
58
+ silence_stream(STDOUT) do
59
+ Paperclip.log("something")
60
+ end
61
+ end
62
+ end
63
+ context "Calling Paperclip.run with a logger" do
64
+ it "passes the defined logger if :log_command is set" do
65
+ Paperclip.options[:log_command] = true
66
+ expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", logger: Paperclip.logger).and_return(double(run: nil))
67
+ Paperclip.run("convert", "stuff")
68
+ end
69
+ end
70
+
71
+ context "Paperclip.each_instance_with_attachment" do
72
+ before do
73
+ @file = File.new(fixture_file("5k.png"), "rb")
74
+ d1 = Dummy.create(avatar: @file)
75
+ d2 = Dummy.create
76
+ d3 = Dummy.create(avatar: @file)
77
+ @expected = [d1, d3]
78
+ end
79
+
80
+ after { @file.close }
81
+
82
+ it "yields every instance of a model that has an attachment" do
83
+ actual = []
84
+ Paperclip.each_instance_with_attachment("Dummy", "avatar") do |instance|
85
+ actual << instance
86
+ end
87
+ expect(actual).to match_array @expected
88
+ end
89
+ end
90
+
91
+ it "raises when sent #processor and the name of a class that doesn't exist" do
92
+ assert_raises(LoadError) { Paperclip.processor(:boogey_man) }
93
+ end
94
+
95
+ it "returns a class when sent #processor and the name of a class under Paperclip" do
96
+ assert_equal ::Paperclip::Thumbnail, Paperclip.processor(:thumbnail)
97
+ end
98
+
99
+ it "gets a class from a namespaced class name" do
100
+ class ::One; class Two; end; end
101
+ assert_equal ::One::Two, Paperclip.class_for("One::Two")
102
+ end
103
+
104
+ it "raises when class doesn't exist in specified namespace" do
105
+ class ::Three; end
106
+ class ::Four; end
107
+ assert_raises NameError do
108
+ Paperclip.class_for("Three::Four")
109
+ end
110
+ end
111
+
112
+ context "An ActiveRecord model with an 'avatar' attachment" do
113
+ before do
114
+ rebuild_model path: "tmp/:class/omg/:style.:extension"
115
+ @file = File.new(fixture_file("5k.png"), "rb")
116
+ end
117
+
118
+ after { @file.close }
119
+
120
+ it "does not error when trying to also create a 'blah' attachment" do
121
+ assert_nothing_raised do
122
+ Dummy.class_eval do
123
+ has_attached_file :blah
124
+ end
125
+ end
126
+ end
127
+
128
+ context "with a subclass" do
129
+ before do
130
+ class ::SubDummy < Dummy; end
131
+ end
132
+
133
+ it "is able to use the attachment from the subclass" do
134
+ assert_nothing_raised do
135
+ @subdummy = SubDummy.create(avatar: @file)
136
+ end
137
+ end
138
+
139
+ after do
140
+ SubDummy.delete_all
141
+ begin
142
+ Object.send(:remove_const, "SubDummy")
143
+ rescue StandardError
144
+ nil
145
+ end
146
+ end
147
+ end
148
+
149
+ it "has an avatar getter method" do
150
+ assert Dummy.new.respond_to?(:avatar)
151
+ end
152
+
153
+ it "has an avatar setter method" do
154
+ assert Dummy.new.respond_to?(:avatar=)
155
+ end
156
+
157
+ context "that is valid" do
158
+ before do
159
+ @dummy = Dummy.new
160
+ @dummy.avatar = @file
161
+ end
162
+
163
+ it "is valid" do
164
+ assert @dummy.valid?
165
+ end
166
+ end
167
+
168
+ it "does not have Attachment in the ActiveRecord::Base namespace" do
169
+ assert_raises(NameError) do
170
+ ActiveRecord::Base::Attachment
171
+ end
172
+ end
173
+ end
174
+
175
+ context "configuring a custom processor" do
176
+ before do
177
+ @freedom_processor = Class.new do
178
+ def make(file, _options = {}, _attachment = nil)
179
+ file
180
+ end
181
+ end.new
182
+
183
+ Paperclip.configure do |config|
184
+ config.register_processor(:freedom, @freedom_processor)
185
+ end
186
+ end
187
+
188
+ it "is able to find the custom processor" do
189
+ assert_equal @freedom_processor, Paperclip.processor(:freedom)
190
+ end
191
+
192
+ after do
193
+ Paperclip.clear_processors!
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ describe "Plural cache" do
4
+ it "caches pluralizations" do
5
+ cache = Paperclip::Interpolations::PluralCache.new
6
+ symbol = :box
7
+
8
+ first = cache.pluralize_symbol(symbol)
9
+ second = cache.pluralize_symbol(symbol)
10
+ expect(first).to equal(second)
11
+ end
12
+
13
+ it "caches pluralizations and underscores" do
14
+ class BigBox; end
15
+ cache = Paperclip::Interpolations::PluralCache.new
16
+ klass = BigBox
17
+
18
+ first = cache.underscore_and_pluralize_class(klass)
19
+ second = cache.underscore_and_pluralize_class(klass)
20
+ expect(first).to equal(second)
21
+ end
22
+
23
+ it "pluralizes words" do
24
+ cache = Paperclip::Interpolations::PluralCache.new
25
+ symbol = :box
26
+
27
+ expect(cache.pluralize_symbol(symbol)).to eq("boxes")
28
+ end
29
+
30
+ it "pluralizes and underscore class names" do
31
+ class BigBox; end
32
+ cache = Paperclip::Interpolations::PluralCache.new
33
+ klass = BigBox
34
+
35
+ expect(cache.underscore_and_pluralize_class(klass)).to eq("big_boxes")
36
+ end
37
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::ProcessorHelpers do
4
+ describe ".load_processor" do
5
+ context "when the file exists in lib/paperclip" do
6
+ it "loads it correctly" do
7
+ pathname = Pathname.new("my_app")
8
+ main_path = "main_path"
9
+ alternate_path = "alternate_path"
10
+
11
+ allow(Rails).to receive(:root).and_return(pathname)
12
+ expect(File).to receive(:expand_path).with(pathname.join("lib/paperclip", "custom.rb")).and_return(main_path)
13
+ expect(File).to receive(:expand_path).with(pathname.join("lib/paperclip_processors", "custom.rb")).and_return(alternate_path)
14
+ expect(File).to receive(:exist?).with(main_path).and_return(true)
15
+ expect(File).to receive(:exist?).with(alternate_path).and_return(false)
16
+
17
+ expect(Paperclip).to receive(:require).with(main_path)
18
+
19
+ Paperclip.load_processor(:custom)
20
+ end
21
+ end
22
+
23
+ context "when the file exists in lib/paperclip_processors" do
24
+ it "loads it correctly" do
25
+ pathname = Pathname.new("my_app")
26
+ main_path = "main_path"
27
+ alternate_path = "alternate_path"
28
+
29
+ allow(Rails).to receive(:root).and_return(pathname)
30
+ expect(File).to receive(:expand_path).with(pathname.join("lib/paperclip", "custom.rb")).and_return(main_path)
31
+ expect(File).to receive(:expand_path).with(pathname.join("lib/paperclip_processors", "custom.rb")).and_return(alternate_path)
32
+ expect(File).to receive(:exist?).with(main_path).and_return(false)
33
+ expect(File).to receive(:exist?).with(alternate_path).and_return(true)
34
+
35
+ expect(Paperclip).to receive(:require).with(alternate_path)
36
+
37
+ Paperclip.load_processor(:custom)
38
+ end
39
+ end
40
+
41
+ context "when the file does not exist in lib/paperclip_processors" do
42
+ it "raises an error" do
43
+ pathname = Pathname.new("my_app")
44
+ main_path = "main_path"
45
+ alternate_path = "alternate_path"
46
+
47
+ allow(Rails).to receive(:root).and_return(pathname)
48
+ allow(File).to receive(:expand_path).with(pathname.join("lib/paperclip", "custom.rb")).and_return(main_path)
49
+ allow(File).to receive(:expand_path).with(pathname.join("lib/paperclip_processors", "custom.rb")).and_return(alternate_path)
50
+ allow(File).to receive(:exist?).with(main_path).and_return(false)
51
+ allow(File).to receive(:exist?).with(alternate_path).and_return(false)
52
+
53
+ assert_raises(LoadError) { Paperclip.processor(:custom) }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::Processor do
4
+ it "instantiates and call #make when sent #make to the class" do
5
+ processor = double
6
+ expect(processor).to receive(:make)
7
+ expect(Paperclip::Processor).to receive(:new).with(:one, :two, :three).and_return(processor)
8
+ Paperclip::Processor.make(:one, :two, :three)
9
+ end
10
+
11
+ context "Calling #convert" do
12
+ it "runs the convert command with Terrapin" do
13
+ Paperclip.options[:log_command] = false
14
+ expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", {}).and_return(double(run: nil))
15
+ Paperclip::Processor.new("filename").convert("stuff")
16
+ end
17
+ end
18
+
19
+ context "Calling #identify" do
20
+ it "runs the identify command with Terrapin" do
21
+ Paperclip.options[:log_command] = false
22
+ expect(Terrapin::CommandLine).to receive(:new).with("identify", "stuff", {}).and_return(double(run: nil))
23
+ Paperclip::Processor.new("filename").identify("stuff")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::RailsEnvironment do
4
+ it "returns nil when Rails isn't defined" do
5
+ resetting_rails_to(nil) do
6
+ expect(Paperclip::RailsEnvironment.get).to be_nil
7
+ end
8
+ end
9
+
10
+ it "returns nil when Rails.env isn't defined" do
11
+ resetting_rails_to({}) do
12
+ expect(Paperclip::RailsEnvironment.get).to be_nil
13
+ end
14
+ end
15
+
16
+ it "returns the value of Rails.env if it is set" do
17
+ resetting_rails_to(OpenStruct.new(env: "foo")) do
18
+ expect(Paperclip::RailsEnvironment.get).to eq "foo"
19
+ end
20
+ end
21
+
22
+ def resetting_rails_to(new_value)
23
+ previous_rails = Object.send(:remove_const, "Rails")
24
+ Object.const_set("Rails", new_value) unless new_value.nil?
25
+ yield
26
+ ensure
27
+ Object.send(:remove_const, "Rails") if Object.const_defined?("Rails")
28
+ Object.const_set("Rails", previous_rails)
29
+ end
30
+ end
@@ -0,0 +1,103 @@
1
+ require "spec_helper"
2
+ require "rake"
3
+ load "./lib/tasks/paperclip.rake"
4
+
5
+ describe Rake do
6
+ context "calling `rake paperclip:refresh:thumbnails`" do
7
+ before do
8
+ rebuild_model
9
+ allow(Paperclip::Task).to receive(:obtain_class).and_return("Dummy")
10
+ @bogus_instance = Dummy.new
11
+ @bogus_instance.id = "some_id"
12
+ allow(@bogus_instance.avatar).to receive(:reprocess!)
13
+ @valid_instance = Dummy.new
14
+ allow(@valid_instance.avatar).to receive(:reprocess!)
15
+ allow(Paperclip::Task).to receive(:log_error)
16
+ allow(Paperclip).to receive(:each_instance_with_attachment).and_yield(@bogus_instance).and_yield(@valid_instance)
17
+ end
18
+ context "when there is an exception in reprocess!" do
19
+ before do
20
+ allow(@bogus_instance.avatar).to receive(:reprocess!).and_raise
21
+ end
22
+
23
+ it "catches the exception" do
24
+ assert_nothing_raised do
25
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
26
+ end
27
+ end
28
+
29
+ it "continues to the next instance" do
30
+ expect(@valid_instance.avatar).to receive(:reprocess!)
31
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
32
+ end
33
+
34
+ it "prints the exception" do
35
+ exception_msg = "Some Exception"
36
+ allow(@bogus_instance.avatar).to receive(:reprocess!).and_raise(exception_msg)
37
+ expect(Paperclip::Task).to receive(:log_error) do |str|
38
+ str.match exception_msg
39
+ end
40
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
41
+ end
42
+
43
+ it "prints the class name" do
44
+ expect(Paperclip::Task).to receive(:log_error) do |str|
45
+ str.match "Dummy"
46
+ end
47
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
48
+ end
49
+
50
+ it "prints the instance ID" do
51
+ expect(Paperclip::Task).to receive(:log_error) do |str|
52
+ str.match "ID #{@bogus_instance.id}"
53
+ end
54
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
55
+ end
56
+ end
57
+
58
+ context "when there is an error in reprocess!" do
59
+ before do
60
+ @errors = double("errors")
61
+ allow(@errors).to receive(:full_messages).and_return([""])
62
+ allow(@errors).to receive(:blank?).and_return(false)
63
+ allow(@bogus_instance).to receive(:errors).and_return(@errors)
64
+ end
65
+
66
+ it "continues to the next instance" do
67
+ expect(@valid_instance.avatar).to receive(:reprocess!)
68
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
69
+ end
70
+
71
+ it "prints the error" do
72
+ error_msg = "Some Error"
73
+ allow(@errors).to receive(:full_messages).and_return([error_msg])
74
+ expect(Paperclip::Task).to receive(:log_error) do |str|
75
+ str.match error_msg
76
+ end
77
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
78
+ end
79
+
80
+ it "prints the class name" do
81
+ expect(Paperclip::Task).to receive(:log_error) do |str|
82
+ str.match "Dummy"
83
+ end
84
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
85
+ end
86
+
87
+ it "prints the instance ID" do
88
+ expect(Paperclip::Task).to receive(:log_error) do |str|
89
+ str.match "ID #{@bogus_instance.id}"
90
+ end
91
+ ::Rake::Task["paperclip:refresh:thumbnails"].execute
92
+ end
93
+ end
94
+ end
95
+
96
+ context "Paperclip::Task.log_error method" do
97
+ it "prints its argument to STDERR" do
98
+ msg = "Some Message"
99
+ expect($stderr).to receive(:puts).with(msg)
100
+ Paperclip::Task.log_error(msg)
101
+ end
102
+ end
103
+ end