artwork 0.2.1 → 0.3.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.
- data/.rspec +1 -0
- data/README.md +11 -4
- data/Rakefile +7 -0
- data/artwork.gemspec +1 -0
- data/lib/artwork.rb +1 -1
- data/lib/artwork/model.rb +15 -26
- data/lib/artwork/thumbnail.rb +46 -0
- data/lib/artwork/version.rb +1 -1
- data/lib/artwork/view.rb +1 -3
- data/spec/artwork/configuration_spec.rb +114 -0
- data/spec/artwork/controller_spec.rb +14 -0
- data/spec/artwork/model_spec.rb +170 -0
- data/spec/artwork/thumbnail_spec.rb +70 -0
- data/spec/artwork/view_spec.rb +26 -0
- data/spec/artwork_spec.rb +18 -0
- data/spec/spec_helper.rb +2 -0
- metadata +42 -13
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/README.md
CHANGED
@@ -36,12 +36,17 @@ you have a _2x versions of your thumbs, the helper will choose the _2x one.
|
|
36
36
|
- Ruby 1.8.7 or newer
|
37
37
|
- Rails 2.3 or newer
|
38
38
|
- Paperclip 2.3 or newer
|
39
|
+
- A JavaScript runtime
|
39
40
|
|
40
41
|
## Installation
|
41
42
|
|
42
|
-
Add
|
43
|
+
Add these lines to your application's Gemfile:
|
43
44
|
|
44
45
|
gem 'artwork'
|
46
|
+
gem 'therubyracer'
|
47
|
+
|
48
|
+
You can skip `therubyracer` if you have other JavaScript environments available
|
49
|
+
on your machine (including on the prodiction one).
|
45
50
|
|
46
51
|
And then execute:
|
47
52
|
|
@@ -100,6 +105,8 @@ the `artwork_tag` view helper. Example:
|
|
100
105
|
|
101
106
|
1. [Fork it](https://github.com/mitio/artwork/fork)
|
102
107
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
103
|
-
3.
|
104
|
-
4.
|
105
|
-
5.
|
108
|
+
3. Make your changes
|
109
|
+
4. Make sure the tests pass (`bundle exec rake`)
|
110
|
+
5. Commit your changes (`git commit -am 'Add some feature'`)
|
111
|
+
6. Push to the branch (`git push origin my-new-feature`)
|
112
|
+
7. Create a new Pull Request
|
data/Rakefile
CHANGED
data/artwork.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
22
22
|
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3'
|
23
24
|
|
24
25
|
spec.add_dependency 'rails', '>= 2.3'
|
25
26
|
spec.add_dependency 'paperclip', '>= 2.3'
|
data/lib/artwork.rb
CHANGED
@@ -3,7 +3,7 @@ require 'artwork/configuration'
|
|
3
3
|
require 'artwork/model'
|
4
4
|
require 'artwork/view'
|
5
5
|
require 'artwork/controller'
|
6
|
-
require 'artwork/engine' if Rails.const_defined?(:Engine)
|
6
|
+
require 'artwork/engine' if Object.const_defined?(:Rails) and Rails.const_defined?(:Engine)
|
7
7
|
|
8
8
|
module Artwork
|
9
9
|
extend Configuration
|
data/lib/artwork/model.rb
CHANGED
@@ -1,34 +1,23 @@
|
|
1
|
+
require 'artwork/thumbnail'
|
2
|
+
|
1
3
|
module Artwork
|
2
4
|
module Model
|
3
|
-
THUMBNAIL_NAME_PATTERN = /^[0-9]+x(\w*?)(_2x)?$/i.freeze
|
4
|
-
|
5
5
|
def artwork_thumb_for(attachment_name, size)
|
6
|
-
|
6
|
+
desired_thumb = Thumbnail.new(size)
|
7
7
|
matching_thumb_name = nil
|
8
8
|
|
9
|
-
if
|
10
|
-
desired_size =
|
11
|
-
|
12
|
-
available_attachments = []
|
13
|
-
|
14
|
-
# Pick attachments which follow our naming conventions, skipping retina images
|
15
|
-
attachment_styles_for(attachment_name).each do |thumb_name|
|
16
|
-
if thumb_name.to_s =~ THUMBNAIL_NAME_PATTERN
|
17
|
-
is_retina = $2
|
18
|
-
thumb_width = thumb_name.to_s.to_i
|
9
|
+
if desired_thumb.compatible?
|
10
|
+
desired_size = desired_thumb.width / ratio_for_current_resolution
|
19
11
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
available_attachments = available_attachments.sort_by do |thumb_name, thumb_width|
|
26
|
-
thumb_width
|
27
|
-
end
|
12
|
+
thumbs = attachment_styles_for(attachment_name) \
|
13
|
+
.map { |thumb_name| Thumbnail.new(thumb_name) } \
|
14
|
+
.select(&:compatible?) \
|
15
|
+
.reject(&:retina?) \
|
16
|
+
.sort
|
28
17
|
|
29
|
-
|
30
|
-
if desired_size <=
|
31
|
-
matching_thumb_name =
|
18
|
+
thumbs.each do |thumb|
|
19
|
+
if desired_size <= thumb.width and thumb.label == desired_thumb.label
|
20
|
+
matching_thumb_name = thumb.name
|
32
21
|
break
|
33
22
|
end
|
34
23
|
end
|
@@ -36,7 +25,7 @@ module Artwork
|
|
36
25
|
# If we did not find any matching attachment definitions,
|
37
26
|
# the desired size is probably larger than all of our thumb widths,
|
38
27
|
# So pick the last (largest) one we have.
|
39
|
-
matching_thumb_name ||=
|
28
|
+
matching_thumb_name ||= thumbs.last.name
|
40
29
|
end
|
41
30
|
|
42
31
|
matching_thumb_name ||= size.to_sym
|
@@ -48,7 +37,7 @@ module Artwork
|
|
48
37
|
matching_thumb_name.to_sym
|
49
38
|
end
|
50
39
|
|
51
|
-
def artwork_url(attachment_name, size, options =
|
40
|
+
def artwork_url(attachment_name, size, options = nil)
|
52
41
|
thumb_name = artwork_thumb_for(attachment_name, size)
|
53
42
|
send(attachment_name).url(thumb_name, options)
|
54
43
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Artwork
|
2
|
+
class Thumbnail
|
3
|
+
include Comparable
|
4
|
+
|
5
|
+
NAME_PATTERN = /^(\d+)x(\w*?)(_2x)?$/i.freeze
|
6
|
+
|
7
|
+
attr :name
|
8
|
+
attr :width
|
9
|
+
attr :label
|
10
|
+
|
11
|
+
def initialize(name)
|
12
|
+
@name = name.to_s
|
13
|
+
|
14
|
+
if match = @name.match(NAME_PATTERN)
|
15
|
+
@width = match[1].to_i
|
16
|
+
@label = match[2].to_s.gsub(/^_|_$/, '')
|
17
|
+
@retina_flag = match[3]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def compatible?
|
22
|
+
not width.nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
def retina?
|
26
|
+
@retina_flag == '_2x'
|
27
|
+
end
|
28
|
+
|
29
|
+
def <=>(other_thumb)
|
30
|
+
width <=> other_thumb.width
|
31
|
+
end
|
32
|
+
|
33
|
+
def eq(other)
|
34
|
+
name == other.name and \
|
35
|
+
width == other.width and \
|
36
|
+
label == other.label and \
|
37
|
+
retina? == other.retina?
|
38
|
+
end
|
39
|
+
|
40
|
+
alias == eq
|
41
|
+
|
42
|
+
def self.compatible?(name)
|
43
|
+
name.to_s =~ NAME_PATTERN ? true : false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/artwork/version.rb
CHANGED
data/lib/artwork/view.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
module Artwork
|
2
2
|
module View
|
3
3
|
def activate_resolution_independence
|
4
|
-
content_tag :script
|
5
|
-
Thread.current[:artwork_script] ||= compile_artwork_script
|
6
|
-
end
|
4
|
+
Thread.current[:artwork_script] ||= content_tag :script, compile_artwork_script
|
7
5
|
end
|
8
6
|
|
9
7
|
def artwork_tag(record, attachment_name, size, options = {})
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artwork
|
4
|
+
describe Configuration do
|
5
|
+
let(:config) { Class.new { extend Configuration } }
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
thread_variables = {}
|
9
|
+
allow(Thread).to receive(:current) { thread_variables }
|
10
|
+
end
|
11
|
+
|
12
|
+
[:default_resolution, :supported_resolutions_list].each do |option_name|
|
13
|
+
describe "##{option_name}" do
|
14
|
+
it 'raises an error if not set' do
|
15
|
+
expect { config.send(option_name) }.to raise_error
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'uses Thread.current to store values' do
|
19
|
+
expect(Thread).to receive(:current).and_return(option_name => 'value')
|
20
|
+
expect(config.send(option_name)).to eq 'value'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#supported_resolutions_list=' do
|
26
|
+
it 'converts the resolutions to integers' do
|
27
|
+
config.supported_resolutions_list = ['123', '456']
|
28
|
+
expect(config.supported_resolutions_list).to eq [123, 456]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#current_resolution' do
|
33
|
+
it 'falls back to default_resolution' do
|
34
|
+
expect(config).to receive(:default_resolution).and_return('default')
|
35
|
+
expect(config.current_resolution).to eq 'default'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#current_resolution=' do
|
40
|
+
it 'allows arbitrary resolutions if called directly' do
|
41
|
+
config.current_resolution = 12345
|
42
|
+
expect(config.current_resolution).to eq 12345
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#reset_configuration' do
|
47
|
+
it 'resets the current_resolution' do
|
48
|
+
config.current_resolution = 'current'
|
49
|
+
expect(config.current_resolution).to eq 'current'
|
50
|
+
|
51
|
+
config.reset_configuration
|
52
|
+
|
53
|
+
expect(config).to receive(:default_resolution).and_return('default')
|
54
|
+
expect(config.current_resolution).to eq 'default'
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'resets the retina flag' do
|
58
|
+
config.load_2x_images = 'retina_flag'
|
59
|
+
expect(config.load_2x_images?).to eq 'retina_flag'
|
60
|
+
|
61
|
+
config.reset_configuration
|
62
|
+
|
63
|
+
expect(config.load_2x_images?).to eq false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#configure_for' do
|
68
|
+
def make_request(cookies_hash = {})
|
69
|
+
double :cookies => cookies_hash
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'sets current_resolution and load_2x_images from request cookies' do
|
73
|
+
config.supported_resolutions_list = [1000, 2000, 3000]
|
74
|
+
config.configure_for make_request('_retina' => '1', '_width' => '2000')
|
75
|
+
|
76
|
+
expect(config.current_resolution).to eq 2000
|
77
|
+
expect(config.load_2x_images?).to eq true
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'sets the load_2x_images flag from the _retina cookie' do
|
81
|
+
config.supported_resolutions_list = [1000, 2000, 3000]
|
82
|
+
config.default_resolution = 1000
|
83
|
+
|
84
|
+
config.configure_for make_request('_retina' => '0')
|
85
|
+
expect(config.load_2x_images?).to eq false
|
86
|
+
|
87
|
+
config.configure_for make_request('_retina' => '1')
|
88
|
+
expect(config.load_2x_images?).to eq true
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'picks only from the supported resolutions list' do
|
92
|
+
config.supported_resolutions_list = [1000, 2000, 3000]
|
93
|
+
|
94
|
+
config.configure_for make_request('_width' => '1234')
|
95
|
+
expect(config.current_resolution).to eq 2000
|
96
|
+
|
97
|
+
config.configure_for make_request('_width' => '234')
|
98
|
+
expect(config.current_resolution).to eq 1000
|
99
|
+
|
100
|
+
config.configure_for make_request('_width' => '10234')
|
101
|
+
expect(config.current_resolution).to eq 3000
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'falls back to default_resolution if no _width cookie' do
|
105
|
+
config.supported_resolutions_list = []
|
106
|
+
config.default_resolution = 5000
|
107
|
+
|
108
|
+
config.configure_for make_request
|
109
|
+
|
110
|
+
expect(config.current_resolution).to eq 5000
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artwork
|
4
|
+
describe Controller do
|
5
|
+
let(:application_controller) { Class.new }
|
6
|
+
|
7
|
+
it 'adds an around_filter and declares view helpers when included' do
|
8
|
+
expect(application_controller).to receive(:around_filter).with(:initialize_artwork_env)
|
9
|
+
expect(application_controller).to receive(:helper).with(View)
|
10
|
+
|
11
|
+
application_controller.send :include, Controller
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artwork
|
4
|
+
describe Model do
|
5
|
+
let(:model) { Class.new { include Artwork::Model } }
|
6
|
+
let(:instance) { model.new }
|
7
|
+
|
8
|
+
before :each do
|
9
|
+
allow(model).to receive(:attachment_definitions).and_return({
|
10
|
+
:image => {
|
11
|
+
:styles => {
|
12
|
+
:'320x' => '320x>',
|
13
|
+
:'320x_2x' => '640x>',
|
14
|
+
:'640x_2x' => '1280x>',
|
15
|
+
:'640x' => '640x>',
|
16
|
+
:'1280x' => '1280x>',
|
17
|
+
:'1280x_2x' => '2560x>',
|
18
|
+
:'2000x' => '2000x>',
|
19
|
+
:'1500x_2x' => '3000x>',
|
20
|
+
:'320x_some_label' => '320x>',
|
21
|
+
:'320x_some_label_2x' => '640x>',
|
22
|
+
:'320x500' => '320x500>',
|
23
|
+
:'320x500_2x' => '640x1000>',
|
24
|
+
:'320x500_crop' => '320x500#',
|
25
|
+
:'320x500_crop_2x' => '640x1000#',
|
26
|
+
:unsupported => '100x100>'
|
27
|
+
},
|
28
|
+
},
|
29
|
+
})
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#attachment_styles_for' do
|
33
|
+
it 'returns the list of available thumbnails' do
|
34
|
+
expect(instance.attachment_styles_for(:image)).to match_array [
|
35
|
+
:'320x',
|
36
|
+
:'320x_2x',
|
37
|
+
:'640x_2x',
|
38
|
+
:'640x',
|
39
|
+
:'1280x',
|
40
|
+
:'1280x_2x',
|
41
|
+
:'2000x',
|
42
|
+
:'1500x_2x',
|
43
|
+
:'320x_some_label',
|
44
|
+
:'320x_some_label_2x',
|
45
|
+
:'320x500',
|
46
|
+
:'320x500_2x',
|
47
|
+
:'320x500_crop',
|
48
|
+
:'320x500_crop_2x',
|
49
|
+
:unsupported,
|
50
|
+
]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#artwork_url' do
|
55
|
+
it 'returns the computed url of an attachment by delegating to artwork_thumb_for' do
|
56
|
+
expect(instance).to receive(:artwork_thumb_for).with(:photo, :size).and_return(:computed_size)
|
57
|
+
|
58
|
+
attachment = double
|
59
|
+
expect(attachment).to receive(:url).with(:computed_size, 'options').and_return 'some/url'
|
60
|
+
expect(instance).to receive(:photo).and_return(attachment)
|
61
|
+
|
62
|
+
expect(instance.artwork_url(:photo, :size, 'options')).to eq 'some/url'
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'works with two arguments and a hash options' do
|
66
|
+
expect(instance).to receive(:artwork_thumb_for).with(:photo, :size).and_return(:computed_size)
|
67
|
+
|
68
|
+
attachment = double
|
69
|
+
expect(attachment).to receive(:url).with(:computed_size, :some => 'options').and_return 'some/url'
|
70
|
+
expect(instance).to receive(:photo).and_return(attachment)
|
71
|
+
|
72
|
+
expect(instance.artwork_url(:photo, :size, :some => 'options')).to eq 'some/url'
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'works with two arguments only without any options hash' do
|
76
|
+
expect(instance).to receive(:artwork_thumb_for).with(:photo, :size).and_return(:computed_size)
|
77
|
+
|
78
|
+
attachment = double
|
79
|
+
expect(attachment).to receive(:url).with(:computed_size, nil).and_return 'some/url'
|
80
|
+
expect(instance).to receive(:photo).and_return(attachment)
|
81
|
+
|
82
|
+
expect(instance.artwork_url(:photo, :size)).to eq 'some/url'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe '#artwork_thumb_for' do
|
87
|
+
before :each do
|
88
|
+
Artwork.default_resolution = 1000
|
89
|
+
Artwork.current_resolution = 1000
|
90
|
+
Artwork.load_2x_images = false
|
91
|
+
end
|
92
|
+
|
93
|
+
def expect_thumb(size, expected)
|
94
|
+
expect(instance.artwork_thumb_for(:image, size)).to eq expected
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'picks the exact requested size if it exists' do
|
98
|
+
expect_thumb '2000x', :'2000x'
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'accepts sizes passed as both a symbol or a string' do
|
102
|
+
expect_thumb '2000x', :'2000x'
|
103
|
+
expect_thumb :'2000x', :'2000x'
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'scales the required size according to current_resolution' do
|
107
|
+
Artwork.default_resolution = 1000
|
108
|
+
Artwork.current_resolution = 2000
|
109
|
+
|
110
|
+
expect_thumb '1000x', :'2000x'
|
111
|
+
expect_thumb '640x', :'1280x'
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'ignores the retina thumbs when looking for a given size' do
|
115
|
+
expect_thumb '1500x', :'2000x'
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'uses the _2x thumb for retina screens' do
|
119
|
+
Artwork.load_2x_images = true
|
120
|
+
expect_thumb '640x', :'640x_2x'
|
121
|
+
expect_thumb '640x', :'640x_2x'
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'uses the non-retina thumb for retina screens if no _2x thumb is available' do
|
125
|
+
Artwork.load_2x_images = true
|
126
|
+
expect_thumb '2000x', :'2000x'
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'passes through unsupported thumb names' do
|
130
|
+
expect_thumb 'unsupported', :unsupported
|
131
|
+
|
132
|
+
Artwork.load_2x_images = true
|
133
|
+
Artwork.default_resolution = 1000
|
134
|
+
Artwork.current_resolution = 5000
|
135
|
+
|
136
|
+
expect_thumb 'unsupported', :unsupported
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'picks the nearest non-retina size to our desizred size' do
|
140
|
+
expect_thumb '400x', :'640x'
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'picks the largest available size if requesting a too large thumb' do
|
144
|
+
expect_thumb '5000x', :'2000x'
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'picks the smallest available size if requesting a too small thumb' do
|
148
|
+
expect_thumb '100x', :'320x'
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'distinguishes thumbs by the supplied text label' do
|
152
|
+
expect_thumb '320x', :'320x'
|
153
|
+
expect_thumb '320x_some_label', :'320x_some_label'
|
154
|
+
expect_thumb '200x_some_label', :'320x_some_label'
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'distinguishes thumbs by the supplied numerical label, as a vertical height' do
|
158
|
+
expect_thumb :'200x500', :'320x500'
|
159
|
+
Artwork.load_2x_images = true
|
160
|
+
expect_thumb :'200x500', :'320x500_2x'
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'distinguishes thumbs by the supplied numerical label ignoring retina flags' do
|
164
|
+
expect_thumb :'200x500_2x', :'320x500'
|
165
|
+
Artwork.load_2x_images = true
|
166
|
+
expect_thumb :'200x500_2x', :'320x500_2x'
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artwork
|
4
|
+
describe Thumbnail do
|
5
|
+
expected_defaults = {:compatible? => true}
|
6
|
+
|
7
|
+
examples = {
|
8
|
+
:'320x' => {:width => 320, :retina? => false, :label => ''},
|
9
|
+
:'320x_2x' => {:width => 320, :retina? => true, :label => ''},
|
10
|
+
:'640x_2x' => {:width => 640, :retina? => true, :label => ''},
|
11
|
+
:'640x' => {:width => 640, :retina? => false, :label => ''},
|
12
|
+
:'1280x' => {:width => 1280, :retina? => false, :label => ''},
|
13
|
+
:'1280x_2x' => {:width => 1280, :retina? => true, :label => ''},
|
14
|
+
:'2000x' => {:width => 2000, :retina? => false, :label => ''},
|
15
|
+
:'1500x_2x' => {:width => 1500, :retina? => true, :label => ''},
|
16
|
+
:'320x_some_label' => {:width => 320, :retina? => false, :label => 'some_label'},
|
17
|
+
:'320x_some_label_2x' => {:width => 320, :retina? => true, :label => 'some_label'},
|
18
|
+
:'320x500' => {:width => 320, :retina? => false, :label => '500'},
|
19
|
+
:'320x500_2x' => {:width => 320, :retina? => true, :label => '500'},
|
20
|
+
:'320x500_crop' => {:width => 320, :retina? => false, :label => '500_crop'},
|
21
|
+
:'320x500_crop_2x' => {:width => 320, :retina? => true, :label => '500_crop'},
|
22
|
+
:unsupported => {:compatible? => false},
|
23
|
+
'unsupported_thumb' => {:compatible? => false},
|
24
|
+
}
|
25
|
+
|
26
|
+
examples.each do |thumb_name, expected_properties|
|
27
|
+
expected_properties = expected_defaults.merge(expected_properties)
|
28
|
+
expected_properties.each do |field_name, expected_value|
|
29
|
+
it "##{field_name} is #{expected_value.inspect} for #{thumb_name}" do
|
30
|
+
thumbnail = Thumbnail.new(thumb_name)
|
31
|
+
expect(thumbnail.send(field_name)).to eq expected_value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
compatible = expected_properties[:compatible?]
|
36
|
+
it "compatible? is true for #{thumb_name.inspect}" do
|
37
|
+
expect(Thumbnail.compatible?(thumb_name)).to eq compatible
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#eq' do
|
42
|
+
it 'is true for different objects with the same width, label and retina flag' do
|
43
|
+
expect(Thumbnail.new(:'1200x500_crop_2x')).to eq Thumbnail.new('1200x500_crop_2x')
|
44
|
+
expect(Thumbnail.new(:'1200x_2x')).to eq Thumbnail.new('1200x_2x')
|
45
|
+
expect(Thumbnail.new(:'1200x')).to eq Thumbnail.new('1200x')
|
46
|
+
expect(Thumbnail.new(:'1200x_black_and_white')).to eq Thumbnail.new('1200x_black_and_white')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'is false for different objects if any of the width, label or retina flag differ' do
|
50
|
+
expect(Thumbnail.new(:'1200x500_crop_2x')).not_to eq Thumbnail.new('1200x500_crop')
|
51
|
+
expect(Thumbnail.new(:'1200x500_crop_2x')).not_to eq Thumbnail.new('1200x500crop_2x')
|
52
|
+
expect(Thumbnail.new(:'1200x500_crop_2x')).not_to eq Thumbnail.new('1201x500_crop_2x')
|
53
|
+
expect(Thumbnail.new(:'1200x500_crop_2x')).not_to eq Thumbnail.new('1500x')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'comparison' do
|
58
|
+
it 'is based on the thumb width' do
|
59
|
+
small = Thumbnail.new('90x_crop')
|
60
|
+
medium = Thumbnail.new('500x_crop')
|
61
|
+
large = Thumbnail.new('1090x_2x')
|
62
|
+
huge = Thumbnail.new('3200x')
|
63
|
+
|
64
|
+
unsorted = [huge, large, small, medium]
|
65
|
+
|
66
|
+
expect(unsorted.sort).to eq [small, medium, large, huge]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artwork
|
4
|
+
describe View do
|
5
|
+
let(:view_context) { Class.new { include View }.new }
|
6
|
+
|
7
|
+
describe '#activate_resolution_independence' do
|
8
|
+
it 'returns an HTML script tag' do
|
9
|
+
stub_const('Uglifier', double(:compile => 'compiled_script'))
|
10
|
+
expect(Thread).to receive(:current).and_return({})
|
11
|
+
expect(view_context).to receive(:content_tag).with(:script, 'compiled_script').and_return('compiled_script_html')
|
12
|
+
|
13
|
+
expect(view_context.activate_resolution_independence).to eq 'compiled_script_html'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'caches the compiled script in Thread.current' do
|
17
|
+
expect(Thread).to receive(:current).and_return(:artwork_script => 'cached_compiled_script')
|
18
|
+
expect(view_context.activate_resolution_independence).to eq 'cached_compiled_script'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'defines the artwork_tag helper method' do
|
23
|
+
expect(View.instance_methods.map(&:to_sym)).to include(:artwork_tag)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Artwork do
|
4
|
+
it 'responds to root_path' do
|
5
|
+
expect(Artwork).to respond_to(:root_path)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'responds to configuration methods' do
|
9
|
+
expect(Artwork).to respond_to(:configure_for)
|
10
|
+
expect(Artwork).to respond_to(:reset_configuration)
|
11
|
+
expect(Artwork).to respond_to(:default_resolution)
|
12
|
+
expect(Artwork).to respond_to(:default_resolution=)
|
13
|
+
expect(Artwork).to respond_to(:supported_resolutions_list)
|
14
|
+
expect(Artwork).to respond_to(:supported_resolutions_list=)
|
15
|
+
expect(Artwork).to respond_to(:load_2x_images?)
|
16
|
+
expect(Artwork).to respond_to(:current_resolution)
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: artwork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dimitar Dimitrov
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2014-06-
|
18
|
+
date: 2014-06-17 00:00:00 +03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -48,9 +48,23 @@ dependencies:
|
|
48
48
|
type: :development
|
49
49
|
version_requirements: *id002
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
51
|
+
name: rspec
|
52
52
|
prerelease: false
|
53
53
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ~>
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 5
|
59
|
+
segments:
|
60
|
+
- 3
|
61
|
+
version: "3"
|
62
|
+
type: :development
|
63
|
+
version_requirements: *id003
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: rails
|
66
|
+
prerelease: false
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
54
68
|
none: false
|
55
69
|
requirements:
|
56
70
|
- - ">="
|
@@ -61,11 +75,11 @@ dependencies:
|
|
61
75
|
- 3
|
62
76
|
version: "2.3"
|
63
77
|
type: :runtime
|
64
|
-
version_requirements: *
|
78
|
+
version_requirements: *id004
|
65
79
|
- !ruby/object:Gem::Dependency
|
66
80
|
name: paperclip
|
67
81
|
prerelease: false
|
68
|
-
requirement: &
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
69
83
|
none: false
|
70
84
|
requirements:
|
71
85
|
- - ">="
|
@@ -76,11 +90,11 @@ dependencies:
|
|
76
90
|
- 3
|
77
91
|
version: "2.3"
|
78
92
|
type: :runtime
|
79
|
-
version_requirements: *
|
93
|
+
version_requirements: *id005
|
80
94
|
- !ruby/object:Gem::Dependency
|
81
95
|
name: uglifier
|
82
96
|
prerelease: false
|
83
|
-
requirement: &
|
97
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
84
98
|
none: false
|
85
99
|
requirements:
|
86
100
|
- - ">="
|
@@ -90,7 +104,7 @@ dependencies:
|
|
90
104
|
- 0
|
91
105
|
version: "0"
|
92
106
|
type: :runtime
|
93
|
-
version_requirements: *
|
107
|
+
version_requirements: *id006
|
94
108
|
description: Automated user resolution based image size choosing for your Rails views, but done at the backend.
|
95
109
|
email:
|
96
110
|
- dimitar@live.bg
|
@@ -102,6 +116,7 @@ extra_rdoc_files: []
|
|
102
116
|
|
103
117
|
files:
|
104
118
|
- .gitignore
|
119
|
+
- .rspec
|
105
120
|
- Gemfile
|
106
121
|
- LICENSE.txt
|
107
122
|
- README.md
|
@@ -112,9 +127,17 @@ files:
|
|
112
127
|
- lib/artwork/controller.rb
|
113
128
|
- lib/artwork/engine.rb
|
114
129
|
- lib/artwork/model.rb
|
130
|
+
- lib/artwork/thumbnail.rb
|
115
131
|
- lib/artwork/version.rb
|
116
132
|
- lib/artwork/view.rb
|
117
133
|
- lib/assets/javascripts/artwork.js
|
134
|
+
- spec/artwork/configuration_spec.rb
|
135
|
+
- spec/artwork/controller_spec.rb
|
136
|
+
- spec/artwork/model_spec.rb
|
137
|
+
- spec/artwork/thumbnail_spec.rb
|
138
|
+
- spec/artwork/view_spec.rb
|
139
|
+
- spec/artwork_spec.rb
|
140
|
+
- spec/spec_helper.rb
|
118
141
|
has_rdoc: true
|
119
142
|
homepage: https://github.com/mitio/artwork
|
120
143
|
licenses:
|
@@ -149,5 +172,11 @@ rubygems_version: 1.6.2
|
|
149
172
|
signing_key:
|
150
173
|
specification_version: 3
|
151
174
|
summary: Automated user resolution based image size choosing for Rails.
|
152
|
-
test_files:
|
153
|
-
|
175
|
+
test_files:
|
176
|
+
- spec/artwork/configuration_spec.rb
|
177
|
+
- spec/artwork/controller_spec.rb
|
178
|
+
- spec/artwork/model_spec.rb
|
179
|
+
- spec/artwork/thumbnail_spec.rb
|
180
|
+
- spec/artwork/view_spec.rb
|
181
|
+
- spec/artwork_spec.rb
|
182
|
+
- spec/spec_helper.rb
|