diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 0000000..1780571
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,45 @@
+# - '1.9'
+# - '2.1'
+# - '2.2'
+# - '2.3'
+# - '2.4'
+# - '2.5'
+# - 'ruby-head'
+# - 'jruby'
+
+version: 2
+workflows:
+ version: 2
+ test:
+ jobs:
+ - test-1.9
+ - test-2.1
+ - test-2.7
+jobs:
+ test-1.9: &test-template
+ docker:
+ - image: circleci/ruby:1.9
+ working_directory: ~/repo
+ steps:
+ - checkout
+ - run:
+ name: Install Fish
+ command: |
+ echo "deb http://ftp.debian.org/debian jessie-backports main" | sudo tee /etc/apt/sources.list.d/jessie-backports.list
+ sudo apt-get update
+ sudo apt-get -t jessie-backports install fish
+ - run: # Install Ruby dependencies
+ name: Bundle Install
+ command: bundle check || bundle install
+ - run:
+ name: Run rspec in parallel
+ command: |
+ bundle exec rspec --profile 10 \
+ --format RspecJunitFormatter \
+ --out test_results/rspec.xml \
+ --format progress \
+ $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
+ test-2.1:
+ <<: *test-template
+ docker:
+ - image: circleci/ruby:2.1
diff --git a/.ruby-version b/.ruby-version
index 21bb5e1..73462a5 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.2.5
+2.5.1
diff --git a/.travis.yml b/.travis.yml
index a23930f..db7467a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,9 +5,11 @@ cache:
sudo: false
rvm:
- '1.9'
- - '2.1.8'
- - '2.2.4'
- - '2.3.0'
+ - '2.1'
+ - '2.2'
+ - '2.3'
+ - '2.4'
+ - '2.5'
- 'ruby-head'
- 'jruby'
diff --git a/History.txt b/History.txt
deleted file mode 100644
index 5b44881..0000000
--- a/History.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-=== 0.7.0 2012-06-14
-
-* Bugfixes:
- * Ignore filters option to #generate if the array is empty
-
-=== 0.6.0 2012-03-14
-
-* 1 major enhancement:
- * Support for filters in the urls
-
-=== 0.5.0 2011-04-19
-
-* 1 major enhancement:
- * Fit-in support in the url
-
-=== 0.0.1 2011-04-02
-
-* 1 major enhancement:
- * Initial release
diff --git a/README.rdoc b/README.rdoc
index a33df34..e059bfc 100644
--- a/README.rdoc
+++ b/README.rdoc
@@ -1,12 +1,8 @@
-= ruby-thumbor {}[http://travis-ci.org/thumbor/ruby-thumbor] {}[https://gemnasium.com/thumbor/ruby-thumbor] {}[http://badge.fury.io/rb/ruby-thumbor] {}[https://coveralls.io/github/thumbor/ruby-thumbor?branch=master]
+= ruby-thumbor {}[http://travis-ci.org/thumbor/ruby-thumbor] {}[http://badge.fury.io/rb/ruby-thumbor] {}[https://coveralls.io/github/thumbor/ruby-thumbor?branch=master]
* http://github.com/thumbor/ruby-thumbor
-== WARING:
-
-3.x version won't support old url's
-
== DESCRIPTION:
ruby-thumbor is the client to the thumbor imaging service (http://github.com/thumbor/thumbor).
@@ -28,9 +24,10 @@ No dependencies required for regular usage.
gem 'ruby-thumbor'
-== BREAKING CHANGE ON 2.0:
+== BREAKING CHANGE ON 3.0:
- Thumbor::Cascade.new now gets key, image
+ Old image Url isn't supported anymore
+ Switch from #url_for to #generate method
== USAGE:
@@ -38,17 +35,19 @@ No dependencies required for regular usage.
crypto = Thumbor::CryptoURL.new 'my-security-key'
- url = crypto.generate :width => 200, :height => 300, :image => 'my.server.com/path/to/image.jpg'
+ url = crypto.generate :width => 200, :height => 300, :image => 'remote-image.com/path/to/image.jpg'
# url will contain something like:
- # /2913921in321n3k2nj32hjhj3h22/my.server.com/path/to/image.jpg
+ # /2913921in321n3k2nj32hjhj3h22/remote-image.com/path/to/image.jpg
+
+ # Now you just need to concatenate this generated path, with your thumbor server url
or
require 'ruby-thumbor'
- image = Thumbor::Cascade.new('my-security-key', 'my.server.com/path/to/image.jpg')
- image.width(300).height(200).watermark_filter('http://my-server.com/image.png', 30).generate
+ image = Thumbor::Cascade.new('my-security-key', 'remote-image.com/path/to/image.jpg')
+ image.width(300).height(200).watermark_filter('http://remote-image.com/path/to/image.jpg', 30).generate
Available arguments to the generate method:
@@ -72,7 +71,7 @@ Available arguments to the generate method:
:valign => :top, :middle or :bottom - horizontal alignment that thumbor should use for cropping;
:smart => - flag that indicates that thumbor should use smart cropping;
-
+
:filters => ['blur(20)', 'watermark(http://my.site.com/img.png,-10,-10,50)'] - array of filters and their arguments
If you need more info on what each option does, check thumbor's documentation at https://github.com/thumbor/thumbor/wiki.
diff --git a/lib/thumbor/cascade.rb b/lib/thumbor/cascade.rb
index 5bca5cd..5f979f0 100644
--- a/lib/thumbor/cascade.rb
+++ b/lib/thumbor/cascade.rb
@@ -6,7 +6,7 @@
module Thumbor
class Cascade
- attr_accessor :image, :old_crypto, :options, :filters
+ attr_accessor :image, :crypto, :options, :filters
@available_options = [
:meta, :crop, :center,
@@ -19,7 +19,7 @@ class Cascade
extend Forwardable
- def_delegators :@old_crypto, :computed_key
+ def_delegators :@crypto, :computed_key
@available_options.each do |opt|
define_method(opt) do |*args|
@@ -34,15 +34,11 @@ def initialize(key=false, image=nil)
@image = image
@options = {}
@filters = []
- @old_crypto = Thumbor::CryptoURL.new @key
- end
-
- def url_for
- @old_crypto.url_for prepare_options(@options).merge({image: @image, filters: @filters})
+ @crypto = Thumbor::CryptoURL.new @key
end
def generate
- @old_crypto.generate prepare_options(@options).merge({image: @image, filters: @filters})
+ @crypto.generate prepare_options(@options).merge({image: @image, filters: @filters})
end
def method_missing(m, *args)
diff --git a/lib/thumbor/crypto_url.rb b/lib/thumbor/crypto_url.rb
index bbaa152..280b160 100644
--- a/lib/thumbor/crypto_url.rb
+++ b/lib/thumbor/crypto_url.rb
@@ -15,10 +15,6 @@ def computed_key
(@key * 16)[0..15]
end
- def pad(s)
- s + ("{" * (16 - s.length % 16))
- end
-
def calculate_width_and_height(url_parts, options)
width = options[:width]
height = options[:height]
@@ -125,7 +121,7 @@ def calculate_centered_crop(options)
options[:crop] = crop
end
- def url_for(options, include_hash = true)
+ def url_for(options)
if not options[:image]
raise 'image is a required argument.'
end
@@ -135,7 +131,7 @@ def url_for(options, include_hash = true)
if options[:debug]
url_parts.push('debug')
end
-
+
if options[:trim]
trim_options = ['trim']
trim_options << options[:trim] unless options[:trim] == true or options[:trim][0] == true
@@ -193,11 +189,6 @@ def url_for(options, include_hash = true)
url_parts.push("filters:#{ filter_parts.join(':') }")
end
- if include_hash
- image_hash = Digest::MD5.hexdigest(options[:image])
- url_parts.push(image_hash)
- end
-
return url_parts.join('/')
end
@@ -208,7 +199,7 @@ def url_safe_base64(str)
def generate(options)
thumbor_path = ""
- image_options = url_for(options, false)
+ image_options = url_for(options)
thumbor_path << image_options + '/' unless image_options.empty?
thumbor_path << options[:image]
diff --git a/lib/thumbor/version.rb b/lib/thumbor/version.rb
index 4819585..3a66f24 100644
--- a/lib/thumbor/version.rb
+++ b/lib/thumbor/version.rb
@@ -1,3 +1,3 @@
module Thumbor
- VERSION = '2.0.1'
+ VERSION = '3.0.0'
end
diff --git a/requirements b/requirements
deleted file mode 100644
index 89b5e9b..0000000
--- a/requirements
+++ /dev/null
@@ -1,6 +0,0 @@
-libevent-dev
-libxml2-dev
-libcurl4-gnutls-dev
-python2.7-dev
-python-virtualenv
-python-pycurl-dbg
diff --git a/ruby-thumbor.gemspec b/ruby-thumbor.gemspec
index f2a353a..e36bd91 100644
--- a/ruby-thumbor.gemspec
+++ b/ruby-thumbor.gemspec
@@ -19,9 +19,4 @@ Gem::Specification.new do |s|
s.add_development_dependency('rspec')
s.add_development_dependency('simplecov')
s.add_development_dependency('rake')
- if RUBY_VERSION < '2.2'
- s.add_development_dependency('json', ['< 2.0'])
- s.add_development_dependency('term-ansicolor', ['< 1.4'])
- s.add_development_dependency('tins', ['< 1.7'])
- end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 41b4355..0748aae 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -9,9 +9,9 @@
SimpleCov.start do
add_filter '/spec/'
+ minimum_coverage 100
end
-
RSpec.configure do |c|
c.filter_run :focus => true
c.run_all_when_everything_filtered = true
diff --git a/spec/thumbor/cascade_spec.rb b/spec/thumbor/cascade_spec.rb
index bdad091..fb91d7f 100644
--- a/spec/thumbor/cascade_spec.rb
+++ b/spec/thumbor/cascade_spec.rb
@@ -4,7 +4,6 @@
describe Thumbor::Cascade do
let(:image_url) { 'my.domain.com/some/image/url.jpg' }
- let(:image_md5) { 'f33af67e41168e80fcc5b00f8bd8061a' }
let(:key) { 'my-security-key' }
subject { Thumbor::Cascade.new key, image_url }
@@ -20,295 +19,302 @@
expect{ subject.god_of_war_crop }.to raise_error(NoMethodError)
end
- describe '#url_for' do
+ describe '#generate' do
+
+ it "should create an unsafe url" do
+ url = Thumbor::Cascade.new(false, image_url).width(300).height(200).generate
+ expect(url).to eq '/unsafe/300x200/my.domain.com/some/image/url.jpg'
+ end
+
+ it "should create an url with debug" do
+ url = subject.debug(true).height(200).generate
+ expect(url).to eq '/5_eX4HHQYk81HQVkc1gBIAvPbLo=/debug/0x200/my.domain.com/some/image/url.jpg'
+ end
+
+ it "should create a new instance passing key and keep it" do
+ url = subject.width(300).height(200).generate
+ expect(url).to eq '/TQfyd3H36Z3srcNcLOYiM05YNO8=/300x200/my.domain.com/some/image/url.jpg'
+ end
+
+ it "should be able to change the Thumbor key" do
+ url1 = subject.width(300).height(200).generate
+ url2 = Thumbor::Cascade.new('another-thumbor-key', image_url).width(300).height(200).generate
+ expect(url1).not_to eq url2
+ end
+
+ it "should create a new instance passing key and keep it" do
+ url = subject.width(300).height(200).meta(true).generate
+ expect(url).to eq '/YBQEWd3g_WRMnVEG73zfzcr8Zj0=/meta/300x200/my.domain.com/some/image/url.jpg'
+ end
+
+ it "should create a new instance passing key and keep it" do
+ url = subject.width(300).height(200).meta(true).smart(true).generate
+ expect(url).to eq '/jP89J0qOWHgPlm_lOA28GtOh5GU=/meta/300x200/smart/my.domain.com/some/image/url.jpg'
+ end
+
+ it "should create a new instance passing key and keep it" do
+ url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).generate
+ expect(url).to eq '/zrrOh_TtTs4kiLLEQq1w4bcTYdc=/meta/fit-in/300x200/smart/my.domain.com/some/image/url.jpg'
+ end
+
+ it "should create a new instance passing key and keep it" do
+ url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).generate
+ expect(url).to eq '/4t1XK1KH43cOb1QJ9tU00-W2_k8=/meta/fit-in/-300x200/smart/my.domain.com/some/image/url.jpg'
+ end
+
+ it "should create a new instance passing key and keep it" do
+ url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).flop(true).generate
+ expect(url).to eq '/HJnvjZU69PkPOhyZGu-Z3Uc_W_A=/meta/fit-in/-300x-200/smart/my.domain.com/some/image/url.jpg'
+ end
+
+ it "should create a new instance passing key and keep it" do
+ url = subject.quality_filter(20).brightness_filter(10).generate
+ expect(url).to eq '/q0DiFg-5-eFZIqyN3lRoCvg2K0s=/filters:quality(20):brightness(10)/my.domain.com/some/image/url.jpg'
+ end
it "should return just the image hash if no arguments passed" do
- url = subject.url_for
- expect(url).to eq image_md5
+ url = subject.generate
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
end
it "should raise if no image passed" do
- expect { Thumbor::Cascade.new.url_for }.to raise_error(RuntimeError)
+ expect { Thumbor::Cascade.new.generate }.to raise_error(RuntimeError)
end
it "should return proper url for width-only" do
- url = subject.width(300).url_for
- expect(url).to eq '300x0/' << image_md5
+ url = subject.width(300).generate
+ expect(url).to eq '/eFwrBWryxtRw9hDSbQPhi5iLpo8=/300x0/my.domain.com/some/image/url.jpg'
end
it "should return proper url for height-only" do
- url = subject.height(300).url_for
- expect(url).to eq '0x300/' << image_md5
+ url = subject.height(300).generate
+ expect(url).to eq '/-VGIgp7g8cMKcfF2gFK9ZpmB_5w=/0x300/my.domain.com/some/image/url.jpg'
end
it "should return proper url for width and height" do
- url = subject.width(200).height(300).url_for
- expect(url).to eq '200x300/' << image_md5
+ url = subject.width(200).height(300).generate
+ expect(url).to eq '/TrM0qqfcivb6VxS3Hxlxn43W21k=/200x300/my.domain.com/some/image/url.jpg'
end
it "should return proper smart url" do
- url = subject.width(200).height(300).smart(true).url_for
- expect(url).to eq '200x300/smart/' << image_md5
+ url = subject.width(200).height(300).smart(true).generate
+ expect(url).to eq '/hdzhxXzK45DzNTru5urV6x6xxSs=/200x300/smart/my.domain.com/some/image/url.jpg'
end
it "should return proper fit-in url" do
- url = subject.width(200).height(300).fit_in(true).url_for
- expect(url).to eq 'fit-in/200x300/' << image_md5
+ url = subject.width(200).height(300).fit_in(true).generate
+ expect(url).to eq '/LOv6ArMOJA2VRpfMQjjs4xSyZpM=/fit-in/200x300/my.domain.com/some/image/url.jpg'
end
it "should return proper adaptive-fit-in url" do
- url = subject.width(200).height(300).adaptive_fit_in(true).url_for
- expect(url).to eq 'adaptive-fit-in/200x300/' << image_md5
+ url = subject.width(200).height(300).adaptive_fit_in(true).generate
+ expect(url).to eq '/V2xmSmQZm4i5-0Flx8iuRtawOkg=/adaptive-fit-in/200x300/my.domain.com/some/image/url.jpg'
end
it "should return proper full-fit-in url" do
- url = subject.width(200).height(300).full_fit_in(true).url_for
- expect(url).to eq 'full-fit-in/200x300/' << image_md5
+ url = subject.width(200).height(300).full_fit_in(true).generate
+ expect(url).to eq '/geXhR7ZFxztQTsKzmkDxYCX-HHg=/full-fit-in/200x300/my.domain.com/some/image/url.jpg'
end
it "should return proper adaptive-full-fit-in url" do
- url = subject.width(200).height(300).adaptive_full_fit_in(true).url_for
- expect(url).to eq 'adaptive-full-fit-in/200x300/' << image_md5
+ url = subject.width(200).height(300).adaptive_full_fit_in(true).generate
+ expect(url).to eq '/jlUfjdC-6rG6jmuHgFp6eKgPy2g=/adaptive-full-fit-in/200x300/my.domain.com/some/image/url.jpg'
end
[:fit_in, :full_fit_in].each do |fit|
it "should raise error when using #{fit} without width or height" do
subject.send(fit, true)
- expect{subject.url_for}.to raise_error(ArgumentError)
+ expect{subject.generate}.to raise_error(ArgumentError)
end
end
it "should return proper flip url if no width and height" do
- url = subject.flip(true).url_for
- expect(url).to eq '-0x0/' << image_md5
+ url = subject.flip(true).generate
+ expect(url).to eq '/rlI4clPR-p-PR2QAxj5ZWiTfvH4=/-0x0/my.domain.com/some/image/url.jpg'
end
it "should return proper flop url if no width and height" do
- url = subject.flop(true).url_for
- expect(url).to eq '0x-0/' << image_md5
+ url = subject.flop(true).generate
+ expect(url).to eq '/-4dmGj-TwIEqTAL9_9yEqUM8cks=/0x-0/my.domain.com/some/image/url.jpg'
end
it "should return proper flip-flop url if no width and height" do
- url = subject.flip(true).flop(true).url_for
- expect(url).to eq '-0x-0/' << image_md5
+ url = subject.flip(true).flop(true).generate
+ expect(url).to eq '/FnMxpQMmxiMpdG219Dsj8pD_4Xc=/-0x-0/my.domain.com/some/image/url.jpg'
end
it "should return proper flip url if width" do
- url = subject.width(300).flip(true).url_for
- expect(url).to eq '-300x0/' << image_md5
+ url = subject.width(300).flip(true).generate
+ expect(url).to eq '/ccr2PoSYcTEGL4_Wzt4u3wWVRKU=/-300x0/my.domain.com/some/image/url.jpg'
end
it "should return proper flop url if height" do
- url = subject.height(300).flop(true).url_for
- expect(url).to eq '0x-300/' << image_md5
+ url = subject.height(300).flop(true).generate
+ expect(url).to eq '/R5K91tkyNgXO65F6E0txgA6C9lY=/0x-300/my.domain.com/some/image/url.jpg'
end
it "should return horizontal align" do
- url = subject.halign(:left).url_for
- expect(url).to eq 'left/' << image_md5
+ url = subject.halign(:left).generate
+ expect(url).to eq '/GTJE3wUt3sURik0O9Nae8sfI928=/left/my.domain.com/some/image/url.jpg'
end
it "should not return horizontal align if it is center" do
- url = subject.halign(:center).url_for
- expect(url).to eq image_md5
+ url = subject.halign(:center).generate
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
end
it "should return vertical align" do
- url = subject.valign(:top).url_for
- expect(url).to eq 'top/' << image_md5
+ url = subject.valign(:top).generate
+ expect(url).to eq '/1QQo5ihObuhgwl95--Z3g78vjiE=/top/my.domain.com/some/image/url.jpg'
end
it "should not return vertical align if it is middle" do
- url = subject.valign(:middle).url_for
- expect(url).to eq image_md5
+ url = subject.valign(:middle).generate
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
end
it "should return halign and valign properly" do
- url = subject.halign(:left).valign(:top).url_for
- expect(url).to eq 'left/top/' << image_md5
+ url = subject.halign(:left).valign(:top).generate
+ expect(url).to eq '/yA2rmtWv_uzHd9klz5OuMIZ5auI=/left/top/my.domain.com/some/image/url.jpg'
end
it "should return meta properly" do
- url = subject.meta(true).url_for
- expect(url).to eq 'meta/' << image_md5
+ url = subject.meta(true).generate
+ expect(url).to eq '/WvIJFDJDePgIl5hZcLgtrzIPxfY=/meta/my.domain.com/some/image/url.jpg'
end
it "should return proper crop url when param is array" do
- url = subject.crop([10, 20, 30, 40]).url_for
- expect(url).to eq '10x20:30x40/' << image_md5
+ url = subject.crop([10, 20, 30, 40]).generate
+ expect(url).to eq '/QcnhqNfHwiP6BHLbD6UvneX7K28=/10x20:30x40/my.domain.com/some/image/url.jpg'
end
it "should return proper crop url" do
- url = subject.crop(10, 20, 30, 40).url_for
- expect(url).to eq '10x20:30x40/' << image_md5
+ url = subject.crop(10, 20, 30, 40).generate
+ expect(url).to eq '/QcnhqNfHwiP6BHLbD6UvneX7K28=/10x20:30x40/my.domain.com/some/image/url.jpg'
end
it "should ignore crop if all zeros" do
- url = subject.crop(0, 0, 0, 0).url_for
- expect(url).to eq image_md5
+ url = subject.crop(0, 0, 0, 0).generate
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
end
it "should have smart after halign and valign" do
- url = subject.halign(:left).valign(:top).smart(true).url_for
- expect(url).to eq 'left/top/smart/' << image_md5
+ url = subject.halign(:left).valign(:top).smart(true).generate
+ expect(url).to eq '/KS6mVuzlGE3hJ75n3JUonfGgSFM=/left/top/smart/my.domain.com/some/image/url.jpg'
end
it "should have quality filter" do
- url = subject.quality_filter(20).url_for
- expect(url).to eq 'filters:quality(20)/' << image_md5
+ url = subject.quality_filter(20).generate
+ expect(url).to eq '/NyA-is4NojxiRqo0NcmJDhB6GTs=/filters:quality(20)/my.domain.com/some/image/url.jpg'
end
it "should have brightness filter" do
- url = subject.brightness_filter(30).url_for
- expect(url).to eq 'filters:brightness(30)/' << image_md5
+ url = subject.brightness_filter(30).generate
+ expect(url).to eq '/oXDmnGD7vQV-rXcj8kCl1tcS3jc=/filters:brightness(30)/my.domain.com/some/image/url.jpg'
end
it "should have 2 filters" do
- url = subject.brightness_filter(30).quality_filter(20).url_for
- expect(url).to eq 'filters:brightness(30):quality(20)/' << image_md5
+ url = subject.brightness_filter(30).quality_filter(20).generate
+ expect(url).to eq '/SW9o4xQG1QAzE69WzEzarL_G3MI=/filters:brightness(30):quality(20)/my.domain.com/some/image/url.jpg'
end
it "should escape url args" do
- url = subject.watermark_filter('http://my-server.com/image.png', 30).quality_filter(20).url_for
- expect(url).to eq 'filters:watermark(http%3A%2F%2Fmy-server.com%2Fimage.png,30):quality(20)/' << image_md5
+ url = subject.watermark_filter('http://my-server.com/image.png', 30).quality_filter(20).generate
+ expect(url).to eq '/4b9kwg0-zsojf7Ed01TPKPYOel4=/filters:watermark(http%3A%2F%2Fmy-server.com%2Fimage.png,30):quality(20)/my.domain.com/some/image/url.jpg'
end
it "should have trim without params" do
- url = subject.trim.url_for
- expect(url).to eq 'trim/' << image_md5
+ url = subject.trim.generate
+ expect(url).to eq '/w23BC0dUiYBFrUnuoYJe8XROuyw=/trim/my.domain.com/some/image/url.jpg'
end
it "should have trim with direction param" do
- url = subject.trim('bottom-right').url_for
- expect(url).to eq 'trim:bottom-right/' << image_md5
+ url = subject.trim('bottom-right').generate
+ expect(url).to eq '/kXPwSmqEvPFQezgzBCv9BtPWmBY=/trim:bottom-right/my.domain.com/some/image/url.jpg'
end
it "should have trim with direction and tolerance param" do
- url = subject.trim('bottom-right', 15).url_for
- expect(url).to eq 'trim:bottom-right:15/' << image_md5
+ url = subject.trim('bottom-right', 15).generate
+ expect(url).to eq '/TUCEIhtWfI1Uv9zjavCSl_i0A_8=/trim:bottom-right:15/my.domain.com/some/image/url.jpg'
end
it "should have the right crop when cropping horizontally and given a left center" do
- url = subject.original_width(100).original_height(100).width(40).height(50).center(0, 50).url_for
- expect(url).to eq '0x0:80x100/40x50/' << image_md5
+ url = subject.original_width(100).original_height(100).width(40).height(50).center(0, 50).generate
+ expect(url).to eq '/SZIT3w4Qgebv5DuVJ8G1IH1mkCU=/0x0:80x100/40x50/my.domain.com/some/image/url.jpg'
end
it "should have the right crop when cropping horizontally and given a right center" do
- url = subject.original_width(100).original_height(100).width(40).height(50).center(100, 50).url_for
- expect(url).to eq '20x0:100x100/40x50/' << image_md5
+ url = subject.original_width(100).original_height(100).width(40).height(50).center(100, 50).generate
+ expect(url).to eq '/NEtCYehaISE7qR3zFj15CxnZoCs=/20x0:100x100/40x50/my.domain.com/some/image/url.jpg'
end
it "should have the right crop when cropping horizontally and given the actual center" do
- url = subject.original_width(100).original_height(100).width(40).height(50).center(50, 50).url_for
- expect(url).to eq '10x0:90x100/40x50/' << image_md5
+ url = subject.original_width(100).original_height(100).width(40).height(50).center(50, 50).generate
+ expect(url).to eq '/JLH65vJTu6d-cXBmqe5hYoSD4ho=/10x0:90x100/40x50/my.domain.com/some/image/url.jpg'
end
it "should have the right crop when cropping vertically and given a top center" do
- url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 0).url_for
- expect(url).to eq '0x0:100x80/50x40/' << image_md5
+ url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 0).generate
+ expect(url).to eq '/FIMZcLatW6bjgSRH9xTkEwUZAZ8=/0x0:100x80/50x40/my.domain.com/some/image/url.jpg'
end
it "should have the right crop when cropping vertically and given a bottom center" do
- url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 100).url_for
- expect(url).to eq '0x20:100x100/50x40/' << image_md5
+ url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 100).generate
+ expect(url).to eq '/9Ud0sVo6i9DLOjlKbQP_4JXgFmA=/0x20:100x100/50x40/my.domain.com/some/image/url.jpg'
end
it "should have the right crop when cropping vertically and given the actual center" do
- url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 50).url_for
- expect(url).to eq '0x10:100x90/50x40/' << image_md5
+ url = subject.original_width(100).original_height(100).width(50).height(40).center(50, 50).generate
+ expect(url).to eq '/WejLJn8djJLn7DkMUq3S0zZCvZE=/0x10:100x90/50x40/my.domain.com/some/image/url.jpg'
end
it "should have the no crop when not necessary" do
- url = subject.original_width(100).original_height(100).width(50).height(50).center(50, 0).url_for
- expect(url).to eq '50x50/' << image_md5
+ url = subject.original_width(100).original_height(100).width(50).height(50).center(50, 0).generate
+ expect(url).to eq '/trIjfr513nkGkCpKXK6qgox2jPA=/50x50/my.domain.com/some/image/url.jpg'
end
it "should blow up with a bad center" do
- expect { subject.original_width(100).original_height(100).width(50).height(50).center(50).url_for }.to raise_error(RuntimeError)
+ expect { subject.original_width(100).original_height(100).width(50).height(50).center(50).generate }.to raise_error(RuntimeError)
end
it "should have no crop with a missing original_height" do
- url = subject.original_width(100).width(50).height(40).center(50, 0).url_for
- expect(url).to eq '50x40/' << image_md5
+ url = subject.original_width(100).width(50).height(40).center(50, 0).generate
+ expect(url).to eq '/veYlY0msKmemAaXpeav2kCNftmU=/50x40/my.domain.com/some/image/url.jpg'
end
it "should have no crop with a missing original_width" do
- url = subject.original_height(100).width(50).height(40).center(50, 0).url_for
- expect(url).to eq '50x40/' << image_md5
+ url = subject.original_height(100).width(50).height(40).center(50, 0).generate
+ expect(url).to eq '/veYlY0msKmemAaXpeav2kCNftmU=/50x40/my.domain.com/some/image/url.jpg'
end
it "should have no crop with out a width and height" do
- url = subject.original_width(100).original_height(100).center(50, 50).url_for
- expect(url).to eq image_md5
+ url = subject.original_width(100).original_height(100).center(50, 50).generate
+ expect(url).to eq '/964rCTkAEDtvjy_a572k7kRa0SU=/my.domain.com/some/image/url.jpg'
end
it "should use the original width with a missing width" do
- url = subject.original_width(100).original_height(100).height(80).center(50, 50).url_for
- expect(url).to eq '0x10:100x90/0x80/' << image_md5
+ url = subject.original_width(100).original_height(100).height(80).center(50, 50).generate
+ expect(url).to eq '/02BNIIJ9NYNV9Q03JHPtlP0DIDg=/0x10:100x90/0x80/my.domain.com/some/image/url.jpg'
end
it "should use the original height with a missing height" do
- url = subject.original_width(100).original_height(100).width(80).center(50, 50).url_for
- expect(url).to eq '10x0:90x100/80x0/' << image_md5
+ url = subject.original_width(100).original_height(100).width(80).center(50, 50).generate
+ expect(url).to eq '/0XL5BmMi3vlJQfw6aGOVW-M1vVI=/10x0:90x100/80x0/my.domain.com/some/image/url.jpg'
end
it "should have the right crop with a negative width" do
- url = subject.original_width(100).original_height(100).width(-50).height(40).center(50, 50).url_for
- expect(url).to eq '0x10:100x90/-50x40/' << image_md5
+ url = subject.original_width(100).original_height(100).width(-50).height(40).center(50, 50).generate
+ expect(url).to eq '/IuRNPlFlpTVol45bDkOm2PGvneo=/0x10:100x90/-50x40/my.domain.com/some/image/url.jpg'
end
it "should have the right crop with a negative height" do
- url = subject.original_width(100).original_height(100).width(50).height(-40).center(50, 50).url_for
- expect(url).to eq '0x10:100x90/50x-40/' << image_md5
+ url = subject.original_width(100).original_height(100).width(50).height(-40).center(50, 50).generate
+ expect(url).to eq '/-8IhWGEeXaY1uv945i9EHLVjwuk=/0x10:100x90/50x-40/my.domain.com/some/image/url.jpg'
end
it "should have the right crop with a negative height and width" do
- url = subject.original_width(100).original_height(100).width(-50).height(-40).center(50, 50).url_for
- expect(url).to eq '0x10:100x90/-50x-40/' << image_md5
- end
- end
-
- describe '#generate' do
-
- it "should create a new instance passing key and keep it" do
- url = subject.width(300).height(200).generate
- expect(url).to eq '/TQfyd3H36Z3srcNcLOYiM05YNO8=/300x200/my.domain.com/some/image/url.jpg'
- end
-
- it "should be able to change the Thumbor key" do
- url1 = subject.width(300).height(200).generate
- url2 = Thumbor::Cascade.new('another-thumbor-key', image_url).width(300).height(200).generate
- expect(url1).not_to eq url2
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.width(300).height(200).meta(true).generate
- expect(url).to eq '/YBQEWd3g_WRMnVEG73zfzcr8Zj0=/meta/300x200/my.domain.com/some/image/url.jpg'
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.width(300).height(200).meta(true).smart(true).generate
- expect(url).to eq '/jP89J0qOWHgPlm_lOA28GtOh5GU=/meta/300x200/smart/my.domain.com/some/image/url.jpg'
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).generate
- expect(url).to eq '/zrrOh_TtTs4kiLLEQq1w4bcTYdc=/meta/fit-in/300x200/smart/my.domain.com/some/image/url.jpg'
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).generate
- expect(url).to eq '/4t1XK1KH43cOb1QJ9tU00-W2_k8=/meta/fit-in/-300x200/smart/my.domain.com/some/image/url.jpg'
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.width(300).height(200).meta(true).smart(true).fit_in(true).flip(true).flop(true).generate
- expect(url).to eq '/HJnvjZU69PkPOhyZGu-Z3Uc_W_A=/meta/fit-in/-300x-200/smart/my.domain.com/some/image/url.jpg'
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.quality_filter(20).brightness_filter(10).generate
- expect(url).to eq '/q0DiFg-5-eFZIqyN3lRoCvg2K0s=/filters:quality(20):brightness(10)/my.domain.com/some/image/url.jpg'
+ url = subject.original_width(100).original_height(100).width(-50).height(-40).center(50, 50).generate
+ expect(url).to eq '/lfjGLTTEaW_Rcvc1q0ZhfYup2jg=/0x10:100x90/-50x-40/my.domain.com/some/image/url.jpg'
end
end
end
diff --git a/spec/thumbor/crypto_url_spec.rb b/spec/thumbor/crypto_url_spec.rb
deleted file mode 100644
index 6c0f49a..0000000
--- a/spec/thumbor/crypto_url_spec.rb
+++ /dev/null
@@ -1,300 +0,0 @@
-require 'spec_helper'
-require 'json'
-require 'ruby-thumbor'
-
-image_url = 'my.domain.com/some/image/url.jpg'
-image_md5 = 'f33af67e41168e80fcc5b00f8bd8061a'
-key = 'my-security-key'
-
-describe Thumbor::CryptoURL do
- subject { Thumbor::CryptoURL.new key }
-
- describe '#new' do
- it "should create a new instance passing key and keep it" do
- expect(subject.computed_key).to eq('my-security-keym')
- end
- end
-
- describe '#url_for' do
-
- it "should return just the image hash if no arguments passed" do
- url = subject.url_for :image => image_url
- expect(url).to eq(image_md5)
- end
-
- it "should raise if no image passed" do
- expect { subject.url_for Hash.new }.to raise_error(RuntimeError)
- end
-
- it "should return proper url for width-only" do
- url = subject.url_for :image => image_url, :width => 300
- expect(url).to eq('300x0/' << image_md5)
- end
-
- it "should return proper url for height-only" do
- url = subject.url_for :image => image_url, :height => 300
- expect(url).to eq('0x300/' << image_md5)
- end
-
- it "should return proper url for width and height" do
- url = subject.url_for :image => image_url, :width => 200, :height => 300
- expect(url).to eq('200x300/' << image_md5)
- end
-
- it "should return proper smart url" do
- url = subject.url_for :image => image_url, :width => 200, :height => 300, :smart => true
- expect(url).to eq('200x300/smart/' << image_md5)
- end
-
- it "should return proper fit-in url" do
- url = subject.url_for :image => image_url, :width => 200, :height => 300, :fit_in => true
- expect(url).to eq('fit-in/200x300/' << image_md5)
- end
-
- it "should return proper flip url if no width and height" do
- url = subject.url_for :image => image_url, :flip => true
- expect(url).to eq('-0x0/' << image_md5)
- end
-
- it "should return proper flop url if no width and height" do
- url = subject.url_for :image => image_url, :flop => true
- expect(url).to eq('0x-0/' << image_md5)
- end
-
- it "should return proper flip-flop url if no width and height" do
- url = subject.url_for :image => image_url, :flip => true, :flop => true
- expect(url).to eq('-0x-0/' << image_md5)
- end
-
- it "should return proper flip url if width" do
- url = subject.url_for :image => image_url, :width => 300, :flip => true
- expect(url).to eq('-300x0/' << image_md5)
- end
-
- it "should return proper flop url if height" do
- url = subject.url_for :image => image_url, :height => 300, :flop => true
- expect(url).to eq('0x-300/' << image_md5)
- end
-
- it "should return horizontal align" do
- url = subject.url_for :image => image_url, :halign => :left
- expect(url).to eq('left/' << image_md5)
- end
-
- it "should not return horizontal align if it is center" do
- url = subject.url_for :image => image_url, :halign => :center
- expect(url).to eq(image_md5)
- end
-
- it "should return vertical align" do
- url = subject.url_for :image => image_url, :valign => :top
- expect(url).to eq('top/' << image_md5)
- end
-
- it "should not return vertical align if it is middle" do
- url = subject.url_for :image => image_url, :valign => :middle
- expect(url).to eq(image_md5)
- end
-
- it "should return halign and valign properly" do
- url = subject.url_for :image => image_url, :halign => :left, :valign => :top
- expect(url).to eq('left/top/' << image_md5)
- end
-
- it "should return meta properly" do
- url = subject.url_for :image => image_url, :meta => true
- expect(url).to eq('meta/' << image_md5)
- end
-
- it "should return proper crop url" do
- url = subject.url_for :image => image_url, :crop => [10, 20, 30, 40]
- expect(url).to eq('10x20:30x40/' << image_md5)
- end
-
- it "should ignore crop if all zeros" do
- url = subject.url_for :image => image_url, :crop => [0, 0, 0, 0]
- expect(url).to eq(image_md5)
- end
-
- it "should have smart after halign and valign" do
- url = subject.url_for :image => image_url, :halign => :left, :valign => :top, :smart => true
- expect(url).to eq('left/top/smart/' << image_md5)
- end
-
- it "should ignore filters if empty" do
- url = subject.url_for :image => image_url, :filters => []
- expect(url).to eq(image_md5)
- end
-
- it "should have trim without params" do
- url = subject.url_for :image => image_url, :trim => true
- expect(url).to eq('trim/' << image_md5)
- end
-
- it "should have trim with direction param" do
- url = subject.url_for :image => image_url, :trim => ['bottom-right']
- expect(url).to eq('trim:bottom-right/' << image_md5)
- end
-
- it "should have trim with direction and tolerance param" do
- url = subject.url_for :image => image_url, :trim => ['bottom-right', 15]
- expect(url).to eq('trim:bottom-right:15/' << image_md5)
- end
-
- it "should have the trim option as the first one" do
- url = subject.url_for :image => image_url, :smart => true, :trim => true
-
- expect(url).to eq('trim/smart/f33af67e41168e80fcc5b00f8bd8061a')
- end
-
-
- it "should have the right crop when cropping horizontally and given a left center" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 40, :height => 50, :center => [0, 50]
- expect(url).to eq('0x0:80x100/40x50/' << image_md5)
- end
-
- it "should have the right crop when cropping horizontally and given a right center" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 40, :height => 50, :center => [100, 50]
- expect(url).to eq('20x0:100x100/40x50/' << image_md5)
- end
-
- it "should have the right crop when cropping horizontally and given the actual center" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 40, :height => 50, :center => [50, 50]
- expect(url).to eq('10x0:90x100/40x50/' << image_md5)
- end
-
- it "should have the right crop when cropping vertically and given a top center" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 50, :height => 40, :center => [50, 0]
- expect(url).to eq('0x0:100x80/50x40/' << image_md5)
- end
-
- it "should have the right crop when cropping vertically and given a bottom center" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 50, :height => 40, :center => [50, 100]
- expect(url).to eq('0x20:100x100/50x40/' << image_md5)
- end
-
- it "should have the right crop when cropping vertically and given the actual center" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 50, :height => 40, :center => [50, 50]
- expect(url).to eq('0x10:100x90/50x40/' << image_md5)
- end
-
- it "should have the no crop when not necessary" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 50, :height => 50, :center => [50, 0]
- expect(url).to eq('50x50/' << image_md5)
- end
-
- it "should blow up with a bad center" do
- expect { subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 50, :height => 40, :center => 50 }.to raise_error(RuntimeError)
- end
-
- it "should have no crop with a missing original_height" do
- url = subject.url_for :image => image_url, :original_width => 100, :width => 50, :height => 40, :center => [50, 50]
- expect(url).to eq('50x40/' << image_md5)
- end
-
- it "should have no crop with a missing original_width" do
- url = subject.url_for :image => image_url, :original_height => 100, :width => 50, :height => 40, :center => [50, 50]
- expect(url).to eq('50x40/' << image_md5)
- end
-
- it "should have no crop with out a width and height" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :center => [50, 50]
- expect(url).to eq(image_md5)
- end
-
- it "should use the original width with a missing width" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :height => 80, :center => [50, 50]
- expect(url).to eq('0x10:100x90/0x80/' << image_md5)
- end
-
- it "should use the original height with a missing height" do
- url = subject.url_for :image => image_url,:original_width => 100, :original_height => 100, :width => 80, :center => [50, 50]
- expect(url).to eq('10x0:90x100/80x0/' << image_md5)
- end
-
- it "should have the right crop with a negative width" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => -50, :height => 40, :center => [50, 50]
- expect(url).to eq('0x10:100x90/-50x40/' << image_md5)
- end
-
- it "should have the right crop with a negative height" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => 50, :height => -40, :center => [50, 50]
- expect(url).to eq('0x10:100x90/50x-40/' << image_md5)
- end
-
- it "should have the right crop with a negative height and width" do
- url = subject.url_for :image => image_url, :original_width => 100, :original_height => 100, :width => -50, :height => -40, :center => [50, 50]
- expect(url).to eq('0x10:100x90/-50x-40/' << image_md5)
- end
-
- it "should handle string values" do
- url = subject.url_for :image => image_url, :width => '40', :height => '50'
- expect(url).to eq('40x50/' << image_md5)
- end
-
- it "should never mutate its arguments" do
- opts = {:image => image_url, :width => '500'}
- subject.url_for opts
- expect(opts).to eq({:image => image_url, :width => '500'})
- end
- end
-
- describe '#generate' do
- it "should generate a proper url when only an image url is specified" do
- url = subject.generate :image => image_url
-
- expect(url).to eq("/964rCTkAEDtvjy_a572k7kRa0SU=/#{image_url}")
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.generate :width => 300, :height => 200, :image => image_url
-
- expect(url).to eq('/TQfyd3H36Z3srcNcLOYiM05YNO8=/300x200/my.domain.com/some/image/url.jpg')
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.generate :width => 300, :height => 200, :meta => true, :image => image_url
-
- expect(url).to eq('/YBQEWd3g_WRMnVEG73zfzcr8Zj0=/meta/300x200/my.domain.com/some/image/url.jpg')
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.generate :width => 300, :height => 200, :meta => true, :image => image_url, :smart => true
-
- expect(url).to eq('/jP89J0qOWHgPlm_lOA28GtOh5GU=/meta/300x200/smart/my.domain.com/some/image/url.jpg')
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.generate :width => 300, :height => 200, :meta => true, :image => image_url, :smart => true, :fit_in => true
-
- expect(url).to eq('/zrrOh_TtTs4kiLLEQq1w4bcTYdc=/meta/fit-in/300x200/smart/my.domain.com/some/image/url.jpg')
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.generate :width => 300, :height => 200, :meta => true, :image => image_url, :smart => true, :fit_in => true, :flip => true
-
- expect(url).to eq('/4t1XK1KH43cOb1QJ9tU00-W2_k8=/meta/fit-in/-300x200/smart/my.domain.com/some/image/url.jpg')
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.generate :width => 300, :height => 200, :meta => true, :image => image_url, :smart => true, :fit_in => true, :flip => true, :flop => true
-
- expect(url).to eq('/HJnvjZU69PkPOhyZGu-Z3Uc_W_A=/meta/fit-in/-300x-200/smart/my.domain.com/some/image/url.jpg')
- end
-
- it "should create a new instance passing key and keep it" do
- url = subject.generate :filters => ["quality(20)", "brightness(10)"], :image => image_url
-
- expect(url).to eq('/q0DiFg-5-eFZIqyN3lRoCvg2K0s=/filters:quality(20):brightness(10)/my.domain.com/some/image/url.jpg')
- end
- end
-
- describe "without security key" do
- subject { Thumbor::CryptoURL.new nil }
- it "should generate a unsafe url" do
- url = subject.generate :image => image_url
-
- expect(url).to eq("/unsafe/#{image_url}")
- end
- end
-end
diff --git a/test_requirements.txt b/test_requirements.txt
deleted file mode 100644
index ef29d7d..0000000
--- a/test_requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-thumbor