attached 0.5.9 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +7 -1
  3. data/lib/attached/attachment.rb +1 -0
  4. data/lib/attached/storage/aws.rb +11 -73
  5. data/lib/attached/storage/fog.rb +98 -0
  6. data/lib/attached/storage/google.rb +8 -70
  7. data/lib/attached/storage/local.rb +1 -0
  8. data/lib/attached/storage/rackspace.rb +9 -70
  9. data/lib/attached/version.rb +1 -1
  10. data/test/dummy/config/aws.yml +14 -0
  11. data/test/dummy/config/google.yml +0 -0
  12. data/test/dummy/config/rackspace.yml +0 -0
  13. data/test/dummy/db/test.sqlite3 +0 -0
  14. data/test/dummy/log/test.log +2525 -0
  15. data/test/dummy/public/system/audios/files/full/08ddd220-3b8a-4bc3-b20f-a01c7c7be816.aac +0 -0
  16. data/test/dummy/public/system/audios/files/full/57905e8e-356e-4705-9b60-ebf2ca941bbb.aac +0 -0
  17. data/test/dummy/public/system/audios/files/full/6ba84723-c6b3-4dcc-9fdd-dab340dfe82b.aac +0 -0
  18. data/test/dummy/public/system/audios/files/full/a77a2cc0-8c48-405e-9801-33642ba2ba60.aac +0 -0
  19. data/test/dummy/public/system/audios/files/full/f1a0c007-9bfc-4c65-b302-f7a5bd93ca3c.aac +0 -0
  20. data/test/dummy/public/system/audios/files/full/fbac7738-20ef-4a65-a4b4-943fe3afb379.aac +0 -0
  21. data/test/dummy/public/system/audios/files/large/08ddd220-3b8a-4bc3-b20f-a01c7c7be816.aac +0 -0
  22. data/test/dummy/public/system/audios/files/large/57905e8e-356e-4705-9b60-ebf2ca941bbb.aac +0 -0
  23. data/test/dummy/public/system/audios/files/large/6ba84723-c6b3-4dcc-9fdd-dab340dfe82b.aac +0 -0
  24. data/test/dummy/public/system/audios/files/large/a77a2cc0-8c48-405e-9801-33642ba2ba60.aac +0 -0
  25. data/test/dummy/public/system/audios/files/large/f1a0c007-9bfc-4c65-b302-f7a5bd93ca3c.aac +0 -0
  26. data/test/dummy/public/system/audios/files/large/fbac7738-20ef-4a65-a4b4-943fe3afb379.aac +0 -0
  27. data/test/dummy/public/system/audios/files/original/08ddd220-3b8a-4bc3-b20f-a01c7c7be816.wav +0 -0
  28. data/test/dummy/public/system/audios/files/original/57905e8e-356e-4705-9b60-ebf2ca941bbb.wav +0 -0
  29. data/test/dummy/public/system/audios/files/original/6ba84723-c6b3-4dcc-9fdd-dab340dfe82b.wav +0 -0
  30. data/test/dummy/public/system/audios/files/original/a77a2cc0-8c48-405e-9801-33642ba2ba60.wav +0 -0
  31. data/test/dummy/public/system/audios/files/original/f1a0c007-9bfc-4c65-b302-f7a5bd93ca3c.wav +0 -0
  32. data/test/dummy/public/system/audios/files/original/fbac7738-20ef-4a65-a4b4-943fe3afb379.wav +0 -0
  33. data/test/dummy/public/system/audios/files/small/08ddd220-3b8a-4bc3-b20f-a01c7c7be816.aac +0 -0
  34. data/test/dummy/public/system/audios/files/small/57905e8e-356e-4705-9b60-ebf2ca941bbb.aac +0 -0
  35. data/test/dummy/public/system/audios/files/small/6ba84723-c6b3-4dcc-9fdd-dab340dfe82b.aac +0 -0
  36. data/test/dummy/public/system/audios/files/small/a77a2cc0-8c48-405e-9801-33642ba2ba60.aac +0 -0
  37. data/test/dummy/public/system/audios/files/small/f1a0c007-9bfc-4c65-b302-f7a5bd93ca3c.aac +0 -0
  38. data/test/dummy/public/system/audios/files/small/fbac7738-20ef-4a65-a4b4-943fe3afb379.aac +0 -0
  39. data/test/dummy/public/system/images/files/full/38387849-e947-467d-ae17-19a4fdaaa8f3.jpg +0 -0
  40. data/test/dummy/public/system/images/files/full/6142216b-5606-4376-b815-39da7ebac624.jpg +0 -0
  41. data/test/dummy/public/system/images/files/full/82cf7f7a-7764-4929-a5b4-a7d4dc21289e.jpg +0 -0
  42. data/test/dummy/public/system/images/files/full/83eefeeb-afaa-4a88-8114-30ccf6a208aa.jpg +0 -0
  43. data/test/dummy/public/system/images/files/full/dc220293-a2fc-4012-ac83-8c2b16605480.jpg +0 -0
  44. data/test/dummy/public/system/images/files/full/fbf7f894-6322-4233-b2a7-0fae7f44f642.jpg +0 -0
  45. data/test/dummy/public/system/images/files/large/38387849-e947-467d-ae17-19a4fdaaa8f3.jpg +0 -0
  46. data/test/dummy/public/system/images/files/large/6142216b-5606-4376-b815-39da7ebac624.jpg +0 -0
  47. data/test/dummy/public/system/images/files/large/82cf7f7a-7764-4929-a5b4-a7d4dc21289e.jpg +0 -0
  48. data/test/dummy/public/system/images/files/large/83eefeeb-afaa-4a88-8114-30ccf6a208aa.jpg +0 -0
  49. data/test/dummy/public/system/images/files/large/dc220293-a2fc-4012-ac83-8c2b16605480.jpg +0 -0
  50. data/test/dummy/public/system/images/files/large/fbf7f894-6322-4233-b2a7-0fae7f44f642.jpg +0 -0
  51. data/test/dummy/public/system/images/files/original/38387849-e947-467d-ae17-19a4fdaaa8f3.png +0 -0
  52. data/test/dummy/public/system/images/files/original/6142216b-5606-4376-b815-39da7ebac624.png +0 -0
  53. data/test/dummy/public/system/images/files/original/82cf7f7a-7764-4929-a5b4-a7d4dc21289e.png +0 -0
  54. data/test/dummy/public/system/images/files/original/83eefeeb-afaa-4a88-8114-30ccf6a208aa.png +0 -0
  55. data/test/dummy/public/system/images/files/original/dc220293-a2fc-4012-ac83-8c2b16605480.png +0 -0
  56. data/test/dummy/public/system/images/files/original/fbf7f894-6322-4233-b2a7-0fae7f44f642.png +0 -0
  57. data/test/dummy/public/system/images/files/small/38387849-e947-467d-ae17-19a4fdaaa8f3.jpg +0 -0
  58. data/test/dummy/public/system/images/files/small/6142216b-5606-4376-b815-39da7ebac624.jpg +0 -0
  59. data/test/dummy/public/system/images/files/small/82cf7f7a-7764-4929-a5b4-a7d4dc21289e.jpg +0 -0
  60. data/test/dummy/public/system/images/files/small/83eefeeb-afaa-4a88-8114-30ccf6a208aa.jpg +0 -0
  61. data/test/dummy/public/system/images/files/small/dc220293-a2fc-4012-ac83-8c2b16605480.jpg +0 -0
  62. data/test/dummy/public/system/images/files/small/fbf7f894-6322-4233-b2a7-0fae7f44f642.jpg +0 -0
  63. data/test/dummy/public/system/images/files/thumb/38387849-e947-467d-ae17-19a4fdaaa8f3.jpg +0 -0
  64. data/test/dummy/public/system/images/files/thumb/6142216b-5606-4376-b815-39da7ebac624.jpg +0 -0
  65. data/test/dummy/public/system/images/files/thumb/82cf7f7a-7764-4929-a5b4-a7d4dc21289e.jpg +0 -0
  66. data/test/dummy/public/system/images/files/thumb/83eefeeb-afaa-4a88-8114-30ccf6a208aa.jpg +0 -0
  67. data/test/dummy/public/system/images/files/thumb/dc220293-a2fc-4012-ac83-8c2b16605480.jpg +0 -0
  68. data/test/dummy/public/system/images/files/thumb/fbf7f894-6322-4233-b2a7-0fae7f44f642.jpg +0 -0
  69. metadata +117 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f81c42cd479108c958a84a9966d008bb2c87a75
4
- data.tar.gz: bb75fc41644ec18ca88bd54f52410e568682ebfc
3
+ metadata.gz: e04c7e6d4ae5b9e01aa1bf4e2e6d9f2d7450561f
4
+ data.tar.gz: 96a3e72f4edd2adff2a8245ba0e761971219025a
5
5
  SHA512:
6
- metadata.gz: e807e3176e5c10caa1c6903377162bf1382ed32ae5b4131a2c2bbe108ab13aa4d413667ef3af308b129d2713c4f951cd060097562ce075b72c8ecd1905dd9db1
7
- data.tar.gz: 11498ab85fb206aea6194167645181a9187be4ececbd5605c95616d05664da8907e8bed2ce68480ab83d8a72566647d688e506b6275d7bdb124682da3d2193cf
6
+ metadata.gz: 13c9e025f9b53c7eff234b0cf64daf44e24ee4b1c1e1a41735f485d4c7e872472c9391653730ae4427f0ca38e6400d9beae15085b8912395f8d1ed085061be7e
7
+ data.tar.gz: ecee752043b0387cec8b7090cacde98876c185692dda2f2ad8076d3533ef989647d02d81e091ba95bad3609b6bfd1d7610df1b315fc62078e35bdae88d9a0c2f
@@ -6,6 +6,7 @@ Attached is a Ruby on Rails file attachment tool that lets users upload to the c
6
6
 
7
7
  The gem is tested with:
8
8
 
9
+ * Ruby on Rails 4.0.0.rc
9
10
  * Ruby on Rails 3.1.9
10
11
  * Ruby on Rails 3.2.10
11
12
  * Ruby (MRI) 2.0.0
@@ -159,7 +160,7 @@ View:
159
160
  === Aliases
160
161
 
161
162
  # app/initializer/attached.rb
162
- Attached::Attachment.options[:alias] = https://storage.ksylvest.com/
163
+ Attached::Attachment.options[:alias] = "https://storage.ksylvest.com/"
163
164
 
164
165
  # app/initializer/attached.rb
165
166
  Attached::Attachment.options[:aliases] = %w(
@@ -169,6 +170,11 @@ View:
169
170
  https://d.storage.ksylvest.com/
170
171
  )
171
172
 
173
+ === Metadata
174
+
175
+ # app/initializers/attached.rb
176
+ Attached::Attachment.options[:metadata] = { 'Cache-Control' => 'max-age=3153600' }
177
+
172
178
  == Status
173
179
 
174
180
  {<img src="https://travis-ci.org/ksylvest/attached.png" />}[https://travis-ci.org/ksylvest/attached]
@@ -47,6 +47,7 @@ module Attached
47
47
  :default => :original,
48
48
  :medium => :local,
49
49
  :credentials => {},
50
+ :metadata => { 'Cache-Control' => 'max-age=3153600' }
50
51
  }
51
52
  end
52
53
 
@@ -1,18 +1,11 @@
1
- require 'attached/storage/base'
2
-
3
- begin
4
- require 'fog'
5
- rescue LoadError
6
- raise "installation of 'fog' is required before using 'aws' for storage"
7
- end
1
+ require 'attached/storage/fog'
2
+ require 'fog'
8
3
 
9
4
 
10
5
  module Attached
11
6
  module Storage
12
- class AWS < Base
13
-
7
+ class AWS < Fog
14
8
 
15
- attr_reader :permissions
16
9
 
17
10
  attr_reader :bucket
18
11
  attr_reader :access_key_id
@@ -27,9 +20,9 @@ module Attached
27
20
  # Attached::Storage::AWS.new("aws.yml")
28
21
 
29
22
  def initialize(credentials)
30
- credentials = parse(credentials)
23
+ super
31
24
 
32
- @permissions = { :public => true }
25
+ credentials = parse(credentials)
33
26
 
34
27
  @bucket = credentials[:bucket] || credentials['bucket']
35
28
  @access_key_id = credentials[:access_key_id] || credentials['access_key_id']
@@ -50,71 +43,16 @@ module Attached
50
43
  end
51
44
 
52
45
 
53
- # Save a file to a given path.
54
- #
55
- # Parameters:
56
- #
57
- # * file - The file to save.
58
- # * path - The path to save.
59
-
60
- def save(file, path)
61
- file = File.open(file.path)
62
-
63
- directory = connection.directories.get(self.bucket)
64
- directory ||= connection.directories.create(self.permissions.merge(:key => self.bucket))
65
-
66
- directory.files.create(self.options(path).merge(self.permissions.merge(:key => path, :body => file)))
67
-
68
- file.close
69
- end
70
-
71
-
72
- # Retrieve a file from a given path.
73
- #
74
- # Parameters:
75
- #
76
- # * path - The path to retrieve.
77
-
78
- def retrieve(path)
79
- directory = connection.directories.get(self.bucket)
80
- directory ||= connection.directories.create(self.permissions.merge(:key => self.bucket))
81
-
82
- file = directory.files.get(path)
83
-
84
- body = file.body
85
-
86
- extname = File.extname(path)
87
- basename = File.basename(path, extname)
88
-
89
- file = Tempfile.new([basename, extname])
90
- file.binmode
91
- file.write(body)
92
- file.rewind
93
-
94
- file
95
- end
96
-
97
-
98
- # Destroy a file at a given path.
99
- #
100
- # Parameters:
101
- #
102
- # * path - The path to destroy.
103
-
104
- def destroy(path)
105
- directory = connection.directories.get(self.bucket)
106
- directory ||= connection.directories.create(self.permissions.merge(:key => self.bucket))
107
-
108
- file = directory.files.get(path)
109
- file.destroy if file
110
- end
46
+ private
111
47
 
112
48
 
113
- private
49
+ def directory()
50
+ connection.directories.get(self.bucket) || connection.directories.create(self.defaults.merge(:key => self.bucket))
51
+ end
114
52
 
115
53
 
116
54
  def connection
117
- @connection ||= Fog::Storage.new(
55
+ @connection ||= ::Fog::Storage.new(
118
56
  :aws_secret_access_key => self.secret_access_key,
119
57
  :aws_access_key_id => self.access_key_id,
120
58
  :provider => 'AWS'
@@ -124,4 +62,4 @@ module Attached
124
62
 
125
63
  end
126
64
  end
127
- end
65
+ end
@@ -0,0 +1,98 @@
1
+ require 'attached/storage/base'
2
+ require 'fog'
3
+
4
+
5
+ module Attached
6
+ module Storage
7
+ class Fog < Base
8
+
9
+
10
+ attr_reader :defaults
11
+
12
+ attr_reader :bucket
13
+ attr_reader :access_key_id
14
+ attr_reader :secret_access_key
15
+
16
+
17
+ # Create a new interface supporting save and destroy operations (should be overridden and called).
18
+
19
+ def initialize(credentials)
20
+ @defaults = { :public => true, :metadata => Attached::Attachment.options[:metadata] }
21
+ end
22
+
23
+
24
+ # Access the host for a storage service (must override).
25
+ #
26
+ # Usage:
27
+ #
28
+ # storage.host
29
+
30
+ def host()
31
+ raise NotImplementedError.new
32
+ end
33
+
34
+
35
+ # Save a file to a given path.
36
+ #
37
+ # Parameters:
38
+ #
39
+ # * file - The file to save.
40
+ # * path - The path to save.
41
+
42
+ def save(file, path)
43
+ file = File.open(file.path)
44
+ directory.files.create(self.options(path).merge(self.defaults.merge(:key => path, :body => file)))
45
+ file.close
46
+ end
47
+
48
+
49
+ # Retrieve a file from a given path.
50
+ #
51
+ # Parameters:
52
+ #
53
+ # * path - The path to retrieve.
54
+
55
+ def retrieve(path)
56
+ file = directory.files.get(path)
57
+
58
+ body = file.body
59
+
60
+ extname = File.extname(path)
61
+ basename = File.basename(path, extname)
62
+
63
+ file = Tempfile.new([basename, extname])
64
+ file.binmode
65
+ file.write(body)
66
+ file.rewind
67
+
68
+ file
69
+ end
70
+
71
+
72
+ # Destroy a file at a given path.
73
+ #
74
+ # Parameters:
75
+ #
76
+ # * path - The path to destroy.
77
+
78
+ def destroy(path)
79
+ directory.files.get(path).destroy if directory.files.head(path)
80
+ end
81
+
82
+
83
+ private
84
+
85
+
86
+ def directory
87
+ raise NotImplementedError.new
88
+ end
89
+
90
+
91
+ def connection
92
+ raise NotImplementedError.new
93
+ end
94
+
95
+
96
+ end
97
+ end
98
+ end
@@ -1,18 +1,10 @@
1
- require 'attached/storage/base'
2
-
3
- begin
4
- require 'fog'
5
- rescue LoadError
6
- raise "installation of 'fog' is required before using 'google' for storage"
7
- end
1
+ require 'attached/storage/fog'
8
2
 
9
3
 
10
4
  module Attached
11
5
  module Storage
12
- class Google < Base
13
-
6
+ class Google < Fog
14
7
 
15
- attr_reader :permissions
16
8
 
17
9
  attr_reader :bucket
18
10
  attr_reader :access_key_id
@@ -27,9 +19,10 @@ module Attached
27
19
  # Attached::Storage::Google.new("google.yml")
28
20
 
29
21
  def initialize(credentials)
22
+ super
23
+
30
24
  credentials = parse(credentials)
31
25
 
32
- @permissions = { :public => true }
33
26
 
34
27
  @bucket = credentials[:bucket] || credentials['bucket']
35
28
  @access_key_id = credentials[:access_key_id] || credentials['access_key_id']
@@ -50,71 +43,16 @@ module Attached
50
43
  end
51
44
 
52
45
 
53
- # Save a file to a given path.
54
- #
55
- # Parameters:
56
- #
57
- # * file - The file to save.
58
- # * path - The path to save.
59
-
60
- def save(file, path)
61
- file = File.open(file.path)
62
-
63
- directory = connection.directories.get(self.bucket)
64
- directory ||= connection.directories.create(self.permissions.merge(:key => self.bucket))
65
-
66
- directory.files.create(self.options(path).merge(self.permissions.merge(:key => path, :body => file)))
67
-
68
- file.close
69
- end
70
-
71
-
72
- # Retrieve a file from a given path.
73
- #
74
- # Parameters:
75
- #
76
- # * path - The path to retrieve.
77
-
78
- def retrieve(path)
79
- directory = connection.directories.get(self.bucket)
80
- directory ||= connection.directories.create(self.permissions.merge(:key => self.bucket))
81
-
82
- file = directory.files.get(path)
83
-
84
- body = file.body
85
-
86
- extname = File.extname(path)
87
- basename = File.basename(path, extname)
88
-
89
- file = Tempfile.new([basename, extname])
90
- file.binmode
91
- file.write(body)
92
- file.rewind
93
-
94
- file
95
- end
96
-
97
-
98
- # Destroy a file at a given path.
99
- #
100
- # Parameters:
101
- #
102
- # * path - The path to destroy.
46
+ private
103
47
 
104
- def destroy(path)
105
- directory = connection.directories.get(self.bucket)
106
- directory ||= connection.directories.create(self.permissions.merge(:key => self.bucket))
107
48
 
108
- file = directory.files.get(path)
109
- file.destroy if file
49
+ def directory()
50
+ connection.directories.get(self.bucket) || connection.directories.create(self.defaults.merge(:key => self.bucket))
110
51
  end
111
52
 
112
53
 
113
- private
114
-
115
-
116
54
  def connection
117
- @connection ||= Fog::Storage.new(
55
+ @connection ||= ::Fog::Storage.new(
118
56
  :google_storage_secret_access_key => self.secret_access_key,
119
57
  :google_storage_access_key_id => self.access_key_id,
120
58
  :provider => 'Google'
@@ -1,5 +1,6 @@
1
1
  require 'attached/storage/base'
2
2
 
3
+
3
4
  module Attached
4
5
  module Storage
5
6
  class Local < Base
@@ -1,18 +1,12 @@
1
1
  require 'attached/storage/base'
2
-
3
- begin
4
- require 'fog'
5
- rescue LoadError
6
- raise "installation of 'fog' is required before using 'rackspace' for storage"
7
- end
2
+ require 'fog'
8
3
 
9
4
 
10
5
  module Attached
11
6
  module Storage
12
- class Rackspace < Base
7
+ class Rackspace < Fog
13
8
 
14
9
 
15
- attr_reader :permissions
16
10
  attr_reader :container
17
11
  attr_reader :username
18
12
  attr_reader :api_key
@@ -26,9 +20,9 @@ module Attached
26
20
  # Attached::Storage::Rackspace.new("rackspace.yml")
27
21
 
28
22
  def initialize(credentials)
29
- credentials = parse(credentials)
23
+ super
30
24
 
31
- @permissions = { :public => true }
25
+ credentials = parse(credentials)
32
26
 
33
27
  @container = credentials[:container] || credentials['container']
34
28
  @username = credentials[:username] || credentials['username']
@@ -49,71 +43,16 @@ module Attached
49
43
  end
50
44
 
51
45
 
52
- # Save a file to a given path.
53
- #
54
- # Parameters:
55
- #
56
- # * file - The file to save.
57
- # * path - The path to save.
58
-
59
- def save(file, path)
60
- file = File.open(file.path)
61
-
62
- directory = connection.directories.get(self.container)
63
- directory ||= connection.directories.create(self.permissions.merge(:key => self.container))
64
-
65
- directory.files.create(self.options(path).merge(self.permissions.merge(:key => path, :body => file)))
66
-
67
- file.close
68
- end
69
-
70
-
71
- # Retrieve a file from a given path.
72
- #
73
- # Parameters:
74
- #
75
- # * path - The path to retrieve.
76
-
77
- def retrieve(path)
78
- directory = connection.directories.get(self.bucket)
79
- directory ||= connection.directories.create(self.permissions.merge(:key => self.bucket))
80
-
81
- file = directory.files.get(path)
82
-
83
- body = file.body
84
-
85
- extname = File.extname(path)
86
- basename = File.basename(path, extname)
87
-
88
- file = Tempfile.new([basename, extname])
89
- file.binmode
90
- file.write(body)
91
- file.rewind
92
-
93
- file
94
- end
95
-
96
-
97
- # Destroy a file at a given path.
98
- #
99
- # Parameters:
100
- #
101
- # * path - The path to destroy.
102
-
103
- def destroy(path)
104
- directory = connection.directories.get(self.container)
105
- directory ||= connection.directories.create(self.permissions.merge(:key => self.container))
106
-
107
- file = directory.files.get(path)
108
- file.destroy if file
109
- end
46
+ private
110
47
 
111
48
 
112
- private
49
+ def directory()
50
+ connection.directories.get(self.container) || connection.directories.create(self.defaults.merge(:key => self.container))
51
+ end
113
52
 
114
53
 
115
54
  def connection
116
- @connection ||= Fog::Storage.new(
55
+ @connection ||= ::Fog::Storage.new(
117
56
  :rackspace_username => self.username,
118
57
  :rackspace_api_key => self.api_key,
119
58
  :provider => 'Rackspace'