attached 0.5.2 → 0.5.3

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 (224) hide show
  1. data/LICENSE +1 -1
  2. data/README.rdoc +1 -1
  3. data/lib/attached.rb +82 -82
  4. data/lib/attached/attachment.rb +114 -114
  5. data/lib/attached/job.rb +6 -6
  6. data/lib/attached/processor.rb +9 -9
  7. data/lib/attached/processor/audio.rb +29 -29
  8. data/lib/attached/processor/base.rb +14 -14
  9. data/lib/attached/processor/image.rb +34 -34
  10. data/lib/attached/railtie.rb +2 -2
  11. data/lib/attached/storage.rb +8 -8
  12. data/lib/attached/storage/aws.rb +69 -69
  13. data/lib/attached/storage/base.rb +26 -26
  14. data/lib/attached/storage/google.rb +71 -71
  15. data/lib/attached/storage/local.rb +44 -44
  16. data/lib/attached/storage/rackspace.rb +68 -68
  17. data/lib/attached/version.rb +1 -1
  18. data/test/dummy/app/assets/javascripts/application.js +2 -1
  19. data/test/dummy/app/assets/javascripts/{audios.js → main.js.coffee} +0 -0
  20. data/test/dummy/app/assets/stylesheets/application.css +3 -10
  21. data/test/dummy/app/assets/stylesheets/main.css.scss +6 -0
  22. data/test/dummy/app/views/audios/_form.html.haml +17 -0
  23. data/test/dummy/app/views/audios/edit.html.haml +5 -0
  24. data/test/dummy/app/views/audios/index.html.haml +20 -0
  25. data/test/dummy/app/views/audios/new.html.haml +5 -0
  26. data/test/dummy/app/views/audios/show.html.haml +13 -0
  27. data/test/dummy/app/views/images/_form.html.haml +17 -0
  28. data/test/dummy/app/views/images/edit.html.haml +5 -0
  29. data/test/dummy/app/views/images/index.html.haml +20 -0
  30. data/test/dummy/app/views/images/new.html.haml +5 -0
  31. data/test/dummy/app/views/images/show.html.haml +13 -0
  32. data/test/dummy/app/views/layouts/application.html.haml +17 -0
  33. data/test/dummy/app/views/main/index.html.haml +8 -0
  34. data/test/dummy/app/views/shared/_error.html.haml +4 -0
  35. data/test/dummy/db/development.sqlite3 +0 -0
  36. data/test/dummy/db/test.sqlite3 +0 -0
  37. data/test/dummy/log/development.log +37 -0
  38. data/test/dummy/log/test.log +390 -1166
  39. data/test/dummy/public/system/audios/files/full/{07a3f586-805d-4c68-be01-7ba4d787aa9e.aac → 151d9dff-7259-41a3-9fc3-988a3099fe22.aac} +0 -0
  40. data/test/dummy/public/system/audios/files/full/{1a5d65b6-3d7f-45e3-8fc8-9221f3bca127.aac → 2b5e47b9-b441-4c49-a98f-5bf89f19848e.aac} +0 -0
  41. data/test/dummy/public/system/audios/files/full/{3729319f-299b-47e2-bd7e-d73d38b5cf8f.aac → 33203ced-129f-454c-870a-dc87a2809859.aac} +0 -0
  42. data/test/dummy/public/system/audios/files/full/{41e88b81-2804-4316-86e8-252adad0eaa3.aac → c03bdf7c-ce26-4a31-9c23-d947b2986fa7.aac} +0 -0
  43. data/test/dummy/public/system/audios/files/large/{07a3f586-805d-4c68-be01-7ba4d787aa9e.aac → 151d9dff-7259-41a3-9fc3-988a3099fe22.aac} +0 -0
  44. data/test/dummy/public/system/audios/files/large/{1a5d65b6-3d7f-45e3-8fc8-9221f3bca127.aac → 2b5e47b9-b441-4c49-a98f-5bf89f19848e.aac} +0 -0
  45. data/test/dummy/public/system/audios/files/large/{3729319f-299b-47e2-bd7e-d73d38b5cf8f.aac → 33203ced-129f-454c-870a-dc87a2809859.aac} +0 -0
  46. data/test/dummy/public/system/audios/files/large/{41e88b81-2804-4316-86e8-252adad0eaa3.aac → c03bdf7c-ce26-4a31-9c23-d947b2986fa7.aac} +0 -0
  47. data/test/dummy/public/system/audios/files/original/{07a3f586-805d-4c68-be01-7ba4d787aa9e.wav → 151d9dff-7259-41a3-9fc3-988a3099fe22.wav} +0 -0
  48. data/test/dummy/public/system/audios/files/original/{1a5d65b6-3d7f-45e3-8fc8-9221f3bca127.wav → 2b5e47b9-b441-4c49-a98f-5bf89f19848e.wav} +0 -0
  49. data/test/dummy/public/system/audios/files/original/{3729319f-299b-47e2-bd7e-d73d38b5cf8f.wav → 33203ced-129f-454c-870a-dc87a2809859.wav} +0 -0
  50. data/test/dummy/public/system/audios/files/original/{41e88b81-2804-4316-86e8-252adad0eaa3.wav → c03bdf7c-ce26-4a31-9c23-d947b2986fa7.wav} +0 -0
  51. data/test/dummy/public/system/audios/files/small/{07a3f586-805d-4c68-be01-7ba4d787aa9e.aac → 151d9dff-7259-41a3-9fc3-988a3099fe22.aac} +0 -0
  52. data/test/dummy/public/system/audios/files/small/{1a5d65b6-3d7f-45e3-8fc8-9221f3bca127.aac → 2b5e47b9-b441-4c49-a98f-5bf89f19848e.aac} +0 -0
  53. data/test/dummy/public/system/audios/files/small/{3729319f-299b-47e2-bd7e-d73d38b5cf8f.aac → 33203ced-129f-454c-870a-dc87a2809859.aac} +0 -0
  54. data/test/dummy/public/system/audios/files/small/{41e88b81-2804-4316-86e8-252adad0eaa3.aac → c03bdf7c-ce26-4a31-9c23-d947b2986fa7.aac} +0 -0
  55. data/test/dummy/public/system/images/files/full/15f09efb-0d03-44b3-a372-5ae156e8898e.jpg +0 -0
  56. data/test/dummy/public/system/images/files/full/7a1dbda7-f7f7-4b13-a7ae-be38c43f76a3.jpg +0 -0
  57. data/test/dummy/public/system/images/files/full/84b585ce-9430-4761-8fb1-d94302eb33bd.jpg +0 -0
  58. data/test/dummy/public/system/images/files/full/b8e19d15-db0f-42e7-9372-5f563486928a.jpg +0 -0
  59. data/test/dummy/public/system/images/files/full/baa48120-b3b9-4d2a-830a-e6ebc4db7802.jpg +0 -0
  60. data/test/dummy/public/system/images/files/full/caac47c3-f3c8-4ca9-a682-d79e8c1b5b29.jpg +0 -0
  61. data/test/dummy/public/system/images/files/large/15f09efb-0d03-44b3-a372-5ae156e8898e.jpg +0 -0
  62. data/test/dummy/public/system/images/files/large/7a1dbda7-f7f7-4b13-a7ae-be38c43f76a3.jpg +0 -0
  63. data/test/dummy/public/system/images/files/large/84b585ce-9430-4761-8fb1-d94302eb33bd.jpg +0 -0
  64. data/test/dummy/public/system/images/files/large/b8e19d15-db0f-42e7-9372-5f563486928a.jpg +0 -0
  65. data/test/dummy/public/system/images/files/large/baa48120-b3b9-4d2a-830a-e6ebc4db7802.jpg +0 -0
  66. data/test/dummy/public/system/images/files/large/caac47c3-f3c8-4ca9-a682-d79e8c1b5b29.jpg +0 -0
  67. data/test/dummy/public/system/images/files/original/{0850c86c-78a8-4319-8852-bed744b792e6.png → 15f09efb-0d03-44b3-a372-5ae156e8898e.png} +0 -0
  68. data/test/dummy/public/system/images/files/original/{12ace664-b553-45a6-b02b-37e15ac2981b.png → 7a1dbda7-f7f7-4b13-a7ae-be38c43f76a3.png} +0 -0
  69. data/test/dummy/public/system/images/files/original/{2ac8ebdb-bc96-49c4-befd-5c96b47646e5.png → 84b585ce-9430-4761-8fb1-d94302eb33bd.png} +0 -0
  70. data/test/dummy/public/system/images/files/original/{3e9c5921-4820-441d-9f90-90b518cd582e.png → b8e19d15-db0f-42e7-9372-5f563486928a.png} +0 -0
  71. data/test/dummy/public/system/images/files/original/{444d0123-908a-4616-83e3-88942a66a075.png → baa48120-b3b9-4d2a-830a-e6ebc4db7802.png} +0 -0
  72. data/test/dummy/public/system/images/files/original/{5af89da1-b1fa-421a-a52e-01607d89fb5d.png → caac47c3-f3c8-4ca9-a682-d79e8c1b5b29.png} +0 -0
  73. data/test/dummy/public/system/images/files/small/15f09efb-0d03-44b3-a372-5ae156e8898e.jpg +0 -0
  74. data/test/dummy/public/system/images/files/small/7a1dbda7-f7f7-4b13-a7ae-be38c43f76a3.jpg +0 -0
  75. data/test/dummy/public/system/images/files/small/84b585ce-9430-4761-8fb1-d94302eb33bd.jpg +0 -0
  76. data/test/dummy/public/system/images/files/small/b8e19d15-db0f-42e7-9372-5f563486928a.jpg +0 -0
  77. data/test/dummy/public/system/images/files/small/baa48120-b3b9-4d2a-830a-e6ebc4db7802.jpg +0 -0
  78. data/test/dummy/public/system/images/files/small/caac47c3-f3c8-4ca9-a682-d79e8c1b5b29.jpg +0 -0
  79. data/test/dummy/public/system/images/files/thumb/15f09efb-0d03-44b3-a372-5ae156e8898e.jpg +0 -0
  80. data/test/dummy/public/system/images/files/thumb/7a1dbda7-f7f7-4b13-a7ae-be38c43f76a3.jpg +0 -0
  81. data/test/dummy/public/system/images/files/thumb/84b585ce-9430-4761-8fb1-d94302eb33bd.jpg +0 -0
  82. data/test/dummy/public/system/images/files/thumb/b8e19d15-db0f-42e7-9372-5f563486928a.jpg +0 -0
  83. data/test/dummy/public/system/images/files/thumb/baa48120-b3b9-4d2a-830a-e6ebc4db7802.jpg +0 -0
  84. data/test/dummy/public/system/images/files/thumb/caac47c3-f3c8-4ca9-a682-d79e8c1b5b29.jpg +0 -0
  85. metadata +168 -337
  86. data/test/dummy/app/assets/javascripts/images.js +0 -0
  87. data/test/dummy/app/assets/javascripts/main.js +0 -0
  88. data/test/dummy/app/assets/stylesheets/audios.css +0 -0
  89. data/test/dummy/app/assets/stylesheets/images.css +0 -0
  90. data/test/dummy/app/assets/stylesheets/main.css +0 -0
  91. data/test/dummy/app/views/audios/_form.html.erb +0 -27
  92. data/test/dummy/app/views/audios/edit.html.erb +0 -3
  93. data/test/dummy/app/views/audios/index.html.erb +0 -17
  94. data/test/dummy/app/views/audios/new.html.erb +0 -3
  95. data/test/dummy/app/views/audios/show.html.erb +0 -17
  96. data/test/dummy/app/views/images/_form.html.erb +0 -27
  97. data/test/dummy/app/views/images/edit.html.erb +0 -3
  98. data/test/dummy/app/views/images/index.html.erb +0 -17
  99. data/test/dummy/app/views/images/new.html.erb +0 -3
  100. data/test/dummy/app/views/images/show.html.erb +0 -18
  101. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  102. data/test/dummy/app/views/main/index.html.erb +0 -6
  103. data/test/dummy/public/system/audios/files/full/5d262d6b-4789-42f9-b985-1c39c9eca0c0.aac +0 -0
  104. data/test/dummy/public/system/audios/files/full/67645888-cf0b-47db-8202-2df3a1ce594d.aac +0 -0
  105. data/test/dummy/public/system/audios/files/full/6cecb6b5-46cd-47a5-bf8a-10849e30f1f6.aac +0 -0
  106. data/test/dummy/public/system/audios/files/full/8d116bcb-2605-429e-9edc-b1a91fa66d0a.aac +0 -0
  107. data/test/dummy/public/system/audios/files/full/9b084b16-eb46-4730-ad80-c5d7d8ef92d2.aac +0 -0
  108. data/test/dummy/public/system/audios/files/full/9dddf071-ac43-4232-9a9d-fb5d26862bd1.aac +0 -0
  109. data/test/dummy/public/system/audios/files/full/a6880c5f-d130-469f-9c30-d8aa1b9f7b71.aac +0 -0
  110. data/test/dummy/public/system/audios/files/full/a79a531d-5de4-4aa3-9c04-275cf6307d13.aac +0 -0
  111. data/test/dummy/public/system/audios/files/full/c6768282-9787-45dc-a39f-37d23b83f8f2.aac +0 -0
  112. data/test/dummy/public/system/audios/files/full/e8389286-fda2-4614-906f-bd646383333a.aac +0 -0
  113. data/test/dummy/public/system/audios/files/full/ee0041b9-6482-4d4f-96cc-1a6e28c93570.aac +0 -0
  114. data/test/dummy/public/system/audios/files/full/ffb3df30-8dbf-4938-abde-21cdfced70d1.aac +0 -0
  115. data/test/dummy/public/system/audios/files/large/5d262d6b-4789-42f9-b985-1c39c9eca0c0.aac +0 -0
  116. data/test/dummy/public/system/audios/files/large/67645888-cf0b-47db-8202-2df3a1ce594d.aac +0 -0
  117. data/test/dummy/public/system/audios/files/large/6cecb6b5-46cd-47a5-bf8a-10849e30f1f6.aac +0 -0
  118. data/test/dummy/public/system/audios/files/large/8d116bcb-2605-429e-9edc-b1a91fa66d0a.aac +0 -0
  119. data/test/dummy/public/system/audios/files/large/9b084b16-eb46-4730-ad80-c5d7d8ef92d2.aac +0 -0
  120. data/test/dummy/public/system/audios/files/large/9dddf071-ac43-4232-9a9d-fb5d26862bd1.aac +0 -0
  121. data/test/dummy/public/system/audios/files/large/a6880c5f-d130-469f-9c30-d8aa1b9f7b71.aac +0 -0
  122. data/test/dummy/public/system/audios/files/large/a79a531d-5de4-4aa3-9c04-275cf6307d13.aac +0 -0
  123. data/test/dummy/public/system/audios/files/large/c6768282-9787-45dc-a39f-37d23b83f8f2.aac +0 -0
  124. data/test/dummy/public/system/audios/files/large/e8389286-fda2-4614-906f-bd646383333a.aac +0 -0
  125. data/test/dummy/public/system/audios/files/large/ee0041b9-6482-4d4f-96cc-1a6e28c93570.aac +0 -0
  126. data/test/dummy/public/system/audios/files/large/ffb3df30-8dbf-4938-abde-21cdfced70d1.aac +0 -0
  127. data/test/dummy/public/system/audios/files/original/5d262d6b-4789-42f9-b985-1c39c9eca0c0.wav +0 -0
  128. data/test/dummy/public/system/audios/files/original/67645888-cf0b-47db-8202-2df3a1ce594d.wav +0 -0
  129. data/test/dummy/public/system/audios/files/original/6cecb6b5-46cd-47a5-bf8a-10849e30f1f6.wav +0 -0
  130. data/test/dummy/public/system/audios/files/original/8d116bcb-2605-429e-9edc-b1a91fa66d0a.wav +0 -0
  131. data/test/dummy/public/system/audios/files/original/9b084b16-eb46-4730-ad80-c5d7d8ef92d2.wav +0 -0
  132. data/test/dummy/public/system/audios/files/original/9dddf071-ac43-4232-9a9d-fb5d26862bd1.wav +0 -0
  133. data/test/dummy/public/system/audios/files/original/a6880c5f-d130-469f-9c30-d8aa1b9f7b71.wav +0 -0
  134. data/test/dummy/public/system/audios/files/original/a79a531d-5de4-4aa3-9c04-275cf6307d13.wav +0 -0
  135. data/test/dummy/public/system/audios/files/original/c6768282-9787-45dc-a39f-37d23b83f8f2.wav +0 -0
  136. data/test/dummy/public/system/audios/files/original/e8389286-fda2-4614-906f-bd646383333a.wav +0 -0
  137. data/test/dummy/public/system/audios/files/original/ee0041b9-6482-4d4f-96cc-1a6e28c93570.wav +0 -0
  138. data/test/dummy/public/system/audios/files/original/ffb3df30-8dbf-4938-abde-21cdfced70d1.wav +0 -0
  139. data/test/dummy/public/system/audios/files/small/5d262d6b-4789-42f9-b985-1c39c9eca0c0.aac +0 -0
  140. data/test/dummy/public/system/audios/files/small/67645888-cf0b-47db-8202-2df3a1ce594d.aac +0 -0
  141. data/test/dummy/public/system/audios/files/small/6cecb6b5-46cd-47a5-bf8a-10849e30f1f6.aac +0 -0
  142. data/test/dummy/public/system/audios/files/small/8d116bcb-2605-429e-9edc-b1a91fa66d0a.aac +0 -0
  143. data/test/dummy/public/system/audios/files/small/9b084b16-eb46-4730-ad80-c5d7d8ef92d2.aac +0 -0
  144. data/test/dummy/public/system/audios/files/small/9dddf071-ac43-4232-9a9d-fb5d26862bd1.aac +0 -0
  145. data/test/dummy/public/system/audios/files/small/a6880c5f-d130-469f-9c30-d8aa1b9f7b71.aac +0 -0
  146. data/test/dummy/public/system/audios/files/small/a79a531d-5de4-4aa3-9c04-275cf6307d13.aac +0 -0
  147. data/test/dummy/public/system/audios/files/small/c6768282-9787-45dc-a39f-37d23b83f8f2.aac +0 -0
  148. data/test/dummy/public/system/audios/files/small/e8389286-fda2-4614-906f-bd646383333a.aac +0 -0
  149. data/test/dummy/public/system/audios/files/small/ee0041b9-6482-4d4f-96cc-1a6e28c93570.aac +0 -0
  150. data/test/dummy/public/system/audios/files/small/ffb3df30-8dbf-4938-abde-21cdfced70d1.aac +0 -0
  151. data/test/dummy/public/system/images/files/full/0850c86c-78a8-4319-8852-bed744b792e6.jpg +0 -0
  152. data/test/dummy/public/system/images/files/full/12ace664-b553-45a6-b02b-37e15ac2981b.jpg +0 -0
  153. data/test/dummy/public/system/images/files/full/2ac8ebdb-bc96-49c4-befd-5c96b47646e5.jpg +0 -0
  154. data/test/dummy/public/system/images/files/full/3e9c5921-4820-441d-9f90-90b518cd582e.jpg +0 -0
  155. data/test/dummy/public/system/images/files/full/444d0123-908a-4616-83e3-88942a66a075.jpg +0 -0
  156. data/test/dummy/public/system/images/files/full/5af89da1-b1fa-421a-a52e-01607d89fb5d.jpg +0 -0
  157. data/test/dummy/public/system/images/files/full/8628fbe3-bd09-4713-babe-e38c1492788e.jpg +0 -0
  158. data/test/dummy/public/system/images/files/full/a0158251-8d9c-42fb-a854-e56b915713df.jpg +0 -0
  159. data/test/dummy/public/system/images/files/full/b7318aed-63ee-43a2-9365-755bcc2815df.jpg +0 -0
  160. data/test/dummy/public/system/images/files/full/c292008f-764f-4f8a-8df1-82c63d87a653.jpg +0 -0
  161. data/test/dummy/public/system/images/files/full/cd5745af-c9c5-4ea4-9fca-711fb58c4604.jpg +0 -0
  162. data/test/dummy/public/system/images/files/full/d39266e6-2426-4888-9f12-031ade4f872e.jpg +0 -0
  163. data/test/dummy/public/system/images/files/full/e9e4c240-1426-4951-a600-c5a07c30d80d.jpg +0 -0
  164. data/test/dummy/public/system/images/files/full/ee1f8491-6e52-410f-9d62-bd544715d066.jpg +0 -0
  165. data/test/dummy/public/system/images/files/full/f7ccd0c4-6d8d-4d26-afe7-ab62a448baf9.jpg +0 -0
  166. data/test/dummy/public/system/images/files/full/ffc3f5fd-ff40-4a77-8e08-0517e519f857.jpg +0 -0
  167. data/test/dummy/public/system/images/files/large/0850c86c-78a8-4319-8852-bed744b792e6.jpg +0 -0
  168. data/test/dummy/public/system/images/files/large/12ace664-b553-45a6-b02b-37e15ac2981b.jpg +0 -0
  169. data/test/dummy/public/system/images/files/large/2ac8ebdb-bc96-49c4-befd-5c96b47646e5.jpg +0 -0
  170. data/test/dummy/public/system/images/files/large/3e9c5921-4820-441d-9f90-90b518cd582e.jpg +0 -0
  171. data/test/dummy/public/system/images/files/large/444d0123-908a-4616-83e3-88942a66a075.jpg +0 -0
  172. data/test/dummy/public/system/images/files/large/5af89da1-b1fa-421a-a52e-01607d89fb5d.jpg +0 -0
  173. data/test/dummy/public/system/images/files/large/8628fbe3-bd09-4713-babe-e38c1492788e.jpg +0 -0
  174. data/test/dummy/public/system/images/files/large/a0158251-8d9c-42fb-a854-e56b915713df.jpg +0 -0
  175. data/test/dummy/public/system/images/files/large/b7318aed-63ee-43a2-9365-755bcc2815df.jpg +0 -0
  176. data/test/dummy/public/system/images/files/large/c292008f-764f-4f8a-8df1-82c63d87a653.jpg +0 -0
  177. data/test/dummy/public/system/images/files/large/cd5745af-c9c5-4ea4-9fca-711fb58c4604.jpg +0 -0
  178. data/test/dummy/public/system/images/files/large/d39266e6-2426-4888-9f12-031ade4f872e.jpg +0 -0
  179. data/test/dummy/public/system/images/files/large/e9e4c240-1426-4951-a600-c5a07c30d80d.jpg +0 -0
  180. data/test/dummy/public/system/images/files/large/ee1f8491-6e52-410f-9d62-bd544715d066.jpg +0 -0
  181. data/test/dummy/public/system/images/files/large/f7ccd0c4-6d8d-4d26-afe7-ab62a448baf9.jpg +0 -0
  182. data/test/dummy/public/system/images/files/large/ffc3f5fd-ff40-4a77-8e08-0517e519f857.jpg +0 -0
  183. data/test/dummy/public/system/images/files/original/8628fbe3-bd09-4713-babe-e38c1492788e.png +0 -0
  184. data/test/dummy/public/system/images/files/original/a0158251-8d9c-42fb-a854-e56b915713df.png +0 -0
  185. data/test/dummy/public/system/images/files/original/b7318aed-63ee-43a2-9365-755bcc2815df.png +0 -0
  186. data/test/dummy/public/system/images/files/original/c292008f-764f-4f8a-8df1-82c63d87a653.png +0 -0
  187. data/test/dummy/public/system/images/files/original/cd5745af-c9c5-4ea4-9fca-711fb58c4604.png +0 -0
  188. data/test/dummy/public/system/images/files/original/d39266e6-2426-4888-9f12-031ade4f872e.png +0 -0
  189. data/test/dummy/public/system/images/files/original/e9e4c240-1426-4951-a600-c5a07c30d80d.png +0 -0
  190. data/test/dummy/public/system/images/files/original/ee1f8491-6e52-410f-9d62-bd544715d066.png +0 -0
  191. data/test/dummy/public/system/images/files/original/f7ccd0c4-6d8d-4d26-afe7-ab62a448baf9.png +0 -0
  192. data/test/dummy/public/system/images/files/original/ffc3f5fd-ff40-4a77-8e08-0517e519f857.png +0 -0
  193. data/test/dummy/public/system/images/files/small/0850c86c-78a8-4319-8852-bed744b792e6.jpg +0 -0
  194. data/test/dummy/public/system/images/files/small/12ace664-b553-45a6-b02b-37e15ac2981b.jpg +0 -0
  195. data/test/dummy/public/system/images/files/small/2ac8ebdb-bc96-49c4-befd-5c96b47646e5.jpg +0 -0
  196. data/test/dummy/public/system/images/files/small/3e9c5921-4820-441d-9f90-90b518cd582e.jpg +0 -0
  197. data/test/dummy/public/system/images/files/small/444d0123-908a-4616-83e3-88942a66a075.jpg +0 -0
  198. data/test/dummy/public/system/images/files/small/5af89da1-b1fa-421a-a52e-01607d89fb5d.jpg +0 -0
  199. data/test/dummy/public/system/images/files/small/8628fbe3-bd09-4713-babe-e38c1492788e.jpg +0 -0
  200. data/test/dummy/public/system/images/files/small/a0158251-8d9c-42fb-a854-e56b915713df.jpg +0 -0
  201. data/test/dummy/public/system/images/files/small/b7318aed-63ee-43a2-9365-755bcc2815df.jpg +0 -0
  202. data/test/dummy/public/system/images/files/small/c292008f-764f-4f8a-8df1-82c63d87a653.jpg +0 -0
  203. data/test/dummy/public/system/images/files/small/cd5745af-c9c5-4ea4-9fca-711fb58c4604.jpg +0 -0
  204. data/test/dummy/public/system/images/files/small/d39266e6-2426-4888-9f12-031ade4f872e.jpg +0 -0
  205. data/test/dummy/public/system/images/files/small/e9e4c240-1426-4951-a600-c5a07c30d80d.jpg +0 -0
  206. data/test/dummy/public/system/images/files/small/ee1f8491-6e52-410f-9d62-bd544715d066.jpg +0 -0
  207. data/test/dummy/public/system/images/files/small/f7ccd0c4-6d8d-4d26-afe7-ab62a448baf9.jpg +0 -0
  208. data/test/dummy/public/system/images/files/small/ffc3f5fd-ff40-4a77-8e08-0517e519f857.jpg +0 -0
  209. data/test/dummy/public/system/images/files/thumb/0850c86c-78a8-4319-8852-bed744b792e6.jpg +0 -0
  210. data/test/dummy/public/system/images/files/thumb/12ace664-b553-45a6-b02b-37e15ac2981b.jpg +0 -0
  211. data/test/dummy/public/system/images/files/thumb/2ac8ebdb-bc96-49c4-befd-5c96b47646e5.jpg +0 -0
  212. data/test/dummy/public/system/images/files/thumb/3e9c5921-4820-441d-9f90-90b518cd582e.jpg +0 -0
  213. data/test/dummy/public/system/images/files/thumb/444d0123-908a-4616-83e3-88942a66a075.jpg +0 -0
  214. data/test/dummy/public/system/images/files/thumb/5af89da1-b1fa-421a-a52e-01607d89fb5d.jpg +0 -0
  215. data/test/dummy/public/system/images/files/thumb/8628fbe3-bd09-4713-babe-e38c1492788e.jpg +0 -0
  216. data/test/dummy/public/system/images/files/thumb/a0158251-8d9c-42fb-a854-e56b915713df.jpg +0 -0
  217. data/test/dummy/public/system/images/files/thumb/b7318aed-63ee-43a2-9365-755bcc2815df.jpg +0 -0
  218. data/test/dummy/public/system/images/files/thumb/c292008f-764f-4f8a-8df1-82c63d87a653.jpg +0 -0
  219. data/test/dummy/public/system/images/files/thumb/cd5745af-c9c5-4ea4-9fca-711fb58c4604.jpg +0 -0
  220. data/test/dummy/public/system/images/files/thumb/d39266e6-2426-4888-9f12-031ade4f872e.jpg +0 -0
  221. data/test/dummy/public/system/images/files/thumb/e9e4c240-1426-4951-a600-c5a07c30d80d.jpg +0 -0
  222. data/test/dummy/public/system/images/files/thumb/ee1f8491-6e52-410f-9d62-bd544715d066.jpg +0 -0
  223. data/test/dummy/public/system/images/files/thumb/f7ccd0c4-6d8d-4d26-afe7-ab62a448baf9.jpg +0 -0
  224. data/test/dummy/public/system/images/files/thumb/ffc3f5fd-ff40-4a77-8e08-0517e519f857.jpg +0 -0
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 - 2011 Kevin Sylvestre
1
+ Copyright (c) 2010 - 2012 Kevin Sylvestre
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -173,4 +173,4 @@ View:
173
173
 
174
174
  == Copyright
175
175
 
176
- Copyright (c) 2010 - 2011 Kevin Sylvestre. See LICENSE for details.
176
+ Copyright (c) 2010 - 2012 Kevin Sylvestre. See LICENSE for details.
@@ -2,19 +2,19 @@ require 'attached/attachment'
2
2
  require 'attached/railtie'
3
3
 
4
4
 
5
- module Attached
6
-
7
-
5
+ module Attached
6
+
7
+
8
8
  def self.included(base)
9
9
  base.extend ClassMethods
10
10
  base.class_attribute :attached_options
11
11
  end
12
-
13
-
12
+
13
+
14
14
  module Definition
15
15
  def attachment(*args)
16
16
  options = args.extract_options!
17
-
17
+
18
18
  args.each do |name|
19
19
  column("#{name}_identifier", :string, options)
20
20
  column("#{name}_extension", :string, options)
@@ -22,11 +22,11 @@ module Attached
22
22
  end
23
23
  end
24
24
  end
25
-
26
-
25
+
26
+
27
27
  module ClassMethods
28
-
29
-
28
+
29
+
30
30
  # Add an attachment to a class.
31
31
  #
32
32
  # Options:
@@ -40,21 +40,21 @@ module Attached
40
40
  # has_attached :video
41
41
  # has_attached :video, :storage => :aws
42
42
  # has_attached :video, styles => { :mov => { :size => "480p", :format => "mov" } }
43
-
43
+
44
44
  def has_attached(name, options = {})
45
-
45
+
46
46
  include InstanceMethods
47
-
47
+
48
48
  self.attached_options ||= {}
49
49
  self.attached_options[name] = options
50
-
50
+
51
51
  before_save :save_attached
52
52
  before_destroy :destroy_attached
53
-
53
+
54
54
  define_method name do
55
55
  attachment_for(name)
56
56
  end
57
-
57
+
58
58
  define_method "#{name}=" do |file|
59
59
  attachment_for(name).assign(file)
60
60
  end
@@ -62,43 +62,43 @@ module Attached
62
62
  define_method "#{name}?" do
63
63
  attachment_for(name).attached?
64
64
  end
65
-
65
+
66
66
  validates_each(name) do |record, attr, value|
67
67
  attachment = record.attachment_for(name)
68
68
  attachment.errors.each do |error|
69
69
  record.errors.add(name, error)
70
70
  end
71
71
  end
72
-
72
+
73
73
  after_validation do
74
-
74
+
75
75
  if self.errors.include?(:"#{name}_size")
76
76
  self.errors[:"#{name}_size"].each do |message|
77
77
  self.errors.add(name, message)
78
78
  end
79
79
  self.errors[:"#{name}_size"].clear
80
80
  end
81
-
81
+
82
82
  if self.errors.include?(:"#{name}_extension")
83
83
  self.errors[:"#{name}_extension"].each do |message|
84
84
  self.errors.add(name, message)
85
85
  end
86
86
  self.errors[:"#{name}_extension"].clear
87
87
  end
88
-
88
+
89
89
  if self.errors.include?(:"#{name}_identifier")
90
90
  self.errors[:"#{name}_identifier"].each do |message|
91
91
  self.errors.add(name, message)
92
92
  end
93
93
  self.errors[:"#{name}_identifier"].clear
94
94
  end
95
-
95
+
96
96
  end
97
-
97
+
98
98
  end
99
-
100
-
101
- # Validates an attached size in a specified range or minimum and maximum.
99
+
100
+
101
+ # Validates an attached size in a specified range or minimum and maximum.
102
102
  #
103
103
  # Options:
104
104
  #
@@ -108,64 +108,64 @@ module Attached
108
108
  # * :in - range of bytes for file
109
109
  #
110
110
  # Usage:
111
- #
111
+ #
112
112
  # validates_attached_size :avatar, :range => 10.megabytes .. 20.megabytes
113
113
  # validates_attached_size :avatar, :minimum => 10.megabytes, :maximum => 20.megabytes
114
114
  # validates_attached_size :avatar, :message => "size must be between :minimum and :maximum bytes"
115
-
115
+
116
116
  def validates_attached_size(name, options = {})
117
-
117
+
118
118
  zero = (0.0 / 1.0)
119
119
  infi = (1.0 / 0.0)
120
-
120
+
121
121
  minimum = options[:minimum] || options[:in] && options[:in].first || zero
122
122
  maximum = options[:maximum] || options[:in] && options[:in].last || infi
123
-
123
+
124
124
  message = options[:message]
125
125
  message ||= "size must be specified" if minimum == zero && maximum == infi
126
126
  message ||= "size must be a minimum of :minimum" if maximum == infi
127
127
  message ||= "size must be a maximum of :maximum" if minimum == zero
128
128
  message ||= "size must be between :minimum and :maximum"
129
-
129
+
130
130
  range = minimum..maximum
131
-
131
+
132
132
  message.gsub!(/:minimum/, number_to_size(minimum)) unless minimum == zero
133
133
  message.gsub!(/:maximum/, number_to_size(maximum)) unless maximum == infi
134
-
135
- validates_inclusion_of :"#{name}_size", :in => range, :message => message,
134
+
135
+ validates_inclusion_of :"#{name}_size", :in => range, :message => message,
136
136
  :if => options[:if], :unless => options[:unless]
137
-
137
+
138
138
  end
139
-
140
-
141
- # Validates an attached extension in a specified set.
139
+
140
+
141
+ # Validates an attached extension in a specified set.
142
142
  #
143
143
  # Options:
144
144
  #
145
145
  # * :in - allowed values for attached
146
146
  #
147
147
  # Usage:
148
- #
148
+ #
149
149
  # validates_attached_extension :avatar, :is => 'png'
150
150
  # validates_attached_extension :avatar, :in => %w(png jpg)
151
151
  # validates_attached_extension :avatar, :in => [:png, :jpg]
152
152
  # validates_attached_extension :avatar, :in => %w(png jpg), :message => "extension must be :in"
153
153
  # validates_attached_extension :avatar, :in => %w(png jpg), :message => "extension must be :in"
154
-
154
+
155
155
  def validates_attached_extension(name, options = {})
156
-
156
+
157
157
  message = options[:message]
158
158
  message ||= "extension is invalid"
159
-
159
+
160
160
  options[:in] ||= [options[:is]] if options[:is]
161
-
161
+
162
162
  range = options[:in].map { |element| ".#{element}" }
163
-
163
+
164
164
  validates_inclusion_of :"#{name}_extension", :in => range, :message => message,
165
165
  :if => options[:if], :unless => options[:unless]
166
166
  end
167
-
168
-
167
+
168
+
169
169
  # Validates that an attachment is included.
170
170
  #
171
171
  # Options:
@@ -176,21 +176,21 @@ module Attached
176
176
  #
177
177
  # validates_attached_presence :avatar
178
178
  # validates_attached_presence :avatar, :message => "must be attached"
179
-
179
+
180
180
  def validates_attached_presence(name, options = {})
181
-
181
+
182
182
  message = options[:message]
183
183
  message ||= "must be attached"
184
-
184
+
185
185
  validates_presence_of :"#{name}_identifier", :message => message,
186
186
  :if => options[:if], :unless => options[:unless]
187
-
187
+
188
188
  end
189
-
190
-
189
+
190
+
191
191
  private
192
-
193
-
192
+
193
+
194
194
  # Convert a number to a human readable size.
195
195
  #
196
196
  # Usage:
@@ -199,75 +199,75 @@ module Attached
199
199
  # number_to_size(2) # 2 bytes
200
200
  # number_to_size(1024) # 1 kilobyte
201
201
  # number_to_size(2048) # 2 kilobytes
202
-
202
+
203
203
  def number_to_size(number, options = {})
204
204
  return if number == 0.0 / 1.0
205
205
  return if number == 1.0 / 0.0
206
-
206
+
207
207
  singular = options['singular'] || 1
208
208
  base = options['base'] || 1024
209
209
  units = options['units'] || ["byte", "kilobyte", "megabyte", "gigabyte", "terabyte", "petabyte"]
210
-
210
+
211
211
  exponent = (Math.log(number) / Math.log(base)).floor
212
-
212
+
213
213
  number /= base ** exponent
214
214
  unit = units[exponent]
215
-
215
+
216
216
  number == singular ? unit.gsub!(/s$/, '') : unit.gsub!(/$/, 's')
217
-
217
+
218
218
  "#{number} #{unit}"
219
219
  end
220
-
221
-
220
+
221
+
222
222
  end
223
-
224
-
223
+
224
+
225
225
  module InstanceMethods
226
-
227
-
226
+
227
+
228
228
  # Create or access attachment.
229
229
  #
230
230
  # Usage:
231
- #
231
+ #
232
232
  # attachment_for :avatar
233
-
233
+
234
234
  def attachment_for(name)
235
235
  @_attached_attachments ||= {}
236
236
  @_attached_attachments[name] ||= Attachment.new(name, self, self.class.attached_options[name])
237
237
  end
238
-
239
-
238
+
239
+
240
240
  # Log and save all attached (using specified storage).
241
241
  #
242
242
  # Usage:
243
243
  #
244
244
  # before_save :save_attached
245
-
245
+
246
246
  def save_attached
247
247
  logger.info "[attached] save attached"
248
-
249
- self.class.attached_options.each do |name, options|
248
+
249
+ self.class.attached_options.each do |name, options|
250
250
  attachment_for(name).save
251
251
  end
252
252
  end
253
-
254
-
253
+
254
+
255
255
  # Log and destroy all attached (using specified storage).
256
256
  #
257
257
  # Usage:
258
258
  #
259
259
  # before_save :destroy_attached
260
-
260
+
261
261
  def destroy_attached
262
262
  logger.info "[attached] destroy attached"
263
-
263
+
264
264
  self.class.attached_options.each do |name, options|
265
265
  attachment_for(name).destroy
266
266
  end
267
267
  end
268
-
269
-
268
+
269
+
270
270
  end
271
-
272
-
271
+
272
+
273
273
  end
@@ -7,10 +7,10 @@ require 'attached/processor'
7
7
  require 'attached/processor/error'
8
8
 
9
9
  module Attached
10
-
10
+
11
11
  class Attachment
12
-
13
-
12
+
13
+
14
14
  attr_reader :file
15
15
  attr_reader :name
16
16
  attr_reader :instance
@@ -30,14 +30,14 @@ module Attached
30
30
  attr_reader :alias
31
31
  attr_reader :storage
32
32
  attr_reader :host
33
-
34
-
33
+
34
+
35
35
  # A default set of options that can be extended to customize the path, storage or credentials.
36
36
  #
37
37
  # Usage:
38
38
  #
39
39
  # Attached::Attachment.options = { :storage => :fs, :path => ":name/:style/:identifier:extension" }
40
-
40
+
41
41
  def self.options
42
42
  @options ||= {
43
43
  :path => ":name/:style/:identifier:extension",
@@ -47,12 +47,12 @@ module Attached
47
47
  :credentials => {},
48
48
  }
49
49
  end
50
-
51
-
50
+
51
+
52
52
  # Initialize a new attachment by providing a name and the instance the attachment is associated with.
53
53
  #
54
54
  # Parameters:
55
- #
55
+ #
56
56
  # * name - The name for the attachment such as 'avatar' or 'photo'
57
57
  # * instance - The instance the attachment is attached to
58
58
  #
@@ -64,23 +64,23 @@ module Attached
64
64
  # * :medium - A symbol or subclass of 'Attached::Storage::Base' to be used
65
65
  # * :processor - A symbol or subclass of 'Attached::Processor::Base' to be used
66
66
  # * :alias - A string representing a fully qualified host alias
67
- # * :processors - An array of processors
67
+ # * :processors - An array of processors
68
68
  # * :aliases - An array of aliases
69
-
69
+
70
70
  def initialize(name, instance, options = {})
71
71
  options = self.class.options.clone.merge(options)
72
-
72
+
73
73
  options[:styles] ||= {}
74
74
  options[:aliases] ||= []
75
75
  options[:processors] ||= []
76
-
76
+
77
77
  @name = name
78
78
  @instance = instance
79
-
79
+
80
80
  @queue = {}
81
81
  @purge = []
82
82
  @errors = []
83
-
83
+
84
84
  @path = options[:path]
85
85
  @missing = options[:missing]
86
86
  @styles = options[:styles]
@@ -92,116 +92,116 @@ module Attached
92
92
  @processor = options[:processor]
93
93
  @aliases = options[:aliases]
94
94
  @alias = options[:alias]
95
-
95
+
96
96
  @aliases = self.aliases << self.alias if self.alias
97
97
  @processors = self.processors << self.processor if self.processor
98
-
98
+
99
99
  @storage = Attached::Storage.storage(self.medium, self.credentials)
100
-
100
+
101
101
  @host = self.storage.host
102
102
  end
103
-
104
-
103
+
104
+
105
105
  # Check if an attachment has been modified.
106
106
  #
107
107
  # Usage:
108
108
  #
109
109
  # @object.avatar.changed?
110
-
110
+
111
111
  def changed?
112
112
  instance.changed.include? "#{name}_identifier"
113
113
  end
114
-
115
-
114
+
115
+
116
116
  # Check if an attachment is present.
117
117
  #
118
118
  # Usage:
119
119
  #
120
120
  # @object.avatar.file?
121
-
121
+
122
122
  def file?
123
123
  not identifier.blank?
124
124
  end
125
-
126
-
125
+
126
+
127
127
  # Check if an attachment is present.
128
128
  #
129
129
  # Usage:
130
130
  #
131
131
  # @object.avatar.attached?
132
-
132
+
133
133
  def attached?
134
134
  not identifier.blank?
135
135
  end
136
-
137
-
136
+
137
+
138
138
  # Custom setter for specifying an attachment.
139
- #
139
+ #
140
140
  # Usage:
141
141
  #
142
142
  # @object.avatar.file = File.open(...)
143
-
143
+
144
144
  def file=(file)
145
145
  @file = file
146
146
  @file = file.tempfile if file.respond_to?(:tempfile)
147
147
  end
148
-
149
-
148
+
149
+
150
150
  # Assign an attachment to a file.
151
151
  #
152
152
  # Usage:
153
153
  #
154
154
  # @object.avatar.assign(...)
155
-
155
+
156
156
  def assign(file, identifier = Identifier.generate)
157
157
  self.file = file
158
-
158
+
159
159
  if file
160
160
  extension ||= file.extension if file.respond_to? :extension
161
161
  extension ||= File.extname(file.original_filename) if file.respond_to? :original_filename
162
162
  extension ||= File.extname(file.path) if file.respond_to? :path
163
-
163
+
164
164
  size ||= file.size if file.respond_to? :size
165
165
  size ||= File.size(file.path) if file.respond_to? :path
166
166
  end
167
-
167
+
168
168
  @purge = [self.path, *self.styles.map { |style, options| self.path(style) }] if attached?
169
-
169
+
170
170
  self.size = file ? size : nil
171
171
  self.extension = file ? extension : nil
172
172
  self.identifier = file ? identifier : nil
173
-
173
+
174
174
  process if file
175
175
  end
176
-
177
-
176
+
177
+
178
178
  # Save an attachment.
179
179
  #
180
180
  # Usage:
181
181
  #
182
182
  # @object.avatar.save
183
-
184
- def save
183
+
184
+ def save
185
185
  self.queue.each do |style, file|
186
186
  path = self.path(style)
187
187
  self.storage.save(file, path) if file and path
188
188
  end
189
-
189
+
190
190
  self.purge.each do |path|
191
191
  self.storage.destroy(path)
192
192
  end
193
-
193
+
194
194
  @purge = []
195
195
  @queue = {}
196
196
  end
197
-
198
-
197
+
198
+
199
199
  # Destroy an attachment.
200
200
  #
201
201
  # Usage:
202
202
  #
203
203
  # @object.avatar.destroy
204
-
204
+
205
205
  def destroy
206
206
  if attached?
207
207
  self.storage.destroy(self.path)
@@ -209,12 +209,12 @@ module Attached
209
209
  self.storage.destroy(self.path(style))
210
210
  end
211
211
  end
212
-
212
+
213
213
  @purge = []
214
214
  @queue = {}
215
215
  end
216
-
217
-
216
+
217
+
218
218
  # Acesss the URL for an attachment.
219
219
  #
220
220
  # Usage:
@@ -222,28 +222,28 @@ module Attached
222
222
  # @object.avatar.url
223
223
  # @object.avatar.url(:small)
224
224
  # @object.avatar.url(:large)
225
-
225
+
226
226
  def url(style = self.default)
227
227
  path = self.path(style)
228
-
228
+
229
229
  host = self.host
230
230
  host = self.aliases[path.hash % self.aliases.count] unless self.aliases.empty?
231
-
231
+
232
232
  return "#{host}#{path}"
233
233
  end
234
-
235
-
236
- # Access the path for an attachment.
234
+
235
+
236
+ # Access the path for an attachment.
237
237
  #
238
238
  # Usage:
239
239
  #
240
240
  # @object.avatar.url
241
241
  # @object.avatar.url(:small)
242
242
  # @object.avatar.url(:large)
243
-
243
+
244
244
  def path(style = self.default)
245
245
  path = self.attached? ? @path.clone : @missing.clone
246
-
246
+
247
247
  path.gsub!(/:name/, name.to_s)
248
248
  path.gsub!(/:style/, style.to_s)
249
249
  path.gsub!(/:extension/, extension(style).to_s)
@@ -251,168 +251,168 @@ module Attached
251
251
 
252
252
  return path
253
253
  end
254
-
255
-
254
+
255
+
256
256
  # Access the size for an attachment.
257
257
  #
258
258
  # Usage:
259
259
  #
260
260
  # @object.avatar.size
261
-
261
+
262
262
  def size
263
263
  return instance_get(:size)
264
264
  end
265
-
266
-
265
+
266
+
267
267
  # Access the status for an attachment.
268
268
  #
269
269
  # Usage:
270
270
  #
271
271
  # @object.avatar.status
272
-
272
+
273
273
  def status
274
274
  instance_get(:status)
275
275
  end
276
-
277
-
278
- # Access the extension for an attachment. It will first check the styles
276
+
277
+
278
+ # Access the extension for an attachment. It will first check the styles
279
279
  # to see if one is specified before checking the instance.
280
280
  #
281
281
  # Usage:
282
282
  #
283
283
  # @object.avatar.extension
284
-
284
+
285
285
  def extension(style = nil)
286
286
  style and
287
- self.styles and
288
- self.styles[style] and
289
- self.styles[style][:extension] or
287
+ self.styles and
288
+ self.styles[style] and
289
+ self.styles[style][:extension] or
290
290
  instance_get(:extension)
291
291
  end
292
-
293
-
294
- # Access the identifier for an attachment. It will first check the styles
292
+
293
+
294
+ # Access the identifier for an attachment. It will first check the styles
295
295
  # to see if one is specified before checking the instance.
296
296
  #
297
297
  # Usage:
298
298
  #
299
299
  # @object.avatar.identifier
300
-
300
+
301
301
  def identifier(style = nil)
302
302
  style and
303
- self.styles and
304
- self.styles[style] and
305
- self.styles[style][:identifier] or
303
+ self.styles and
304
+ self.styles[style] and
305
+ self.styles[style][:identifier] or
306
306
  instance_get(:identifier)
307
307
  end
308
-
309
-
308
+
309
+
310
310
  # Set the size for an attachment.
311
311
  #
312
312
  # Usage:
313
313
  #
314
314
  # @object.avatar.size = 1024
315
-
315
+
316
316
  def size=(size)
317
317
  instance_set(:size, size)
318
318
  end
319
-
320
-
319
+
320
+
321
321
  # Set the status for an attachment.
322
322
  #
323
323
  # Usage:
324
324
  #
325
325
  # @object.avatar.status = 'processing'
326
-
326
+
327
327
  def status=(status)
328
328
  instance_set(:size, status)
329
329
  end
330
-
331
-
332
- # Set the extension for an attachment. It will act independently of the
330
+
331
+
332
+ # Set the extension for an attachment. It will act independently of the
333
333
  # defined style.
334
334
  #
335
335
  # Usage:
336
336
  #
337
337
  # @object.avatar.extension = ".png"
338
-
338
+
339
339
  def extension=(extension)
340
340
  instance_set(:extension, extension)
341
341
  end
342
-
343
-
344
- # Set the identifier for an attachment. It will act independently of the
342
+
343
+
344
+ # Set the identifier for an attachment. It will act independently of the
345
345
  # defined style.
346
346
  #
347
347
  # Usage:
348
348
  #
349
349
  # @object.avatar.identifier = "1234"
350
-
350
+
351
351
  def identifier=(identifier)
352
352
  instance_set(:identifier, identifier)
353
353
  end
354
-
355
-
354
+
355
+
356
356
  # Access the original file .
357
-
357
+
358
358
  def reprocess!
359
359
  self.file = self.storage.retrieve(self.path)
360
-
360
+
361
361
  process
362
362
  end
363
-
364
-
363
+
364
+
365
365
  private
366
-
367
-
366
+
367
+
368
368
  # Helper function for calling processors (will queue default).
369
369
  #
370
370
  # Usage:
371
371
  #
372
372
  # self.process
373
-
373
+
374
374
  def process
375
375
  self.queue[self.default] = self.file
376
-
376
+
377
377
  begin
378
-
378
+
379
379
  self.processors.each do |processor|
380
380
  processor = Attached::Processor.processor(processor)
381
381
  self.styles.each do |style, options|
382
382
  self.queue[style] = processor.process(self.queue[style] || self.file, options, self)
383
383
  end
384
384
  end
385
-
385
+
386
386
  rescue Attached::Processor::Error => error
387
387
  self.errors << error.message
388
388
  end
389
389
  end
390
-
391
-
390
+
391
+
392
392
  # Helper function for setting instance variables.
393
- #
393
+ #
394
394
  # Usage:
395
395
  #
396
396
  # self.instance_set(size, 12345)
397
-
397
+
398
398
  def instance_set(attribute, value)
399
399
  setter = :"#{self.name}_#{attribute}="
400
400
  self.instance.send(setter, value) if instance.respond_to?(setter)
401
401
  end
402
-
403
-
402
+
403
+
404
404
  # Helper function for getting instance variables.
405
405
  #
406
406
  # Usage:
407
407
  #
408
408
  # self.instance_get(size)
409
-
409
+
410
410
  def instance_get(attribute)
411
411
  getter = :"#{self.name}_#{attribute}"
412
412
  self.instance.send(getter) if instance.respond_to?(getter)
413
413
  end
414
414
 
415
-
415
+
416
416
  end
417
-
417
+
418
418
  end