light_resizer 0.1.7 → 0.2.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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +13 -1
  3. data/README.md +2 -12
  4. data/lib/light_resizer.rb +14 -2
  5. data/lib/light_resizer/carrierwave_resize.rb +5 -18
  6. data/lib/light_resizer/dimension_not_found.rb +6 -0
  7. data/lib/light_resizer/middleware.rb +10 -34
  8. data/lib/light_resizer/resizer.rb +72 -0
  9. data/lib/light_resizer/version.rb +2 -2
  10. data/light_resizer.gemspec +5 -8
  11. data/spec/dummy/.gitignore +17 -0
  12. data/spec/dummy/README.rdoc +28 -0
  13. data/spec/dummy/Rakefile +6 -0
  14. data/spec/dummy/app/assets/images/.keep +0 -0
  15. data/spec/dummy/app/assets/javascripts/application.js +16 -0
  16. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  17. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  18. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  19. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  20. data/spec/dummy/app/mailers/.keep +0 -0
  21. data/spec/dummy/app/models/.keep +0 -0
  22. data/spec/dummy/app/models/concerns/.keep +0 -0
  23. data/spec/dummy/app/uploaders/photo_uploader.rb +5 -0
  24. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  25. data/spec/dummy/bin/bundle +3 -0
  26. data/spec/dummy/bin/rails +4 -0
  27. data/spec/dummy/bin/rake +4 -0
  28. data/spec/dummy/bin/setup +29 -0
  29. data/spec/dummy/config.ru +4 -0
  30. data/spec/dummy/config/application.rb +19 -0
  31. data/spec/dummy/config/boot.rb +3 -0
  32. data/spec/dummy/config/environment.rb +5 -0
  33. data/spec/dummy/config/environments/development.rb +38 -0
  34. data/spec/dummy/config/environments/production.rb +74 -0
  35. data/spec/dummy/config/environments/test.rb +39 -0
  36. data/spec/dummy/config/initializers/assets.rb +11 -0
  37. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  38. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  39. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  40. data/spec/dummy/config/initializers/inflections.rb +16 -0
  41. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  42. data/spec/dummy/config/initializers/session_store.rb +3 -0
  43. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  44. data/spec/dummy/config/locales/en.yml +23 -0
  45. data/spec/dummy/config/routes.rb +56 -0
  46. data/spec/dummy/config/secrets.yml +22 -0
  47. data/spec/dummy/db/seeds.rb +7 -0
  48. data/spec/dummy/lib/assets/.keep +0 -0
  49. data/spec/dummy/lib/tasks/.keep +0 -0
  50. data/spec/dummy/public/404.html +67 -0
  51. data/spec/dummy/public/422.html +67 -0
  52. data/spec/dummy/public/500.html +66 -0
  53. data/spec/dummy/public/favicon.ico +0 -0
  54. data/spec/dummy/public/robots.txt +5 -0
  55. data/spec/dummy/public/uploads/test/.gitignore +1 -0
  56. data/spec/dummy/public/uploads/test/dragon.jpg +0 -0
  57. data/spec/features/carrier_wave_resize_spec.rb +20 -0
  58. data/spec/features/middleware_spec.rb +82 -0
  59. data/spec/spec_helper.rb +16 -5
  60. metadata +116 -79
  61. data/lib/light_resizer/image_loader.rb +0 -48
  62. data/lib/light_resizer/image_loader/original_image.rb +0 -39
  63. data/lib/light_resizer/image_loader/resize_image.rb +0 -51
  64. data/lib/light_resizer/middleware/path.rb +0 -71
  65. data/lib/light_resizer/middleware/resizer.rb +0 -45
  66. data/spec/fixtures/sample.jpg +0 -0
  67. data/spec/integration/middleware_spec.rb +0 -37
  68. data/spec/unit/image_loader_original_spec.rb +0 -29
  69. data/spec/unit/image_loader_resized_spec.rb +0 -45
  70. data/spec/unit/image_loader_spec.rb +0 -23
  71. data/spec/unit/middleware_path_spec.rb +0 -53
  72. data/spec/unit/middleware_resizer_spec.rb +0 -35
@@ -1,48 +0,0 @@
1
- # encoding: utf-8
2
- require 'light_resizer/image_loader/original_image'
3
- require 'light_resizer/image_loader/resize_image'
4
-
5
- module LightResizer
6
- class ImageLoader
7
-
8
- attr_reader :original, :resized
9
-
10
- def initialize(root_dir)
11
- @original = ImageLoader::OriginalImage.new(root_dir)
12
- @resized = ImageLoader::ResizeImage.new(root_dir)
13
- end
14
-
15
- def original_image_path=(path)
16
- #todo refresh @original image
17
- @original.relative_path = path
18
- end
19
-
20
- def resize_prefix=(prefix)
21
- #todo clear resize prefix
22
- @resized.original_filename = @original.filename
23
- @resized.original_relative_dir = @original.relative_dir
24
- @resized.resize_prefix = prefix
25
- end
26
-
27
- def original_path
28
- @original.full_path
29
- end
30
-
31
- def original_image_exist?
32
- @original.image_exist?
33
- end
34
-
35
- def resize_path
36
- @resized.full_path
37
- end
38
-
39
- def resized_image_relative_path
40
- @resized.relative_path
41
- end
42
-
43
- def resized_image_exist?
44
- @resized.image_exist?
45
- end
46
-
47
- end
48
- end
@@ -1,39 +0,0 @@
1
- # encoding: utf-8
2
- module LightResizer
3
- class ImageLoader
4
- class OriginalImage
5
-
6
- attr_accessor :relative_path
7
-
8
- def initialize(root_dir)
9
- @root_dir = root_dir
10
- end
11
-
12
- # Full original image path /{root}/some_dir/image.png
13
- def full_path
14
- File.join(@root_dir, relative_path)
15
- end
16
-
17
- # Absolute store /{root}/some_dir
18
- def dir_path
19
- File.dirname( full_path ).to_s
20
- end
21
-
22
- # Requested filename /image.png
23
- def filename
24
- File.basename( full_path ).to_s
25
- end
26
-
27
- # Relative file store dir /some_dir/
28
- def relative_dir
29
- dir_path.gsub(@root_dir, '')
30
- end
31
-
32
- # {Bool} original image exist
33
- def image_exist?
34
- !Dir[full_path + '.*'].empty?
35
- end
36
-
37
- end
38
- end
39
- end
@@ -1,51 +0,0 @@
1
- # encoding: utf-8
2
- module LightResizer
3
- class ImageLoader
4
- class ResizeImage
5
-
6
- STORE_RESIZE_DIR = 'light_resize' #todo move to config option
7
-
8
- attr_accessor :original_filename, :original_relative_dir, :resize_prefix
9
- attr_reader :root_dir
10
-
11
- def initialize(root_dir)
12
- @root_dir = root_dir
13
- end
14
-
15
- def resize_prefix_dir
16
- STORE_RESIZE_DIR
17
- end
18
-
19
- # Resized file name '150x150_image.png'
20
- def filename
21
- "#{resize_prefix}_#{original_filename}"
22
- end
23
-
24
- # Relative resize image path '/some_dir/resize/150x150_image.png'
25
- def relative_path
26
- File.join(original_relative_dir, STORE_RESIZE_DIR, filename)
27
- end
28
-
29
- # Absolute image path
30
- def full_path
31
- File.join(@root_dir, relative_path)
32
- end
33
-
34
- # Absolute resize path {root}/some_dir/resize
35
- def dir_path
36
- File.dirname full_path
37
- end
38
-
39
- # {Bool} returns true if resize dir exist?
40
- def dir_exist?
41
- Dir.exist? dir_path
42
- end
43
-
44
- # {Bool} returns true if resize image exist?
45
- def image_exist?
46
- File.exist? full_path
47
- end
48
-
49
- end
50
- end
51
- end
@@ -1,71 +0,0 @@
1
- # encoding: utf-8
2
- module LightResizer
3
- class Middleware
4
- class Path
5
-
6
- PREFIX_REGEXP = /^[0-9]+x[0-9]+(_crop|_convert)*_/
7
-
8
- attr_reader :request_path
9
-
10
- def request_path=(path)
11
- @request_path = path
12
- @segments = nil
13
- end
14
-
15
- # {Bool} returns true if request path begins with 'image'
16
- def image_path?
17
- request_dir.end_with?('light_resize')
18
- end
19
-
20
-
21
- # {Bool} returns true if image should be croped on resize
22
- def crop_path?
23
- prefix =~ /crop/
24
- end
25
-
26
- # {Bool} returns true if image should be converted on resize
27
- def convert_path?
28
- prefix =~ /convert/
29
- end
30
-
31
- # {String} last part of request – relative path
32
- def image_path
33
- dir = File.expand_path('..', request_dir)
34
- File.join(dir, original_filename)
35
- end
36
-
37
- def image_extension
38
- File.extname(request_path)
39
- end
40
-
41
-
42
- # {String} returns prefix of resized image name
43
- # 200x200_crop_image.png => 200x200_crop
44
- def prefix
45
- filename[PREFIX_REGEXP].chop if image_path?
46
- end
47
-
48
- def dimensions
49
- prefix.split('_').first
50
- end
51
-
52
- private
53
-
54
- def request_dir
55
- File.dirname(request_path)
56
- end
57
-
58
- def original_filename
59
- filename.gsub(PREFIX_REGEXP, '')
60
- end
61
-
62
- def filename
63
- File.basename(request_path, '.*')
64
- end
65
-
66
- def name_segments
67
- @segments ||= request_path.split('/')
68
- end
69
- end
70
- end
71
- end
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
- module LightResizer
3
- class Middleware
4
- class Resizer
5
-
6
- def resize(dimensions, original_path, resize_path, crop, extension, convert)
7
- check_resized_dir(resize_path)
8
- store_image(dimensions, original_path, resize_path, crop, extension)
9
- end
10
-
11
- private
12
-
13
- def check_resized_dir(resize_path)
14
- dir_name = File.dirname resize_path
15
- Dir.mkdir dir_name unless Dir.exist? dir_name
16
- #todo permissions?
17
- end
18
-
19
- def store_image(dimensions, original_path, resize_path, crop, extension)
20
- original_path += '.*'
21
- width, height = dimensions.split('x').map &:to_i
22
-
23
- @image = Magick::Image.read(Dir[original_path].first).first
24
- @image.format = extension[1..-1]
25
-
26
- # WARNING: DO NOT CHANGE COMMANDS ORDER FOR @IMAGE OBJECT
27
- # really, don't do this
28
- crop ? crop_image(width, height) : resize_image(width, height)
29
-
30
- @image.write(resize_path + extension)
31
- end
32
-
33
- def resize_image(width, height)
34
- @image.resize_to_fit!(width, height)
35
- @image.background_color = 'Transparent'
36
- @image = @image.extent(width, height, (@image.columns - width) / 2, (@image.rows - height) / 2) # does not work with simple gravity
37
- end
38
-
39
- def crop_image(width, height)
40
- @image.resize_to_fill!(width, height)
41
- end
42
-
43
- end
44
- end
45
- end
Binary file
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LightResizer::Middleware do
4
- let(:app) { double("app") }
5
- let(:resizer) { described_class.new(app, ROOT, 'fixtures') }
6
- let(:env) { { 'PATH_INFO' => resize_relative_path} }
7
-
8
- let(:resize_full_path) { File.join(ROOT, 'fixtures', resize_relative_path) }
9
-
10
- context 'image path' do
11
- after(:each) do
12
- File.delete(resize_full_path)
13
- end
14
- let(:resize_relative_path) { '/light_resize/200x100_sample.png' } #todo depends for many constant
15
-
16
- it 'should approve resize request' do
17
- resizer.call(env)
18
-
19
- expect(resizer.resize_request?).to be_truthy
20
- end
21
-
22
- it 'should create resized image' do
23
- expect(File.exist?(resize_full_path)).to be_falsey
24
- resizer.call(env)
25
- expect(File.exist?(resize_full_path)).to be_truthy
26
- end
27
- end
28
-
29
- context 'non image path' do
30
- let(:resize_relative_path) { 'some/other/path' }
31
-
32
- it 'should call app with right environment' do
33
- expect(app).to receive(:call).with(env)
34
- resizer.call(env)
35
- end
36
- end
37
- end
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LightResizer::ImageLoader::OriginalImage do
4
-
5
- let(:root_dir) { File.join(ROOT, 'fixtures') }
6
- let(:store_dir) { '/some/dir' }
7
- let(:filename) { 'image' }
8
- let(:image_full_path) { File.join(root_dir, store_dir, filename) }
9
- let(:original_image) { described_class.new root_dir }
10
-
11
- before(:each) do
12
- original_image.relative_path = File.join(store_dir, filename)
13
- end
14
-
15
- context 'path methods' do
16
-
17
- it { expect(original_image.send(:full_path)).to eq(image_full_path) }
18
-
19
- it { expect(original_image.send(:dir_path)).to eq( File.join(root_dir, store_dir) ) }
20
-
21
- it { expect(original_image.send(:filename)).to eq( filename ) }
22
-
23
- it { expect(original_image.send(:relative_dir)).to eq(store_dir) }
24
-
25
- it { expect(original_image.send(:image_exist?)).to eq(false) }
26
-
27
- end
28
-
29
- end
@@ -1,45 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LightResizer::ImageLoader::ResizeImage do
4
-
5
- let(:root_dir) { File.join(ROOT, 'fixtures') }
6
- let(:store_dir) { '/some/dir' }
7
- let(:original_filename) { 'image.png' }
8
- let(:resized_prefix) { '20x20' }
9
- let(:resized_image) { described_class.new root_dir }
10
-
11
- before(:each) do
12
- resized_image.original_filename = original_filename
13
- resized_image.original_relative_dir = store_dir
14
- resized_image.resize_prefix = resized_prefix
15
- end
16
-
17
- context 'path methods' do
18
-
19
- it {
20
- expected_filename = [resized_prefix, '_', original_filename].join('')
21
- expect(resized_image.send(:filename)).to eq( expected_filename )
22
- }
23
-
24
- it {
25
- expected_path = File.join(store_dir, 'light_resize', resized_image.filename)
26
- expect(resized_image.send(:relative_path)).to eq( expected_path )
27
- }
28
-
29
- it {
30
- expected_path = File.join(root_dir, resized_image.relative_path )
31
- expect(resized_image.send(:full_path)).to eq( expected_path )
32
- }
33
-
34
- it {
35
- expected_path = File.join(root_dir, store_dir, 'light_resize' )
36
- expect(resized_image.send(:dir_path)).to eq( expected_path )
37
- }
38
-
39
- it { expect(resized_image.send(:dir_exist?)).to eq(false) }
40
-
41
- it { expect(resized_image.send(:image_exist?)).to eq(false) }
42
-
43
- end
44
-
45
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LightResizer::ImageLoader do
4
-
5
- let(:root_dir) { File.join(ROOT, 'fixtures') }
6
- let(:image_loader) { described_class.new root_dir }
7
-
8
- before(:each) do
9
- image_loader.original_image_path = '/some/dir/image.png'
10
- image_loader.resize_prefix = '20x20'
11
- end
12
-
13
- context 'image loader methods' do
14
-
15
- it { expect(image_loader.send(:original_image_exist?)).to eq(false) }
16
-
17
- it { expect(image_loader.send(:resized_image_relative_path)).to eq('/some/dir/light_resize/20x20_image.png') }
18
-
19
- it { expect(image_loader.send(:resized_image_exist?)).to eq(false) }
20
-
21
- end
22
-
23
- end
@@ -1,53 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LightResizer::Middleware::Path do
4
-
5
- let(:path) { described_class.new }
6
-
7
- context 'valid path methods' do
8
-
9
- before(:each) do
10
- path.request_path = '/some_dir/light_resize/150x150_image.png'
11
- end
12
-
13
- it { expect(path.image_path?).to be_truthy }
14
-
15
- it { expect(path.image_path).to eq('/some_dir/image') }
16
-
17
- it { expect(path.image_extension).to eq('.png') }
18
-
19
- it { expect(path.dimensions).to eq('150x150') }
20
-
21
- it { expect(path.prefix).to eq('150x150') }
22
-
23
- end
24
-
25
- context 'resize with crop' do
26
- before(:each) do
27
- path.request_path = '/some_dir/light_resize/150x150_crop_convert_image.png'
28
- end
29
-
30
- it { expect(path.crop_path?).to be_truthy }
31
-
32
- it { expect(path.convert_path?).to be_truthy }
33
-
34
- it { expect(path.image_path).to eq('/some_dir/image') }
35
-
36
- it { expect(path.image_extension).to eq('.png') }
37
-
38
- it { expect(path.dimensions).to eq('150x150') }
39
-
40
- it { expect(path.prefix).to eq('150x150_crop_convert') }
41
- end
42
-
43
- context 'wrong path methods' do
44
-
45
- before(:each) do
46
- path.request_path = '/asdada/123acad/some_dir/imdage.png'
47
- end
48
-
49
- it { expect(path.image_path?).to be_falsey }
50
-
51
- end
52
-
53
- end