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,2 +0,0 @@
1
- require "carrierwave/storage/abstract"
2
- require "carrierwave/storage/file"
@@ -1,43 +0,0 @@
1
- module CarrierWave
2
- module Storage
3
-
4
- ##
5
- # This file serves mostly as a specification for Storage engines. There is no requirement
6
- # that storage engines must be a subclass of this class.
7
- #
8
- class Abstract
9
-
10
- attr_reader :uploader
11
-
12
- def initialize(uploader)
13
- @uploader = uploader
14
- end
15
-
16
- def identifier
17
- uploader.filename
18
- end
19
-
20
- def store!(file)
21
- end
22
-
23
- def retrieve!(identifier)
24
- end
25
-
26
- def cache!(new_file)
27
- raise NotImplementedError.new("Need to implement #cache! if you want to use #{self.class.name} as a cache storage.")
28
- end
29
-
30
- def retrieve_from_cache!(identifier)
31
- raise NotImplementedError.new("Need to implement #retrieve_from_cache! if you want to use #{self.class.name} as a cache storage.")
32
- end
33
-
34
- def delete_dir!(path)
35
- raise NotImplementedError.new("Need to implement #delete_dir! if you want to use #{self.class.name} as a cache storage.")
36
- end
37
-
38
- def clean_cache!(seconds)
39
- raise NotImplementedError.new("Need to implement #clean_cache! if you want to use #{self.class.name} as a cache storage.")
40
- end
41
- end # Abstract
42
- end # Storage
43
- end # CarrierWave
@@ -1,118 +0,0 @@
1
- module CarrierWave
2
- module Storage
3
-
4
- ##
5
- # File storage stores file to the Filesystem (surprising, no?). There's really not much
6
- # to it, it uses the store_dir defined on the uploader as the storage location. That's
7
- # pretty much it.
8
- #
9
- class File < Abstract
10
-
11
- ##
12
- # Move the file to the uploader's store path.
13
- #
14
- # By default, store!() uses copy_to(), which operates by copying the file
15
- # from the cache to the store, then deleting the file from the cache.
16
- # If move_to_store() is overriden to return true, then store!() uses move_to(),
17
- # which simply moves the file from cache to store. Useful for large files.
18
- #
19
- # === Parameters
20
- #
21
- # [file (CarrierWave::SanitizedFile)] the file to store
22
- #
23
- # === Returns
24
- #
25
- # [CarrierWave::SanitizedFile] a sanitized file
26
- #
27
- def store!(file)
28
- path = ::File.expand_path(uploader.store_path, uploader.root)
29
- if uploader.move_to_store
30
- file.move_to(path, uploader.permissions, uploader.directory_permissions)
31
- else
32
- file.copy_to(path, uploader.permissions, uploader.directory_permissions)
33
- end
34
- end
35
-
36
- ##
37
- # Retrieve the file from its store path
38
- #
39
- # === Parameters
40
- #
41
- # [identifier (String)] the filename of the file
42
- #
43
- # === Returns
44
- #
45
- # [CarrierWave::SanitizedFile] a sanitized file
46
- #
47
- def retrieve!(identifier)
48
- path = ::File.expand_path(uploader.store_path(identifier), uploader.root)
49
- CarrierWave::SanitizedFile.new(path)
50
- end
51
-
52
- ##
53
- # Stores given file to cache directory.
54
- #
55
- # === Parameters
56
- #
57
- # [new_file (File, IOString, Tempfile)] any kind of file object
58
- #
59
- # === Returns
60
- #
61
- # [CarrierWave::SanitizedFile] a sanitized file
62
- #
63
- def cache!(new_file)
64
- new_file.move_to(::File.expand_path(uploader.cache_path, uploader.root), uploader.permissions, uploader.directory_permissions, true)
65
- rescue Errno::EMLINK => e
66
- raise(e) if @cache_called
67
- @cache_called = true
68
-
69
- # NOTE: Remove cached files older than 10 minutes
70
- clean_cache!(600)
71
-
72
- cache!(new_file)
73
- end
74
-
75
- ##
76
- # Retrieves the file with the given cache_name from the cache.
77
- #
78
- # === Parameters
79
- #
80
- # [cache_name (String)] uniquely identifies a cache file
81
- #
82
- # === Raises
83
- #
84
- # [CarrierWave::InvalidParameter] if the cache_name is incorrectly formatted.
85
- #
86
- def retrieve_from_cache!(identifier)
87
- CarrierWave::SanitizedFile.new(::File.expand_path(uploader.cache_path(identifier), uploader.root))
88
- end
89
-
90
- ##
91
- # Deletes a cache dir
92
- #
93
- def delete_dir!(path)
94
- if path
95
- begin
96
- Dir.rmdir(::File.expand_path(path, uploader.root))
97
- rescue Errno::ENOENT
98
- # Ignore: path does not exist
99
- rescue Errno::ENOTDIR
100
- # Ignore: path is not a dir
101
- rescue Errno::ENOTEMPTY, Errno::EEXIST
102
- # Ignore: dir is not empty
103
- end
104
- end
105
- end
106
-
107
- def clean_cache!(seconds)
108
- Dir.glob(::File.expand_path(::File.join(uploader.cache_dir, '*'), CarrierWave.root)).each do |dir|
109
- time = dir.scan(/(\d+)-\d+-\d+$/).first.map(&:to_i)
110
- time = Time.at(*time)
111
- if time < (Time.now.utc - seconds)
112
- FileUtils.rm_rf(dir)
113
- end
114
- end
115
- end
116
- end # File
117
- end # Storage
118
- end # CarrierWave
@@ -1,462 +0,0 @@
1
- module CarrierWave
2
- module Storage
3
-
4
- ##
5
- # Stores things using the "fog" gem.
6
- #
7
- # fog supports storing files with AWS, Google, Local and Rackspace
8
- #
9
- # You need to setup some options to configure your usage:
10
- #
11
- # [:fog_credentials] host info and credentials for service
12
- # [:fog_directory] specifies name of directory to store data in, assumed to already exist
13
- #
14
- # [:fog_attributes] (optional) additional attributes to set on files
15
- # [:fog_public] (optional) public readability, defaults to true
16
- # [:fog_authenticated_url_expiration] (optional) time (in seconds) that authenticated urls
17
- # will be valid, when fog_public is false and provider is AWS or Google, defaults to 600
18
- # [:fog_use_ssl_for_aws] (optional) #public_url will use https for the AWS generated URL]
19
- #
20
- #
21
- # AWS credentials contain the following keys:
22
- #
23
- # [:aws_access_key_id]
24
- # [:aws_secret_access_key]
25
- # [:region] (optional) defaults to 'us-east-1'
26
- # :region should be one of ['eu-west-1', 'us-east-1', 'ap-southeast-1', 'us-west-1', 'ap-northeast-1', 'eu-central-1']
27
- #
28
- #
29
- # Google credentials contain the following keys:
30
- # [:google_storage_access_key_id]
31
- # [:google_storage_secrete_access_key]
32
- #
33
- #
34
- # Local credentials contain the following keys:
35
- #
36
- # [:local_root] local path to files
37
- #
38
- #
39
- # Rackspace credentials contain the following keys:
40
- #
41
- # [:rackspace_username]
42
- # [:rackspace_api_key]
43
- #
44
- #
45
- # A full example with AWS credentials:
46
- # CarrierWave.configure do |config|
47
- # config.fog_credentials = {
48
- # :aws_access_key_id => 'xxxxxx',
49
- # :aws_secret_access_key => 'yyyyyy',
50
- # :provider => 'AWS'
51
- # }
52
- # config.fog_directory = 'directoryname'
53
- # config.fog_public = true
54
- # end
55
- #
56
- class Fog < Abstract
57
- class << self
58
- def connection_cache
59
- @connection_cache ||= {}
60
- end
61
- end
62
-
63
- ##
64
- # Store a file
65
- #
66
- # === Parameters
67
- #
68
- # [file (CarrierWave::SanitizedFile)] the file to store
69
- #
70
- # === Returns
71
- #
72
- # [CarrierWave::Storage::Fog::File] the stored file
73
- #
74
- def store!(file)
75
- f = CarrierWave::Storage::Fog::File.new(uploader, self, uploader.store_path)
76
- f.store(file)
77
- f
78
- end
79
-
80
- ##
81
- # Retrieve a file
82
- #
83
- # === Parameters
84
- #
85
- # [identifier (String)] unique identifier for file
86
- #
87
- # === Returns
88
- #
89
- # [CarrierWave::Storage::Fog::File] the stored file
90
- #
91
- def retrieve!(identifier)
92
- CarrierWave::Storage::Fog::File.new(uploader, self, uploader.store_path(identifier))
93
- end
94
-
95
- ##
96
- # Stores given file to cache directory.
97
- #
98
- # === Parameters
99
- #
100
- # [new_file (File, IOString, Tempfile)] any kind of file object
101
- #
102
- # === Returns
103
- #
104
- # [CarrierWave::SanitizedFile] a sanitized file
105
- #
106
- def cache!(new_file)
107
- f = CarrierWave::Storage::Fog::File.new(uploader, self, uploader.cache_path)
108
- f.store(new_file)
109
- f
110
- end
111
-
112
- ##
113
- # Retrieves the file with the given cache_name from the cache.
114
- #
115
- # === Parameters
116
- #
117
- # [cache_name (String)] uniquely identifies a cache file
118
- #
119
- # === Raises
120
- #
121
- # [CarrierWave::InvalidParameter] if the cache_name is incorrectly formatted.
122
- #
123
- def retrieve_from_cache!(identifier)
124
- CarrierWave::Storage::Fog::File.new(uploader, self, uploader.cache_path(identifier))
125
- end
126
-
127
- ##
128
- # Deletes a cache dir
129
- #
130
- def delete_dir!(path)
131
- # do nothing, because there's no such things as 'empty directory'
132
- end
133
-
134
- def clean_cache!(seconds)
135
- connection.directories.new(
136
- :key => uploader.fog_directory,
137
- :public => uploader.fog_public
138
- ).files.all(:prefix => uploader.cache_dir).each do |file|
139
- time = file.key.scan(/(\d+)-\d+-\d+/).first.map { |t| t.to_i }
140
- time = Time.at(*time)
141
- file.destroy if time < (Time.now.utc - seconds)
142
- end
143
- end
144
-
145
- def connection
146
- @connection ||= begin
147
- options = credentials = uploader.fog_credentials
148
- self.class.connection_cache[credentials] ||= ::Fog::Storage.new(options)
149
- end
150
- end
151
-
152
- class File
153
- include CarrierWave::Utilities::Uri
154
-
155
- ##
156
- # Current local path to file
157
- #
158
- # === Returns
159
- #
160
- # [String] a path to file
161
- #
162
- attr_reader :path
163
-
164
- ##
165
- # Return all attributes from file
166
- #
167
- # === Returns
168
- #
169
- # [Hash] attributes from file
170
- #
171
- def attributes
172
- file.attributes
173
- end
174
-
175
- ##
176
- # Return a temporary authenticated url to a private file, if available
177
- # Only supported for AWS, Rackspace and Google providers
178
- #
179
- # === Returns
180
- #
181
- # [String] temporary authenticated url
182
- # or
183
- # [NilClass] no authenticated url available
184
- #
185
- def authenticated_url(options = {})
186
- if ['AWS', 'Google', 'Rackspace', 'OpenStack'].include?(@uploader.fog_credentials[:provider])
187
- # avoid a get by using local references
188
- local_directory = connection.directories.new(:key => @uploader.fog_directory)
189
- local_file = local_directory.files.new(:key => path)
190
- expire_at = ::Fog::Time.now + @uploader.fog_authenticated_url_expiration
191
- case @uploader.fog_credentials[:provider]
192
- when 'AWS'
193
- local_file.url(expire_at, options)
194
- when 'Rackspace'
195
- connection.get_object_https_url(@uploader.fog_directory, path, expire_at, options)
196
- when 'OpenStack'
197
- connection.get_object_https_url(@uploader.fog_directory, path, expire_at)
198
- else
199
- local_file.url(expire_at)
200
- end
201
- end
202
- end
203
-
204
- ##
205
- # Lookup value for file content-type header
206
- #
207
- # === Returns
208
- #
209
- # [String] value of content-type
210
- #
211
- def content_type
212
- @content_type || !file.nil? && file.content_type
213
- end
214
-
215
- ##
216
- # Set non-default content-type header (default is file.content_type)
217
- #
218
- # === Returns
219
- #
220
- # [String] returns new content type value
221
- #
222
- def content_type=(new_content_type)
223
- @content_type = new_content_type
224
- end
225
-
226
- ##
227
- # Remove the file from service
228
- #
229
- # === Returns
230
- #
231
- # [Boolean] true for success or raises error
232
- #
233
- def delete
234
- # avoid a get by just using local reference
235
- directory.files.new(:key => path).destroy
236
- end
237
-
238
- ##
239
- # Return extension of file
240
- #
241
- # === Returns
242
- #
243
- # [String] extension of file or nil if the file has no extension
244
- #
245
- def extension
246
- path_elements = path.split('.')
247
- path_elements.last if path_elements.size > 1
248
- end
249
-
250
- ##
251
- # deprecated: All attributes from file (includes headers)
252
- #
253
- # === Returns
254
- #
255
- # [Hash] attributes from file
256
- #
257
- def headers
258
- location = caller.first
259
- warning = "[yellow][WARN] headers is deprecated, use attributes instead[/]"
260
- warning << " [light_black](#{location})[/]"
261
- Formatador.display_line(warning)
262
- attributes
263
- end
264
-
265
- def initialize(uploader, base, path)
266
- @uploader, @base, @path = uploader, base, path
267
- end
268
-
269
- ##
270
- # Read content of file from service
271
- #
272
- # === Returns
273
- #
274
- # [String] contents of file
275
- def read
276
- file.body
277
- end
278
-
279
- ##
280
- # Return size of file body
281
- #
282
- # === Returns
283
- #
284
- # [Integer] size of file body
285
- #
286
- def size
287
- file.nil? ? 0 : file.content_length
288
- end
289
-
290
- ##
291
- # Check if the file exists on the remote service
292
- #
293
- # === Returns
294
- #
295
- # [Boolean] true if file exists or false
296
- def exists?
297
- !!directory.files.head(path)
298
- end
299
-
300
- ##
301
- # Write file to service
302
- #
303
- # === Returns
304
- #
305
- # [Boolean] true on success or raises error
306
- def store(new_file)
307
- if new_file.is_a?(self.class)
308
- new_file.copy_to(path)
309
- else
310
- fog_file = new_file.to_file
311
- @content_type ||= new_file.content_type
312
- @file = directory.files.create({
313
- :body => (fog_file ? fog_file : new_file).read,
314
- :content_type => @content_type,
315
- :key => path,
316
- :public => @uploader.fog_public
317
- }.merge(@uploader.fog_attributes))
318
- fog_file.close if fog_file && !fog_file.closed?
319
- end
320
- true
321
- end
322
-
323
- ##
324
- # Return a url to a public file, if available
325
- #
326
- # === Returns
327
- #
328
- # [String] public url
329
- # or
330
- # [NilClass] no public url available
331
- #
332
- def public_url
333
- encoded_path = encode_path(path)
334
- if host = @uploader.asset_host
335
- if host.respond_to? :call
336
- "#{host.call(self)}/#{encoded_path}"
337
- else
338
- "#{host}/#{encoded_path}"
339
- end
340
- else
341
- # AWS/Google optimized for speed over correctness
342
- case @uploader.fog_credentials[:provider].to_s
343
- when 'AWS'
344
- # check if some endpoint is set in fog_credentials
345
- if @uploader.fog_credentials.has_key?(:endpoint)
346
- "#{@uploader.fog_credentials[:endpoint]}/#{@uploader.fog_directory}/#{encoded_path}"
347
- else
348
- protocol = @uploader.fog_use_ssl_for_aws ? "https" : "http"
349
- # if directory is a valid subdomain, use that style for access
350
- if @uploader.fog_directory.to_s =~ /^(?:[a-z]|\d(?!\d{0,2}(?:\d{1,3}){3}$))(?:[a-z0-9\.]|(?![\-])|\-(?![\.])){1,61}[a-z0-9]$/
351
- "#{protocol}://#{@uploader.fog_directory}.s3.amazonaws.com/#{encoded_path}"
352
- else
353
- # directory is not a valid subdomain, so use path style for access
354
- "#{protocol}://s3.amazonaws.com/#{@uploader.fog_directory}/#{encoded_path}"
355
- end
356
- end
357
- when 'Google'
358
- file = directory.files.get(encoded_path)
359
- file.nil?? "" : file.public_url
360
- else
361
- # avoid a get by just using local reference
362
- directory.files.new(:key => path).public_url
363
- end
364
- end
365
- end
366
-
367
- ##
368
- # Return url to file, if avaliable
369
- #
370
- # === Returns
371
- #
372
- # [String] url
373
- # or
374
- # [NilClass] no url available
375
- #
376
- def url(options = {})
377
- if !@uploader.fog_public
378
- authenticated_url(options)
379
- else
380
- public_url
381
- end
382
- end
383
-
384
- ##
385
- # Return file name, if available
386
- #
387
- # === Returns
388
- #
389
- # [String] file name
390
- # or
391
- # [NilClass] no file name available
392
- #
393
- def filename(options = {})
394
- return unless file_url = url(options)
395
- CGI.unescape(file_url.split('?').first).gsub(/.*\/(.*?$)/, '\1')
396
- end
397
-
398
- ##
399
- # Creates a copy of this file and returns it.
400
- #
401
- # === Parameters
402
- #
403
- # [new_path (String)] The path where the file should be copied to.
404
- #
405
- # === Returns
406
- #
407
- # @return [CarrierWave::Storage::Fog::File] the location where the file will be stored.
408
- #
409
- def copy_to(new_path)
410
- connection.copy_object(@uploader.fog_directory, file.key, @uploader.fog_directory, new_path, acl_header)
411
- CarrierWave::Storage::Fog::File.new(@uploader, @base, new_path)
412
- end
413
-
414
- private
415
-
416
- ##
417
- # connection to service
418
- #
419
- # === Returns
420
- #
421
- # [Fog::#{provider}::Storage] connection to service
422
- #
423
- def connection
424
- @base.connection
425
- end
426
-
427
- ##
428
- # local reference to directory containing file
429
- #
430
- # === Returns
431
- #
432
- # [Fog::#{provider}::Directory] containing directory
433
- #
434
- def directory
435
- @directory ||= begin
436
- connection.directories.new(
437
- :key => @uploader.fog_directory,
438
- :public => @uploader.fog_public
439
- )
440
- end
441
- end
442
-
443
- ##
444
- # lookup file
445
- #
446
- # === Returns
447
- #
448
- # [Fog::#{provider}::File] file data from remote service
449
- #
450
- def file
451
- @file ||= directory.files.head(path)
452
- end
453
-
454
- def acl_header
455
- {'x-amz-acl' => @uploader.fog_public ? 'public-read' : 'private'}
456
- end
457
- end
458
-
459
- end # Fog
460
-
461
- end # Storage
462
- end # CarrierWave