card 1.19.3 → 1.19.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/VERSION +1 -1
  4. data/card.gemspec +1 -3
  5. data/db/migrate_core_cards/20160914132636_fix_mod_files.rb +25 -0
  6. data/lib/card.rb +0 -2
  7. data/lib/card/content/diff.rb +3 -4
  8. data/lib/card/format/error.rb +1 -1
  9. data/mod/admin/set/self/admin.rb +2 -2
  10. data/mod/admin/set/self/trash.rb +9 -3
  11. data/mod/basic_types/set/type/html.rb +1 -1
  12. data/mod/bootstrap/set/all/bootstrap/layout.rb +58 -0
  13. data/mod/bootstrap/spec/set/all/bootstrap/layout_spec.rb +32 -0
  14. data/mod/carrierwave/lib/carrier_wave/cardmount.rb +0 -2
  15. data/mod/carrierwave/set/abstract/attachment/upload_cache.rb +2 -1
  16. data/mod/core/set/all/stages.rb +6 -4
  17. data/mod/history/lib/card/act.rb +8 -7
  18. data/mod/history/set/all/history.rb +10 -8
  19. data/mod/machines/set/abstract/script.rb +1 -1
  20. data/mod/machines/set/type/css.rb +1 -1
  21. data/mod/pointer/set/abstract/01_pointer.rb +1 -1
  22. data/mod/standard/file/credit_image/image-icon.png +0 -0
  23. data/mod/standard/file/credit_image/image-large.png +0 -0
  24. data/mod/standard/file/credit_image/image-medium.png +0 -0
  25. data/mod/standard/file/credit_image/image-small.png +0 -0
  26. data/mod/standard/file/favicon/image-icon.png +0 -0
  27. data/mod/standard/file/favicon/image-large.png +0 -0
  28. data/mod/standard/file/favicon/image-medium.png +0 -0
  29. data/mod/standard/file/favicon/image-small.png +0 -0
  30. data/mod/standard/file/logo/image-icon.png +0 -0
  31. data/mod/standard/file/logo/image-large.png +0 -0
  32. data/mod/standard/file/logo/image-medium.png +0 -0
  33. data/mod/standard/file/logo/image-small.png +0 -0
  34. data/mod/standard/set/self/recent.rb +2 -2
  35. data/spec/lib/card/diff_spec.rb +9 -9
  36. metadata +19 -156
  37. data/vendor/carrierwave/.gitignore +0 -19
  38. data/vendor/carrierwave/.rubocop.yml +0 -262
  39. data/vendor/carrierwave/.travis.yml +0 -58
  40. data/vendor/carrierwave/CHANGELOG.md +0 -81
  41. data/vendor/carrierwave/CONTRIBUTING.md +0 -37
  42. data/vendor/carrierwave/Gemfile +0 -5
  43. data/vendor/carrierwave/README.md +0 -995
  44. data/vendor/carrierwave/Rakefile +0 -26
  45. data/vendor/carrierwave/carrierwave.gemspec +0 -45
  46. data/vendor/carrierwave/cucumber.yml +0 -2
  47. data/vendor/carrierwave/features/caching.feature +0 -28
  48. data/vendor/carrierwave/features/download.feature +0 -20
  49. data/vendor/carrierwave/features/file_storage.feature +0 -37
  50. data/vendor/carrierwave/features/file_storage_overridden_filename.feature +0 -38
  51. data/vendor/carrierwave/features/file_storage_overridden_store_dir.feature +0 -38
  52. data/vendor/carrierwave/features/file_storage_reversing_processor.feature +0 -43
  53. data/vendor/carrierwave/features/fixtures/bork.txt +0 -1
  54. data/vendor/carrierwave/features/fixtures/monkey.txt +0 -1
  55. data/vendor/carrierwave/features/fixtures/upcased_bork.txt +0 -1
  56. data/vendor/carrierwave/features/mount_activerecord.feature +0 -46
  57. data/vendor/carrierwave/features/step_definitions/activerecord_steps.rb +0 -20
  58. data/vendor/carrierwave/features/step_definitions/caching_steps.rb +0 -12
  59. data/vendor/carrierwave/features/step_definitions/datamapper_steps.rb +0 -27
  60. data/vendor/carrierwave/features/step_definitions/download_steps.rb +0 -8
  61. data/vendor/carrierwave/features/step_definitions/file_steps.rb +0 -51
  62. data/vendor/carrierwave/features/step_definitions/general_steps.rb +0 -102
  63. data/vendor/carrierwave/features/step_definitions/mount_steps.rb +0 -17
  64. data/vendor/carrierwave/features/step_definitions/store_steps.rb +0 -16
  65. data/vendor/carrierwave/features/support/activerecord.rb +0 -18
  66. data/vendor/carrierwave/features/support/env.rb +0 -19
  67. data/vendor/carrierwave/features/versions_basics.feature +0 -50
  68. data/vendor/carrierwave/features/versions_caching_from_versions.feature +0 -32
  69. data/vendor/carrierwave/features/versions_nested_versions.feature +0 -70
  70. data/vendor/carrierwave/features/versions_overridden_filename.feature +0 -51
  71. data/vendor/carrierwave/features/versions_overriden_store_dir.feature +0 -41
  72. data/vendor/carrierwave/gemfiles/rails-4-0-stable.gemfile +0 -5
  73. data/vendor/carrierwave/gemfiles/rails-4-1-stable.gemfile +0 -5
  74. data/vendor/carrierwave/gemfiles/rails-4-2-stable.gemfile +0 -5
  75. data/vendor/carrierwave/gemfiles/rails-master.gemfile +0 -11
  76. data/vendor/carrierwave/lib/carrierwave.rb +0 -93
  77. data/vendor/carrierwave/lib/carrierwave/compatibility/paperclip.rb +0 -103
  78. data/vendor/carrierwave/lib/carrierwave/error.rb +0 -8
  79. data/vendor/carrierwave/lib/carrierwave/locale/cs.yml +0 -14
  80. data/vendor/carrierwave/lib/carrierwave/locale/de.yml +0 -14
  81. data/vendor/carrierwave/lib/carrierwave/locale/el.yml +0 -14
  82. data/vendor/carrierwave/lib/carrierwave/locale/en.yml +0 -14
  83. data/vendor/carrierwave/lib/carrierwave/locale/es.yml +0 -14
  84. data/vendor/carrierwave/lib/carrierwave/locale/fr-CA.yml +0 -14
  85. data/vendor/carrierwave/lib/carrierwave/locale/fr.yml +0 -14
  86. data/vendor/carrierwave/lib/carrierwave/locale/id.yml +0 -14
  87. data/vendor/carrierwave/lib/carrierwave/locale/ja.yml +0 -14
  88. data/vendor/carrierwave/lib/carrierwave/locale/nb.yml +0 -14
  89. data/vendor/carrierwave/lib/carrierwave/locale/nl.yml +0 -14
  90. data/vendor/carrierwave/lib/carrierwave/locale/pl.yml +0 -14
  91. data/vendor/carrierwave/lib/carrierwave/locale/pt-BR.yml +0 -14
  92. data/vendor/carrierwave/lib/carrierwave/locale/pt-PT.yml +0 -14
  93. data/vendor/carrierwave/lib/carrierwave/locale/ru.yml +0 -14
  94. data/vendor/carrierwave/lib/carrierwave/locale/sk.yml +0 -14
  95. data/vendor/carrierwave/lib/carrierwave/locale/tr.yml +0 -14
  96. data/vendor/carrierwave/lib/carrierwave/locale/zh-CN.yml +0 -14
  97. data/vendor/carrierwave/lib/carrierwave/locale/zh-TW.yml +0 -14
  98. data/vendor/carrierwave/lib/carrierwave/mount.rb +0 -444
  99. data/vendor/carrierwave/lib/carrierwave/mounter.rb +0 -163
  100. data/vendor/carrierwave/lib/carrierwave/orm/activerecord.rb +0 -103
  101. data/vendor/carrierwave/lib/carrierwave/processing.rb +0 -2
  102. data/vendor/carrierwave/lib/carrierwave/processing/mini_magick.rb +0 -328
  103. data/vendor/carrierwave/lib/carrierwave/processing/rmagick.rb +0 -379
  104. data/vendor/carrierwave/lib/carrierwave/sanitized_file.rb +0 -348
  105. data/vendor/carrierwave/lib/carrierwave/storage.rb +0 -2
  106. data/vendor/carrierwave/lib/carrierwave/storage/abstract.rb +0 -43
  107. data/vendor/carrierwave/lib/carrierwave/storage/file.rb +0 -118
  108. data/vendor/carrierwave/lib/carrierwave/storage/fog.rb +0 -462
  109. data/vendor/carrierwave/lib/carrierwave/test/matchers.rb +0 -394
  110. data/vendor/carrierwave/lib/carrierwave/uploader.rb +0 -67
  111. data/vendor/carrierwave/lib/carrierwave/uploader/cache.rb +0 -207
  112. data/vendor/carrierwave/lib/carrierwave/uploader/callbacks.rb +0 -33
  113. data/vendor/carrierwave/lib/carrierwave/uploader/configuration.rb +0 -203
  114. data/vendor/carrierwave/lib/carrierwave/uploader/content_type_blacklist.rb +0 -48
  115. data/vendor/carrierwave/lib/carrierwave/uploader/content_type_whitelist.rb +0 -48
  116. data/vendor/carrierwave/lib/carrierwave/uploader/default_url.rb +0 -17
  117. data/vendor/carrierwave/lib/carrierwave/uploader/download.rb +0 -92
  118. data/vendor/carrierwave/lib/carrierwave/uploader/extension_blacklist.rb +0 -51
  119. data/vendor/carrierwave/lib/carrierwave/uploader/extension_whitelist.rb +0 -51
  120. data/vendor/carrierwave/lib/carrierwave/uploader/file_size.rb +0 -41
  121. data/vendor/carrierwave/lib/carrierwave/uploader/magic_mime_blacklist.rb +0 -94
  122. data/vendor/carrierwave/lib/carrierwave/uploader/magic_mime_whitelist.rb +0 -94
  123. data/vendor/carrierwave/lib/carrierwave/uploader/mountable.rb +0 -38
  124. data/vendor/carrierwave/lib/carrierwave/uploader/processing.rb +0 -88
  125. data/vendor/carrierwave/lib/carrierwave/uploader/proxy.rb +0 -86
  126. data/vendor/carrierwave/lib/carrierwave/uploader/remove.rb +0 -21
  127. data/vendor/carrierwave/lib/carrierwave/uploader/serialization.rb +0 -28
  128. data/vendor/carrierwave/lib/carrierwave/uploader/store.rb +0 -93
  129. data/vendor/carrierwave/lib/carrierwave/uploader/url.rb +0 -41
  130. data/vendor/carrierwave/lib/carrierwave/uploader/versions.rb +0 -295
  131. data/vendor/carrierwave/lib/carrierwave/utilities.rb +0 -6
  132. data/vendor/carrierwave/lib/carrierwave/utilities/uri.rb +0 -21
  133. data/vendor/carrierwave/lib/carrierwave/validations/active_model.rb +0 -78
  134. data/vendor/carrierwave/lib/carrierwave/version.rb +0 -3
  135. data/vendor/carrierwave/lib/generators/templates/uploader.rb +0 -49
  136. data/vendor/carrierwave/lib/generators/uploader_generator.rb +0 -7
  137. data/vendor/carrierwave/script/console +0 -10
  138. data/vendor/carrierwave/script/destroy +0 -14
  139. data/vendor/carrierwave/script/generate +0 -14
  140. data/vendor/carrierwave/spec/compatibility/paperclip_spec.rb +0 -138
  141. data/vendor/carrierwave/spec/fixtures/Uppercase.jpg +0 -1
  142. data/vendor/carrierwave/spec/fixtures/bork.ttxt +0 -1
  143. data/vendor/carrierwave/spec/fixtures/bork.txt +0 -1
  144. data/vendor/carrierwave/spec/fixtures/bork.txtt +0 -1
  145. data/vendor/carrierwave/spec/fixtures/case.JPG +0 -1
  146. data/vendor/carrierwave/spec/fixtures/landscape.jpg +0 -0
  147. data/vendor/carrierwave/spec/fixtures/multi_page.pdf +0 -0
  148. data/vendor/carrierwave/spec/fixtures/new.jpeg +0 -1
  149. data/vendor/carrierwave/spec/fixtures/new.txt +0 -1
  150. data/vendor/carrierwave/spec/fixtures/old.jpeg +0 -1
  151. data/vendor/carrierwave/spec/fixtures/old.txt +0 -1
  152. data/vendor/carrierwave/spec/fixtures/portrait.jpg +0 -0
  153. data/vendor/carrierwave/spec/fixtures/ruby.gif +0 -0
  154. data/vendor/carrierwave/spec/fixtures/sponsored.doc +0 -1
  155. data/vendor/carrierwave/spec/fixtures/test+.jpg +0 -1
  156. data/vendor/carrierwave/spec/fixtures/test.jpeg +0 -1
  157. data/vendor/carrierwave/spec/fixtures/test.jpg +0 -1
  158. data/vendor/carrierwave/spec/generators/uploader_generator_spec.rb +0 -19
  159. data/vendor/carrierwave/spec/mount_multiple_spec.rb +0 -913
  160. data/vendor/carrierwave/spec/mount_single_spec.rb +0 -793
  161. data/vendor/carrierwave/spec/orm/activerecord_spec.rb +0 -1556
  162. data/vendor/carrierwave/spec/processing/mini_magick_spec.rb +0 -210
  163. data/vendor/carrierwave/spec/processing/rmagick_spec.rb +0 -250
  164. data/vendor/carrierwave/spec/sanitized_file_spec.rb +0 -805
  165. data/vendor/carrierwave/spec/spec_helper.rb +0 -105
  166. data/vendor/carrierwave/spec/storage/file_spec.rb +0 -82
  167. data/vendor/carrierwave/spec/storage/fog_credentials.rb +0 -46
  168. data/vendor/carrierwave/spec/storage/fog_helper.rb +0 -428
  169. data/vendor/carrierwave/spec/storage/fog_spec.rb +0 -48
  170. data/vendor/carrierwave/spec/support/activerecord.rb +0 -31
  171. data/vendor/carrierwave/spec/support/file_utils_helper.rb +0 -15
  172. data/vendor/carrierwave/spec/uploader/cache_spec.rb +0 -324
  173. data/vendor/carrierwave/spec/uploader/callback_spec.rb +0 -30
  174. data/vendor/carrierwave/spec/uploader/configuration_spec.rb +0 -133
  175. data/vendor/carrierwave/spec/uploader/content_type_blacklist_spec.rb +0 -61
  176. data/vendor/carrierwave/spec/uploader/content_type_whitelist_spec.rb +0 -63
  177. data/vendor/carrierwave/spec/uploader/default_url_spec.rb +0 -77
  178. data/vendor/carrierwave/spec/uploader/download_spec.rb +0 -204
  179. data/vendor/carrierwave/spec/uploader/extension_blacklist_spec.rb +0 -112
  180. data/vendor/carrierwave/spec/uploader/extension_whitelist_spec.rb +0 -102
  181. data/vendor/carrierwave/spec/uploader/file_size_spec.rb +0 -52
  182. data/vendor/carrierwave/spec/uploader/mountable_spec.rb +0 -26
  183. data/vendor/carrierwave/spec/uploader/overrides_spec.rb +0 -71
  184. data/vendor/carrierwave/spec/uploader/paths_spec.rb +0 -18
  185. data/vendor/carrierwave/spec/uploader/processing_spec.rb +0 -159
  186. data/vendor/carrierwave/spec/uploader/proxy_spec.rb +0 -79
  187. data/vendor/carrierwave/spec/uploader/remove_spec.rb +0 -71
  188. data/vendor/carrierwave/spec/uploader/store_spec.rb +0 -400
  189. data/vendor/carrierwave/spec/uploader/url_spec.rb +0 -273
  190. data/vendor/carrierwave/spec/uploader/versions_spec.rb +0 -633
@@ -1,14 +0,0 @@
1
- sk:
2
- errors:
3
- messages:
4
- carrierwave_processing_error: sa nepodarilo spracovať
5
- carrierwave_integrity_error: nie je povolený typ súboru
6
- carrierwave_download_error: nie je možné stiahnuť
7
- extension_whitelist_error: "Nie je možné nahrávať %{extension} súbory, povolené typy: %{allowed_types}"
8
- extension_blacklist_error: "Nie je možné nahrávať %{extension} súbory, zakázané typy: %{prohibited_types}"
9
- content_type_whitelist_error: "Nie je možné nahrávať %{content_type} súbory"
10
- content_type_blacklist_error: "Nie je možné nahrávať %{content_type} súbory"
11
- rmagick_processing_error: "Nepodarilo sa upraviť pomocou rmagick, možno nejde o obrázok? Hlásená chyba: %{e}"
12
- mini_magick_processing_error: "Nepodarilo sa upraviť pomocou MiniMagick, možno nejde o obrázok? Hlásená chyba: %{e}"
13
- min_size_error: "Filstorleken ska vara större än %{min_size}"
14
- max_size_error: "Filstorleken bör vara mindre än %{max_size}"
@@ -1,14 +0,0 @@
1
- tr:
2
- errors:
3
- messages:
4
- carrierwave_processing_error: işlenmesi sırasında hata oluştu
5
- carrierwave_integrity_error: izin verilebilir bir dosya türü değil
6
- carrierwave_download_error: indirilemedi
7
- extension_whitelist_error: "%{extension} uzantılı dosyaları yükleme izniniz yok, izin verilen uzantılar: %{allowed_types}"
8
- extension_blacklist_error: "%{extension} uzantılı dosyaları yükleme izniniz yok, izin verilmeyen uzantılar: %{prohibited_types}"
9
- content_type_whitelist_error: "%{content_type} uzantılı dosyaları yükleme izniniz yok"
10
- content_type_blacklist_error: "%{content_type} uzantılı dosyaları yükleme izniniz yok"
11
- rmagick_processing_error: "Resim rmagick ile düzenlenemedi, belkide resim değildir? Orjinal Hata: %{e}"
12
- mini_magick_processing_error: "Resim MiniMagick ile düzenlenemedi, belkide resim değildir? Orjinal Hata: %{e}"
13
- min_size_error: "Dosya boyutu daha büyük olmalıdır %{min_size}"
14
- max_size_error: "Dosya boyutu daha az olmalıdır %{max_size}"
@@ -1,14 +0,0 @@
1
- zh-CN:
2
- errors:
3
- messages:
4
- carrierwave_processing_error: 处理错误
5
- carrierwave_integrity_error: 文件类型不正确
6
- carrierwave_download_error: 下载错误
7
- extension_whitelist_error: "不可上传 %{extension} 文件, 可上传文件类型为: %{allowed_types}"
8
- extension_blacklist_error: "不可上传 %{extension} 文件, 不可上传文件类型为: %{prohibited_types}"
9
- content_type_whitelist_error: "不可上传 %{content_type} 文件"
10
- content_type_blacklist_error: "不可上传 %{content_type} 文件"
11
- rmagick_processing_error: "rmagick 错误, 也许上传的文件不是图片? 原错误: %{e}"
12
- mini_magick_processing_error: "MiniMagick 错误, 也许上传的文件不是图片? 原错误: %{e}"
13
- min_size_error: "文件大小应大于 %{min_size}"
14
- max_size_error: "文件的大小应小于 %{max_size}"
@@ -1,14 +0,0 @@
1
- zh-TW:
2
- errors:
3
- messages:
4
- carrierwave_processing_error: 處理錯誤
5
- carrierwave_integrity_error: 文件類型錯誤
6
- carrierwave_download_error: 下載錯誤
7
- extension_whitelist_error: "不可上傳 %{extension} 文件, 可上傳文件類型為: %{allowed_types}"
8
- extension_blacklist_error: "不可上傳 %{extension} 文件, 不可上傳文件類型為: %{prohibited_types}"
9
- content_type_whitelist_error: "不可上傳 %{content_type} 文件"
10
- content_type_blacklist_error: "不可上傳 %{content_type} 文件"
11
- rmagick_processing_error: "rmagick 錯誤, 也許上傳的的文件不是圖片? 原錯誤: %{e}"
12
- mini_magick_processing_error: "MiniMagick 錯誤, 也許上傳的文件不是圖片? 原錯誤: %{e}"
13
- min_size_error: "文件大小應大於 %{min_size}"
14
- max_size_error: "文件大小應小於 %{max_size}"
@@ -1,444 +0,0 @@
1
- module CarrierWave
2
-
3
- ##
4
- # If a Class is extended with this module, it gains the mount_uploader
5
- # method, which is used for mapping attributes to uploaders and allowing
6
- # easy assignment.
7
- #
8
- # You can use mount_uploader with pretty much any class, however it is
9
- # intended to be used with some kind of persistent storage, like an ORM.
10
- # If you want to persist the uploaded files in a particular Class, it
11
- # needs to implement a `read_uploader` and a `write_uploader` method.
12
- #
13
- module Mount
14
-
15
- ##
16
- # === Returns
17
- #
18
- # [Hash{Symbol => CarrierWave}] what uploaders are mounted on which columns
19
- #
20
- def uploaders
21
- @uploaders ||= superclass.respond_to?(:uploaders) ? superclass.uploaders.dup : {}
22
- end
23
-
24
- def uploader_options
25
- @uploader_options ||= superclass.respond_to?(:uploader_options) ? superclass.uploader_options.dup : {}
26
- end
27
-
28
- ##
29
- # Return a particular option for a particular uploader
30
- #
31
- # === Parameters
32
- #
33
- # [column (Symbol)] The column the uploader is mounted at
34
- # [option (Symbol)] The option, e.g. validate_integrity
35
- #
36
- # === Returns
37
- #
38
- # [Object] The option value
39
- #
40
- def uploader_option(column, option)
41
- if uploader_options[column].has_key?(option)
42
- uploader_options[column][option]
43
- else
44
- uploaders[column].send(option)
45
- end
46
- end
47
-
48
- ##
49
- # Mounts the given uploader on the given column. This means that assigning
50
- # and reading from the column will upload and retrieve files. Supposing
51
- # that a User class has an uploader mounted on image, you can assign and
52
- # retrieve files like this:
53
- #
54
- # @user.image # => <Uploader>
55
- # @user.image.store!(some_file_object)
56
- #
57
- # @user.image.url # => '/some_url.png'
58
- #
59
- # It is also possible (but not recommended) to omit the uploader, which
60
- # will create an anonymous uploader class.
61
- #
62
- # Passing a block makes it possible to customize the uploader. This can be
63
- # convenient for brevity, but if there is any significant logic in the
64
- # uploader, you should do the right thing and have it in its own file.
65
- #
66
- # === Added instance methods
67
- #
68
- # Supposing a class has used +mount_uploader+ to mount an uploader on a column
69
- # named +image+, in that case the following methods will be added to the class:
70
- #
71
- # [image] Returns an instance of the uploader only if anything has been uploaded
72
- # [image=] Caches the given file
73
- #
74
- # [image_url] Returns the url to the uploaded file
75
- #
76
- # [image_cache] Returns a string that identifies the cache location of the file
77
- # [image_cache=] Retrieves the file from the cache based on the given cache name
78
- #
79
- # [remote_image_url] Returns previously cached remote url
80
- # [remote_image_url=] Retrieve the file from the remote url
81
- #
82
- # [remove_image] An attribute reader that can be used with a checkbox to mark a file for removal
83
- # [remove_image=] An attribute writer that can be used with a checkbox to mark a file for removal
84
- # [remove_image?] Whether the file should be removed when store_image! is called.
85
- #
86
- # [store_image!] Stores a file that has been assigned with +image=+
87
- # [remove_image!] Removes the uploaded file from the filesystem.
88
- #
89
- # [image_integrity_error] Returns an error object if the last file to be assigned caused an integrity error
90
- # [image_processing_error] Returns an error object if the last file to be assigned caused a processing error
91
- # [image_download_error] Returns an error object if the last file to be remotely assigned caused a download error
92
- #
93
- # [image_identifier] Reads out the identifier of the file
94
- #
95
- # === Parameters
96
- #
97
- # [column (Symbol)] the attribute to mount this uploader on
98
- # [uploader (CarrierWave::Uploader)] the uploader class to mount
99
- # [options (Hash{Symbol => Object})] a set of options
100
- # [&block (Proc)] customize anonymous uploaders
101
- #
102
- # === Options
103
- #
104
- # [:mount_on => Symbol] if the name of the column to be serialized to differs you can override it using this option
105
- # [:ignore_integrity_errors => Boolean] if set to true, integrity errors will result in caching failing silently
106
- # [:ignore_processing_errors => Boolean] if set to true, processing errors will result in caching failing silently
107
- #
108
- # === Examples
109
- #
110
- # Mounting uploaders on different columns.
111
- #
112
- # class Song
113
- # mount_uploader :lyrics, LyricsUploader
114
- # mount_uploader :alternative_lyrics, LyricsUploader
115
- # mount_uploader :file, SongUploader
116
- # end
117
- #
118
- # This will add an anonymous uploader with only the default settings:
119
- #
120
- # class Data
121
- # mount_uploader :csv
122
- # end
123
- #
124
- # this will add an anonymous uploader overriding the store_dir:
125
- #
126
- # class Product
127
- # mount_uploader :blueprint do
128
- # def store_dir
129
- # 'blueprints'
130
- # end
131
- # end
132
- # end
133
- #
134
- def mount_uploader(column, uploader=nil, options={}, &block)
135
- mount_base(column, uploader, options, &block)
136
-
137
- mod = Module.new
138
- include mod
139
- mod.class_eval <<-RUBY, __FILE__, __LINE__+1
140
-
141
- def #{column}
142
- _mounter(:#{column}).uploaders[0] ||= _mounter(:#{column}).blank_uploader
143
- end
144
-
145
- def #{column}=(new_file)
146
- _mounter(:#{column}).cache([new_file])
147
- end
148
-
149
- def #{column}_url(*args)
150
- #{column}.url(*args)
151
- end
152
-
153
- def #{column}_cache
154
- _mounter(:#{column}).cache_names[0]
155
- end
156
-
157
- def #{column}_cache=(cache_name)
158
- _mounter(:#{column}).cache_names = [cache_name]
159
- end
160
-
161
- def remote_#{column}_url
162
- [_mounter(:#{column}).remote_urls].flatten[0]
163
- end
164
-
165
- def remote_#{column}_url=(url)
166
- _mounter(:#{column}).remote_urls = [url]
167
- end
168
-
169
- def write_#{column}_identifier
170
- return if frozen?
171
- mounter = _mounter(:#{column})
172
-
173
- if mounter.remove?
174
- write_uploader(mounter.serialization_column, nil)
175
- elsif mounter.identifiers.first
176
- write_uploader(mounter.serialization_column, mounter.identifiers.first)
177
- end
178
- end
179
-
180
- def #{column}_identifier
181
- _mounter(:#{column}).read_identifiers[0]
182
- end
183
-
184
- def store_previous_changes_for_#{column}
185
- @_previous_changes_for_#{column} = changes[_mounter(:#{column}).serialization_column]
186
- end
187
-
188
- def remove_previously_stored_#{column}
189
- before, after = @_previous_changes_for_#{column}
190
- _mounter(:#{column}).remove_previous([before], [after])
191
- end
192
- RUBY
193
- end
194
-
195
- ##
196
- # Mounts the given uploader on the given array column. This means that
197
- # assigning and reading from the array column will upload and retrieve
198
- # multiple files. Supposing that a User class has an uploader mounted on
199
- # images, and that images can store an array, for example it could be a
200
- # PostgreSQL JSON column. You can assign and retrieve files like this:
201
- #
202
- # @user.images # => []
203
- # @user.images = [some_file_object]
204
- # @user.images # => [<Uploader>]
205
- #
206
- # @user.images[0].url # => '/some_url.png'
207
- #
208
- # It is also possible (but not recommended) to omit the uploader, which
209
- # will create an anonymous uploader class.
210
- #
211
- # Passing a block makes it possible to customize the uploader. This can be
212
- # convenient for brevity, but if there is any significant logic in the
213
- # uploader, you should do the right thing and have it in its own file.
214
- #
215
- # === Added instance methods
216
- #
217
- # Supposing a class has used +mount_uploaders+ to mount an uploader on a column
218
- # named +images+, in that case the following methods will be added to the class:
219
- #
220
- # [images] Returns an array of uploaders for each uploaded file
221
- # [images=] Caches the given files
222
- #
223
- # [images_urls] Returns the urls to the uploaded files
224
- #
225
- # [images_cache] Returns a string that identifies the cache location of the files
226
- # [images_cache=] Retrieves the files from the cache based on the given cache name
227
- #
228
- # [remote_image_urls] Returns previously cached remote urls
229
- # [remote_image_urls=] Retrieve files from the given remote urls
230
- #
231
- # [remove_images] An attribute reader that can be used with a checkbox to mark the files for removal
232
- # [remove_images=] An attribute writer that can be used with a checkbox to mark the files for removal
233
- # [remove_images?] Whether the files should be removed when store_image! is called.
234
- #
235
- # [store_images!] Stores all files that have been assigned with +images=+
236
- # [remove_images!] Removes the uploaded file from the filesystem.
237
- #
238
- # [images_integrity_error] Returns an error object if the last files to be assigned caused an integrity error
239
- # [images_processing_error] Returns an error object if the last files to be assigned caused a processing error
240
- # [images_download_error] Returns an error object if the last files to be remotely assigned caused a download error
241
- #
242
- # [image_identifiers] Reads out the identifiers of the files
243
- #
244
- # === Parameters
245
- #
246
- # [column (Symbol)] the attribute to mount this uploader on
247
- # [uploader (CarrierWave::Uploader)] the uploader class to mount
248
- # [options (Hash{Symbol => Object})] a set of options
249
- # [&block (Proc)] customize anonymous uploaders
250
- #
251
- # === Options
252
- #
253
- # [:mount_on => Symbol] if the name of the column to be serialized to differs you can override it using this option
254
- # [:ignore_integrity_errors => Boolean] if set to true, integrity errors will result in caching failing silently
255
- # [:ignore_processing_errors => Boolean] if set to true, processing errors will result in caching failing silently
256
- #
257
- # === Examples
258
- #
259
- # Mounting uploaders on different columns.
260
- #
261
- # class Song
262
- # mount_uploaders :lyrics, LyricsUploader
263
- # mount_uploaders :alternative_lyrics, LyricsUploader
264
- # mount_uploaders :files, SongUploader
265
- # end
266
- #
267
- # This will add an anonymous uploader with only the default settings:
268
- #
269
- # class Data
270
- # mount_uploaders :csv_files
271
- # end
272
- #
273
- # this will add an anonymous uploader overriding the store_dir:
274
- #
275
- # class Product
276
- # mount_uploaders :blueprints do
277
- # def store_dir
278
- # 'blueprints'
279
- # end
280
- # end
281
- # end
282
- #
283
- def mount_uploaders(column, uploader=nil, options={}, &block)
284
- mount_base(column, uploader, options, &block)
285
-
286
- mod = Module.new
287
- include mod
288
- mod.class_eval <<-RUBY, __FILE__, __LINE__+1
289
-
290
- def #{column}
291
- _mounter(:#{column}).uploaders
292
- end
293
-
294
- def #{column}=(new_files)
295
- _mounter(:#{column}).cache(new_files)
296
- end
297
-
298
- def #{column}_urls(*args)
299
- _mounter(:#{column}).urls(*args)
300
- end
301
-
302
- def #{column}_cache
303
- names = _mounter(:#{column}).cache_names
304
- names.to_json if names.present?
305
- end
306
-
307
- def #{column}_cache=(cache_name)
308
- _mounter(:#{column}).cache_names = JSON.parse(cache_name) if cache_name.present?
309
- end
310
-
311
- def remote_#{column}_urls
312
- _mounter(:#{column}).remote_urls
313
- end
314
-
315
- def remote_#{column}_urls=(urls)
316
- _mounter(:#{column}).remote_urls = urls
317
- end
318
-
319
- def write_#{column}_identifier
320
- return if frozen?
321
- mounter = _mounter(:#{column})
322
-
323
- if mounter.remove?
324
- write_uploader(mounter.serialization_column, nil)
325
- elsif mounter.identifiers.any?
326
- write_uploader(mounter.serialization_column, mounter.identifiers)
327
- end
328
- end
329
-
330
- def #{column}_identifiers
331
- _mounter(:#{column}).read_identifiers
332
- end
333
-
334
- def store_previous_changes_for_#{column}
335
- @_previous_changes_for_#{column} = changes[_mounter(:#{column}).serialization_column]
336
- end
337
-
338
- def remove_previously_stored_#{column}
339
- _mounter(:#{column}).remove_previous(*@_previous_changes_for_#{column})
340
- end
341
- RUBY
342
- end
343
-
344
- private
345
-
346
- def mount_base(column, uploader=nil, options={}, &block)
347
- include CarrierWave::Mount::Extension
348
-
349
- uploader = build_uploader(uploader, &block)
350
- uploaders[column.to_sym] = uploader
351
- uploader_options[column.to_sym] = options
352
-
353
- # Make sure to write over accessors directly defined on the class.
354
- # Simply super to the included module below.
355
- class_eval <<-RUBY, __FILE__, __LINE__+1
356
- def #{column}; super; end
357
- def #{column}=(new_file); super; end
358
- RUBY
359
-
360
- mod = Module.new
361
- include mod
362
- mod.class_eval <<-RUBY, __FILE__, __LINE__+1
363
-
364
- def #{column}?
365
- _mounter(:#{column}).present?
366
- end
367
-
368
- def remove_#{column}
369
- _mounter(:#{column}).remove
370
- end
371
-
372
- def remove_#{column}!
373
- _mounter(:#{column}).remove!
374
- end
375
-
376
- def remove_#{column}=(value)
377
- _mounter(:#{column}).remove = value
378
- end
379
-
380
- def remove_#{column}?
381
- _mounter(:#{column}).remove?
382
- end
383
-
384
- def store_#{column}!
385
- _mounter(:#{column}).store!
386
- end
387
-
388
- def #{column}_integrity_error
389
- _mounter(:#{column}).integrity_error
390
- end
391
-
392
- def #{column}_processing_error
393
- _mounter(:#{column}).processing_error
394
- end
395
-
396
- def #{column}_download_error
397
- _mounter(:#{column}).download_error
398
- end
399
-
400
- def mark_remove_#{column}_false
401
- _mounter(:#{column}).remove = false
402
- end
403
- RUBY
404
- end
405
-
406
- def build_uploader(uploader, &block)
407
- return uploader if uploader && !block_given?
408
-
409
- uploader = Class.new(uploader || CarrierWave::Uploader::Base)
410
- const_set("Uploader#{uploader.object_id}".tr('-', '_'), uploader)
411
-
412
- if block_given?
413
- uploader.class_eval(&block)
414
- uploader.recursively_apply_block_to_versions(&block)
415
- end
416
-
417
- uploader
418
- end
419
-
420
- module Extension
421
-
422
- ##
423
- # overwrite this to read from a serialized attribute
424
- #
425
- def read_uploader(column); end
426
-
427
- ##
428
- # overwrite this to write to a serialized attribute
429
- #
430
- def write_uploader(column, identifier); end
431
-
432
- private
433
-
434
- def _mounter(column)
435
- # We cannot memoize in frozen objects :(
436
- return Mounter.new(self, column) if frozen?
437
- @_mounters ||= {}
438
- @_mounters[column] ||= Mounter.new(self, column)
439
- end
440
-
441
- end # Extension
442
-
443
- end # Mount
444
- end # CarrierWave