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,88 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::DataUriAdapter do
4
+ before do
5
+ Paperclip::DataUriAdapter.register
6
+ end
7
+
8
+ after do
9
+ Paperclip.io_adapters.unregister(described_class)
10
+
11
+ if @subject
12
+ @subject.close
13
+ end
14
+ end
15
+
16
+ it "allows a missing mime-type" do
17
+ adapter = Paperclip.io_adapters.for("data:;base64,#{original_base64_content}")
18
+ assert_equal Paperclip::DataUriAdapter, adapter.class
19
+ end
20
+
21
+ it "alows mime type that has dot in it" do
22
+ adapter = Paperclip.io_adapters.for("data:image/vnd.microsoft.icon;base64,#{original_base64_content}")
23
+ assert_equal Paperclip::DataUriAdapter, adapter.class
24
+ end
25
+
26
+ context "a new instance" do
27
+ before do
28
+ @contents = "data:image/png;base64,#{original_base64_content}"
29
+ @subject = Paperclip.io_adapters.for(@contents, hash_digest: Digest::MD5)
30
+ end
31
+
32
+ it "returns a nondescript file name" do
33
+ assert_equal "data", @subject.original_filename
34
+ end
35
+
36
+ it "returns a content type" do
37
+ assert_equal "image/png", @subject.content_type
38
+ end
39
+
40
+ it "returns the size of the data" do
41
+ assert_equal 4456, @subject.size
42
+ end
43
+
44
+ it "generates a correct MD5 hash of the contents" do
45
+ assert_equal(
46
+ Digest::MD5.hexdigest(Base64.decode64(original_base64_content)),
47
+ @subject.fingerprint
48
+ )
49
+ end
50
+
51
+ it "generates correct fingerprint after read" do
52
+ fingerprint = Digest::MD5.hexdigest(@subject.read)
53
+ assert_equal fingerprint, @subject.fingerprint
54
+ end
55
+
56
+ it "generates same fingerprint" do
57
+ assert_equal @subject.fingerprint, @subject.fingerprint
58
+ end
59
+
60
+ it "accepts a content_type" do
61
+ @subject.content_type = "image/png"
62
+ assert_equal "image/png", @subject.content_type
63
+ end
64
+
65
+ it "accepts an original_filename" do
66
+ @subject.original_filename = "image.png"
67
+ assert_equal "image.png", @subject.original_filename
68
+ end
69
+
70
+ it "does not generate filenames that include restricted characters" do
71
+ @subject.original_filename = "image:restricted.png"
72
+ assert_equal "image_restricted.png", @subject.original_filename
73
+ end
74
+
75
+ it "does not generate paths that include restricted characters" do
76
+ @subject.original_filename = "image:restricted.png"
77
+ expect(@subject.path).to_not match(/:/)
78
+ end
79
+ end
80
+
81
+ def original_base64_content
82
+ Base64.encode64(original_file_contents)
83
+ end
84
+
85
+ def original_file_contents
86
+ @original_file_contents ||= File.read(fixture_file("5k.png"))
87
+ end
88
+ end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::EmptyStringAdapter do
4
+ context "a new instance" do
5
+ before do
6
+ @subject = Paperclip.io_adapters.for("")
7
+ end
8
+
9
+ it "returns false for a call to nil?" do
10
+ assert !@subject.nil?
11
+ end
12
+
13
+ it "returns false for a call to assignment?" do
14
+ assert !@subject.assignment?
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,131 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::FileAdapter do
4
+ context "a new instance" do
5
+ context "with normal file" do
6
+ before do
7
+ @file = File.new(fixture_file("5k.png"))
8
+ @file.binmode
9
+ end
10
+
11
+ after do
12
+ @file.close
13
+ @subject.close if @subject
14
+ end
15
+
16
+ context "doing normal things" do
17
+ before do
18
+ @subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
19
+ end
20
+
21
+ it "uses the original filename to generate the tempfile" do
22
+ assert @subject.path.ends_with?(".png")
23
+ end
24
+
25
+ it "gets the right filename" do
26
+ assert_equal "5k.png", @subject.original_filename
27
+ end
28
+
29
+ it "forces binmode on tempfile" do
30
+ assert @subject.instance_variable_get("@tempfile").binmode?
31
+ end
32
+
33
+ it "gets the content type" do
34
+ assert_equal "image/png", @subject.content_type
35
+ end
36
+
37
+ it "returns content type as a string" do
38
+ expect(@subject.content_type).to be_a String
39
+ end
40
+
41
+ it "gets the file's size" do
42
+ assert_equal 4456, @subject.size
43
+ end
44
+
45
+ it "returns false for a call to nil?" do
46
+ assert !@subject.nil?
47
+ end
48
+
49
+ it "generates a MD5 hash of the contents" do
50
+ expected = Digest::MD5.file(@file.path).to_s
51
+ assert_equal expected, @subject.fingerprint
52
+ end
53
+
54
+ it "reads the contents of the file" do
55
+ expected = @file.read
56
+ assert !expected.empty?
57
+ assert_equal expected, @subject.read
58
+ end
59
+ end
60
+
61
+ context "file with multiple possible content type" do
62
+ before do
63
+ allow(MIME::Types).to receive(:type_for).and_return([MIME::Type.new("image/x-png"), MIME::Type.new("image/png")])
64
+ @subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
65
+ end
66
+
67
+ it "prefers officially registered mime type" do
68
+ assert_equal "image/png", @subject.content_type
69
+ end
70
+
71
+ it "returns content type as a string" do
72
+ expect(@subject.content_type).to be_a String
73
+ end
74
+ end
75
+
76
+ context "file with content type derived from file contents on *nix" do
77
+ before do
78
+ allow(MIME::Types).to receive(:type_for).and_return([])
79
+ allow(Paperclip).to receive(:run).and_return("application/vnd.ms-office\n")
80
+ allow_any_instance_of(Paperclip::ContentTypeDetector).
81
+ to receive(:type_from_mime_magic).and_return("application/vnd.ms-office")
82
+
83
+ @subject = Paperclip.io_adapters.for(@file)
84
+ end
85
+
86
+ it "returns content type without newline character" do
87
+ assert_equal "application/vnd.ms-office", @subject.content_type
88
+ end
89
+ end
90
+ end
91
+
92
+ context "filename with restricted characters" do
93
+ before do
94
+ @file = File.open(fixture_file("animated.gif")) do |file|
95
+ StringIO.new(file.read)
96
+ end
97
+ allow(@file).to receive(:original_filename).and_return("image:restricted.gif")
98
+ @subject = Paperclip.io_adapters.for(@file)
99
+ end
100
+
101
+ after do
102
+ @file.close
103
+ @subject.close
104
+ end
105
+
106
+ it "does not generate filenames that include restricted characters" do
107
+ assert_equal "image_restricted.gif", @subject.original_filename
108
+ end
109
+
110
+ it "does not generate paths that include restricted characters" do
111
+ expect(@subject.path).to_not match(/:/)
112
+ end
113
+ end
114
+
115
+ context "empty file" do
116
+ before do
117
+ @file = Tempfile.new("file_adapter_test")
118
+ @subject = Paperclip.io_adapters.for(@file)
119
+ end
120
+
121
+ after do
122
+ @file.close
123
+ @subject.close
124
+ end
125
+
126
+ it "provides correct mime-type" do
127
+ assert_match %r{.*/x-empty}, @subject.content_type
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,137 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::HttpUrlProxyAdapter do
4
+ before do
5
+ @open_return = StringIO.new("xxx")
6
+ allow(@open_return).to receive(:meta).and_return("content-type" => "image/png")
7
+ allow_any_instance_of(Paperclip::HttpUrlProxyAdapter).to receive(:download_content).
8
+ and_return(@open_return)
9
+ Paperclip::HttpUrlProxyAdapter.register
10
+ end
11
+
12
+ after do
13
+ Paperclip.io_adapters.unregister(described_class)
14
+ end
15
+
16
+ context "a new instance" do
17
+ before do
18
+ @url = "http://thoughtbot.com/images/thoughtbot-logo.png"
19
+ @subject = Paperclip.io_adapters.for(@url, hash_digest: Digest::MD5)
20
+ end
21
+
22
+ after do
23
+ @subject.close
24
+ end
25
+
26
+ it "returns a file name" do
27
+ assert_equal "thoughtbot-logo.png", @subject.original_filename
28
+ end
29
+
30
+ it "closes open handle after reading" do
31
+ assert_equal true, @open_return.closed?
32
+ end
33
+
34
+ it "returns a content type" do
35
+ assert_equal "image/png", @subject.content_type
36
+ end
37
+
38
+ it "returns the size of the data" do
39
+ assert_equal @open_return.size, @subject.size
40
+ end
41
+
42
+ it "generates an MD5 hash of the contents" do
43
+ assert_equal Digest::MD5.hexdigest("xxx"), @subject.fingerprint
44
+ end
45
+
46
+ it "generates correct fingerprint after read" do
47
+ fingerprint = Digest::MD5.hexdigest(@subject.read)
48
+ assert_equal fingerprint, @subject.fingerprint
49
+ end
50
+
51
+ it "generates same fingerprint" do
52
+ assert_equal @subject.fingerprint, @subject.fingerprint
53
+ end
54
+
55
+ it "returns the data contained in the StringIO" do
56
+ assert_equal "xxx", @subject.read
57
+ end
58
+
59
+ it "accepts a content_type" do
60
+ @subject.content_type = "image/png"
61
+ assert_equal "image/png", @subject.content_type
62
+ end
63
+
64
+ it "accepts an original_filename" do
65
+ @subject.original_filename = "image.png"
66
+ assert_equal "image.png", @subject.original_filename
67
+ end
68
+ end
69
+
70
+ context "a url with query params" do
71
+ subject { Paperclip.io_adapters.for(url) }
72
+
73
+ after { subject.close }
74
+
75
+ let(:url) { "https://github.com/thoughtbot/paperclip?file=test" }
76
+
77
+ it "returns a file name" do
78
+ assert_equal "paperclip", subject.original_filename
79
+ end
80
+
81
+ it "preserves params" do
82
+ assert_equal url, subject.instance_variable_get(:@target).to_s
83
+ end
84
+ end
85
+
86
+ context "a url with restricted characters in the filename" do
87
+ before do
88
+ @url = "https://github.com/thoughtbot/paper:clip.jpg"
89
+ @subject = Paperclip.io_adapters.for(@url)
90
+ end
91
+
92
+ after do
93
+ begin
94
+ @subject.close
95
+ rescue Exception
96
+ true
97
+ end
98
+ end
99
+
100
+ it "does not generate filenames that include restricted characters" do
101
+ assert_equal "paper_clip.jpg", @subject.original_filename
102
+ end
103
+
104
+ it "does not generate paths that include restricted characters" do
105
+ expect(@subject.path).to_not match(/:/)
106
+ end
107
+ end
108
+
109
+ context "a url with special characters in the filename" do
110
+ before do
111
+ allow_any_instance_of(Paperclip::HttpUrlProxyAdapter).to receive(:download_content).and_return(@open_return)
112
+ end
113
+
114
+ let(:filename) do
115
+ "paperclip-%C3%B6%C3%A4%C3%BC%E5%AD%97%C2%B4%C2%BD%E2%99%A5"\
116
+ "%C3%98%C2%B2%C3%88.png"
117
+ end
118
+ let(:url) { "https://github.com/thoughtbot/paperclip-öäü字´½♥زÈ.png" }
119
+
120
+ subject { Paperclip.io_adapters.for(url) }
121
+
122
+ it "returns a encoded filename" do
123
+ assert_equal filename, subject.original_filename
124
+ end
125
+
126
+ context "when already URI encoded" do
127
+ let(:url) do
128
+ "https://github.com/thoughtbot/paperclip-%C3%B6%C3%A4%C3%BC%E5%AD%97"\
129
+ "%C2%B4%C2%BD%E2%99%A5%C3%98%C2%B2%C3%88.png"
130
+ end
131
+
132
+ it "returns a encoded filename" do
133
+ assert_equal filename, subject.original_filename
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,8 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::IdentityAdapter do
4
+ it "responds to #new by returning the argument" do
5
+ adapter = Paperclip::IdentityAdapter.new
6
+ assert_equal :target, adapter.new(:target, nil)
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::NilAdapter do
4
+ context "a new instance" do
5
+ before do
6
+ @subject = Paperclip.io_adapters.for(nil)
7
+ end
8
+
9
+ it "gets the right filename" do
10
+ assert_equal "", @subject.original_filename
11
+ end
12
+
13
+ it "gets the content type" do
14
+ assert_equal "", @subject.content_type
15
+ end
16
+
17
+ it "gets the file's size" do
18
+ assert_equal 0, @subject.size
19
+ end
20
+
21
+ it "returns true for a call to nil?" do
22
+ assert @subject.nil?
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Paperclip::AttachmentRegistry do
4
+ context "for" do
5
+ before do
6
+ class AdapterTest
7
+ def initialize(_target, _ = {}); end
8
+ end
9
+ @subject = Paperclip::AdapterRegistry.new
10
+ @subject.register(AdapterTest) { |t| Symbol === t }
11
+ end
12
+
13
+ it "returns the class registered for the adapted type" do
14
+ assert_equal AdapterTest, @subject.for(:target).class
15
+ end
16
+ end
17
+
18
+ context "registered?" do
19
+ before do
20
+ class AdapterTest
21
+ def initialize(_target, _ = {}); end
22
+ end
23
+ @subject = Paperclip::AdapterRegistry.new
24
+ @subject.register(AdapterTest) { |t| Symbol === t }
25
+ end
26
+
27
+ it "returns true when the class of this adapter has been registered" do
28
+ assert @subject.registered?(AdapterTest.new(:target))
29
+ end
30
+
31
+ it "returns false when the adapter has not been registered" do
32
+ assert !@subject.registered?(Object)
33
+ end
34
+ end
35
+ end