attachs 0.4.5 → 4.0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +83 -218
  4. data/Rakefile +1 -14
  5. data/lib/attachs.rb +98 -31
  6. data/lib/attachs/attachment.rb +301 -72
  7. data/lib/attachs/builder.rb +78 -0
  8. data/lib/attachs/collection.rb +84 -0
  9. data/lib/attachs/concern.rb +47 -0
  10. data/lib/attachs/configuration.rb +11 -0
  11. data/lib/attachs/console.rb +40 -0
  12. data/lib/attachs/extensions/active_record/base.rb +24 -0
  13. data/lib/attachs/extensions/active_record/validations/attachment_content_type_validator.rb +37 -0
  14. data/lib/attachs/extensions/active_record/validations/attachment_presence_validator.rb +27 -0
  15. data/lib/attachs/extensions/active_record/validations/attachment_size_validator.rb +55 -0
  16. data/lib/attachs/extensions/active_record/validations/attachment_validator.rb +24 -0
  17. data/lib/attachs/interpolations.rb +27 -0
  18. data/lib/attachs/jobs/base.rb +14 -0
  19. data/lib/attachs/jobs/delete_job.rb +15 -0
  20. data/lib/attachs/jobs/update_job.rb +11 -0
  21. data/lib/attachs/locales/en.yml +2 -6
  22. data/lib/attachs/locales/es.yml +2 -6
  23. data/lib/attachs/processors/base.rb +4 -14
  24. data/lib/attachs/processors/image.rb +45 -0
  25. data/lib/attachs/railtie.rb +7 -27
  26. data/lib/attachs/storages/base.rb +10 -59
  27. data/lib/attachs/storages/s3.rb +68 -63
  28. data/lib/attachs/version.rb +1 -1
  29. data/lib/generators/attachs/install/install_generator.rb +15 -0
  30. data/lib/generators/attachs/install/templates/initializer.rb +7 -0
  31. data/lib/generators/attachs/upload/templates/migration.rb +11 -0
  32. data/lib/generators/attachs/upload/templates/model.rb +19 -0
  33. data/lib/generators/attachs/upload/upload_generator.rb +24 -0
  34. data/lib/tasks/attachs.rake +12 -26
  35. data/test/attachment_test.rb +175 -12
  36. data/test/collection_test.rb +52 -0
  37. data/test/concern_test.rb +10 -0
  38. data/test/dummy/Rakefile +1 -2
  39. data/test/dummy/app/assets/javascripts/application.js +2 -2
  40. data/test/dummy/app/assets/stylesheets/application.css +6 -4
  41. data/test/dummy/app/models/product.rb +16 -0
  42. data/test/dummy/app/models/shop.rb +14 -0
  43. data/test/dummy/app/models/upload.rb +19 -0
  44. data/test/dummy/app/views/layouts/application.html.erb +9 -11
  45. data/test/dummy/bin/bundle +1 -0
  46. data/test/dummy/bin/rails +2 -1
  47. data/test/dummy/bin/rake +1 -0
  48. data/test/dummy/bin/setup +30 -0
  49. data/test/dummy/config.ru +1 -1
  50. data/test/dummy/config/application.rb +3 -2
  51. data/test/dummy/config/boot.rb +1 -1
  52. data/test/dummy/config/database.yml +4 -22
  53. data/test/dummy/config/database.yml.travis +3 -0
  54. data/test/dummy/config/environment.rb +1 -1
  55. data/test/dummy/config/environments/development.rb +15 -3
  56. data/test/dummy/config/environments/production.rb +21 -26
  57. data/test/dummy/config/environments/test.rb +10 -12
  58. data/test/dummy/config/initializers/assets.rb +11 -0
  59. data/test/dummy/config/initializers/attachs.rb +7 -21
  60. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  61. data/test/dummy/config/initializers/mime_types.rb +1 -2
  62. data/test/dummy/config/initializers/session_store.rb +1 -1
  63. data/test/dummy/config/routes.rb +54 -0
  64. data/test/dummy/config/secrets.yml +24 -0
  65. data/test/dummy/db/migrate/20161024234003_create_shops.rb +11 -0
  66. data/test/dummy/db/migrate/20161024234029_create_products.rb +12 -0
  67. data/test/dummy/db/migrate/20161031135453_create_uploads.rb +11 -0
  68. data/test/dummy/db/schema.rb +27 -16
  69. data/test/dummy/log/development.log +61 -0
  70. data/test/dummy/log/test.log +5873 -0
  71. data/test/dummy/public/404.html +58 -55
  72. data/test/dummy/public/422.html +58 -55
  73. data/test/dummy/public/500.html +57 -54
  74. data/test/fixtures/big_file.txt +50 -0
  75. data/test/fixtures/big_image.jpg +0 -0
  76. data/test/fixtures/file.txt +1 -0
  77. data/test/fixtures/image.jpg +0 -0
  78. data/test/{dummy/test/fixtures/file.txt → fixtures/small_file.txt} +0 -0
  79. data/test/fixtures/small_image.jpg +0 -0
  80. data/test/generator_test.rb +14 -6
  81. data/test/helper_test.rb +28 -0
  82. data/test/query_test.rb +26 -0
  83. data/test/support/storage_helper.rb +65 -0
  84. data/test/task_test.rb +69 -0
  85. data/test/test_helper.rb +6 -45
  86. data/test/upload_test.rb +27 -0
  87. data/test/validator_test.rb +160 -0
  88. metadata +114 -68
  89. data/lib/attachs/active_record/base.rb +0 -103
  90. data/lib/attachs/active_record/connection_adapters.rb +0 -40
  91. data/lib/attachs/active_record/migration.rb +0 -17
  92. data/lib/attachs/active_record/validators.rb +0 -7
  93. data/lib/attachs/active_record/validators/attachment_content_type_validator.rb +0 -30
  94. data/lib/attachs/active_record/validators/attachment_presence_validator.rb +0 -22
  95. data/lib/attachs/active_record/validators/attachment_size_validator.rb +0 -47
  96. data/lib/attachs/processors/thumbnail.rb +0 -69
  97. data/lib/attachs/storages/local.rb +0 -95
  98. data/lib/attachs/types/base.rb +0 -22
  99. data/lib/attachs/types/default.rb +0 -29
  100. data/lib/attachs/types/regular.rb +0 -21
  101. data/lib/generators/attachs/install_generator.rb +0 -13
  102. data/lib/generators/attachs/templates/attachs.rb +0 -2
  103. data/test/dummy/README.rdoc +0 -28
  104. data/test/dummy/app/models/medium.rb +0 -5
  105. data/test/dummy/app/models/picture.rb +0 -2
  106. data/test/dummy/config/initializers/secret_token.rb +0 -13
  107. data/test/dummy/config/s3.yml +0 -15
  108. data/test/dummy/db/migrate/20140808012639_create_media.rb +0 -11
  109. data/test/dummy/test/fixtures/image.gif +0 -0
  110. data/test/local_storage_test.rb +0 -72
  111. data/test/migration_test.rb +0 -65
  112. data/test/processor_test.rb +0 -49
  113. data/test/s3_storage_tes.rb +0 -66
  114. data/test/tasks_test.rb +0 -57
  115. data/test/validators_test.rb +0 -100
@@ -1,29 +0,0 @@
1
- module Attachs
2
- module Types
3
- class Default < Base
4
-
5
- %w(
6
- basename
7
- extension
8
- process
9
- process_styles
10
- destroy
11
- destroy_styles
12
- update
13
- ).each do |name|
14
- define_method(name) {}
15
- end
16
-
17
- def image?
18
- false
19
- end
20
-
21
- def url(*args)
22
- if attachment.default?
23
- storage.url *args
24
- end
25
- end
26
-
27
- end
28
- end
29
- end
@@ -1,21 +0,0 @@
1
- module Attachs
2
- module Types
3
- class Regular < Base
4
-
5
- delegate :url, :process, :process_styles, :destroy, :destroy_styles, :update, to: :storage
6
-
7
- def basename
8
- @basename ||= File.basename(attachment.filename, ".#{extension}")
9
- end
10
-
11
- def extension
12
- @extension ||= File.extname(attachment.filename).from(1)
13
- end
14
-
15
- def image?
16
- @image ||= attachment.content_type.start_with?('image')
17
- end
18
-
19
- end
20
- end
21
- end
@@ -1,13 +0,0 @@
1
- require 'rails/generators'
2
-
3
- module Attachs
4
- class InstallGenerator < Rails::Generators::Base
5
-
6
- source_root File.expand_path('../templates', __FILE__)
7
-
8
- def create_initializer
9
- copy_file 'attachs.rb', 'config/initializers/attachs.rb'
10
- end
11
-
12
- end
13
- end
@@ -1,2 +0,0 @@
1
- Attachs.configure do |config|
2
- end
@@ -1,28 +0,0 @@
1
- == README
2
-
3
- This README would normally document whatever steps are necessary to get the
4
- application up and running.
5
-
6
- Things you may want to cover:
7
-
8
- * Ruby version
9
-
10
- * System dependencies
11
-
12
- * Configuration
13
-
14
- * Database creation
15
-
16
- * Database initialization
17
-
18
- * How to run the test suite
19
-
20
- * Services (job queues, cache servers, search engines, etc.)
21
-
22
- * Deployment instructions
23
-
24
- * ...
25
-
26
-
27
- Please feel free to use a different markup language if you do not plan to run
28
- <tt>rake doc:app</tt>.
@@ -1,5 +0,0 @@
1
- class Medium < ActiveRecord::Base
2
- has_attached_file :attach, path: '/storage/:style/:filename'
3
- has_attached_file :local_attach, storage: 'local', path: '/storage/:type/:size/:style/:month/:basename.:extension', styles: [:small]
4
- has_attached_file :s3_attach, storage: 's3', path: '/storage/:type/:size/:style/:month/:basename.:extension', styles: [:small]
5
- end
@@ -1,2 +0,0 @@
1
- class Picture < ActiveRecord::Base
2
- end
@@ -1,13 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Your secret key is used for verifying the integrity of signed cookies.
4
- # If you change this key, all old signed cookies will become invalid!
5
-
6
- # Make sure the secret is at least 30 characters and all random,
7
- # no regular words or you'll be exposed to dictionary attacks.
8
- # You can use `rake secret` to generate a secure secret key.
9
-
10
- # Make sure your secret_key_base is kept private
11
- # if you're sharing your code publicly.
12
- Dummy::Application.config.secret_token = '325198aee80c035ddba090e3307afe68ef17c12a25b60f987d673febf4164119cb1ce3772aa21fb6b16ede3b9362c0030f7d934f31f1f01f96dd61f289bc6f8c'
13
- Dummy::Application.config.secret_key_base = '325198aee80c035ddba090e3307afe68ef17c12a25b60f987d673febf4164119cb1ce3772aa21fb6b16ede3b9362c0030f7d934f31f1f01f96dd61f289bc6f8c'
@@ -1,15 +0,0 @@
1
-
2
- development:
3
- bucket: development-bucket
4
- access_key_id: development_access_key_id
5
- secret_access_key: development_secret_access_key
6
-
7
- test:
8
- bucket: test-bucket
9
- access_key_id: test_access_key_id
10
- secret_access_key: test_secret_access_key
11
-
12
- production:
13
- bucket: production-bucket
14
- access_key_id: production_access_key_id
15
- secret_access_key: production_secret_access_key
@@ -1,11 +0,0 @@
1
- class CreateMedia < ActiveRecord::Migration
2
- def change
3
- create_table :media do |t|
4
- t.attachment :attach
5
- t.attachment :local_attach
6
- t.attachment :s3_attach
7
-
8
- t.timestamps
9
- end
10
- end
11
- end
@@ -1,72 +0,0 @@
1
- require 'test_helper'
2
-
3
- class LocalStorageTest < ActiveSupport::TestCase
4
-
5
- teardown do
6
- clean_storage
7
- end
8
-
9
- test 'file url' do
10
- medium = Medium.create(local_attach: file_upload)
11
- assert_equal file_url(:original, medium, true), medium.local_attach.url
12
- assert_equal file_url(:original, medium, false), medium.local_attach.url(cachebuster: false)
13
- end
14
-
15
- test 'image url' do
16
- medium = Medium.create(local_attach: image_upload)
17
- assert_equal image_url(:original, medium, true), medium.local_attach.url
18
- assert_equal image_url(:original, medium, false), medium.local_attach.url(cachebuster: false)
19
- assert_equal image_url(:small, medium, true), medium.local_attach.url(:small)
20
- assert_equal image_url(:small, medium, false), medium.local_attach.url(:small, cachebuster: false)
21
- end
22
-
23
- test 'crud' do
24
- medium = Medium.create(local_attach: file_upload)
25
- assert File.exist?(file_path(:original))
26
- medium.update_attributes! local_attach: image_upload
27
- assert !File.exist?(file_path(:original))
28
- assert File.exist?(image_path(:original))
29
- assert File.exist?(image_path(:small))
30
- medium.destroy
31
- assert !File.exist?(image_path(:original))
32
- assert !File.exist?(image_path(:small))
33
- end
34
-
35
- test 'detroy attr' do
36
- medium = Medium.create(local_attach: file_upload, destroy_attach: true)
37
- assert File.exist?(file_path(:original))
38
- medium.update_attributes! destroy_local_attach: true
39
- assert !File.exist?(file_path(:original))
40
- end
41
-
42
- private
43
-
44
- def month
45
- Time.zone.now.month
46
- end
47
-
48
- def file_url(style, record, cachebuster=true)
49
- "/storage/text/11/#{style}/#{month}/file.txt".tap do |url|
50
- if cachebuster
51
- url << "?#{record.local_attach_updated_at.to_i}"
52
- end
53
- end
54
- end
55
-
56
- def image_url(style, record, cachebuster=true)
57
- "/storage/image/5461/#{style}/#{month}/image.gif".tap do |url|
58
- if cachebuster
59
- url << "?#{record.local_attach_updated_at.to_i}"
60
- end
61
- end
62
- end
63
-
64
- def file_path(style)
65
- Rails.root.join("public/storage/text/11/#{style}/#{month}/file.txt")
66
- end
67
-
68
- def image_path(style)
69
- Rails.root.join("public/storage/image/5461/#{style}/#{month}/image.gif")
70
- end
71
-
72
- end
@@ -1,65 +0,0 @@
1
- require 'test_helper'
2
-
3
- class MigrationTest < ActiveSupport::TestCase
4
-
5
- setup do
6
- ActiveRecord::Migration.verbose = false
7
- end
8
-
9
- test 'table migration' do
10
- table_migration.migrate(:up)
11
- assert_includes columns, ['image_filename', :string]
12
- assert_includes columns, ['image_size', :integer]
13
- assert_includes columns, ['image_content_type', :string]
14
- assert_includes columns, ['image_updated_at', :datetime]
15
-
16
- assert_nothing_raised do
17
- table_migration.migrate(:down)
18
- end
19
- end
20
-
21
- test 'column migration' do
22
- ActiveRecord::Base.connection.create_table :pictures
23
-
24
- column_migration.migrate(:up)
25
- assert_includes columns, ['image_filename', :string]
26
- assert_includes columns, ['image_size', :integer]
27
- assert_includes columns, ['image_content_type', :string]
28
- assert_includes columns, ['image_updated_at', :datetime]
29
-
30
- column_migration.migrate(:down)
31
- refute_includes columns, ['image_filename', :string]
32
- refute_includes columns, ['image_size', :integer]
33
- refute_includes columns, ['image_content_type', :string]
34
- refute_includes columns, ['image_updated_at', :datetime]
35
- end
36
-
37
- private
38
-
39
- def columns
40
- Picture.reset_column_information
41
- Picture.columns.map { |column| [column.name, column.type] }
42
- end
43
-
44
- def table_migration
45
- Class.new(ActiveRecord::Migration) do
46
- def change
47
- create_table :pictures do |t|
48
- t.attachment :image
49
- end
50
- end
51
- end
52
- end
53
-
54
- def column_migration
55
- Class.new(ActiveRecord::Migration) do
56
- def up
57
- add_attachment :pictures, :image
58
- end
59
- def down
60
- remove_attachment :pictures, :image
61
- end
62
- end
63
- end
64
-
65
- end
@@ -1,49 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ProcessorTest < ActiveSupport::TestCase
4
-
5
- setup do
6
- FileUtils.mkdir_p resized_path.dirname
7
- FileUtils.cp source_path, resized_path
8
- end
9
-
10
- teardown do
11
- clean_storage
12
- end
13
-
14
- test 'force resize' do
15
- Attachs::Processors::Thumbnail.new(nil, source_path).process(:big_force, resized_path)
16
- assert_equal [160,130], dimensions(resized_path)
17
- Attachs::Processors::Thumbnail.new(nil, source_path).process(:small_force, resized_path)
18
- assert_equal [140,110], dimensions(resized_path)
19
- end
20
-
21
- test 'cover resize' do
22
- Attachs::Processors::Thumbnail.new(nil, source_path).process(:big_cover, resized_path)
23
- assert_equal [160,130], dimensions(resized_path)
24
- Attachs::Processors::Thumbnail.new(nil, source_path).process(:small_cover, resized_path)
25
- assert_equal [140,110], dimensions(resized_path)
26
- end
27
-
28
- test 'contain resize' do
29
- Attachs::Processors::Thumbnail.new(nil, source_path).process(:big_contain, resized_path)
30
- assert_equal [156,130], dimensions(resized_path)
31
- Attachs::Processors::Thumbnail.new(nil, source_path).process(:small_contain, resized_path)
32
- assert_equal [132,110], dimensions(resized_path)
33
- end
34
-
35
- private
36
-
37
- def source_path
38
- image_upload.path
39
- end
40
-
41
- def resized_path
42
- Rails.root.join('public/storage/processor/resized.gif')
43
- end
44
-
45
- def dimensions(source)
46
- `identify -format %wx%h '#{source}'`.split('x').map(&:to_i)
47
- end
48
-
49
- end
@@ -1,66 +0,0 @@
1
- require 'test_helper'
2
-
3
- class S3StorageTest < ActiveSupport::TestCase
4
-
5
- test 'file url' do
6
- medium = Medium.create(s3_attach: file_upload)
7
- assert_equal file_url(:original, medium, true, false), medium.s3_attach.url
8
- assert_equal file_url(:original, medium, false, false), medium.s3_attach.url(cachebuster: false)
9
- assert_equal file_url(:original, medium, true, true), medium.s3_attach.url(ssl: true)
10
- assert_equal file_url(:original, medium, false, true), medium.s3_attach.url(ssl: true, cachebuster: false)
11
- end
12
-
13
- test 'image url' do
14
- medium = Medium.create(s3_attach: image_upload)
15
- assert_equal image_url(:original, medium, true, false), medium.s3_attach.url
16
- assert_equal image_url(:original, medium, false, false), medium.s3_attach.url(cachebuster: false)
17
- assert_equal image_url(:original, medium, true, true), medium.s3_attach.url(ssl: true)
18
- assert_equal image_url(:original, medium, false, true), medium.s3_attach.url(ssl: true, cachebuster: false)
19
- assert_equal image_url(:small, medium, true, false), medium.s3_attach.url(:small)
20
- assert_equal image_url(:small, medium, false, false), medium.s3_attach.url(:small, cachebuster: false)
21
- assert_equal image_url(:small, medium, true, true), medium.s3_attach.url(:small, ssl: true)
22
- assert_equal image_url(:small, medium, false, true), medium.s3_attach.url(:small, ssl: true, cachebuster: false)
23
- end
24
-
25
- test 'storage' do
26
- medium = Medium.create(s3_attach: file_upload)
27
- assert_url file_url(:original, medium)
28
- medium.update_attributes! s3_attach: image_upload
29
- assert_not_url file_url(:original, medium)
30
- assert_url image_url(:original, medium)
31
- assert_url image_url(:small, medium)
32
- medium.destroy
33
- assert_not_url image_url(:original, medium)
34
- assert_not_url image_url(:small, medium)
35
- end
36
-
37
- test 'detroy attr' do
38
- medium = Medium.create(s3_attach: file_upload, destroy_s3_attach: true)
39
- assert_url file_url(:original, medium)
40
- medium.update_attributes! destroy_s3_attach: true
41
- assert_not_url file_url(:original, medium)
42
- end
43
-
44
- private
45
-
46
- def month
47
- Time.zone.now.month
48
- end
49
-
50
- def file_url(style, record, cachebuster=true, ssl=false)
51
- "http#{'s' if ssl}://s3.amazonaws.com/attachs.test/storage/text/11/#{style}/#{month}/file.txt".tap do |url|
52
- if cachebuster
53
- url << "?#{record.s3_attach_updated_at.to_i}"
54
- end
55
- end
56
- end
57
-
58
- def image_url(style, record, cachebuster=true, ssl=false)
59
- "http#{'s' if ssl}://s3.amazonaws.com/attachs.test/storage/image/5461/#{style}/#{month}/image.gif".tap do |url|
60
- if cachebuster
61
- url << "?#{record.s3_attach_updated_at.to_i}"
62
- end
63
- end
64
- end
65
-
66
- end
@@ -1,57 +0,0 @@
1
- require 'test_helper'
2
- require 'rake'
3
-
4
- class TasksTest < ActiveSupport::TestCase
5
-
6
- setup do
7
- Dummy::Application.load_tasks
8
- end
9
-
10
- teardown do
11
- clean_storage
12
- end
13
-
14
- test 'refresh all styles' do
15
- Medium.create(attach: image_upload)
16
- original_small_time = small_time
17
- original_big_time = big_time
18
- ENV['CLASS'] = 'medium'
19
- ENV['ATTACHMENT'] = 'attach'
20
- sleep 1
21
- Rake::Task['attachs:refresh:all'].invoke
22
- assert File.file?(image_path(:small))
23
- assert File.file?(image_path(:big))
24
- assert_not_equal original_small_time, small_time
25
- assert_not_equal original_big_time, big_time
26
- end
27
-
28
- test 'refersh missing styles' do
29
- Medium.create(attach: image_upload)
30
- original_big_time = big_time
31
- original_small_time = small_time
32
- File.delete image_path(:small)
33
- ENV['CLASS'] = 'medium'
34
- ENV['ATTACHMENT'] = 'attach'
35
- sleep 1
36
- Rake::Task['attachs:refresh:missing'].invoke
37
- assert File.file?(image_path(:small))
38
- assert File.file?(image_path(:big))
39
- assert_not_equal original_small_time, small_time
40
- assert_equal original_big_time, big_time
41
- end
42
-
43
- private
44
-
45
- def image_path(style)
46
- Rails.root.join("public/storage/#{style}/image.gif")
47
- end
48
-
49
- def small_time
50
- File.mtime(image_path(:small))
51
- end
52
-
53
- def big_time
54
- File.mtime(image_path(:big))
55
- end
56
-
57
- end