asset_cloud 2.7.0 → 2.7.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/.github/workflows/ci.yml +42 -0
- data/.github/workflows/cla.yml +22 -0
- data/.rubocop.yml +3 -1
- data/Gemfile +5 -3
- data/History.md +8 -0
- data/README.rdoc +3 -4
- data/Rakefile +18 -16
- data/asset_cloud.gemspec +19 -18
- data/dev.yml +1 -1
- data/lib/asset_cloud/asset.rb +17 -13
- data/lib/asset_cloud/asset_extension.rb +27 -15
- data/lib/asset_cloud/base.rb +77 -72
- data/lib/asset_cloud/bucket.rb +5 -2
- data/lib/asset_cloud/buckets/active_record_bucket.rb +16 -14
- data/lib/asset_cloud/buckets/blackhole_bucket.rb +2 -0
- data/lib/asset_cloud/buckets/bucket_chain.rb +38 -31
- data/lib/asset_cloud/buckets/file_system_bucket.rb +14 -15
- data/lib/asset_cloud/buckets/gcs_bucket.rb +6 -8
- data/lib/asset_cloud/buckets/invalid_bucket.rb +9 -6
- data/lib/asset_cloud/buckets/memory_bucket.rb +7 -4
- data/lib/asset_cloud/buckets/s3_bucket.rb +11 -8
- data/lib/asset_cloud/buckets/versioned_memory_bucket.rb +4 -2
- data/lib/asset_cloud/callbacks.rb +9 -5
- data/lib/asset_cloud/free_key_locator.rb +6 -6
- data/lib/asset_cloud/metadata.rb +11 -7
- data/lib/asset_cloud/validations.rb +9 -5
- data/lib/asset_cloud.rb +23 -21
- data/spec/active_record_bucket_spec.rb +27 -26
- data/spec/asset_cloud/metadata_spec.rb +4 -2
- data/spec/asset_extension_spec.rb +17 -16
- data/spec/asset_spec.rb +27 -21
- data/spec/base_spec.rb +93 -92
- data/spec/blackhole_bucket_spec.rb +12 -11
- data/spec/bucket_chain_spec.rb +61 -56
- data/spec/bucket_spec.rb +6 -5
- data/spec/callbacks_spec.rb +52 -32
- data/spec/file_system_spec.rb +25 -24
- data/spec/find_free_key_spec.rb +16 -17
- data/spec/gcs_bucket_remote_spec.rb +23 -22
- data/spec/gcs_bucket_spec.rb +48 -60
- data/spec/memory_bucket_spec.rb +12 -11
- data/spec/mock_s3_interface.rb +17 -6
- data/spec/remote_s3_bucket_spec.rb +31 -28
- data/spec/s3_bucket_spec.rb +19 -17
- data/spec/spec_helper.rb +8 -7
- data/spec/validations_spec.rb +13 -12
- data/spec/versioned_memory_bucket_spec.rb +11 -10
- metadata +10 -33
- data/.github/probots.yml +0 -2
- data/.rubocop_todo.yml +0 -326
- data/.travis.yml +0 -12
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 568dd22b66b6a00beacf0a8d099cad040bcddac422b3932b946573d823e67291
         | 
| 4 | 
            +
              data.tar.gz: 8e97aa129cc5c6617722a6f5212ff51562cee437ba22476ceb63d7ad9dc62d25
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 3cde8568299bb0b63c31ce9affa4880bcc7aa1940a63d1541210289f25dc7766528846d110a9b00ae7d1a412bc5bb2e695294b4bff851fb7aa0cc090856ed2bb
         | 
| 7 | 
            +
              data.tar.gz: 821d7f7f2fe4c37df691d52b40217168638ff2d2d5cc3ee2dd056ec231e30f44584b1dbd538dc98d167d07d1a29ac0948bbde798d1b7f1870324f593090ecf88
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            name: CI
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            on: [push, pull_request]
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            jobs:
         | 
| 6 | 
            +
              test:
         | 
| 7 | 
            +
                runs-on: ubuntu-latest
         | 
| 8 | 
            +
                name: Ruby ${{ matrix.ruby }}
         | 
| 9 | 
            +
                strategy:
         | 
| 10 | 
            +
                  fail-fast: false
         | 
| 11 | 
            +
                  matrix:
         | 
| 12 | 
            +
                    ruby: ["2.5", "2.6", "2.7", "3.0", "3.1", "3.2"]
         | 
| 13 | 
            +
                steps:
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                - name: Check out code
         | 
| 16 | 
            +
                  uses: actions/checkout@v3
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                - name: Set up Ruby ${{ matrix.ruby }}
         | 
| 19 | 
            +
                  uses: ruby/setup-ruby@v1
         | 
| 20 | 
            +
                  with:
         | 
| 21 | 
            +
                    ruby-version: ${{ matrix.ruby }}
         | 
| 22 | 
            +
                    bundler-cache: true
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                - name: Tests
         | 
| 25 | 
            +
                  run: bundle exec rspec
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              lint:
         | 
| 28 | 
            +
                runs-on: ubuntu-latest
         | 
| 29 | 
            +
                name: RuboCop
         | 
| 30 | 
            +
                steps:
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                - name: Check out code
         | 
| 33 | 
            +
                  uses: actions/checkout@v3
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                - name: Set up Ruby
         | 
| 36 | 
            +
                  uses: ruby/setup-ruby@v1
         | 
| 37 | 
            +
                  with:
         | 
| 38 | 
            +
                    ruby-version: '3.2'
         | 
| 39 | 
            +
                    bundler-cache: true
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                - name: RuboCop
         | 
| 42 | 
            +
                  run: bundle exec rubocop
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            name: Contributor License Agreement (CLA)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            on:
         | 
| 4 | 
            +
              pull_request_target:
         | 
| 5 | 
            +
                types: [opened, synchronize]
         | 
| 6 | 
            +
              issue_comment:
         | 
| 7 | 
            +
                types: [created]
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            jobs:
         | 
| 10 | 
            +
              cla:
         | 
| 11 | 
            +
                runs-on: ubuntu-latest
         | 
| 12 | 
            +
                if: |
         | 
| 13 | 
            +
                  (github.event.issue.pull_request 
         | 
| 14 | 
            +
                    && !github.event.issue.pull_request.merged_at
         | 
| 15 | 
            +
                    && contains(github.event.comment.body, 'signed')
         | 
| 16 | 
            +
                  ) 
         | 
| 17 | 
            +
                  || (github.event.pull_request && !github.event.pull_request.merged)
         | 
| 18 | 
            +
                steps:
         | 
| 19 | 
            +
                  - uses: Shopify/shopify-cla-action@v1
         | 
| 20 | 
            +
                    with:
         | 
| 21 | 
            +
                      github-token: ${{ secrets.GITHUB_TOKEN }}
         | 
| 22 | 
            +
                      cla-token: ${{ secrets.CLA_TOKEN }}
         | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    | @@ -1,6 +1,8 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 3 | 
            +
            source "https://rubygems.org"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            gem "aws-sdk-s3", ">= 1.60.2", require: false
         | 
| 6 | 
            +
            gem "google-cloud-storage"
         | 
| 5 7 |  | 
| 6 8 | 
             
            gemspec
         | 
    
        data/History.md
    CHANGED
    
    | @@ -1,5 +1,13 @@ | |
| 1 1 | 
             
            # Asset Cloud Version History
         | 
| 2 2 |  | 
| 3 | 
            +
            ## Version 2.7.2, 2023-04-20
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Swap the order of operations for checking UUID and asset exist logic in free key locator (https://github.com/Shopify/asset_cloud/pull/83)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## Version 2.7.1, 2022-03-18
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            * Fix incorrect invocation of callbacks defined in external classes (https://github.com/Shopify/asset_cloud/issues/71)
         | 
| 10 | 
            +
             | 
| 3 11 | 
             
            ## Version 2.7.0, 2020-07-15
         | 
| 4 12 |  | 
| 5 13 | 
             
            * Add `Asset#write!` which raises on validation failure (https://github.com/Shopify/asset_cloud/pull/67)
         | 
    
        data/README.rdoc
    CHANGED
    
    | @@ -34,13 +34,12 @@ With GCS Remote test: | |
| 34 34 |  | 
| 35 35 | 
             
            Releasing is handled by Shopify's internal Shipit server.
         | 
| 36 36 |  | 
| 37 | 
            -
            After merging a change, a separate PR should be opened to update  | 
| 38 | 
            -
            (following  | 
| 37 | 
            +
            After merging a change, a separate PR should be opened to update +History.md+ and bump the version
         | 
| 38 | 
            +
            (following {Semantic Versioning}[https://semver.org]).
         | 
| 39 39 |  | 
| 40 40 | 
             
            When merged, the new release will be automatically tagged and deployed to rubygems.org.
         | 
| 41 41 |  | 
| 42 | 
            -
            Note that the automatic process does not create a new [ | 
| 43 | 
            -
            GitHub.
         | 
| 42 | 
            +
            Note that the automatic process does not create a new {release}[https://github.com/Shopify/asset_cloud/releases] on GitHub.
         | 
| 44 43 |  | 
| 45 44 | 
             
            == Copyright
         | 
| 46 45 |  | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,28 +1,30 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
            require 'rspec'
         | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 3 2 |  | 
| 4 | 
            -
            require  | 
| 5 | 
            -
            require  | 
| 6 | 
            -
            require 'rdoc/task'
         | 
| 7 | 
            -
            require 'rspec/core/rake_task'
         | 
| 8 | 
            -
            require 'rubocop/rake_task'
         | 
| 3 | 
            +
            require "bundler/gem_tasks"
         | 
| 4 | 
            +
            require "rspec"
         | 
| 9 5 |  | 
| 10 | 
            -
             | 
| 6 | 
            +
            require "rake"
         | 
| 7 | 
            +
            require "rake/testtask"
         | 
| 8 | 
            +
            require "rdoc/task"
         | 
| 9 | 
            +
            require "rspec/core/rake_task"
         | 
| 10 | 
            +
            require "rubocop/rake_task"
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            desc "Default: run unit tests and style checks."
         | 
| 11 13 | 
             
            task default: [:spec, :rubocop]
         | 
| 12 14 |  | 
| 13 15 | 
             
            desc "Run all spec examples"
         | 
| 14 16 | 
             
            RSpec::Core::RakeTask.new do |t|
         | 
| 15 | 
            -
              t.pattern =  | 
| 16 | 
            -
              t.rspec_opts = [ | 
| 17 | 
            +
              t.pattern = "spec/**/*_spec.rb"
         | 
| 18 | 
            +
              t.rspec_opts = ["--color"]
         | 
| 17 19 | 
             
            end
         | 
| 18 20 |  | 
| 19 | 
            -
            desc  | 
| 21 | 
            +
            desc "Generate documentation for the asset_cloud plugin."
         | 
| 20 22 | 
             
            Rake::RDocTask.new(:rdoc) do |rdoc|
         | 
| 21 | 
            -
              rdoc.rdoc_dir =  | 
| 22 | 
            -
              rdoc.title    =  | 
| 23 | 
            -
              rdoc.options <<  | 
| 24 | 
            -
              rdoc.rdoc_files.include( | 
| 25 | 
            -
              rdoc.rdoc_files.include( | 
| 23 | 
            +
              rdoc.rdoc_dir = "rdoc"
         | 
| 24 | 
            +
              rdoc.title    = "AssetCloud"
         | 
| 25 | 
            +
              rdoc.options << "--line-numbers" << "--inline-source"
         | 
| 26 | 
            +
              rdoc.rdoc_files.include("README")
         | 
| 27 | 
            +
              rdoc.rdoc_files.include("lib/**/*.rb")
         | 
| 26 28 | 
             
            end
         | 
| 27 29 |  | 
| 28 30 | 
             
            RuboCop::RakeTask.new
         | 
    
        data/asset_cloud.gemspec
    CHANGED
    
    | @@ -1,29 +1,30 @@ | |
| 1 1 | 
             
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 2 3 |  | 
| 4 | 
            +
            require "English"
         | 
| 3 5 | 
             
            Gem::Specification.new do |s|
         | 
| 4 | 
            -
              s.name =  | 
| 5 | 
            -
              s.version = "2.7. | 
| 6 | 
            +
              s.name = "asset_cloud"
         | 
| 7 | 
            +
              s.version = "2.7.2"
         | 
| 6 8 |  | 
| 7 | 
            -
              s.authors =  | 
| 8 | 
            -
              s.summary =  | 
| 9 | 
            -
              s.description =  | 
| 9 | 
            +
              s.authors = ["Shopify"]
         | 
| 10 | 
            +
              s.summary = "An abstraction layer around arbitrary and diverse asset stores."
         | 
| 11 | 
            +
              s.description = "An abstraction layer around arbitrary and diverse asset stores."
         | 
| 10 12 |  | 
| 11 | 
            -
              s.required_ruby_version =  | 
| 13 | 
            +
              s.required_ruby_version = ">= 2.5.0"
         | 
| 12 14 |  | 
| 13 | 
            -
              s.email =  | 
| 14 | 
            -
              s.homepage =  | 
| 15 | 
            -
              s.require_paths =  | 
| 15 | 
            +
              s.email = "developers@shopify.com"
         | 
| 16 | 
            +
              s.homepage = "http://github.com/Shopify/asset_cloud"
         | 
| 17 | 
            +
              s.require_paths = ["lib"]
         | 
| 16 18 |  | 
| 17 | 
            -
              s.files =  | 
| 18 | 
            -
              s.test_files = s.files.grep(%r{^(test|spec|features)/})
         | 
| 19 | 
            +
              s.files = %x(git ls-files).split($INPUT_RECORD_SEPARATOR)
         | 
| 19 20 |  | 
| 20 | 
            -
              s.add_dependency | 
| 21 | 
            +
              s.add_dependency("activesupport")
         | 
| 21 22 |  | 
| 22 | 
            -
              s.metadata[ | 
| 23 | 
            +
              s.metadata["allowed_push_host"] = "https://rubygems.org"
         | 
| 23 24 |  | 
| 24 | 
            -
              s.add_development_dependency | 
| 25 | 
            -
              s.add_development_dependency | 
| 26 | 
            -
              s.add_development_dependency | 
| 27 | 
            -
              s.add_development_dependency | 
| 28 | 
            -
              s.add_development_dependency | 
| 25 | 
            +
              s.add_development_dependency("pry")
         | 
| 26 | 
            +
              s.add_development_dependency("pry-byebug")
         | 
| 27 | 
            +
              s.add_development_dependency("rake")
         | 
| 28 | 
            +
              s.add_development_dependency("rspec")
         | 
| 29 | 
            +
              s.add_development_dependency("rubocop-shopify")
         | 
| 29 30 | 
             
            end
         | 
    
        data/dev.yml
    CHANGED
    
    
    
        data/lib/asset_cloud/asset.rb
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            module AssetCloud
         | 
| 3 4 | 
             
              class AssetError < StandardError
         | 
| 4 5 | 
             
              end
         | 
| 5 6 |  | 
| @@ -8,8 +9,9 @@ module AssetCloud | |
| 8 9 |  | 
| 9 10 | 
             
              class Asset
         | 
| 10 11 | 
             
                include Comparable
         | 
| 11 | 
            -
                attr_accessor :key, : | 
| 12 | 
            +
                attr_accessor :key, :cloud, :new_asset
         | 
| 12 13 | 
             
                attr_reader   :extensions
         | 
| 14 | 
            +
                attr_writer   :value, :metadata
         | 
| 13 15 |  | 
| 14 16 | 
             
                def initialize(cloud, key, value = nil, metadata = Metadata.non_existing)
         | 
| 15 17 | 
             
                  @new_asset = true
         | 
| @@ -27,10 +29,12 @@ module AssetCloud | |
| 27 29 | 
             
                  yield self if block_given?
         | 
| 28 30 | 
             
                end
         | 
| 29 31 |  | 
| 30 | 
            -
                 | 
| 31 | 
            -
                   | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 32 | 
            +
                class << self
         | 
| 33 | 
            +
                  def at(cloud, key, value = nil, metadata = nil, &block)
         | 
| 34 | 
            +
                    file = new(cloud, key, value, metadata, &block)
         | 
| 35 | 
            +
                    file.new_asset = false
         | 
| 36 | 
            +
                    file
         | 
| 37 | 
            +
                  end
         | 
| 34 38 | 
             
                end
         | 
| 35 39 |  | 
| 36 40 | 
             
                def <=>(other)
         | 
| @@ -42,11 +46,11 @@ module AssetCloud | |
| 42 46 | 
             
                end
         | 
| 43 47 |  | 
| 44 48 | 
             
                def relative_key
         | 
| 45 | 
            -
                  @key.split("/",2).last
         | 
| 49 | 
            +
                  @key.split("/", 2).last
         | 
| 46 50 | 
             
                end
         | 
| 47 51 |  | 
| 48 52 | 
             
                def relative_key_without_ext
         | 
| 49 | 
            -
                  relative_key.gsub(/\.[^.]+$/,"")
         | 
| 53 | 
            +
                  relative_key.gsub(/\.[^.]+$/, "")
         | 
| 50 54 | 
             
                end
         | 
| 51 55 |  | 
| 52 56 | 
             
                def dirname
         | 
| @@ -58,7 +62,7 @@ module AssetCloud | |
| 58 62 | 
             
                end
         | 
| 59 63 |  | 
| 60 64 | 
             
                def format
         | 
| 61 | 
            -
                  extname.sub( | 
| 65 | 
            +
                  extname.sub(".", "")
         | 
| 62 66 | 
             
                end
         | 
| 63 67 |  | 
| 64 68 | 
             
                def basename
         | 
| @@ -122,7 +126,7 @@ module AssetCloud | |
| 122 126 | 
             
                end
         | 
| 123 127 |  | 
| 124 128 | 
             
                def store!
         | 
| 125 | 
            -
                  store  | 
| 129 | 
            +
                  store || raise(AssetNotSaved, "Validation failed: #{errors.join(", ")}")
         | 
| 126 130 | 
             
                end
         | 
| 127 131 |  | 
| 128 132 | 
             
                def to_param
         | 
| @@ -134,11 +138,11 @@ module AssetCloud | |
| 134 138 | 
             
                end
         | 
| 135 139 |  | 
| 136 140 | 
             
                def url(options = {})
         | 
| 137 | 
            -
                  cloud.url_for | 
| 141 | 
            +
                  cloud.url_for(key, options)
         | 
| 138 142 | 
             
                end
         | 
| 139 143 |  | 
| 140 144 | 
             
                def bucket_name
         | 
| 141 | 
            -
                  @key.split( | 
| 145 | 
            +
                  @key.split("/").first
         | 
| 142 146 | 
             
                end
         | 
| 143 147 |  | 
| 144 148 | 
             
                def bucket
         | 
| @@ -169,7 +173,7 @@ module AssetCloud | |
| 169 173 | 
             
                end
         | 
| 170 174 |  | 
| 171 175 | 
             
                def method_missing(method, *args)
         | 
| 172 | 
            -
                  if extension = @extensions.find { |e| e.respond_to?(method) }
         | 
| 176 | 
            +
                  if (extension = @extensions.find { |e| e.respond_to?(method) })
         | 
| 173 177 | 
             
                    extension.public_send(method, *args)
         | 
| 174 178 | 
             
                  else
         | 
| 175 179 | 
             
                    super
         | 
| @@ -1,9 +1,17 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module AssetCloud
         | 
| 2 4 | 
             
              class AssetExtension
         | 
| 3 5 | 
             
                class AssetMismatch < StandardError
         | 
| 4 6 | 
             
                end
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                def  | 
| 7 | 
            +
             | 
| 8 | 
            +
                def store
         | 
| 9 | 
            +
                  true
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def delete
         | 
| 13 | 
            +
                  true
         | 
| 14 | 
            +
                end
         | 
| 7 15 |  | 
| 8 16 | 
             
                include AssetCloud::Callbacks
         | 
| 9 17 | 
             
                include AssetCloud::Validations
         | 
| @@ -11,31 +19,35 @@ module AssetCloud | |
| 11 19 | 
             
                callback_methods :store, :delete, :validate
         | 
| 12 20 |  | 
| 13 21 | 
             
                attr_reader :asset
         | 
| 14 | 
            -
             | 
| 22 | 
            +
             | 
| 23 | 
            +
                delegate :add_error, to: :asset
         | 
| 15 24 |  | 
| 16 25 | 
             
                class_attribute :extnames
         | 
| 17 26 |  | 
| 18 | 
            -
                 | 
| 19 | 
            -
                   | 
| 20 | 
            -
                     | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 27 | 
            +
                class << self
         | 
| 28 | 
            +
                  def applies_to(*args)
         | 
| 29 | 
            +
                    extnames = args.map do |arg|
         | 
| 30 | 
            +
                      arg = arg.to_s.downcase
         | 
| 31 | 
            +
                      arg = ".#{arg}" unless arg.starts_with?(".")
         | 
| 32 | 
            +
                      arg
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
                    self.extnames = extnames
         | 
| 23 35 | 
             
                  end
         | 
| 24 | 
            -
                  self.extnames = extnames
         | 
| 25 | 
            -
                end
         | 
| 26 36 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 37 | 
            +
                  def applies_to_asset?(asset)
         | 
| 38 | 
            +
                    extnames = self.extnames || []
         | 
| 39 | 
            +
                    extnames.each do |extname|
         | 
| 40 | 
            +
                      return true if asset.key.downcase.ends_with?(extname)
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
                    false
         | 
| 31 43 | 
             
                  end
         | 
| 32 | 
            -
                  false
         | 
| 33 44 | 
             
                end
         | 
| 34 45 |  | 
| 35 46 | 
             
                def initialize(asset)
         | 
| 36 47 | 
             
                  unless self.class.applies_to_asset?(asset)
         | 
| 37 48 | 
             
                    raise AssetMismatch, "Instances of #{self.class.name} cannot be applied to asset #{asset.key.inspect}"
         | 
| 38 49 | 
             
                  end
         | 
| 50 | 
            +
             | 
| 39 51 | 
             
                  @asset = asset
         | 
| 40 52 | 
             
                end
         | 
| 41 53 | 
             
              end
         |