shrine-tus 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +98 -0
- data/lib/shrine/plugins/tus.rb +38 -0
- data/lib/shrine/storage/tus.rb +71 -0
- data/shrine-tus.gemspec +23 -0
- metadata +147 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 88569c9725438f4ec79a2e475952cf7ba968ce2c
         | 
| 4 | 
            +
              data.tar.gz: d5811879b451a6ec5bead0540a2d1582a5b9f5d2
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: f2ea7ef342d68564e10f5831e65804106bc8af0b1f53f352d658f340c9bae6de15d18d7dfe375695869b7d7a5934787f9d8e491d1b3a6897690de0aa8bd70b03
         | 
| 7 | 
            +
              data.tar.gz: d0874c8447a1b1053bbb4b64f8d5435f9bcd232b0092b9caf4c679f7da91d6a318e29ad9d674d758f23418531b73d0fa99da68120144fa47f2d97cf39ebf71ba
         | 
    
        data/LICENSE.txt
    ADDED
    
    | @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            The MIT License (MIT)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Copyright (c) 2017 Janko Marohnić
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 6 | 
            +
            of this software and associated documentation files (the "Software"), to deal
         | 
| 7 | 
            +
            in the Software without restriction, including without limitation the rights
         | 
| 8 | 
            +
            to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
         | 
| 9 | 
            +
            copies of the Software, and to permit persons to whom the Software is
         | 
| 10 | 
            +
            furnished to do so, subject to the following conditions:
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            The above copyright notice and this permission notice shall be included in
         | 
| 13 | 
            +
            all copies or substantial portions of the Software.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
         | 
| 16 | 
            +
            IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
         | 
| 17 | 
            +
            FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
         | 
| 18 | 
            +
            AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
         | 
| 19 | 
            +
            LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
         | 
| 20 | 
            +
            OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
         | 
| 21 | 
            +
            THE SOFTWARE.
         | 
    
        data/README.md
    ADDED
    
    | @@ -0,0 +1,98 @@ | |
| 1 | 
            +
            # Shrine::Tus
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Provides tools for integrating [Shrine] with [tus-ruby-server].
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## Installation
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ```ruby
         | 
| 8 | 
            +
            gem "shrine-tus"
         | 
| 9 | 
            +
            ```
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ## Usage
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            Once the file has been uploaded to `tus-ruby-server`, you want to attach it to
         | 
| 14 | 
            +
            a database record and move it to permanent Shrine storage.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            ```rb
         | 
| 17 | 
            +
            class VideoUploader < Shrine
         | 
| 18 | 
            +
              plugin :default_storage, cache: :tus # set Shrine::Storage::Tus as temporary storage
         | 
| 19 | 
            +
            end
         | 
| 20 | 
            +
            ```
         | 
| 21 | 
            +
            ```rb
         | 
| 22 | 
            +
            class Movie < Sequel::Model
         | 
| 23 | 
            +
              include VideoUploader::Attachment.new(:video)
         | 
| 24 | 
            +
            end
         | 
| 25 | 
            +
            ```
         | 
| 26 | 
            +
            ```rb
         | 
| 27 | 
            +
            file_data #=> {"id":"http://tus-server.org/68db42638388ae645ab747b36a837a79", "storage":"cache", "metadata":{...}}
         | 
| 28 | 
            +
            Movie.create(video: file_data)
         | 
| 29 | 
            +
            ```
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            The simplest setup is to have Shrine download the file uploaded to
         | 
| 32 | 
            +
            `tus-ruby-server` through the app, which you can do by setting
         | 
| 33 | 
            +
            `Shrine::Storage::Tus` as the temporary Shrine storage.
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            ```rb
         | 
| 36 | 
            +
            gem "shrine-url", "~> 0.3" # dependency of Shrine::Storage::Tus
         | 
| 37 | 
            +
            ```
         | 
| 38 | 
            +
            ```rb
         | 
| 39 | 
            +
            require "shrine/storage/tus"
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            Shrine.storages[:tus] = Shrine::Storage::Tus.new
         | 
| 42 | 
            +
            ```
         | 
| 43 | 
            +
            ```rb
         | 
| 44 | 
            +
            class VideoUploader < Shrine
         | 
| 45 | 
            +
              plugin :default_storage, cache: :tus # set Shrine::Storage::Tus as temporary storage
         | 
| 46 | 
            +
            end
         | 
| 47 | 
            +
            ```
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            By default `wget` will be used for downloading, but if you need support for
         | 
| 50 | 
            +
            partial downloads (e.g. you want to use `restore_cached_data`), you can switch
         | 
| 51 | 
            +
            to using [Down] for downloads.
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            ```rb
         | 
| 54 | 
            +
            Shrine::Storage::Tus.new(downloader: :down)
         | 
| 55 | 
            +
            ```
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            If you want to Shrine, instead of downloading through the `tus-ruby-server`
         | 
| 58 | 
            +
            app, to download directly from the tus storage, you can assign the tus storage
         | 
| 59 | 
            +
            instance to `Shrine::Storage::Tus`:
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            ```rb
         | 
| 62 | 
            +
            Shrine::Storage::Tus.new(tus_storage: Tus::Server.opts[:storage])
         | 
| 63 | 
            +
            ```
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            Finally, if you want to use the same kind of permanent storage as your
         | 
| 66 | 
            +
            `tus-ruby-server` uses, you can setup your temporary Shrine storage to match
         | 
| 67 | 
            +
            the one your tus server uses, and load the `tus` plugin which will translate
         | 
| 68 | 
            +
            the assigned tus URL to the corresponding storage ID.
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            ```rb
         | 
| 71 | 
            +
            Shrine.storages = {
         | 
| 72 | 
            +
              cache: Shrine::Storage::YourTemporaryStorage.new(...),
         | 
| 73 | 
            +
              store: Shrine::Storage::YourPermanentStorage.new(...),
         | 
| 74 | 
            +
            }
         | 
| 75 | 
            +
            ```
         | 
| 76 | 
            +
            ```rb
         | 
| 77 | 
            +
            class VideoUploader < Shrine
         | 
| 78 | 
            +
              plugin :tus
         | 
| 79 | 
            +
            end
         | 
| 80 | 
            +
            ```
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            For more details, and an explanation of pros and cons for each of the
         | 
| 83 | 
            +
            approaches, see [shrine-tus-demo].
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            ## Contributing
         | 
| 86 | 
            +
             | 
| 87 | 
            +
            ```sh
         | 
| 88 | 
            +
            $ rake test
         | 
| 89 | 
            +
            ```
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            ## License
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            [MIT](/LICENSE.txt)
         | 
| 94 | 
            +
             | 
| 95 | 
            +
            [Shrine]: https://github.com/janko-m/shrine
         | 
| 96 | 
            +
            [tus-ruby-server]: https://github.com/janko-m/tus-ruby-server
         | 
| 97 | 
            +
            [Down]: https://github.com/janko-m/down
         | 
| 98 | 
            +
            [shrine-tus-demo]: https://github.com/janko-m/shrine-tus-demo
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            require "json"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Shrine
         | 
| 4 | 
            +
              module Plugins
         | 
| 5 | 
            +
                module Tus
         | 
| 6 | 
            +
                  module AttacherMethods
         | 
| 7 | 
            +
                    def assign(value)
         | 
| 8 | 
            +
                      if value.is_a?(String) && value != ""
         | 
| 9 | 
            +
                        data = JSON.parse(value)
         | 
| 10 | 
            +
                        data["id"] = tus_url_to_storage_id(data["id"], cache.storage)
         | 
| 11 | 
            +
                        super(data.to_json)
         | 
| 12 | 
            +
                      else
         | 
| 13 | 
            +
                        super
         | 
| 14 | 
            +
                      end
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    private
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def tus_url_to_storage_id(tus_url, storage)
         | 
| 20 | 
            +
                      tus_uid = tus_url.split("/").last
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      if defined?(Storage::FileSystem) && storage.is_a?(Storage::FileSystem)
         | 
| 23 | 
            +
                        "#{tus_uid}.file"
         | 
| 24 | 
            +
                      elsif defined?(Storage::Gridfs) && storage.is_a?(Storage::Gridfs)
         | 
| 25 | 
            +
                        grid_info = storage.bucket.find(filename: tus_uid).limit(1).first
         | 
| 26 | 
            +
                        grid_info[:_id].to_s
         | 
| 27 | 
            +
                      elsif defined?(Storage::S3) && storage.is_a?(Storage::S3)
         | 
| 28 | 
            +
                        tus_uid
         | 
| 29 | 
            +
                      else
         | 
| 30 | 
            +
                        raise Error, "undefined conversion of tus URL to storage id for storage #{storage.inspect}"
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                register_plugin(:tus, Tus)
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| @@ -0,0 +1,71 @@ | |
| 1 | 
            +
            require "shrine/storage/url"
         | 
| 2 | 
            +
            require "down/chunked_io"
         | 
| 3 | 
            +
            require "tempfile"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Shrine
         | 
| 6 | 
            +
              module Storage
         | 
| 7 | 
            +
                class Tus < Url
         | 
| 8 | 
            +
                  attr_reader :tus_storage
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def initialize(downloader: :wget, tus_storage: nil)
         | 
| 11 | 
            +
                    @tus_storage = tus_storage
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    super(downloader: downloader)
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def download(id)
         | 
| 17 | 
            +
                    if tus_storage
         | 
| 18 | 
            +
                      download_from_tus_storage(tus_uid(id))
         | 
| 19 | 
            +
                    else
         | 
| 20 | 
            +
                      super
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def open(id)
         | 
| 25 | 
            +
                    if tus_storage
         | 
| 26 | 
            +
                      open_from_tus_storage(tus_uid(id))
         | 
| 27 | 
            +
                    else
         | 
| 28 | 
            +
                      super
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  private
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def download_from_tus_storage(uid)
         | 
| 35 | 
            +
                    tempfile = Tempfile.new("shrine-tus", binmode: true)
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    response = get_tus_file(uid)
         | 
| 38 | 
            +
                    response.each { |chunk| tempfile << chunk }
         | 
| 39 | 
            +
                    response.close
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    tempfile.open
         | 
| 42 | 
            +
                    tempfile
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  def open_from_tus_storage(uid)
         | 
| 46 | 
            +
                    response = get_tus_file(uid)
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    Down::ChunkedIO.new(
         | 
| 49 | 
            +
                      size:     response.length,
         | 
| 50 | 
            +
                      chunks:   response.each,
         | 
| 51 | 
            +
                      on_close: ->{response.close},
         | 
| 52 | 
            +
                    )
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  def get_tus_file(uid)
         | 
| 56 | 
            +
                    tus_storage.get_file(uid)
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  def tus_uid(url)
         | 
| 60 | 
            +
                    url.split("/").last
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  # Add "Tus-Resumable" header to HEAD and DELETE requests.
         | 
| 64 | 
            +
                  def request(*args)
         | 
| 65 | 
            +
                    super do |req|
         | 
| 66 | 
            +
                      req["Tus-Resumable"] = "1.0.0"
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
            end
         | 
    
        data/shrine-tus.gemspec
    ADDED
    
    | @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            Gem::Specification.new do |gem|
         | 
| 2 | 
            +
              gem.name          = "shrine-tus"
         | 
| 3 | 
            +
              gem.version       = "0.1.0"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              gem.required_ruby_version = ">= 2.1"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              gem.summary      = "Provides storage and plugin for easier integration between Shrine and tus-ruby-server."
         | 
| 8 | 
            +
              gem.homepage     = "https://github.com/janko-m/shrine-tus"
         | 
| 9 | 
            +
              gem.authors      = ["Janko Marohnić"]
         | 
| 10 | 
            +
              gem.email        = ["janko.marohnic@gmail.com"]
         | 
| 11 | 
            +
              gem.license      = "MIT"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              gem.files        = Dir["README.md", "LICENSE.txt", "lib/**/*.rb", "*.gemspec"]
         | 
| 14 | 
            +
              gem.require_path = "lib"
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              gem.add_development_dependency "rake"
         | 
| 17 | 
            +
              gem.add_development_dependency "minitest"
         | 
| 18 | 
            +
              gem.add_development_dependency "tus-server", "~> 0.10"
         | 
| 19 | 
            +
              gem.add_development_dependency "shrine-url", "~> 0.3"
         | 
| 20 | 
            +
              gem.add_development_dependency "shrine-gridfs"
         | 
| 21 | 
            +
              gem.add_development_dependency "aws-sdk", "~> 2.1"
         | 
| 22 | 
            +
              gem.add_development_dependency "webmock"
         | 
| 23 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,147 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: shrine-tus
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Janko Marohnić
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2017-04-09 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: rake
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - ">="
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '0'
         | 
| 20 | 
            +
              type: :development
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - ">="
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '0'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: minitest
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :development
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ">="
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: tus-server
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '0.10'
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '0.10'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: shrine-url
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '0.3'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '0.3'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: shrine-gridfs
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - ">="
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '0'
         | 
| 76 | 
            +
              type: :development
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - ">="
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '0'
         | 
| 83 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            +
              name: aws-sdk
         | 
| 85 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 | 
            +
                requirements:
         | 
| 87 | 
            +
                - - "~>"
         | 
| 88 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            +
                    version: '2.1'
         | 
| 90 | 
            +
              type: :development
         | 
| 91 | 
            +
              prerelease: false
         | 
| 92 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 | 
            +
                requirements:
         | 
| 94 | 
            +
                - - "~>"
         | 
| 95 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            +
                    version: '2.1'
         | 
| 97 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 98 | 
            +
              name: webmock
         | 
| 99 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 | 
            +
                requirements:
         | 
| 101 | 
            +
                - - ">="
         | 
| 102 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            +
                    version: '0'
         | 
| 104 | 
            +
              type: :development
         | 
| 105 | 
            +
              prerelease: false
         | 
| 106 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 | 
            +
                requirements:
         | 
| 108 | 
            +
                - - ">="
         | 
| 109 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            +
                    version: '0'
         | 
| 111 | 
            +
            description: 
         | 
| 112 | 
            +
            email:
         | 
| 113 | 
            +
            - janko.marohnic@gmail.com
         | 
| 114 | 
            +
            executables: []
         | 
| 115 | 
            +
            extensions: []
         | 
| 116 | 
            +
            extra_rdoc_files: []
         | 
| 117 | 
            +
            files:
         | 
| 118 | 
            +
            - LICENSE.txt
         | 
| 119 | 
            +
            - README.md
         | 
| 120 | 
            +
            - lib/shrine/plugins/tus.rb
         | 
| 121 | 
            +
            - lib/shrine/storage/tus.rb
         | 
| 122 | 
            +
            - shrine-tus.gemspec
         | 
| 123 | 
            +
            homepage: https://github.com/janko-m/shrine-tus
         | 
| 124 | 
            +
            licenses:
         | 
| 125 | 
            +
            - MIT
         | 
| 126 | 
            +
            metadata: {}
         | 
| 127 | 
            +
            post_install_message: 
         | 
| 128 | 
            +
            rdoc_options: []
         | 
| 129 | 
            +
            require_paths:
         | 
| 130 | 
            +
            - lib
         | 
| 131 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 132 | 
            +
              requirements:
         | 
| 133 | 
            +
              - - ">="
         | 
| 134 | 
            +
                - !ruby/object:Gem::Version
         | 
| 135 | 
            +
                  version: '2.1'
         | 
| 136 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 137 | 
            +
              requirements:
         | 
| 138 | 
            +
              - - ">="
         | 
| 139 | 
            +
                - !ruby/object:Gem::Version
         | 
| 140 | 
            +
                  version: '0'
         | 
| 141 | 
            +
            requirements: []
         | 
| 142 | 
            +
            rubyforge_project: 
         | 
| 143 | 
            +
            rubygems_version: 2.5.1
         | 
| 144 | 
            +
            signing_key: 
         | 
| 145 | 
            +
            specification_version: 4
         | 
| 146 | 
            +
            summary: Provides storage and plugin for easier integration between Shrine and tus-ruby-server.
         | 
| 147 | 
            +
            test_files: []
         |