cloudinary 1.1.1 → 1.1.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -0
- data/cloudinary.gemspec +1 -0
- data/lib/cloudinary.rb +21 -2
- data/lib/cloudinary/api.rb +126 -94
- data/lib/cloudinary/helper.rb +17 -4
- data/lib/cloudinary/uploader.rb +190 -167
- data/lib/cloudinary/utils.rb +138 -14
- data/lib/cloudinary/version.rb +1 -1
- data/spec/api_spec.rb +168 -115
- data/spec/archive_spec.rb +102 -0
- data/spec/cloudinary_spec.rb +17 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/uploader_spec.rb +90 -44
- data/spec/utils_spec.rb +183 -176
- data/spec/video_tag_spec.rb +7 -2
- metadata +20 -2
| @@ -0,0 +1,102 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'cloudinary'
         | 
| 3 | 
            +
            require 'rest_client'
         | 
| 4 | 
            +
            require 'zip'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            ARCHIVE_TAG = "archive_test_tag_#{rand}"
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            RSpec.shared_context 'archive' do
         | 
| 9 | 
            +
              before :all do
         | 
| 10 | 
            +
                Cloudinary::Uploader.upload(
         | 
| 11 | 
            +
                  "http://res.cloudinary.com/demo/image/upload/sample.jpg",
         | 
| 12 | 
            +
                  :public_id      => 'tag_samplebw',
         | 
| 13 | 
            +
                  :tags           => [TEST_TAG, ARCHIVE_TAG],
         | 
| 14 | 
            +
                  :transformation => {
         | 
| 15 | 
            +
                    :effect => :blackwhite
         | 
| 16 | 
            +
                  }
         | 
| 17 | 
            +
                )
         | 
| 18 | 
            +
                Cloudinary::Uploader.upload(
         | 
| 19 | 
            +
                  "http://res.cloudinary.com/demo/image/upload/sample.jpg",
         | 
| 20 | 
            +
                  :public_id      => 'tag_sample',
         | 
| 21 | 
            +
                  :tags           => [TEST_TAG, ARCHIVE_TAG],
         | 
| 22 | 
            +
                  :transformation => {
         | 
| 23 | 
            +
                    :effect => :blackwhite
         | 
| 24 | 
            +
                  }
         | 
| 25 | 
            +
                )
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
              include_context "cleanup"
         | 
| 28 | 
            +
            end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            describe Cloudinary::Utils do
         | 
| 31 | 
            +
              include_context 'archive'
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              describe '.generate_zip_download_url' do
         | 
| 34 | 
            +
                let(:options) { {} }
         | 
| 35 | 
            +
                let!(:archive_result) {
         | 
| 36 | 
            +
                  Cloudinary::Utils.download_zip_url(
         | 
| 37 | 
            +
                    {
         | 
| 38 | 
            +
                      :target_public_id => 'gem_archive_test',
         | 
| 39 | 
            +
                      :public_ids       => %w(tag_sample tag_samplebw),
         | 
| 40 | 
            +
                      :tags             => ARCHIVE_TAG
         | 
| 41 | 
            +
                    }.merge(options))
         | 
| 42 | 
            +
                }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                describe 'public_ids' do
         | 
| 45 | 
            +
                  it 'should generate a valid url' do
         | 
| 46 | 
            +
                    expect(archive_result).not_to be_empty
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
                  it 'should include two files' do
         | 
| 49 | 
            +
                    Zip::File.open_buffer(RestClient.get(archive_result)) do |zip_file|
         | 
| 50 | 
            +
                      list = zip_file.glob('*').map(&:name)
         | 
| 51 | 
            +
                      expect(list.length).to be(2)
         | 
| 52 | 
            +
                      expect(list).to include('tag_sample.jpg', 'tag_samplebw.jpg')
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            describe Cloudinary::Uploader do
         | 
| 60 | 
            +
              include_context 'archive'
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              let(:options) { {} }
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              describe '.create_archive' do
         | 
| 65 | 
            +
                let!(:archive_result) {
         | 
| 66 | 
            +
                  Cloudinary::Uploader.create_archive(
         | 
| 67 | 
            +
                    {
         | 
| 68 | 
            +
                      :target_public_id => 'gem_archive_test',
         | 
| 69 | 
            +
                      :public_ids       => %w(tag_sample tag_samplebw),
         | 
| 70 | 
            +
                      :tags             => ARCHIVE_TAG
         | 
| 71 | 
            +
                    }.merge(options))
         | 
| 72 | 
            +
                }
         | 
| 73 | 
            +
                let(:options) { { :mode => :create } }
         | 
| 74 | 
            +
                it 'should return a Hash' do
         | 
| 75 | 
            +
                  expect(archive_result).to be_a(Hash)
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
                expected_keys = %w(
         | 
| 78 | 
            +
                          resource_type
         | 
| 79 | 
            +
                          type
         | 
| 80 | 
            +
                          public_id
         | 
| 81 | 
            +
                          version
         | 
| 82 | 
            +
                          url
         | 
| 83 | 
            +
                          secure_url
         | 
| 84 | 
            +
                          created_at
         | 
| 85 | 
            +
                          tags
         | 
| 86 | 
            +
                          signature
         | 
| 87 | 
            +
                          bytes
         | 
| 88 | 
            +
                          etag
         | 
| 89 | 
            +
                          resource_count
         | 
| 90 | 
            +
                          file_count
         | 
| 91 | 
            +
                        )
         | 
| 92 | 
            +
                it "should include keys: #{expected_keys.join(', ')}" do
         | 
| 93 | 
            +
                  expect(archive_result.keys).to match_array(expected_keys)
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
              describe '.create_zip' do
         | 
| 97 | 
            +
                it 'should call create_archive with "zip" format' do
         | 
| 98 | 
            +
                  expect(Cloudinary::Uploader).to receive(:create_archive).with({ :tags => TEST_TAG }, "zip")
         | 
| 99 | 
            +
                  Cloudinary::Uploader.create_zip({ :tags => TEST_TAG })
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
              end
         | 
| 102 | 
            +
            end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'cloudinary'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Cloudinary do
         | 
| 5 | 
            +
              before :all do
         | 
| 6 | 
            +
                @user_platform = Cloudinary.user_platform
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
              after :all do
         | 
| 9 | 
            +
                Cloudinary.user_platform = @user_platform
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              it 'should add a user platform to USER_AGENT' do
         | 
| 13 | 
            +
                Cloudinary.user_platform = "Spec/1.0 (Test)"
         | 
| 14 | 
            +
                expect(Cloudinary.USER_AGENT).to match( %r"Spec\/1.0 \(Test\) CloudinaryRuby/[\d.]+")
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -15,6 +15,12 @@ RSpec.configure do |config| | |
| 15 15 | 
             
              config.filter_run_excluding :delete_all => true
         | 
| 16 16 | 
             
            end
         | 
| 17 17 |  | 
| 18 | 
            +
            RSpec.shared_context "cleanup" do
         | 
| 19 | 
            +
              after :all do
         | 
| 20 | 
            +
                Cloudinary::Api.delete_resources_by_tag(TEST_TAG) unless Cloudinary.config.keep_test_products
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            end
         | 
| 18 24 | 
             
            # Create a regexp with the given +tag+ name.
         | 
| 19 25 | 
             
            def html_tag_matcher( tag)
         | 
| 20 26 | 
             
              /<#{tag}([\s]+([-[:word:]]+)[\s]*\=\s*\"([^\"]*)\")*\s*>.*<\s*\/#{tag}\s*>/
         | 
| @@ -140,3 +146,20 @@ RSpec::Matchers.define :be_served_by_cloudinary do | |
| 140 146 | 
             
              end
         | 
| 141 147 | 
             
            end
         | 
| 142 148 |  | 
| 149 | 
            +
            def deep_fetch(hash, path)
         | 
| 150 | 
            +
              Array(path).reduce(hash) { |h, key| h && h.fetch(key, nil) }
         | 
| 151 | 
            +
            end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
            # Matches deep values in the actual Hash, disregarding other keys and values.
         | 
| 154 | 
            +
            # @example
         | 
| 155 | 
            +
            #   expect( {:foo => { :bar => 'foobar'}}).to have_deep_hash_values_of( [:foo, :bar] => 'foobar')
         | 
| 156 | 
            +
            #   expect( foo_instance).to receive(:bar_method).with(deep_hash_values_of([:foo, :bar] => 'foobar'))
         | 
| 157 | 
            +
            RSpec::Matchers.define :deep_hash_value do |expected|
         | 
| 158 | 
            +
              match do |actual|
         | 
| 159 | 
            +
                expected.all? do |path, value|
         | 
| 160 | 
            +
                  values_match? deep_fetch(actual, path), value
         | 
| 161 | 
            +
                end
         | 
| 162 | 
            +
              end
         | 
| 163 | 
            +
            end
         | 
| 164 | 
            +
             | 
| 165 | 
            +
            RSpec::Matchers.alias_matcher :have_deep_hash_values_of, :deep_hash_value
         | 
    
        data/spec/uploader_spec.rb
    CHANGED
    
    | @@ -7,9 +7,10 @@ end | |
| 7 7 |  | 
| 8 8 | 
             
            describe Cloudinary::Uploader do
         | 
| 9 9 | 
             
              break puts("Please setup environment for api test to run") if Cloudinary.config.api_secret.blank?
         | 
| 10 | 
            +
              include_context "cleanup"
         | 
| 10 11 |  | 
| 11 12 | 
             
              it "should successfully upload file" do
         | 
| 12 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png") | 
| 13 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", :tags => TEST_TAG)
         | 
| 13 14 | 
             
                expect(result["width"]).to eq(241)
         | 
| 14 15 | 
             
                expect(result["height"]).to eq(51)
         | 
| 15 16 | 
             
                expected_signature = Cloudinary::Utils.api_sign_request({:public_id=>result["public_id"], :version=>result["version"]}, Cloudinary.config.api_secret)
         | 
| @@ -17,121 +18,148 @@ describe Cloudinary::Uploader do | |
| 17 18 | 
             
              end
         | 
| 18 19 |  | 
| 19 20 | 
             
              it "should successfully upload a file from pathname", :pathname => true do
         | 
| 20 | 
            -
                result = Cloudinary::Uploader.upload(Pathname.new("spec/logo.png"))
         | 
| 21 | 
            +
                result = Cloudinary::Uploader.upload(Pathname.new("spec/logo.png"), :tags => TEST_TAG)
         | 
| 21 22 | 
             
                expect(result["width"]).to eq(241)
         | 
| 22 23 | 
             
              end
         | 
| 23 24 |  | 
| 24 25 | 
             
              it "should successfully upload file by url" do
         | 
| 25 | 
            -
                result = Cloudinary::Uploader.upload("http://cloudinary.com/images/old_logo.png")
         | 
| 26 | 
            +
                result = Cloudinary::Uploader.upload("http://cloudinary.com/images/old_logo.png", :tags => TEST_TAG)
         | 
| 26 27 | 
             
                expect(result["width"]).to eq(241)
         | 
| 27 28 | 
             
                expect(result["height"]).to eq(51)
         | 
| 28 29 | 
             
                expected_signature = Cloudinary::Utils.api_sign_request({:public_id=>result["public_id"], :version=>result["version"]}, Cloudinary.config.api_secret)
         | 
| 29 30 | 
             
                expect(result["signature"]).to eq(expected_signature)
         | 
| 30 31 | 
             
              end
         | 
| 31 | 
            -
              
         | 
| 32 | 
            -
              it "should successfully rename a file" do
         | 
| 33 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png")
         | 
| 34 | 
            -
                Cloudinary::Uploader.rename(result["public_id"], result["public_id"]+"2")
         | 
| 35 | 
            -
                expect(Cloudinary::Api.resource(result["public_id"]+"2")).not_to be_nil
         | 
| 36 32 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
                 | 
| 39 | 
            -
             | 
| 33 | 
            +
              describe '.rename' do
         | 
| 34 | 
            +
                before(:all) do
         | 
| 35 | 
            +
                  @result        = Cloudinary::Uploader.upload("spec/logo.png", :tags => TEST_TAG)
         | 
| 36 | 
            +
                  @resource_1_id = @result["public_id"]
         | 
| 37 | 
            +
                  result         = Cloudinary::Uploader.upload("spec/favicon.ico", :tags => TEST_TAG)
         | 
| 38 | 
            +
                  @resource_2_id = result["public_id"]
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                it 'should rename a resource' do
         | 
| 42 | 
            +
                  Cloudinary::Uploader.rename(@resource_1_id, @resource_1_id+"2")
         | 
| 43 | 
            +
                  expect(Cloudinary::Api.resource(@resource_1_id+"2")).not_to be_nil
         | 
| 44 | 
            +
                  @resource_1_id = @resource_1_id+"2" # will not update if expect fails
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
                it 'should not allow renaming to an existing ID' do
         | 
| 47 | 
            +
                  id             = @resource_2_id
         | 
| 48 | 
            +
                  @resource_2_id = @resource_1_id+"2" # if rename doesn't fail, this is the new ID
         | 
| 49 | 
            +
                  expect { Cloudinary::Uploader.rename(id, @resource_1_id+"2") }.to raise_error
         | 
| 50 | 
            +
                  @resource_2_id = id
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
                context ':overwrite => true' do
         | 
| 53 | 
            +
                  it 'should rename to an existing ID' do
         | 
| 54 | 
            +
                    new_id = Cloudinary::Uploader.upload("spec/logo.png", :tags => TEST_TAG)["public_id"]
         | 
| 55 | 
            +
                    Cloudinary::Uploader.rename(@resource_2_id, new_id, :overwrite => true)
         | 
| 56 | 
            +
                    expect(Cloudinary::Api.resource(new_id)["format"]).to eq("ico")
         | 
| 57 | 
            +
                    @resource_2_id = new_id # will not update if expect fails
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
                context ':invalidate => true' do
         | 
| 61 | 
            +
                  it 'should notidy the server to invalidate the resource in the CDN' do
         | 
| 62 | 
            +
                    # Can't test the result, so we just verify the parameter is send to the server
         | 
| 63 | 
            +
                    expect(RestClient::Request).to receive(:execute).with(deep_hash_value([:payload, :invalidate] => 1))
         | 
| 64 | 
            +
                    Cloudinary::Uploader.rename(@resource_2_id, @resource_2_id+"2", :invalidate => true) # will not affect the server
         | 
| 65 | 
            +
                  end
         | 
| 40 66 |  | 
| 41 | 
            -
                 | 
| 67 | 
            +
                end
         | 
| 42 68 | 
             
              end
         | 
| 43 69 |  | 
| 70 | 
            +
             | 
| 44 71 | 
             
              it "should support explicit" do
         | 
| 45 | 
            -
                result = Cloudinary::Uploader.explicit("cloudinary", :type=>"twitter_name", :eager=>[{:crop=>"scale", :width=>"2.0"}])
         | 
| 72 | 
            +
                result = Cloudinary::Uploader.explicit("cloudinary", :type=>"twitter_name", :eager=>[{:crop=>"scale", :width=>"2.0"}], :tags => TEST_TAG)
         | 
| 46 73 | 
             
                url = Cloudinary::Utils.cloudinary_url("cloudinary", :type=>"twitter_name", :crop=>"scale", :width=>"2.0", :format=>"png", :version=>result["version"])
         | 
| 47 74 | 
             
                expect(result["eager"][0]["url"]).to eq(url)
         | 
| 48 75 | 
             
              end
         | 
| 49 76 |  | 
| 50 77 | 
             
              it "should support eager" do
         | 
| 51 | 
            -
                Cloudinary::Uploader.upload("spec/logo.png", :eager=>[{:crop=>"scale", :width=>"2.0"}])
         | 
| 78 | 
            +
                Cloudinary::Uploader.upload("spec/logo.png", :eager=>[{:crop=>"scale", :width=>"2.0"}], :tags => TEST_TAG)
         | 
| 52 79 | 
             
              end
         | 
| 53 80 |  | 
| 54 81 | 
             
              it "should support headers" do
         | 
| 55 | 
            -
                Cloudinary::Uploader.upload("spec/logo.png", :headers=>["Link: 1"])
         | 
| 56 | 
            -
                Cloudinary::Uploader.upload("spec/logo.png", :headers=>{"Link" => "1"})
         | 
| 82 | 
            +
                Cloudinary::Uploader.upload("spec/logo.png", :headers=>["Link: 1"], :tags => TEST_TAG)
         | 
| 83 | 
            +
                Cloudinary::Uploader.upload("spec/logo.png", :headers=>{"Link" => "1"}, :tags => TEST_TAG)
         | 
| 57 84 | 
             
              end
         | 
| 58 85 |  | 
| 59 86 | 
             
              it "should successfully generate text image" do
         | 
| 60 | 
            -
                result = Cloudinary::Uploader.text("hello world")
         | 
| 87 | 
            +
                result = Cloudinary::Uploader.text("hello world", :tags => TEST_TAG)
         | 
| 61 88 | 
             
                expect(result["width"]).to be > 1
         | 
| 62 89 | 
             
                expect(result["height"]).to be > 1
         | 
| 63 90 | 
             
              end
         | 
| 64 91 |  | 
| 65 92 | 
             
              it "should correctly handle tags" do
         | 
| 66 | 
            -
                 | 
| 67 | 
            -
                Cloudinary::Uploader. | 
| 68 | 
            -
                Cloudinary::Uploader.add_tag(" | 
| 69 | 
            -
                 | 
| 70 | 
            -
                Cloudinary:: | 
| 71 | 
            -
                 | 
| 72 | 
            -
                Cloudinary:: | 
| 73 | 
            -
                 | 
| 93 | 
            +
                new_tag = "tag#{rand(10000)}"
         | 
| 94 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", :tags => TEST_TAG)
         | 
| 95 | 
            +
                Cloudinary::Uploader.add_tag("#{new_tag}_1", result["public_id"])
         | 
| 96 | 
            +
                Cloudinary::Uploader.add_tag("#{new_tag}_2", result["public_id"])
         | 
| 97 | 
            +
                expect(Cloudinary::Api.resource(result["public_id"])["tags"]).to match_array(["#{new_tag}_1", "#{new_tag}_2", TEST_TAG])
         | 
| 98 | 
            +
                Cloudinary::Uploader.remove_tag("#{new_tag}_1", result["public_id"])
         | 
| 99 | 
            +
                expect(Cloudinary::Api.resource(result["public_id"])["tags"]).to match_array(["#{new_tag}_2", TEST_TAG])
         | 
| 100 | 
            +
                Cloudinary::Uploader.replace_tag("#{new_tag}_3", result["public_id"])
         | 
| 101 | 
            +
                expect(Cloudinary::Api.resource(result["public_id"])["tags"]).to match_array(["#{new_tag}_3"])
         | 
| 74 102 | 
             
              end
         | 
| 75 103 |  | 
| 76 104 | 
             
              it "should correctly handle unique_filename" do
         | 
| 77 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png", :use_filename => true)
         | 
| 105 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", :use_filename => true, :tags => TEST_TAG)
         | 
| 78 106 | 
             
                expect(result["public_id"]).to match(/logo_[a-zA-Z0-9]{6}/)
         | 
| 79 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png", :use_filename => true, :unique_filename => false)
         | 
| 107 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", :use_filename => true, :unique_filename => false, :tags => TEST_TAG)
         | 
| 80 108 | 
             
                expect(result["public_id"]).to eq("logo")
         | 
| 81 109 | 
             
              end
         | 
| 82 110 |  | 
| 83 111 | 
             
              it "should allow whitelisted formats if allowed_formats", :allowed=>true do
         | 
| 84 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png", :allowed_formats => ["png"])
         | 
| 112 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", :allowed_formats => ["png"], :tags => TEST_TAG)
         | 
| 85 113 | 
             
                expect(result["format"]).to eq("png")
         | 
| 86 114 | 
             
              end
         | 
| 87 115 |  | 
| 88 116 | 
             
              it "should prevent non whitelisted formats from being uploaded if allowed_formats is specified", :allowed=>true do
         | 
| 89 | 
            -
                expect{Cloudinary::Uploader.upload("spec/logo.png", :allowed_formats => ["jpg"])}.to raise_error
         | 
| 117 | 
            +
                expect{Cloudinary::Uploader.upload("spec/logo.png", :allowed_formats => ["jpg"], :tags => TEST_TAG)}.to raise_error
         | 
| 90 118 | 
             
              end
         | 
| 91 119 |  | 
| 92 120 | 
             
              it "should allow non whitelisted formats if type is specified and convert to that type", :allowed=>true do
         | 
| 93 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png", :allowed_formats => ["jpg"], :format => "jpg")
         | 
| 121 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", :allowed_formats => ["jpg"], :format => "jpg", :tags => TEST_TAG)
         | 
| 94 122 | 
             
                expect(result["format"]).to eq("jpg")
         | 
| 95 123 | 
             
              end
         | 
| 96 124 |  | 
| 97 125 | 
             
              it "should allow sending face coordinates" do
         | 
| 98 126 | 
             
                coordinates = [[120, 30, 109, 150], [121, 31, 110, 151]]
         | 
| 99 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png", {:face_coordinates => coordinates, :faces => true})
         | 
| 127 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", {:face_coordinates => coordinates, :faces => true, :tags => TEST_TAG})
         | 
| 100 128 | 
             
                expect(result["faces"]).to eq(coordinates)
         | 
| 101 129 |  | 
| 102 130 | 
             
                different_coordinates = [[122, 32, 111, 152]]
         | 
| 103 | 
            -
                Cloudinary::Uploader.explicit(result["public_id"], {:face_coordinates => different_coordinates, :faces => true, :type => "upload"})
         | 
| 131 | 
            +
                Cloudinary::Uploader.explicit(result["public_id"], {:face_coordinates => different_coordinates, :faces => true, :type => "upload", :tags => TEST_TAG})
         | 
| 104 132 | 
             
                info = Cloudinary::Api.resource(result["public_id"], {:faces => true})
         | 
| 105 133 | 
             
                expect(info["faces"]).to eq(different_coordinates)
         | 
| 106 134 | 
             
              end
         | 
| 107 135 |  | 
| 108 136 | 
             
              it "should allow sending context" do
         | 
| 109 137 | 
             
                context = {"caption" => "some caption", "alt" => "alternative"}
         | 
| 110 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png", {:context => context})
         | 
| 138 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", {:context => context, :tags => TEST_TAG})
         | 
| 111 139 | 
             
                info = Cloudinary::Api.resource(result["public_id"], {:context => true})
         | 
| 112 140 | 
             
                expect(info["context"]).to eq({"custom" => context})
         | 
| 113 141 | 
             
              end
         | 
| 114 142 |  | 
| 115 143 | 
             
              it "should support requesting manual moderation" do
         | 
| 116 | 
            -
                result = Cloudinary::Uploader.upload("spec/logo.png", {:moderation => :manual})
         | 
| 144 | 
            +
                result = Cloudinary::Uploader.upload("spec/logo.png", {:moderation => :manual, :tags => TEST_TAG})
         | 
| 117 145 | 
             
                expect(result["moderation"][0]["status"]).to eq("pending")
         | 
| 118 146 | 
             
                expect(result["moderation"][0]["kind"]).to eq("manual")
         | 
| 119 147 | 
             
              end
         | 
| 120 148 |  | 
| 121 149 | 
             
              it "should support requesting raw conversion" do
         | 
| 122 | 
            -
                expect{Cloudinary::Uploader.upload("spec/docx.docx", {:resource_type => :raw, :raw_convert => :illegal})}.to raise_error(CloudinaryException, /Illegal value|not a valid/)
         | 
| 150 | 
            +
                expect{Cloudinary::Uploader.upload("spec/docx.docx", {:resource_type => :raw, :raw_convert => :illegal, :tags => TEST_TAG})}.to raise_error(CloudinaryException, /Illegal value|not a valid/)
         | 
| 123 151 | 
             
              end
         | 
| 124 152 |  | 
| 125 153 | 
             
              it "should support requesting categorization" do
         | 
| 126 | 
            -
                expect{Cloudinary::Uploader.upload("spec/logo.png", {:categorization => :illegal})}.to raise_error(CloudinaryException, /Illegal value|not a valid/)
         | 
| 154 | 
            +
                expect{Cloudinary::Uploader.upload("spec/logo.png", {:categorization => :illegal, :tags => TEST_TAG})}.to raise_error(CloudinaryException, /Illegal value|not a valid/)
         | 
| 127 155 | 
             
              end
         | 
| 128 156 |  | 
| 129 157 | 
             
              it "should support requesting detection" do
         | 
| 130 | 
            -
                expect{Cloudinary::Uploader.upload("spec/logo.png", {:detection => :illegal})}.to raise_error(CloudinaryException, /Illegal value|not a valid/)
         | 
| 158 | 
            +
                expect{Cloudinary::Uploader.upload("spec/logo.png", {:detection => :illegal, :tags => TEST_TAG})}.to raise_error(CloudinaryException, /Illegal value|not a valid/)
         | 
| 131 159 | 
             
              end
         | 
| 132 160 |  | 
| 133 161 | 
             
              it "should support requesting auto_tagging" do
         | 
| 134 | 
            -
                expect{Cloudinary::Uploader.upload("spec/logo.png", {:auto_tagging => 0.5})}.to raise_error(CloudinaryException, /Must use/)
         | 
| 162 | 
            +
                expect{Cloudinary::Uploader.upload("spec/logo.png", {:auto_tagging => 0.5, :tags => TEST_TAG})}.to raise_error(CloudinaryException, /Must use/)
         | 
| 135 163 | 
             
              end
         | 
| 136 164 |  | 
| 137 165 | 
             
              it "should support upload_large", :large => true do
         | 
| @@ -140,10 +168,10 @@ describe Cloudinary::Uploader do | |
| 140 168 | 
             
                io.puts(header)
         | 
| 141 169 | 
             
                5880000.times{ io.write("\xFF") }
         | 
| 142 170 | 
             
                io.rewind
         | 
| 143 | 
            -
                result = Cloudinary::Uploader.upload_large(io, :chunk_size => 5243000)
         | 
| 171 | 
            +
                result = Cloudinary::Uploader.upload_large(io, :chunk_size => 5243000, :tags => TEST_TAG)
         | 
| 144 172 | 
             
                expect(result["resource_type"]).to eq('raw')
         | 
| 145 173 | 
             
                io.rewind
         | 
| 146 | 
            -
                result = Cloudinary::Uploader.upload_large(io, :resource_type => 'image', :chunk_size => 5243000)
         | 
| 174 | 
            +
                result = Cloudinary::Uploader.upload_large(io, :resource_type => 'image', :chunk_size => 5243000, :tags => TEST_TAG)
         | 
| 147 175 | 
             
                expect(result["resource_type"]).to eq('image')
         | 
| 148 176 | 
             
                expect(result["width"]).to eq(1400)
         | 
| 149 177 | 
             
                expect(result["height"]).to eq(1400)
         | 
| @@ -156,17 +184,16 @@ describe Cloudinary::Uploader do | |
| 156 184 | 
             
                end
         | 
| 157 185 |  | 
| 158 186 | 
             
                it "should support unsigned uploading using presets", :upload_preset => true do
         | 
| 159 | 
            -
                  preset = Cloudinary::Api.create_upload_preset(:folder => "test_folder_upload", :unsigned => true)
         | 
| 187 | 
            +
                  preset = Cloudinary::Api.create_upload_preset(:folder => "test_folder_upload", :unsigned => true, :tags => TEST_TAG)
         | 
| 160 188 |  | 
| 161 189 | 
             
                  Cloudinary.config.api_key = nil
         | 
| 162 190 | 
             
                  Cloudinary.config.api_secret = nil
         | 
| 163 191 |  | 
| 164 | 
            -
                  result = Cloudinary::Uploader.unsigned_upload("spec/logo.png", preset["name"])
         | 
| 192 | 
            +
                  result = Cloudinary::Uploader.unsigned_upload("spec/logo.png", preset["name"], :tags => TEST_TAG)
         | 
| 165 193 | 
             
                  expect(result["public_id"]).to match(/^test_folder_upload\/[a-z0-9]+$/)
         | 
| 166 194 |  | 
| 167 195 | 
             
                  Cloudinary.class_variable_set(:@@config, nil)
         | 
| 168 196 |  | 
| 169 | 
            -
                  Cloudinary::Api.delete_upload_preset(preset["name"])
         | 
| 170 197 | 
             
                end
         | 
| 171 198 | 
             
              end
         | 
| 172 199 |  | 
| @@ -180,7 +207,26 @@ describe Cloudinary::Uploader do | |
| 180 207 | 
             
                end
         | 
| 181 208 |  | 
| 182 209 | 
             
                it "should fail if timeout is reached" do
         | 
| 183 | 
            -
                  expect{Cloudinary::Uploader.upload(Pathname.new("spec/logo.png"))}.to raise_error
         | 
| 210 | 
            +
                  expect{Cloudinary::Uploader.upload(Pathname.new("spec/logo.png"), :tags => TEST_TAG)}.to raise_error
         | 
| 211 | 
            +
                end
         | 
| 212 | 
            +
              end
         | 
| 213 | 
            +
             | 
| 214 | 
            +
              context ":responsive_breakpoints" do
         | 
| 215 | 
            +
                context ":create_derived" do
         | 
| 216 | 
            +
                  result = Cloudinary::Uploader.upload("spec/logo.png", :responsive_breakpoints => {:create_derived => false }, :tags => TEST_TAG)
         | 
| 217 | 
            +
                  it 'should return a responsive_breakpoints in the response' do
         | 
| 218 | 
            +
                    expect(result).to include('responsive_breakpoints')
         | 
| 219 | 
            +
                  end
         | 
| 220 | 
            +
                end
         | 
| 221 | 
            +
              end
         | 
| 222 | 
            +
              describe 'explicit' do
         | 
| 223 | 
            +
             | 
| 224 | 
            +
                context ":invalidate" do
         | 
| 225 | 
            +
                  it 'should pass the invalidate value to the server' do
         | 
| 226 | 
            +
                    expect(RestClient::Request).to receive(:execute).with(deep_hash_value( [:payload, :invalidate] => 1))
         | 
| 227 | 
            +
                    Cloudinary::Uploader.explicit("cloudinary", :type=>"twitter_name", :eager=>[{:crop=>"scale", :width=>"2.0"}], :invalidate => true, :tags => TEST_TAG)
         | 
| 228 | 
            +
                  end
         | 
| 184 229 | 
             
                end
         | 
| 185 230 | 
             
              end
         | 
| 186 231 | 
             
            end
         | 
| 232 | 
            +
             | 
    
        data/spec/utils_spec.rb
    CHANGED
    
    | @@ -7,22 +7,17 @@ describe Cloudinary::Utils do | |
| 7 7 | 
             
                Cloudinary.config do |config|
         | 
| 8 8 | 
             
                  # config.cloud_name = "demo"
         | 
| 9 9 | 
             
                  config.secure_distribution = nil
         | 
| 10 | 
            -
                  config.private_cdn | 
| 11 | 
            -
                  config.secure | 
| 12 | 
            -
                  config.cname | 
| 13 | 
            -
                  config.cdn_subdomain | 
| 10 | 
            +
                  config.private_cdn         = false
         | 
| 11 | 
            +
                  config.secure              = false
         | 
| 12 | 
            +
                  config.cname               = nil
         | 
| 13 | 
            +
                  config.cdn_subdomain       = false
         | 
| 14 14 | 
             
                end
         | 
| 15 15 | 
             
              end
         | 
| 16 | 
            -
             | 
| 16 | 
            +
             | 
| 17 | 
            +
              let(:cloud_name) { Cloudinary.config.cloud_name }
         | 
| 17 18 | 
             
              let(:root_path) { "http://res.cloudinary.com/#{cloud_name}" }
         | 
| 18 19 | 
             
              let(:upload_path) { "#{root_path}/image/upload" }
         | 
| 19 20 |  | 
| 20 | 
            -
              it "should use cloud_name from config" do
         | 
| 21 | 
            -
                expect(["test", {}])
         | 
| 22 | 
            -
                  .to produce_url( "#{upload_path}/test")
         | 
| 23 | 
            -
                    .and empty_options
         | 
| 24 | 
            -
              end
         | 
| 25 | 
            -
             | 
| 26 21 | 
             
              it "should allow overriding cloud_name in options" do
         | 
| 27 22 | 
             
                expect(["test", { :cloud_name => "test321" }])
         | 
| 28 23 | 
             
                  .to produce_url("http://res.cloudinary.com/test321/image/upload/test")
         | 
| @@ -30,221 +25,221 @@ describe Cloudinary::Utils do | |
| 30 25 | 
             
              end
         | 
| 31 26 |  | 
| 32 27 | 
             
              it "should use default secure distribution if secure=true" do
         | 
| 33 | 
            -
                expect(["test",{:secure=>true}])
         | 
| 28 | 
            +
                expect(["test", { :secure => true }])
         | 
| 34 29 | 
             
                  .to produce_url("https://res.cloudinary.com/#{cloud_name}/image/upload/test")
         | 
| 35 | 
            -
             | 
| 30 | 
            +
                        .and empty_options
         | 
| 36 31 | 
             
              end
         | 
| 37 32 |  | 
| 38 33 | 
             
              it "should allow overriding secure distribution if secure=true" do
         | 
| 39 | 
            -
                expect(["test",{:secure=>true, :secure_distribution=>"something.else.com"}])
         | 
| 34 | 
            +
                expect(["test", { :secure => true, :secure_distribution => "something.else.com" }])
         | 
| 40 35 | 
             
                  .to produce_url("https://something.else.com/#{cloud_name}/image/upload/test")
         | 
| 41 | 
            -
             | 
| 36 | 
            +
                        .and empty_options
         | 
| 42 37 | 
             
              end
         | 
| 43 38 |  | 
| 44 39 | 
             
              it "should take secure distribution from config if secure=true" do
         | 
| 45 40 | 
             
                Cloudinary.config.secure_distribution = "config.secure.distribution.com"
         | 
| 46 | 
            -
                expect(["test",{:secure=>true}])
         | 
| 41 | 
            +
                expect(["test", { :secure => true }])
         | 
| 47 42 | 
             
                  .to produce_url("https://config.secure.distribution.com/#{cloud_name}/image/upload/test")
         | 
| 48 | 
            -
             | 
| 43 | 
            +
                        .and empty_options
         | 
| 49 44 | 
             
              end
         | 
| 50 45 |  | 
| 51 46 | 
             
              it "should default to akamai if secure is given with private_cdn and no secure_distribution" do
         | 
| 52 | 
            -
                expect(["test",{:secure=>true, :private_cdn=>true}])
         | 
| 47 | 
            +
                expect(["test", { :secure => true, :private_cdn => true }])
         | 
| 53 48 | 
             
                  .to produce_url("https://#{cloud_name}-res.cloudinary.com/image/upload/test")
         | 
| 54 | 
            -
             | 
| 49 | 
            +
                        .and empty_options
         | 
| 55 50 | 
             
              end
         | 
| 56 51 |  | 
| 57 52 | 
             
              it "should not add cloud_name if secure private_cdn and secure non akamai secure_distribution" do
         | 
| 58 | 
            -
                expect(["test",{:secure=>true, :private_cdn=>true, :secure_distribution=>"something.cloudfront.net"}])
         | 
| 53 | 
            +
                expect(["test", { :secure => true, :private_cdn => true, :secure_distribution => "something.cloudfront.net" }])
         | 
| 59 54 | 
             
                  .to produce_url("https://something.cloudfront.net/image/upload/test")
         | 
| 60 | 
            -
             | 
| 55 | 
            +
                        .and empty_options
         | 
| 61 56 | 
             
              end
         | 
| 62 57 |  | 
| 63 58 | 
             
              it "should allow overriding private_cdn if private_cdn=true" do
         | 
| 64 | 
            -
                expect(["test",{:private_cdn => true}])
         | 
| 59 | 
            +
                expect(["test", { :private_cdn => true }])
         | 
| 65 60 | 
             
                  .to produce_url("http://#{cloud_name}-res.cloudinary.com/image/upload/test")
         | 
| 66 | 
            -
             | 
| 61 | 
            +
                        .and empty_options
         | 
| 67 62 | 
             
              end
         | 
| 68 63 |  | 
| 69 64 | 
             
              it "should allow overriding private_cdn if private_cdn=false" do
         | 
| 70 65 | 
             
                Cloudinary.config.private_cdn = true
         | 
| 71 | 
            -
                expect(["test",{ :private_cdn => false }])
         | 
| 66 | 
            +
                expect(["test", { :private_cdn => false }])
         | 
| 72 67 | 
             
                  .to produce_url("#{upload_path}/test")
         | 
| 73 | 
            -
             | 
| 68 | 
            +
                        .and empty_options
         | 
| 74 69 | 
             
              end
         | 
| 75 70 |  | 
| 76 71 | 
             
              it "should allow overriding cname if cname=example.com" do
         | 
| 77 | 
            -
                expect(["test",{:cname => "example.com"}])
         | 
| 72 | 
            +
                expect(["test", { :cname => "example.com" }])
         | 
| 78 73 | 
             
                  .to produce_url("http://example.com/#{cloud_name}/image/upload/test")
         | 
| 79 | 
            -
             | 
| 74 | 
            +
                        .and empty_options
         | 
| 80 75 | 
             
              end
         | 
| 81 76 |  | 
| 82 77 | 
             
              it "should allow overriding cname if cname=false" do
         | 
| 83 78 | 
             
                Cloudinary.config.cname = "example.com"
         | 
| 84 | 
            -
                expect(["test",{ :cname => false }])
         | 
| 79 | 
            +
                expect(["test", { :cname => false }])
         | 
| 85 80 | 
             
                  .to produce_url("#{upload_path}/test")
         | 
| 86 | 
            -
             | 
| 81 | 
            +
                        .and empty_options
         | 
| 87 82 | 
             
              end
         | 
| 88 83 |  | 
| 89 84 | 
             
              it "should use format from options" do
         | 
| 90 | 
            -
                expect(["test",{ :format => :jpg }])
         | 
| 85 | 
            +
                expect(["test", { :format => :jpg }])
         | 
| 91 86 | 
             
                  .to produce_url("#{upload_path}/test.jpg")
         | 
| 92 | 
            -
             | 
| 87 | 
            +
                        .and empty_options
         | 
| 93 88 | 
             
              end
         | 
| 94 89 |  | 
| 95 90 | 
             
              it "should disallow url_suffix in shared distribution" do
         | 
| 96 | 
            -
                expect{Cloudinary::Utils.cloudinary_url("test", {:url_suffix=>"hello"})}.to raise_error(CloudinaryException)
         | 
| 91 | 
            +
                expect { Cloudinary::Utils.cloudinary_url("test", { :url_suffix => "hello" }) }.to raise_error(CloudinaryException)
         | 
| 97 92 | 
             
              end
         | 
| 98 93 |  | 
| 99 94 | 
             
              it "should disallow url_suffix in non upload types" do
         | 
| 100 | 
            -
                expect{Cloudinary::Utils.cloudinary_url("test", {:url_suffix=>"hello", :private_cdn=>true, :type | 
| 95 | 
            +
                expect { Cloudinary::Utils.cloudinary_url("test", { :url_suffix => "hello", :private_cdn => true, :type => :facebook }) }.to raise_error(CloudinaryException)
         | 
| 101 96 | 
             
              end
         | 
| 102 97 |  | 
| 103 98 | 
             
              it "should disallow url_suffix with / or ." do
         | 
| 104 | 
            -
                expect{Cloudinary::Utils.cloudinary_url("test", {:url_suffix=>"hello/world", :private_cdn=>true})}.to raise_error(CloudinaryException)
         | 
| 105 | 
            -
                expect{Cloudinary::Utils.cloudinary_url("test", {:url_suffix=>"hello.world", :private_cdn=>true})}.to raise_error(CloudinaryException)
         | 
| 99 | 
            +
                expect { Cloudinary::Utils.cloudinary_url("test", { :url_suffix => "hello/world", :private_cdn => true }) }.to raise_error(CloudinaryException)
         | 
| 100 | 
            +
                expect { Cloudinary::Utils.cloudinary_url("test", { :url_suffix => "hello.world", :private_cdn => true }) }.to raise_error(CloudinaryException)
         | 
| 106 101 | 
             
              end
         | 
| 107 102 |  | 
| 108 103 | 
             
              it "should support url_suffix for private_cdn" do
         | 
| 109 | 
            -
                expect(["test",{:url_suffix=>"hello", :private_cdn=>true}])
         | 
| 104 | 
            +
                expect(["test", { :url_suffix => "hello", :private_cdn => true }])
         | 
| 110 105 | 
             
                  .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/test/hello")
         | 
| 111 | 
            -
             | 
| 112 | 
            -
                expect(["test",{:url_suffix=>"hello", :angle=>0, :private_cdn=>true}])
         | 
| 106 | 
            +
                        .and empty_options
         | 
| 107 | 
            +
                expect(["test", { :url_suffix => "hello", :angle => 0, :private_cdn => true }])
         | 
| 113 108 | 
             
                  .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/a_0/test/hello")
         | 
| 114 | 
            -
             | 
| 109 | 
            +
                        .and empty_options
         | 
| 115 110 | 
             
              end
         | 
| 116 111 |  | 
| 117 112 | 
             
              it "should put format after url_suffix" do
         | 
| 118 | 
            -
                expect(["test",{:url_suffix=>"hello", :private_cdn=>true, :format=>"jpg"}])
         | 
| 113 | 
            +
                expect(["test", { :url_suffix => "hello", :private_cdn => true, :format => "jpg" }])
         | 
| 119 114 | 
             
                  .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/test/hello.jpg")
         | 
| 120 | 
            -
             | 
| 115 | 
            +
                        .and empty_options
         | 
| 121 116 | 
             
              end
         | 
| 122 117 |  | 
| 123 118 | 
             
              it "should not sign the url_suffix" do
         | 
| 124 | 
            -
                expected_signture = Cloudinary::Utils.cloudinary_url("test", :format=>"jpg", :sign_url=>true).match(/s--[0-9A-Za-z_-]{8}--/).to_s
         | 
| 125 | 
            -
                expect(["test",{:url_suffix=>"hello", :private_cdn=>true, :format=>"jpg", :sign_url=>true}])
         | 
| 119 | 
            +
                expected_signture = Cloudinary::Utils.cloudinary_url("test", :format => "jpg", :sign_url => true).match(/s--[0-9A-Za-z_-]{8}--/).to_s
         | 
| 120 | 
            +
                expect(["test", { :url_suffix => "hello", :private_cdn => true, :format => "jpg", :sign_url => true }])
         | 
| 126 121 | 
             
                  .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/#{expected_signture}/test/hello.jpg")
         | 
| 127 | 
            -
             | 
| 122 | 
            +
                        .and empty_options
         | 
| 128 123 |  | 
| 129 | 
            -
                expected_signture = Cloudinary::Utils.cloudinary_url("test", :format=>"jpg", :angle=>0, :sign_url=>true).match(/s--[0-9A-Za-z_-]{8}--/).to_s
         | 
| 130 | 
            -
                expect(["test",{:url_suffix=>"hello", :private_cdn=>true, :format=>"jpg", :angle=>0, :sign_url=>true}])
         | 
| 124 | 
            +
                expected_signture = Cloudinary::Utils.cloudinary_url("test", :format => "jpg", :angle => 0, :sign_url => true).match(/s--[0-9A-Za-z_-]{8}--/).to_s
         | 
| 125 | 
            +
                expect(["test", { :url_suffix => "hello", :private_cdn => true, :format => "jpg", :angle => 0, :sign_url => true }])
         | 
| 131 126 | 
             
                  .to produce_url("http://#{cloud_name}-res.cloudinary.com/images/#{expected_signture}/a_0/test/hello.jpg")
         | 
| 132 | 
            -
             | 
| 127 | 
            +
                        .and empty_options
         | 
| 133 128 | 
             
              end
         | 
| 134 129 |  | 
| 135 130 | 
             
              it "should support url_suffix for raw uploads" do
         | 
| 136 | 
            -
                expect(["test",{:url_suffix=>"hello", :private_cdn=>true, :resource_type | 
| 131 | 
            +
                expect(["test", { :url_suffix => "hello", :private_cdn => true, :resource_type => :raw }])
         | 
| 137 132 | 
             
                  .to produce_url("http://#{cloud_name}-res.cloudinary.com/files/test/hello")
         | 
| 138 | 
            -
             | 
| 133 | 
            +
                        .and empty_options
         | 
| 139 134 | 
             
              end
         | 
| 140 135 |  | 
| 141 136 | 
             
              describe 'root_path support' do
         | 
| 142 137 |  | 
| 143 138 | 
             
                it "should allow use_root_path in shared distribution" do
         | 
| 144 139 | 
             
                  # expect{Cloudinary::Utils.cloudinary_url("test", {:use_root_path=>true})}.to raise_error(CloudinaryException)
         | 
| 145 | 
            -
                  expect(["test",{ :use_root_path => true, :private_cdn => false }])
         | 
| 140 | 
            +
                  expect(["test", { :use_root_path => true, :private_cdn => false }])
         | 
| 146 141 | 
             
                    .to produce_url("#{root_path}/test")
         | 
| 147 | 
            -
             | 
| 148 | 
            -
                  expect(["test",{ :use_root_path => true, :private_cdn => false, :angle => 0 }])
         | 
| 142 | 
            +
                          .and empty_options
         | 
| 143 | 
            +
                  expect(["test", { :use_root_path => true, :private_cdn => false, :angle => 0 }])
         | 
| 149 144 | 
             
                    .to produce_url("#{root_path}/a_0/test")
         | 
| 150 | 
            -
             | 
| 145 | 
            +
                          .and empty_options
         | 
| 151 146 | 
             
                end
         | 
| 152 147 |  | 
| 153 148 | 
             
                it "should support use_root_path for private_cdn" do
         | 
| 154 | 
            -
                  expect(["test",{:use_root_path=>true, :private_cdn=>true}])
         | 
| 149 | 
            +
                  expect(["test", { :use_root_path => true, :private_cdn => true }])
         | 
| 155 150 | 
             
                    .to produce_url("http://#{cloud_name}-res.cloudinary.com/test")
         | 
| 156 | 
            -
             | 
| 157 | 
            -
                  expect(["test",{:use_root_path=>true, :private_cdn=>true, :angle=>0}])
         | 
| 151 | 
            +
                          .and empty_options
         | 
| 152 | 
            +
                  expect(["test", { :use_root_path => true, :private_cdn => true, :angle => 0 }])
         | 
| 158 153 | 
             
                    .to produce_url("http://#{cloud_name}-res.cloudinary.com/a_0/test")
         | 
| 159 | 
            -
             | 
| 154 | 
            +
                          .and empty_options
         | 
| 160 155 | 
             
                end
         | 
| 161 156 |  | 
| 162 157 | 
             
                it "should support use_root_path together with url_suffix for private_cdn" do
         | 
| 163 | 
            -
                  expect(["test",{:use_root_path=>true, :url_suffix=>"hello", :private_cdn=>true}])
         | 
| 158 | 
            +
                  expect(["test", { :use_root_path => true, :url_suffix => "hello", :private_cdn => true }])
         | 
| 164 159 | 
             
                    .to produce_url("http://#{cloud_name}-res.cloudinary.com/test/hello")
         | 
| 165 | 
            -
             | 
| 160 | 
            +
                          .and empty_options
         | 
| 166 161 | 
             
                end
         | 
| 167 162 |  | 
| 168 163 | 
             
                it "should disallow use_root_path if not image/upload" do
         | 
| 169 | 
            -
                  expect{Cloudinary::Utils.cloudinary_url("test", {:use_root_path=>true, :private_cdn=>true, :type | 
| 170 | 
            -
                  expect{Cloudinary::Utils.cloudinary_url("test", {:use_root_path=>true, :private_cdn=>true, :resource_type | 
| 164 | 
            +
                  expect { Cloudinary::Utils.cloudinary_url("test", { :use_root_path => true, :private_cdn => true, :type => :facebook }) }.to raise_error(CloudinaryException)
         | 
| 165 | 
            +
                  expect { Cloudinary::Utils.cloudinary_url("test", { :use_root_path => true, :private_cdn => true, :resource_type => :raw }) }.to raise_error(CloudinaryException)
         | 
| 171 166 | 
             
                end
         | 
| 172 167 |  | 
| 173 168 | 
             
              end
         | 
| 174 169 | 
             
              describe ":width, :height" do
         | 
| 175 170 | 
             
                it "should use width and height from options only if crop is given" do
         | 
| 176 | 
            -
                  expect(["test",{ :width => 100, :height => 100 }])
         | 
| 171 | 
            +
                  expect(["test", { :width => 100, :height => 100 }])
         | 
| 177 172 | 
             
                    .to produce_url("#{upload_path}/test")
         | 
| 178 | 
            -
             | 
| 179 | 
            -
                  expect(["test",{ :width => 100, :height => 100, :crop => :crop }])
         | 
| 173 | 
            +
                          .and mutate_options_to({ :width => 100, :height => 100 })
         | 
| 174 | 
            +
                  expect(["test", { :width => 100, :height => 100, :crop => :crop }])
         | 
| 180 175 | 
             
                    .to produce_url("#{upload_path}/c_crop,h_100,w_100/test")
         | 
| 181 | 
            -
             | 
| 176 | 
            +
                          .and mutate_options_to({ :width => 100, :height => 100 })
         | 
| 182 177 | 
             
                end
         | 
| 183 178 |  | 
| 184 179 | 
             
                it "should not pass width and height to html in case of fit, lfill or limit crop" do
         | 
| 185 | 
            -
                  expect(["test",{ :width => 100, :height => 100, :crop => :limit }])
         | 
| 180 | 
            +
                  expect(["test", { :width => 100, :height => 100, :crop => :limit }])
         | 
| 186 181 | 
             
                    .to produce_url("#{upload_path}/c_limit,h_100,w_100/test")
         | 
| 187 | 
            -
             | 
| 188 | 
            -
                  expect(["test",{ :width => 100, :height => 100, :crop => :lfill }])
         | 
| 182 | 
            +
                          .and empty_options
         | 
| 183 | 
            +
                  expect(["test", { :width => 100, :height => 100, :crop => :lfill }])
         | 
| 189 184 | 
             
                    .to produce_url("#{upload_path}/c_lfill,h_100,w_100/test")
         | 
| 190 | 
            -
             | 
| 191 | 
            -
                  expect(["test",{ :width => 100, :height => 100, :crop => :fit }])
         | 
| 185 | 
            +
                          .and empty_options
         | 
| 186 | 
            +
                  expect(["test", { :width => 100, :height => 100, :crop => :fit }])
         | 
| 192 187 | 
             
                    .to produce_url("#{upload_path}/c_fit,h_100,w_100/test")
         | 
| 193 | 
            -
             | 
| 188 | 
            +
                          .and empty_options
         | 
| 194 189 | 
             
                end
         | 
| 195 190 |  | 
| 196 191 | 
             
                it "should not pass width and height to html in case angle was used" do
         | 
| 197 | 
            -
                  expect(["test",{ :width => 100, :height => 100, :crop => :scale, :angle => :auto }])
         | 
| 192 | 
            +
                  expect(["test", { :width => 100, :height => 100, :crop => :scale, :angle => :auto }])
         | 
| 198 193 | 
             
                    .to produce_url("#{upload_path}/a_auto,c_scale,h_100,w_100/test")
         | 
| 199 | 
            -
             | 
| 194 | 
            +
                          .and empty_options
         | 
| 200 195 | 
             
                end
         | 
| 201 196 | 
             
                it "should support size" do
         | 
| 202 | 
            -
                  expect(["test",{ :size => "10x10", :crop => :crop }])
         | 
| 197 | 
            +
                  expect(["test", { :size => "10x10", :crop => :crop }])
         | 
| 203 198 | 
             
                    .to produce_url("#{upload_path}/c_crop,h_10,w_10/test")
         | 
| 204 | 
            -
             | 
| 199 | 
            +
                          .and mutate_options_to({ :width => "10", :height => "10" })
         | 
| 205 200 | 
             
                end
         | 
| 206 201 | 
             
              end
         | 
| 207 202 |  | 
| 208 203 | 
             
              it "should use x, y, radius, prefix, gravity and quality from options" do
         | 
| 209 | 
            -
                expect(["test",{ :x => 1, :y => 2, :radius => 3, :gravity => :center, :quality => 0.4, :prefix => "a" }])
         | 
| 204 | 
            +
                expect(["test", { :x => 1, :y => 2, :radius => 3, :gravity => :center, :quality => 0.4, :prefix => "a" }])
         | 
| 210 205 | 
             
                  .to produce_url("#{upload_path}/g_center,p_a,q_0.4,r_3,x_1,y_2/test")
         | 
| 211 | 
            -
             | 
| 206 | 
            +
                        .and empty_options
         | 
| 212 207 | 
             
              end
         | 
| 213 208 |  | 
| 214 209 | 
             
              describe ":transformation" do
         | 
| 215 210 | 
             
                it "should support named tranformation" do
         | 
| 216 | 
            -
                  expect(["test",{ :transformation => "blip" }])
         | 
| 211 | 
            +
                  expect(["test", { :transformation => "blip" }])
         | 
| 217 212 | 
             
                    .to produce_url("#{upload_path}/t_blip/test")
         | 
| 218 | 
            -
             | 
| 213 | 
            +
                          .and empty_options
         | 
| 219 214 | 
             
                end
         | 
| 220 215 |  | 
| 221 216 | 
             
                it "should support array of named tranformations" do
         | 
| 222 | 
            -
                  expect(["test",{ :transformation => ["blip", "blop"] }])
         | 
| 217 | 
            +
                  expect(["test", { :transformation => ["blip", "blop"] }])
         | 
| 223 218 | 
             
                    .to produce_url("#{upload_path}/t_blip.blop/test")
         | 
| 224 | 
            -
             | 
| 219 | 
            +
                          .and empty_options
         | 
| 225 220 | 
             
                end
         | 
| 226 221 |  | 
| 227 222 | 
             
                it "should support base tranformation" do
         | 
| 228 | 
            -
                  expect(["test",{ :transformation => { :x => 100, :y => 100, :crop => :fill }, :crop => :crop, :width => 100 }])
         | 
| 223 | 
            +
                  expect(["test", { :transformation => { :x => 100, :y => 100, :crop => :fill }, :crop => :crop, :width => 100 }])
         | 
| 229 224 | 
             
                    .to produce_url("#{upload_path}/c_fill,x_100,y_100/c_crop,w_100/test")
         | 
| 230 | 
            -
             | 
| 225 | 
            +
                          .and mutate_options_to({ :width => 100 })
         | 
| 231 226 | 
             
                end
         | 
| 232 227 |  | 
| 233 228 | 
             
                it "should support array of base tranformations" do
         | 
| 234 | 
            -
                  expect(["test",{ :transformation => [{ :x => 100, :y => 100, :width => 200, :crop => :fill }, { :radius => 10 }], :crop => :crop, :width => 100 }])
         | 
| 229 | 
            +
                  expect(["test", { :transformation => [{ :x => 100, :y => 100, :width => 200, :crop => :fill }, { :radius => 10 }], :crop => :crop, :width => 100 }])
         | 
| 235 230 | 
             
                    .to produce_url("#{upload_path}/c_fill,w_200,x_100,y_100/r_10/c_crop,w_100/test")
         | 
| 236 | 
            -
             | 
| 231 | 
            +
                          .and mutate_options_to({ :width => 100 })
         | 
| 237 232 | 
             
                end
         | 
| 238 233 |  | 
| 239 234 | 
             
                it "should support array of tranformations" do
         | 
| 240 | 
            -
                  result = Cloudinary::Utils.generate_transformation_string([{:x=>100, :y=>100, :width=>200, :crop | 
| 235 | 
            +
                  result = Cloudinary::Utils.generate_transformation_string([{ :x => 100, :y => 100, :width => 200, :crop => :fill }, { :radius => 10 }])
         | 
| 241 236 | 
             
                  expect(result).to eq("c_fill,w_200,x_100,y_100/r_10")
         | 
| 242 237 | 
             
                end
         | 
| 243 238 |  | 
| 244 239 | 
             
                it "should not include empty tranformations" do
         | 
| 245 | 
            -
                  expect(["test", { :transformation => [{}, { :x => 100, :y => 100, :crop => :fill },{}] }])
         | 
| 240 | 
            +
                  expect(["test", { :transformation => [{}, { :x => 100, :y => 100, :crop => :fill }, {}] }])
         | 
| 246 241 | 
             
                    .to produce_url("#{upload_path}/c_fill,x_100,y_100/test")
         | 
| 247 | 
            -
             | 
| 242 | 
            +
                          .and empty_options
         | 
| 248 243 | 
             
                end
         | 
| 249 244 | 
             
              end
         | 
| 250 245 |  | 
| @@ -354,11 +349,11 @@ describe Cloudinary::Utils do | |
| 354 349 | 
             
                                              :type => 'authenticated',
         | 
| 355 350 | 
             
                                              :tags => TEST_TAG
         | 
| 356 351 | 
             
                end
         | 
| 357 | 
            -
                let(:options) {{ :version => authenticated_image['version'], :sign_url => true, :type => :authenticated }.merge(specific_options)}
         | 
| 352 | 
            +
                let(:options) { { :version => authenticated_image['version'], :sign_url => true, :type => :authenticated }.merge(specific_options) }
         | 
| 358 353 | 
             
                let(:authenticated_path) { "#{root_path}/image/authenticated" }
         | 
| 359 354 |  | 
| 360 355 | 
             
                it "should not serve resource with the wrong signature" do
         | 
| 361 | 
            -
                  expect(authenticated_image["url"].sub(/(?:s--)([\w-]+)(?:--)/) {|s| s.succ})
         | 
| 356 | 
            +
                  expect(authenticated_image["url"].sub(/(?:s--)([\w-]+)(?:--)/) { |s| s.succ })
         | 
| 362 357 | 
             
                    .not_to be_served_by_cloudinary
         | 
| 363 358 | 
             
                end
         | 
| 364 359 |  | 
| @@ -395,14 +390,14 @@ describe Cloudinary::Utils do | |
| 395 390 | 
             
              { 'overlay' => :l, :underlay => :u }.each do |param, letter|
         | 
| 396 391 | 
             
                describe param do
         | 
| 397 392 | 
             
                  let(:root_path) { "http://res.cloudinary.com/#{cloud_name}" }
         | 
| 398 | 
            -
                  # [name, options, result]
         | 
| 399 393 | 
             
                  let(:layers_options) { [
         | 
| 400 | 
            -
             | 
| 401 | 
            -
                    [" | 
| 402 | 
            -
                    ["public_id | 
| 403 | 
            -
                    [" | 
| 404 | 
            -
                    [" | 
| 405 | 
            -
                    [" | 
| 394 | 
            +
                  # [name,                    options,                                              result]
         | 
| 395 | 
            +
                    ["string",                "text:hello",                                         "text:hello"],
         | 
| 396 | 
            +
                    ["public_id",             { "public_id" => "logo" },                            "logo"],
         | 
| 397 | 
            +
                    ["public_id with folder", { "public_id" => "folder/logo" },                     "folder:logo"],
         | 
| 398 | 
            +
                    ["private",               { "public_id" => "logo", "type" => "private" },       "private:logo"],
         | 
| 399 | 
            +
                    ["format",                { "public_id" => "logo", "format" => "png" },         "logo.png"],
         | 
| 400 | 
            +
                    ["video",                 { "resource_type" => "video", "public_id" => "cat" }, "video:cat"],
         | 
| 406 401 | 
             
                  ] }
         | 
| 407 402 | 
             
                  it "should support #{param}" do
         | 
| 408 403 | 
             
                    layers_options.each do |name, options, result|
         | 
| @@ -418,11 +413,11 @@ describe Cloudinary::Utils do | |
| 418 413 | 
             
                end
         | 
| 419 414 | 
             
              end
         | 
| 420 415 |  | 
| 421 | 
            -
             | 
| 422 416 | 
             
              describe "text" do
         | 
| 423 417 |  | 
| 424 | 
            -
                text_layer | 
| 418 | 
            +
                text_layer   = "Hello World, /Nice to meet you?"
         | 
| 425 419 | 
             
                text_encoded = "Hello%20World%252C%20%252FNice%20to%20meet%20you%3F"
         | 
| 420 | 
            +
             | 
| 426 421 | 
             
                before :all do
         | 
| 427 422 | 
             
                  Cloudinary::Uploader.text(text_layer, {
         | 
| 428 423 | 
             
                    :public_id   => "test_text",
         | 
| @@ -431,7 +426,7 @@ describe Cloudinary::Utils do | |
| 431 426 | 
             
                    :font_size   => "18",
         | 
| 432 427 | 
             
                    :tags        => TEST_TAG
         | 
| 433 428 | 
             
                  })
         | 
| 434 | 
            -
                  srt = Tempfile.new('test_subtitles.srt')
         | 
| 429 | 
            +
                  srt = Tempfile.new(['test_subtitles', '.srt'])
         | 
| 435 430 | 
             
                  srt.write <<-END
         | 
| 436 431 | 
             
                  1
         | 
| 437 432 | 
             
                  00:00:10,500 --> 00:00:13,000
         | 
| @@ -443,20 +438,18 @@ describe Cloudinary::Utils do | |
| 443 438 | 
             
                  srt.unlink
         | 
| 444 439 | 
             
                end
         | 
| 445 440 |  | 
| 446 | 
            -
                 | 
| 447 | 
            -
                #   Cloudinary::Api.delete_resources_by_tag TEST_TAG
         | 
| 448 | 
            -
                # end
         | 
| 441 | 
            +
                include_context "cleanup"
         | 
| 449 442 |  | 
| 450 443 | 
             
                { 'overlay' => 'l', 'underlay' => 'u' }.each do |param, short|
         | 
| 451 444 | 
             
                  describe param do
         | 
| 452 445 | 
             
                    let(:root_path) { "http://res.cloudinary.com/#{cloud_name}" }
         | 
| 453 446 | 
             
                    # [name, options, result]
         | 
| 454 | 
            -
                    layers_options= | 
| 447 | 
            +
                    layers_options= [
         | 
| 455 448 | 
             
                      ["string", "text:test_text:hello", "text:test_text:hello"],
         | 
| 456 | 
            -
                      ["explicit layer parameter", | 
| 457 | 
            -
                      ["text parameter", { :public_id => "test_text", :text => text_layer }, "text:test_text:#{text_encoded}" | 
| 449 | 
            +
                      ["explicit layer parameter", "text:test_text:#{text_encoded}", "text:test_text:#{text_encoded}"],
         | 
| 450 | 
            +
                      ["text parameter", { :public_id => "test_text", :text => text_layer }, "text:test_text:#{text_encoded}"],
         | 
| 458 451 | 
             
                      ["text with font family and size parameters", { :text => text_layer, :font_family => "Arial", :font_size => "18" }, "text:Arial_18:#{text_encoded}"],
         | 
| 459 | 
            -
                      ["text with text style parameter", { :text => text_layer, :font_family => "Arial", :font_size => "18", :font_weight => "bold", :font_style => "italic", :letter_spacing => 4 }, "text: | 
| 452 | 
            +
                      ["text with text style parameter", { :text => text_layer, :font_family => "Arial", :font_size => "18", :font_weight => "bold", :font_style => "italic", :letter_spacing => 4, :line_spacing => 2 }, "text:Arial_18_bold_italic_letter_spacing_4_line_spacing_2:#{text_encoded}"],
         | 
| 460 453 | 
             
                      ["subtitles", { :resource_type => "subtitles", :public_id => "subtitles.srt" }, "subtitles:subtitles.srt"],
         | 
| 461 454 | 
             
                      ["subtitles with font family and size", { :resource_type => "subtitles", :public_id => "subtitles.srt", :font_family => "Arial", :font_size => "40" }, "subtitles:Arial_40:subtitles.srt"]
         | 
| 462 455 | 
             
                    ]
         | 
| @@ -466,7 +459,7 @@ describe Cloudinary::Utils do | |
| 466 459 | 
             
                        expect("#{upload_path}/#{short}_#{result}/sample").to be_served_by_cloudinary
         | 
| 467 460 | 
             
                      end
         | 
| 468 461 | 
             
                      unless options.is_a? String
         | 
| 469 | 
            -
                        op | 
| 462 | 
            +
                        op        = Hash.new
         | 
| 470 463 | 
             
                        op[param] = options
         | 
| 471 464 | 
             
                        it_behaves_like "a signed url", op, "#{short}_#{result}"
         | 
| 472 465 | 
             
                      end
         | 
| @@ -483,131 +476,141 @@ describe Cloudinary::Utils do | |
| 483 476 | 
             
              end
         | 
| 484 477 |  | 
| 485 478 |  | 
| 486 | 
            -
             | 
| 487 479 | 
             
              it "should use ssl_detected if secure is not given as parameter and not set to true in configuration" do
         | 
| 488 | 
            -
                expect(["test",{:ssl_detected=>true}])
         | 
| 480 | 
            +
                expect(["test", { :ssl_detected => true }])
         | 
| 489 481 | 
             
                  .to produce_url("https://res.cloudinary.com/#{cloud_name}/image/upload/test")
         | 
| 490 | 
            -
             | 
| 482 | 
            +
                        .and empty_options
         | 
| 491 483 | 
             
              end
         | 
| 492 484 |  | 
| 493 485 | 
             
              it "should use secure if given over ssl_detected and configuration" do
         | 
| 494 486 | 
             
                Cloudinary.config.secure = true
         | 
| 495 | 
            -
                expect(["test",{ :ssl_detected => true, :secure => false }])
         | 
| 487 | 
            +
                expect(["test", { :ssl_detected => true, :secure => false }])
         | 
| 496 488 | 
             
                  .to produce_url("#{upload_path}/test")
         | 
| 497 | 
            -
             | 
| 489 | 
            +
                        .and empty_options
         | 
| 498 490 | 
             
              end
         | 
| 499 491 |  | 
| 500 492 | 
             
              it "should use secure: true from configuration over ssl_detected" do
         | 
| 501 493 | 
             
                Cloudinary.config.secure = true
         | 
| 502 | 
            -
                expect(["test",{:ssl_detected=>false}])
         | 
| 494 | 
            +
                expect(["test", { :ssl_detected => false }])
         | 
| 503 495 | 
             
                  .to produce_url("https://res.cloudinary.com/#{cloud_name}/image/upload/test")
         | 
| 504 | 
            -
             | 
| 496 | 
            +
                        .and empty_options
         | 
| 505 497 | 
             
              end
         | 
| 506 498 |  | 
| 507 499 | 
             
              it "should support extenal cname" do
         | 
| 508 | 
            -
                expect(["test",{:cname=>"hello.com"}])
         | 
| 500 | 
            +
                expect(["test", { :cname => "hello.com" }])
         | 
| 509 501 | 
             
                  .to produce_url("http://hello.com/#{cloud_name}/image/upload/test")
         | 
| 510 | 
            -
             | 
| 502 | 
            +
                        .and empty_options
         | 
| 511 503 | 
             
              end
         | 
| 512 504 |  | 
| 513 505 | 
             
              it "should support extenal cname with cdn_subdomain on" do
         | 
| 514 | 
            -
                expect(["test",{:cname=>"hello.com", :cdn_subdomain=>true}])
         | 
| 506 | 
            +
                expect(["test", { :cname => "hello.com", :cdn_subdomain => true }])
         | 
| 515 507 | 
             
                  .to produce_url("http://a2.hello.com/#{cloud_name}/image/upload/test")
         | 
| 516 | 
            -
             | 
| 508 | 
            +
                        .and empty_options
         | 
| 517 509 | 
             
              end
         | 
| 518 510 |  | 
| 519 511 | 
             
              it "should support cdn_subdomain with secure on if using shared_domain" do
         | 
| 520 | 
            -
                expect(["test",{:secure=>true, :cdn_subdomain=>true}])
         | 
| 512 | 
            +
                expect(["test", { :secure => true, :cdn_subdomain => true }])
         | 
| 521 513 | 
             
                  .to produce_url("https://res-2.cloudinary.com/#{cloud_name}/image/upload/test")
         | 
| 522 | 
            -
             | 
| 514 | 
            +
                        .and empty_options
         | 
| 523 515 | 
             
              end
         | 
| 524 516 |  | 
| 525 517 | 
             
              it "should support secure_cdn_subdomain false override with secure" do
         | 
| 526 | 
            -
                expect(["test",{:secure=>true, :cdn_subdomain=>true, :secure_cdn_subdomain=>false}])
         | 
| 518 | 
            +
                expect(["test", { :secure => true, :cdn_subdomain => true, :secure_cdn_subdomain => false }])
         | 
| 527 519 | 
             
                  .to produce_url("https://res.cloudinary.com/#{cloud_name}/image/upload/test")
         | 
| 528 | 
            -
             | 
| 520 | 
            +
                        .and empty_options
         | 
| 529 521 | 
             
              end
         | 
| 530 522 |  | 
| 531 523 | 
             
              it "should support secure_cdn_subdomain true override with secure" do
         | 
| 532 | 
            -
                expect(["test",{:secure=>true, :cdn_subdomain=>true, :secure_cdn_subdomain=>true, :private_cdn=>true}])
         | 
| 524 | 
            +
                expect(["test", { :secure => true, :cdn_subdomain => true, :secure_cdn_subdomain => true, :private_cdn => true }])
         | 
| 533 525 | 
             
                  .to produce_url("https://#{cloud_name}-res-2.cloudinary.com/image/upload/test")
         | 
| 534 | 
            -
             | 
| 526 | 
            +
                        .and empty_options
         | 
| 535 527 | 
             
              end
         | 
| 536 528 |  | 
| 537 529 | 
             
              it "should support string param" do
         | 
| 538 | 
            -
                expect(["test",{ "effect" => { "sepia" => 10 } }])
         | 
| 530 | 
            +
                expect(["test", { "effect" => { "sepia" => 10 } }])
         | 
| 539 531 | 
             
                  .to produce_url("#{upload_path}/e_sepia:10/test")
         | 
| 540 | 
            -
             | 
| 532 | 
            +
                        .and empty_options
         | 
| 541 533 | 
             
              end
         | 
| 542 534 |  | 
| 543 535 | 
             
              it "should support border" do
         | 
| 544 | 
            -
                expect(["test",{ "border" => { :width => 5 } }])
         | 
| 536 | 
            +
                expect(["test", { "border" => { :width => 5 } }])
         | 
| 545 537 | 
             
                  .to produce_url("#{upload_path}/bo_5px_solid_black/test")
         | 
| 546 | 
            -
             | 
| 547 | 
            -
                expect(["test",{ "border" => { :width => 5, :color => "#ffaabbdd" } }])
         | 
| 538 | 
            +
                        .and empty_options
         | 
| 539 | 
            +
                expect(["test", { "border" => { :width => 5, :color => "#ffaabbdd" } }])
         | 
| 548 540 | 
             
                  .to produce_url("#{upload_path}/bo_5px_solid_rgb:ffaabbdd/test")
         | 
| 549 | 
            -
             | 
| 550 | 
            -
                expect(["test",{ "border" => "1px_solid_blue" }])
         | 
| 541 | 
            +
                        .and empty_options
         | 
| 542 | 
            +
                expect(["test", { "border" => "1px_solid_blue" }])
         | 
| 551 543 | 
             
                  .to produce_url("#{upload_path}/bo_1px_solid_blue/test")
         | 
| 552 | 
            -
             | 
| 544 | 
            +
                        .and empty_options
         | 
| 553 545 | 
             
                expect(["test", { "border" => "2" }]).to produce_url("#{upload_path}/test").and mutate_options_to({ :border => "2" })
         | 
| 554 546 | 
             
              end
         | 
| 555 547 |  | 
| 556 548 | 
             
              it "should support flags" do
         | 
| 557 | 
            -
                expect(["test",{ "flags" => "abc" }])
         | 
| 549 | 
            +
                expect(["test", { "flags" => "abc" }])
         | 
| 558 550 | 
             
                  .to produce_url("#{upload_path}/fl_abc/test")
         | 
| 559 | 
            -
             | 
| 560 | 
            -
                expect(["test",{ "flags" => ["abc", "def"] }])
         | 
| 551 | 
            +
                        .and empty_options
         | 
| 552 | 
            +
                expect(["test", { "flags" => ["abc", "def"] }])
         | 
| 561 553 | 
             
                  .to produce_url("#{upload_path}/fl_abc.def/test")
         | 
| 562 | 
            -
             | 
| 554 | 
            +
                        .and empty_options
         | 
| 555 | 
            +
              end
         | 
| 556 | 
            +
             | 
| 557 | 
            +
              it "should support aspect ratio" do
         | 
| 558 | 
            +
                expect(["test", { "aspect_ratio" => "1.0" }])
         | 
| 559 | 
            +
                  .to produce_url("#{upload_path}/ar_1.0/test")
         | 
| 560 | 
            +
                        .and empty_options
         | 
| 561 | 
            +
                expect(["test", { "aspect_ratio" => "3:2" }])
         | 
| 562 | 
            +
                  .to produce_url("#{upload_path}/ar_3:2/test")
         | 
| 563 | 
            +
                        .and empty_options
         | 
| 563 564 | 
             
              end
         | 
| 564 565 |  | 
| 565 566 | 
             
              it "build_upload_params should not destroy options" do
         | 
| 566 | 
            -
                options = {:width=>100, :crop | 
| 567 | 
            +
                options = { :width => 100, :crop => :scale }
         | 
| 567 568 | 
             
                expect(Cloudinary::Uploader.build_upload_params(options)[:transformation]).to eq("c_scale,w_100")
         | 
| 568 569 | 
             
                expect(options.length).to eq(2)
         | 
| 569 570 | 
             
              end
         | 
| 570 571 |  | 
| 571 572 | 
             
              it "build_upload_params canonize booleans" do
         | 
| 572 | 
            -
                options = {:backup=>true, :use_filename=>false, :colors | 
| 573 | 
            -
             | 
| 574 | 
            -
                params | 
| 575 | 
            -
                expect(Cloudinary::Api.only(params, *options.keys)) | 
| 576 | 
            -
                  :backup=> | 
| 577 | 
            -
             | 
| 578 | 
            -
             | 
| 579 | 
            -
             | 
| 580 | 
            -
             | 
| 581 | 
            -
             | 
| 582 | 
            -
             | 
| 583 | 
            -
                )
         | 
| 584 | 
            -
                expect(Cloudinary:: | 
| 573 | 
            +
                options = { :backup         => true, :use_filename => false, :colors => :true,
         | 
| 574 | 
            +
                            :image_metadata => :false, :invalidate => 1 }
         | 
| 575 | 
            +
                params  = Cloudinary::Uploader.build_upload_params(options)
         | 
| 576 | 
            +
                expect(Cloudinary::Api.only(params, *options.keys))
         | 
| 577 | 
            +
                  .to eq(:backup         => 1,
         | 
| 578 | 
            +
                         :use_filename   => 0,
         | 
| 579 | 
            +
                         :colors         => 1,
         | 
| 580 | 
            +
                         :image_metadata => 0,
         | 
| 581 | 
            +
                         :invalidate     => 1
         | 
| 582 | 
            +
                      )
         | 
| 583 | 
            +
                options = { :colors => "true", :exif => "false", :eager_async => "1" }
         | 
| 584 | 
            +
                params  = Cloudinary::Uploader.build_upload_params(options)
         | 
| 585 | 
            +
                expect(Cloudinary::Api.only(params, *options.keys))
         | 
| 586 | 
            +
                  .to eq(:exif => 0, :colors => 1, :eager_async => 1)
         | 
| 587 | 
            +
                expect(Cloudinary::Uploader.build_upload_params(:backup => nil)[:backup]).to be_nil
         | 
| 585 588 | 
             
                expect(Cloudinary::Uploader.build_upload_params({})[:backup]).to be_nil
         | 
| 586 589 | 
             
              end
         | 
| 587 590 |  | 
| 588 591 | 
             
              it "should add version if public_id contains /" do
         | 
| 589 592 | 
             
                expect(["folder/test", {}])
         | 
| 590 | 
            -
                  .to produce_url( | 
| 591 | 
            -
             | 
| 592 | 
            -
                expect(["folder/test",{ :version => 123 }])
         | 
| 593 | 
            +
                  .to produce_url("#{upload_path}/v1/folder/test")
         | 
| 594 | 
            +
                        .and empty_options
         | 
| 595 | 
            +
                expect(["folder/test", { :version => 123 }])
         | 
| 593 596 | 
             
                  .to produce_url("#{upload_path}/v123/folder/test")
         | 
| 594 | 
            -
             | 
| 597 | 
            +
                        .and empty_options
         | 
| 595 598 | 
             
              end
         | 
| 596 599 |  | 
| 597 600 | 
             
              it "should not add version if public_id contains version already" do
         | 
| 598 601 | 
             
                expect(["v1234/test", {}])
         | 
| 599 | 
            -
                  .to produce_url( | 
| 600 | 
            -
             | 
| 602 | 
            +
                  .to produce_url("#{upload_path}/v1234/test")
         | 
| 603 | 
            +
                        .and empty_options
         | 
| 601 604 | 
             
              end
         | 
| 602 605 |  | 
| 603 606 | 
             
              it "should allow to shorted image/upload urls" do
         | 
| 604 | 
            -
                expect(["test",{ :shorten => true }])
         | 
| 607 | 
            +
                expect(["test", { :shorten => true }])
         | 
| 605 608 | 
             
                  .to produce_url("#{root_path}/iu/test")
         | 
| 606 | 
            -
             | 
| 609 | 
            +
                        .and empty_options
         | 
| 607 610 | 
             
              end
         | 
| 608 611 |  | 
| 609 612 | 
             
              it "should allow to use folders in PreloadedFile" do
         | 
| 610 | 
            -
                signature = Cloudinary::Utils.api_sign_request({:public_id=>"folder/file", :version=>"1234"}, Cloudinary.config.api_secret)
         | 
| 613 | 
            +
                signature = Cloudinary::Utils.api_sign_request({ :public_id => "folder/file", :version => "1234" }, Cloudinary.config.api_secret)
         | 
| 611 614 | 
             
                preloaded = Cloudinary::PreloadedFile.new("image/upload/v1234/folder/file.jpg#" + signature)
         | 
| 612 615 | 
             
                expect(preloaded).to be_valid
         | 
| 613 616 | 
             
              end
         | 
| @@ -621,7 +624,7 @@ describe Cloudinary::Utils do | |
| 621 624 | 
             
                  ["a??b", "a%3F%3Fb"],
         | 
| 622 625 | 
             
                  ["parentheses(interject)", "parentheses%28interject%29"]
         | 
| 623 626 | 
             
                ].each do
         | 
| 624 | 
            -
             | 
| 627 | 
            +
                |source, target|
         | 
| 625 628 | 
             
                  expect(Cloudinary::Utils.cloudinary_url(source)).to eq("#{upload_path}/#{target}")
         | 
| 626 629 | 
             
                end
         | 
| 627 630 | 
             
              end
         | 
| @@ -636,29 +639,33 @@ describe Cloudinary::Utils do | |
| 636 639 | 
             
              end
         | 
| 637 640 |  | 
| 638 641 | 
             
              it "should correctly sign_request" do
         | 
| 639 | 
            -
                params = Cloudinary::Utils.sign_request( | 
| 640 | 
            -
                   | 
| 641 | 
            -
             | 
| 642 | 
            -
             | 
| 643 | 
            -
                   | 
| 644 | 
            -
             | 
| 645 | 
            -
                 | 
| 646 | 
            -
             | 
| 642 | 
            +
                params = Cloudinary::Utils.sign_request(
         | 
| 643 | 
            +
                  {
         | 
| 644 | 
            +
                    :public_id => "folder/file",
         | 
| 645 | 
            +
                    :version   => "1234" },
         | 
| 646 | 
            +
                  {
         | 
| 647 | 
            +
                    :cloud_name => "demo",
         | 
| 648 | 
            +
                    :api_key    => "1234",
         | 
| 649 | 
            +
                    :api_secret => "b"
         | 
| 650 | 
            +
                  }
         | 
| 647 651 | 
             
                )
         | 
| 652 | 
            +
                expect(params).to include(:signature => "7a3349cbb373e4812118d625047ede50b90e7b67")
         | 
| 648 653 | 
             
              end
         | 
| 649 654 |  | 
| 650 655 | 
             
              it "should support responsive width" do
         | 
| 651 | 
            -
                expect(["test",{ :width => 100, :height => 100, :crop => :crop, :responsive_width => true }])
         | 
| 656 | 
            +
                expect(["test", { :width => 100, :height => 100, :crop => :crop, :responsive_width => true }])
         | 
| 652 657 | 
             
                  .to produce_url("#{upload_path}/c_crop,h_100,w_100/c_limit,w_auto/test")
         | 
| 653 | 
            -
             | 
| 654 | 
            -
                Cloudinary.config.responsive_width_transformation = {:width => :auto, :crop => :pad}
         | 
| 658 | 
            +
                        .and mutate_options_to({ :responsive => true })
         | 
| 659 | 
            +
                Cloudinary.config.responsive_width_transformation = { :width => :auto, :crop => :pad }
         | 
| 655 660 | 
             
                expect(["test", { :width => 100, :height => 100, :crop => :crop, :responsive_width => true }])
         | 
| 656 | 
            -
             | 
| 657 | 
            -
             | 
| 661 | 
            +
                  .to produce_url("#{upload_path}/c_crop,h_100,w_100/c_pad,w_auto/test")
         | 
| 662 | 
            +
                        .and mutate_options_to({ :responsive => true })
         | 
| 658 663 | 
             
              end
         | 
| 659 664 |  | 
| 660 665 | 
             
              it "should correctly encode double arrays" do
         | 
| 661 | 
            -
                expect(Cloudinary::Utils.encode_double_array([1,2,3,4])).to eq("1,2,3,4")
         | 
| 662 | 
            -
                expect(Cloudinary::Utils.encode_double_array([[1,2,3,4],[5,6,7,8]])).to eq("1,2,3,4|5,6,7,8")
         | 
| 666 | 
            +
                expect(Cloudinary::Utils.encode_double_array([1, 2, 3, 4])).to eq("1,2,3,4")
         | 
| 667 | 
            +
                expect(Cloudinary::Utils.encode_double_array([[1, 2, 3, 4], [5, 6, 7, 8]])).to eq("1,2,3,4|5,6,7,8")
         | 
| 663 668 | 
             
              end
         | 
| 669 | 
            +
             | 
| 670 | 
            +
             | 
| 664 671 | 
             
            end
         |