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 {Build Status}[http://travis-ci.org/thumbor/ruby-thumbor] {Dependency Status}[https://gemnasium.com/thumbor/ruby-thumbor] {Gem Version}[http://badge.fury.io/rb/ruby-thumbor] {Coverage Status}[https://coveralls.io/github/thumbor/ruby-thumbor?branch=master] += ruby-thumbor {Build Status}[http://travis-ci.org/thumbor/ruby-thumbor] {Gem Version}[http://badge.fury.io/rb/ruby-thumbor] {Coverage Status}[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