httpimagestore 0.3.2 → 0.4.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.
- data/VERSION +1 -1
- data/bin/httpimagestore +57 -23
- data/features/cache-control.feature +80 -0
- data/features/httpimagestore.feature +1 -1
- data/features/step_definitions/httpimagestore_steps.rb +13 -1
- data/httpimagestore.gemspec +4 -3
- data/lib/httpimagestore/s3_service.rb +3 -0
- metadata +38 -117
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0. | 
| 1 | 
            +
            0.4.0
         | 
    
        data/bin/httpimagestore
    CHANGED
    
    | @@ -3,18 +3,46 @@ require 'ip' | |
| 3 3 | 
             
            require 'pathname'
         | 
| 4 4 | 
             
            require 'cli'
         | 
| 5 5 |  | 
| 6 | 
            -
             | 
| 6 | 
            +
            cli_settings = CLI.new do
         | 
| 7 7 | 
             
            	description 'HTTP based image storage and thumbnailer'
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            	switch : | 
| 10 | 
            -
             | 
| 11 | 
            -
            	switch : | 
| 12 | 
            -
             | 
| 13 | 
            -
            	 | 
| 14 | 
            -
             | 
| 15 | 
            -
            	 | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 8 | 
            +
             | 
| 9 | 
            +
            	switch :no_bind,
         | 
| 10 | 
            +
            		description: "Do not bind to TCP socket - useful with -s fastcgi option"
         | 
| 11 | 
            +
            	switch :no_logging,
         | 
| 12 | 
            +
            		description: "Disable logging"
         | 
| 13 | 
            +
            	switch :debug,
         | 
| 14 | 
            +
            		description: "Enable debugging"
         | 
| 15 | 
            +
            	switch :no_uri_encode,
         | 
| 16 | 
            +
            		description: "Disable output URI encoding"
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            	option :bind,
         | 
| 19 | 
            +
            		short: :b,
         | 
| 20 | 
            +
            		default: IP.new('127.0.0.1'),
         | 
| 21 | 
            +
            		cast: IP,
         | 
| 22 | 
            +
            		description: "HTTP server bind address - use 0.0.0.0 to bind to all interfaces"
         | 
| 23 | 
            +
            	option :port,
         | 
| 24 | 
            +
            		short: :p,
         | 
| 25 | 
            +
            		default: 3000,
         | 
| 26 | 
            +
            		cast: Integer,
         | 
| 27 | 
            +
            		description: "HTTP server TCP port"
         | 
| 28 | 
            +
            	option :server,
         | 
| 29 | 
            +
            		short: :s,
         | 
| 30 | 
            +
            		default: 'mongrel',
         | 
| 31 | 
            +
            		description: "Rack server handler like thin, mongrel, webrick, fastcgi etc."
         | 
| 32 | 
            +
            	option :upload_retry_times,
         | 
| 33 | 
            +
            		default: 3,
         | 
| 34 | 
            +
            		cast: Integer,
         | 
| 35 | 
            +
            		description: "Number of times file upload will be retried in case of an error"
         | 
| 36 | 
            +
            	option :upload_retry_delay,
         | 
| 37 | 
            +
            		default: 0.0,
         | 
| 38 | 
            +
            		cast: Float,
         | 
| 39 | 
            +
            		description: "Time to sleep between retries"
         | 
| 40 | 
            +
            	option :cache_control,
         | 
| 41 | 
            +
            		default: "public, max-age=#{(86400 * 365.25).to_i}",
         | 
| 42 | 
            +
            		description: "Stored object Cache-Control header value"
         | 
| 43 | 
            +
            	argument :config,
         | 
| 44 | 
            +
            		cast: Pathname,
         | 
| 45 | 
            +
            		description: "Configuration file path"
         | 
| 18 46 | 
             
            end.parse!
         | 
| 19 47 |  | 
| 20 48 | 
             
            require 'sinatra/base'
         | 
| @@ -28,23 +56,24 @@ require 'httpimagestore/s3_service' | |
| 28 56 |  | 
| 29 57 | 
             
            sinatra = Sinatra.new
         | 
| 30 58 |  | 
| 31 | 
            -
            unless  | 
| 32 | 
            -
            	sinatra.set :port,  | 
| 33 | 
            -
            	sinatra.set :bind,  | 
| 59 | 
            +
            unless cli_settings.no_bind
         | 
| 60 | 
            +
            	sinatra.set :port, cli_settings.port
         | 
| 61 | 
            +
            	sinatra.set :bind, cli_settings.bind.to_s
         | 
| 34 62 | 
             
            else
         | 
| 35 63 | 
             
            	sinatra.set :port, nil
         | 
| 36 64 | 
             
            	sinatra.set :bind, nil
         | 
| 37 65 | 
             
            end
         | 
| 38 66 | 
             
            sinatra.set :environment, 'production'
         | 
| 39 | 
            -
            sinatra.set :server,  | 
| 67 | 
            +
            sinatra.set :server, cli_settings.server
         | 
| 40 68 | 
             
            sinatra.set :lock, true
         | 
| 41 | 
            -
            sinatra.set :logging, (not  | 
| 42 | 
            -
            sinatra.set :debug,  | 
| 43 | 
            -
            sinatra.set :uri_encode, (not  | 
| 44 | 
            -
            sinatra.set :upload_retry_times,  | 
| 45 | 
            -
            sinatra.set :upload_retry_delay,  | 
| 69 | 
            +
            sinatra.set :logging, (not cli_settings.no_logging)
         | 
| 70 | 
            +
            sinatra.set :debug, cli_settings.debug
         | 
| 71 | 
            +
            sinatra.set :uri_encode, (not cli_settings.no_uri_encode)
         | 
| 72 | 
            +
            sinatra.set :upload_retry_times, cli_settings.upload_retry_times
         | 
| 73 | 
            +
            sinatra.set :upload_retry_delay, cli_settings.upload_retry_delay
         | 
| 74 | 
            +
            sinatra.set :cache_control, cli_settings.cache_control
         | 
| 46 75 |  | 
| 47 | 
            -
            Configuration.from_file( | 
| 76 | 
            +
            Configuration.from_file(cli_settings.config).put(sinatra)
         | 
| 48 77 |  | 
| 49 78 | 
             
            class ThumbnailingError < RuntimeError
         | 
| 50 79 | 
             
            	def initialize(thumbnail_class, remote_error)
         | 
| @@ -65,7 +94,7 @@ sinatra.helpers do | |
| 65 94 | 
             
            	def halt_exception(status, exception)
         | 
| 66 95 | 
             
            		msg = "Error: #{exception.class.name}: #{exception}"
         | 
| 67 96 | 
             
            		if status >= 500
         | 
| 68 | 
            -
            			logger.error msg
         | 
| 97 | 
            +
            			logger.error msg + (exception.respond_to?(:response) ? ': ' + exception.response.inspect : '')
         | 
| 69 98 | 
             
            		else
         | 
| 70 99 | 
             
            			logger.warn msg
         | 
| 71 100 | 
             
            		end
         | 
| @@ -81,7 +110,12 @@ sinatra.before do | |
| 81 110 | 
             
            	begin
         | 
| 82 111 | 
             
            		logger.level = Logger::DEBUG if settings.logging and settings.debug
         | 
| 83 112 | 
             
            		# singletons
         | 
| 84 | 
            -
            		$s3 ||= S3Service.new(settings.s3_key_id, settings.s3_key_secret, settings.s3_bucket,  | 
| 113 | 
            +
            		$s3 ||= S3Service.new(settings.s3_key_id, settings.s3_key_secret, settings.s3_bucket, 
         | 
| 114 | 
            +
            			cache_control: settings.cache_control,
         | 
| 115 | 
            +
            			logger: logger,
         | 
| 116 | 
            +
            			upload_retry_times: settings.upload_retry_times,
         | 
| 117 | 
            +
            			upload_retry_delay: settings.upload_retry_delay
         | 
| 118 | 
            +
            		)
         | 
| 85 119 | 
             
            		$thumbnailer ||= HTTPThumbnailerClient.new(settings.thumbnailer_url)
         | 
| 86 120 | 
             
            	rescue => exception
         | 
| 87 121 | 
             
            		halt_exception(500, exception)
         | 
| @@ -0,0 +1,80 @@ | |
| 1 | 
            +
            Feature: Stored objects should have proper Cache-Control header set
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            	Background:
         | 
| 4 | 
            +
            		Given issthumbtest S3 bucket with key AKIAJMUYVYOSACNXLPTQ and secret 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
         | 
| 5 | 
            +
            		Given httpimagestore log is empty
         | 
| 6 | 
            +
            		Given httpthumbnailer log is empty
         | 
| 7 | 
            +
            		Given httpthumbnailer server is running at http://localhost:3100/
         | 
| 8 | 
            +
            		Given Content-Type header set to image/autodetect
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            	@cache-control
         | 
| 11 | 
            +
            	Scenario: Image files get Cache-Control header with max-age set by default
         | 
| 12 | 
            +
            		Given httpimagestore server is running at http://localhost:3000/ with the following configuration
         | 
| 13 | 
            +
            		"""
         | 
| 14 | 
            +
            		s3_key 'AKIAJMUYVYOSACNXLPTQ', 'MAeGhvW+clN7kzK3NboASf3/kZ6a81PRtvwMZj4Y'
         | 
| 15 | 
            +
            		s3_bucket 'issthumbtest'
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            		thumbnail_class 'small', 'crop', 128, 128
         | 
| 18 | 
            +
            		"""
         | 
| 19 | 
            +
            		Given there is no test/image/4006450256177f4a/test.jpg file in S3 bucket
         | 
| 20 | 
            +
            		And there is no test/image/4006450256177f4a/test-small.jpg file in S3 bucket
         | 
| 21 | 
            +
            		Given test.jpg file content as request body
         | 
| 22 | 
            +
            		When I do PUT request http://localhost:3000/thumbnail/small/test/image/test
         | 
| 23 | 
            +
            		Then response status will be 200
         | 
| 24 | 
            +
            		And response content type will be text/uri-list
         | 
| 25 | 
            +
            		And response body will be CRLF ended lines
         | 
| 26 | 
            +
            		"""
         | 
| 27 | 
            +
            		http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg
         | 
| 28 | 
            +
            		http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg
         | 
| 29 | 
            +
            		"""
         | 
| 30 | 
            +
            		And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg Cache-Control header will be public, max-age=31557600
         | 
| 31 | 
            +
            		And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg Cache-Control header will be public, max-age=31557600
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            	@cache-control
         | 
| 34 | 
            +
            	Scenario: Image files get Cache-Control header defined with argument
         | 
| 35 | 
            +
            		Given httpimagestore argument --cache-control 'private, max-age=300, s-maxage=300'
         | 
| 36 | 
            +
            		Given httpimagestore server is running at http://localhost:3000/ with the following configuration
         | 
| 37 | 
            +
            		"""
         | 
| 38 | 
            +
            		s3_key 'AKIAJMUYVYOSACNXLPTQ', 'MAeGhvW+clN7kzK3NboASf3/kZ6a81PRtvwMZj4Y'
         | 
| 39 | 
            +
            		s3_bucket 'issthumbtest'
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            		thumbnail_class 'small', 'crop', 128, 128
         | 
| 42 | 
            +
            		"""
         | 
| 43 | 
            +
            		Given there is no test/image/4006450256177f4a/test.jpg file in S3 bucket
         | 
| 44 | 
            +
            		And there is no test/image/4006450256177f4a/test-small.jpg file in S3 bucket
         | 
| 45 | 
            +
            		Given test.jpg file content as request body
         | 
| 46 | 
            +
            		When I do PUT request http://localhost:3000/thumbnail/small/test/image/test
         | 
| 47 | 
            +
            		Then response status will be 200
         | 
| 48 | 
            +
            		And response content type will be text/uri-list
         | 
| 49 | 
            +
            		And response body will be CRLF ended lines
         | 
| 50 | 
            +
            		"""
         | 
| 51 | 
            +
            		http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg
         | 
| 52 | 
            +
            		http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg
         | 
| 53 | 
            +
            		"""
         | 
| 54 | 
            +
            		And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg Cache-Control header will be private, max-age=300, s-maxage=300
         | 
| 55 | 
            +
            		And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg Cache-Control header will be private, max-age=300, s-maxage=300
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            	@cache-control
         | 
| 58 | 
            +
            	Scenario: Image files get Cache-Control header undefined when set to ''
         | 
| 59 | 
            +
            		Given httpimagestore argument --cache-control ''
         | 
| 60 | 
            +
            		Given httpimagestore server is running at http://localhost:3000/ with the following configuration
         | 
| 61 | 
            +
            		"""
         | 
| 62 | 
            +
            		s3_key 'AKIAJMUYVYOSACNXLPTQ', 'MAeGhvW+clN7kzK3NboASf3/kZ6a81PRtvwMZj4Y'
         | 
| 63 | 
            +
            		s3_bucket 'issthumbtest'
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            		thumbnail_class 'small', 'crop', 128, 128
         | 
| 66 | 
            +
            		"""
         | 
| 67 | 
            +
            		Given there is no test/image/4006450256177f4a/test.jpg file in S3 bucket
         | 
| 68 | 
            +
            		And there is no test/image/4006450256177f4a/test-small.jpg file in S3 bucket
         | 
| 69 | 
            +
            		Given test.jpg file content as request body
         | 
| 70 | 
            +
            		When I do PUT request http://localhost:3000/thumbnail/small/test/image/test
         | 
| 71 | 
            +
            		Then response status will be 200
         | 
| 72 | 
            +
            		And response content type will be text/uri-list
         | 
| 73 | 
            +
            		And response body will be CRLF ended lines
         | 
| 74 | 
            +
            		"""
         | 
| 75 | 
            +
            		http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg
         | 
| 76 | 
            +
            		http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg
         | 
| 77 | 
            +
            		"""
         | 
| 78 | 
            +
            		And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg Cache-Control header will not be set
         | 
| 79 | 
            +
            		And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg Cache-Control header will not be set
         | 
| 80 | 
            +
             | 
| @@ -4,6 +4,7 @@ Feature: Storing of original image and specified classes of its thumbnails on S3 | |
| 4 4 | 
             
            	The response will be paths to files stored in S3
         | 
| 5 5 |  | 
| 6 6 | 
             
            	Background:
         | 
| 7 | 
            +
            		Given issthumbtest S3 bucket with key AKIAJMUYVYOSACNXLPTQ and secret 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
         | 
| 7 8 | 
             
            		Given httpimagestore log is empty
         | 
| 8 9 | 
             
            		Given httpimagestore server is running at http://localhost:3000/ with the following configuration
         | 
| 9 10 | 
             
            		"""
         | 
| @@ -19,7 +20,6 @@ Feature: Storing of original image and specified classes of its thumbnails on S3 | |
| 19 20 | 
             
            		"""
         | 
| 20 21 | 
             
            		Given httpthumbnailer log is empty
         | 
| 21 22 | 
             
            		Given httpthumbnailer server is running at http://localhost:3100/
         | 
| 22 | 
            -
            		Given issthumbtest S3 bucket with key AKIAJMUYVYOSACNXLPTQ and secret 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
         | 
| 23 23 | 
             
            		Given Content-Type header set to image/autodetect
         | 
| 24 24 |  | 
| 25 25 | 
             
            	Scenario: Putting original and its thumbnails to S3 bucket
         | 
| @@ -1,3 +1,7 @@ | |
| 1 | 
            +
            Given /httpimagestore argument (.*)/ do |arg|
         | 
| 2 | 
            +
            	(@httpimagestore_args ||= []) << arg
         | 
| 3 | 
            +
            end
         | 
| 4 | 
            +
             | 
| 1 5 | 
             
            Given /httpimagestore server is running at (.*) with the following configuration/ do |url, config|
         | 
| 2 6 | 
             
            	cfile = Tempfile.new('httpimagestore.conf')
         | 
| 3 7 | 
             
            	cfile.write(config)
         | 
| @@ -5,7 +9,7 @@ Given /httpimagestore server is running at (.*) with the following configuration | |
| 5 9 |  | 
| 6 10 | 
             
            	begin
         | 
| 7 11 | 
             
            		start_server(
         | 
| 8 | 
            -
            			"bundle exec #{script('httpimagestore')} #{cfile.path}",
         | 
| 12 | 
            +
            			"bundle exec #{script('httpimagestore')} #{(@httpimagestore_args ||= []).join(' ')} #{cfile.path}",
         | 
| 9 13 | 
             
            			'/tmp/httpimagestore.pid',
         | 
| 10 14 | 
             
            			support_dir + 'server.log',
         | 
| 11 15 | 
             
            			url
         | 
| @@ -78,6 +82,14 @@ Then /(http.*) content type will be (.*)/ do |url, content_type| | |
| 78 82 | 
             
            	get_headers(url)['Content-Type'].should == content_type
         | 
| 79 83 | 
             
            end
         | 
| 80 84 |  | 
| 85 | 
            +
            Then /(http.*) ([^ ]+) header will be (.*)/ do |url, header, value|
         | 
| 86 | 
            +
            	get_headers(url)[header].should == value
         | 
| 87 | 
            +
            end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
            Then /(http.*) ([^ ]+) header will not be set/ do |url, header|
         | 
| 90 | 
            +
            	get_headers(url)[header].should be_nil
         | 
| 91 | 
            +
            end
         | 
| 92 | 
            +
             | 
| 81 93 | 
             
            Then /(.*) will contain (.*) image of size (.*)x(.*)/ do |url, format, width, height|
         | 
| 82 94 | 
             
            	data = get(url)
         | 
| 83 95 |  | 
    
        data/httpimagestore.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = "httpimagestore"
         | 
| 8 | 
            -
              s.version = "0. | 
| 8 | 
            +
              s.version = "0.4.0"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Jakub Pastuszek"]
         | 
| 12 | 
            -
              s.date = "2012- | 
| 12 | 
            +
              s.date = "2012-11-14"
         | 
| 13 13 | 
             
              s.description = "Thumbnails images using httpthumbnailer and stored data on HTTP server (S3)"
         | 
| 14 14 | 
             
              s.email = "jpastuszek@gmail.com"
         | 
| 15 15 | 
             
              s.executables = ["httpimagestore"]
         | 
| @@ -27,6 +27,7 @@ Gem::Specification.new do |s| | |
| 27 27 | 
             
                "Rakefile",
         | 
| 28 28 | 
             
                "VERSION",
         | 
| 29 29 | 
             
                "bin/httpimagestore",
         | 
| 30 | 
            +
                "features/cache-control.feature",
         | 
| 30 31 | 
             
                "features/httpimagestore.feature",
         | 
| 31 32 | 
             
                "features/step_definitions/httpimagestore_steps.rb",
         | 
| 32 33 | 
             
                "features/support/env.rb",
         | 
| @@ -46,7 +47,7 @@ Gem::Specification.new do |s| | |
| 46 47 | 
             
              s.homepage = "http://github.com/jpastuszek/httpimagestore"
         | 
| 47 48 | 
             
              s.licenses = ["MIT"]
         | 
| 48 49 | 
             
              s.require_paths = ["lib"]
         | 
| 49 | 
            -
              s.rubygems_version = "1.8. | 
| 50 | 
            +
              s.rubygems_version = "1.8.15"
         | 
| 50 51 | 
             
              s.summary = "HTTP based image storage and thumbnailer"
         | 
| 51 52 |  | 
| 52 53 | 
             
              if s.respond_to? :specification_version then
         | 
| @@ -16,6 +16,9 @@ class S3Service | |
| 16 16 | 
             
            		@logger.info "Putting image in bucket '#{@bucket.name}': #{image_path}"
         | 
| 17 17 |  | 
| 18 18 | 
             
            		file = @bucket.objects.build(image_path)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            		file.cache_control = @options[:cache_control] if @options.include?(:cache_control) and not @options[:cache_control].empty?
         | 
| 21 | 
            +
             | 
| 19 22 | 
             
            		file.content_type = content_type
         | 
| 20 23 | 
             
            		file.content = data
         | 
| 21 24 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: httpimagestore
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.4.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,11 +9,11 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012- | 
| 12 | 
            +
            date: 2012-11-14 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: sinatra
         | 
| 16 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
              requirement: &70112214075800 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ! '>='
         | 
| @@ -21,15 +21,10 @@ dependencies: | |
| 21 21 | 
             
                    version: 1.2.6
         | 
| 22 22 | 
             
              type: :runtime
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements:  | 
| 25 | 
            -
                none: false
         | 
| 26 | 
            -
                requirements:
         | 
| 27 | 
            -
                - - ! '>='
         | 
| 28 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 29 | 
            -
                    version: 1.2.6
         | 
| 24 | 
            +
              version_requirements: *70112214075800
         | 
| 30 25 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 31 26 | 
             
              name: mongrel
         | 
| 32 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 27 | 
            +
              requirement: &70112214091620 !ruby/object:Gem::Requirement
         | 
| 33 28 | 
             
                none: false
         | 
| 34 29 | 
             
                requirements:
         | 
| 35 30 | 
             
                - - ! '>='
         | 
| @@ -37,15 +32,10 @@ dependencies: | |
| 37 32 | 
             
                    version: 1.2.0.pre2
         | 
| 38 33 | 
             
              type: :runtime
         | 
| 39 34 | 
             
              prerelease: false
         | 
| 40 | 
            -
              version_requirements:  | 
| 41 | 
            -
                none: false
         | 
| 42 | 
            -
                requirements:
         | 
| 43 | 
            -
                - - ! '>='
         | 
| 44 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 45 | 
            -
                    version: 1.2.0.pre2
         | 
| 35 | 
            +
              version_requirements: *70112214091620
         | 
| 46 36 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 47 37 | 
             
              name: s3
         | 
| 48 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 38 | 
            +
              requirement: &70112214090660 !ruby/object:Gem::Requirement
         | 
| 49 39 | 
             
                none: false
         | 
| 50 40 | 
             
                requirements:
         | 
| 51 41 | 
             
                - - ~>
         | 
| @@ -53,15 +43,10 @@ dependencies: | |
| 53 43 | 
             
                    version: '0.3'
         | 
| 54 44 | 
             
              type: :runtime
         | 
| 55 45 | 
             
              prerelease: false
         | 
| 56 | 
            -
              version_requirements:  | 
| 57 | 
            -
                none: false
         | 
| 58 | 
            -
                requirements:
         | 
| 59 | 
            -
                - - ~>
         | 
| 60 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: '0.3'
         | 
| 46 | 
            +
              version_requirements: *70112214090660
         | 
| 62 47 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 63 48 | 
             
              name: httpthumbnailer-client
         | 
| 64 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 49 | 
            +
              requirement: &70112214088900 !ruby/object:Gem::Requirement
         | 
| 65 50 | 
             
                none: false
         | 
| 66 51 | 
             
                requirements:
         | 
| 67 52 | 
             
                - - ~>
         | 
| @@ -69,15 +54,10 @@ dependencies: | |
| 69 54 | 
             
                    version: 0.1.0
         | 
| 70 55 | 
             
              type: :runtime
         | 
| 71 56 | 
             
              prerelease: false
         | 
| 72 | 
            -
              version_requirements:  | 
| 73 | 
            -
                none: false
         | 
| 74 | 
            -
                requirements:
         | 
| 75 | 
            -
                - - ~>
         | 
| 76 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 77 | 
            -
                    version: 0.1.0
         | 
| 57 | 
            +
              version_requirements: *70112214088900
         | 
| 78 58 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 79 59 | 
             
              name: ruby-ip
         | 
| 80 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 60 | 
            +
              requirement: &70112214087800 !ruby/object:Gem::Requirement
         | 
| 81 61 | 
             
                none: false
         | 
| 82 62 | 
             
                requirements:
         | 
| 83 63 | 
             
                - - ~>
         | 
| @@ -85,15 +65,10 @@ dependencies: | |
| 85 65 | 
             
                    version: '0.9'
         | 
| 86 66 | 
             
              type: :runtime
         | 
| 87 67 | 
             
              prerelease: false
         | 
| 88 | 
            -
              version_requirements:  | 
| 89 | 
            -
                none: false
         | 
| 90 | 
            -
                requirements:
         | 
| 91 | 
            -
                - - ~>
         | 
| 92 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 93 | 
            -
                    version: '0.9'
         | 
| 68 | 
            +
              version_requirements: *70112214087800
         | 
| 94 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 95 70 | 
             
              name: cli
         | 
| 96 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 71 | 
            +
              requirement: &70112214086600 !ruby/object:Gem::Requirement
         | 
| 97 72 | 
             
                none: false
         | 
| 98 73 | 
             
                requirements:
         | 
| 99 74 | 
             
                - - ~>
         | 
| @@ -101,15 +76,10 @@ dependencies: | |
| 101 76 | 
             
                    version: 1.1.0
         | 
| 102 77 | 
             
              type: :runtime
         | 
| 103 78 | 
             
              prerelease: false
         | 
| 104 | 
            -
              version_requirements:  | 
| 105 | 
            -
                none: false
         | 
| 106 | 
            -
                requirements:
         | 
| 107 | 
            -
                - - ~>
         | 
| 108 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            -
                    version: 1.1.0
         | 
| 79 | 
            +
              version_requirements: *70112214086600
         | 
| 110 80 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 111 81 | 
             
              name: mime-types
         | 
| 112 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 82 | 
            +
              requirement: &70112214085800 !ruby/object:Gem::Requirement
         | 
| 113 83 | 
             
                none: false
         | 
| 114 84 | 
             
                requirements:
         | 
| 115 85 | 
             
                - - ~>
         | 
| @@ -117,15 +87,10 @@ dependencies: | |
| 117 87 | 
             
                    version: 1.17.2
         | 
| 118 88 | 
             
              type: :runtime
         | 
| 119 89 | 
             
              prerelease: false
         | 
| 120 | 
            -
              version_requirements:  | 
| 121 | 
            -
                none: false
         | 
| 122 | 
            -
                requirements:
         | 
| 123 | 
            -
                - - ~>
         | 
| 124 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 125 | 
            -
                    version: 1.17.2
         | 
| 90 | 
            +
              version_requirements: *70112214085800
         | 
| 126 91 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 127 92 | 
             
              name: retry-this
         | 
| 128 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 93 | 
            +
              requirement: &70112214085140 !ruby/object:Gem::Requirement
         | 
| 129 94 | 
             
                none: false
         | 
| 130 95 | 
             
                requirements:
         | 
| 131 96 | 
             
                - - ~>
         | 
| @@ -133,15 +98,10 @@ dependencies: | |
| 133 98 | 
             
                    version: '1.1'
         | 
| 134 99 | 
             
              type: :runtime
         | 
| 135 100 | 
             
              prerelease: false
         | 
| 136 | 
            -
              version_requirements:  | 
| 137 | 
            -
                none: false
         | 
| 138 | 
            -
                requirements:
         | 
| 139 | 
            -
                - - ~>
         | 
| 140 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 141 | 
            -
                    version: '1.1'
         | 
| 101 | 
            +
              version_requirements: *70112214085140
         | 
| 142 102 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 143 103 | 
             
              name: rspec
         | 
| 144 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 104 | 
            +
              requirement: &70112214084480 !ruby/object:Gem::Requirement
         | 
| 145 105 | 
             
                none: false
         | 
| 146 106 | 
             
                requirements:
         | 
| 147 107 | 
             
                - - ~>
         | 
| @@ -149,15 +109,10 @@ dependencies: | |
| 149 109 | 
             
                    version: 2.8.0
         | 
| 150 110 | 
             
              type: :development
         | 
| 151 111 | 
             
              prerelease: false
         | 
| 152 | 
            -
              version_requirements:  | 
| 153 | 
            -
                none: false
         | 
| 154 | 
            -
                requirements:
         | 
| 155 | 
            -
                - - ~>
         | 
| 156 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 157 | 
            -
                    version: 2.8.0
         | 
| 112 | 
            +
              version_requirements: *70112214084480
         | 
| 158 113 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 159 114 | 
             
              name: cucumber
         | 
| 160 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 115 | 
            +
              requirement: &70112214083880 !ruby/object:Gem::Requirement
         | 
| 161 116 | 
             
                none: false
         | 
| 162 117 | 
             
                requirements:
         | 
| 163 118 | 
             
                - - ! '>='
         | 
| @@ -165,15 +120,10 @@ dependencies: | |
| 165 120 | 
             
                    version: '0'
         | 
| 166 121 | 
             
              type: :development
         | 
| 167 122 | 
             
              prerelease: false
         | 
| 168 | 
            -
              version_requirements:  | 
| 169 | 
            -
                none: false
         | 
| 170 | 
            -
                requirements:
         | 
| 171 | 
            -
                - - ! '>='
         | 
| 172 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 173 | 
            -
                    version: '0'
         | 
| 123 | 
            +
              version_requirements: *70112214083880
         | 
| 174 124 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 175 125 | 
             
              name: jeweler
         | 
| 176 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 126 | 
            +
              requirement: &70112214099500 !ruby/object:Gem::Requirement
         | 
| 177 127 | 
             
                none: false
         | 
| 178 128 | 
             
                requirements:
         | 
| 179 129 | 
             
                - - ~>
         | 
| @@ -181,15 +131,10 @@ dependencies: | |
| 181 131 | 
             
                    version: 1.6.4
         | 
| 182 132 | 
             
              type: :development
         | 
| 183 133 | 
             
              prerelease: false
         | 
| 184 | 
            -
              version_requirements:  | 
| 185 | 
            -
                none: false
         | 
| 186 | 
            -
                requirements:
         | 
| 187 | 
            -
                - - ~>
         | 
| 188 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 189 | 
            -
                    version: 1.6.4
         | 
| 134 | 
            +
              version_requirements: *70112214099500
         | 
| 190 135 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 191 136 | 
             
              name: simplecov
         | 
| 192 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 137 | 
            +
              requirement: &70112214097940 !ruby/object:Gem::Requirement
         | 
| 193 138 | 
             
                none: false
         | 
| 194 139 | 
             
                requirements:
         | 
| 195 140 | 
             
                - - ! '>='
         | 
| @@ -197,15 +142,10 @@ dependencies: | |
| 197 142 | 
             
                    version: '0'
         | 
| 198 143 | 
             
              type: :development
         | 
| 199 144 | 
             
              prerelease: false
         | 
| 200 | 
            -
              version_requirements:  | 
| 201 | 
            -
                none: false
         | 
| 202 | 
            -
                requirements:
         | 
| 203 | 
            -
                - - ! '>='
         | 
| 204 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 205 | 
            -
                    version: '0'
         | 
| 145 | 
            +
              version_requirements: *70112214097940
         | 
| 206 146 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 207 147 | 
             
              name: rdoc
         | 
| 208 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 148 | 
            +
              requirement: &70112214097240 !ruby/object:Gem::Requirement
         | 
| 209 149 | 
             
                none: false
         | 
| 210 150 | 
             
                requirements:
         | 
| 211 151 | 
             
                - - ~>
         | 
| @@ -213,15 +153,10 @@ dependencies: | |
| 213 153 | 
             
                    version: '3.9'
         | 
| 214 154 | 
             
              type: :development
         | 
| 215 155 | 
             
              prerelease: false
         | 
| 216 | 
            -
              version_requirements:  | 
| 217 | 
            -
                none: false
         | 
| 218 | 
            -
                requirements:
         | 
| 219 | 
            -
                - - ~>
         | 
| 220 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 221 | 
            -
                    version: '3.9'
         | 
| 156 | 
            +
              version_requirements: *70112214097240
         | 
| 222 157 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 223 158 | 
             
              name: daemon
         | 
| 224 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 159 | 
            +
              requirement: &70112214096680 !ruby/object:Gem::Requirement
         | 
| 225 160 | 
             
                none: false
         | 
| 226 161 | 
             
                requirements:
         | 
| 227 162 | 
             
                - - ~>
         | 
| @@ -229,15 +164,10 @@ dependencies: | |
| 229 164 | 
             
                    version: '1'
         | 
| 230 165 | 
             
              type: :development
         | 
| 231 166 | 
             
              prerelease: false
         | 
| 232 | 
            -
              version_requirements:  | 
| 233 | 
            -
                none: false
         | 
| 234 | 
            -
                requirements:
         | 
| 235 | 
            -
                - - ~>
         | 
| 236 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 237 | 
            -
                    version: '1'
         | 
| 167 | 
            +
              version_requirements: *70112214096680
         | 
| 238 168 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 239 169 | 
             
              name: httpthumbnailer
         | 
| 240 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 170 | 
            +
              requirement: &70112214095980 !ruby/object:Gem::Requirement
         | 
| 241 171 | 
             
                none: false
         | 
| 242 172 | 
             
                requirements:
         | 
| 243 173 | 
             
                - - ~>
         | 
| @@ -245,28 +175,18 @@ dependencies: | |
| 245 175 | 
             
                    version: '0.2'
         | 
| 246 176 | 
             
              type: :development
         | 
| 247 177 | 
             
              prerelease: false
         | 
| 248 | 
            -
              version_requirements:  | 
| 249 | 
            -
                none: false
         | 
| 250 | 
            -
                requirements:
         | 
| 251 | 
            -
                - - ~>
         | 
| 252 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 253 | 
            -
                    version: '0.2'
         | 
| 178 | 
            +
              version_requirements: *70112214095980
         | 
| 254 179 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 255 180 | 
             
              name: prawn
         | 
| 256 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 181 | 
            +
              requirement: &70112214095380 !ruby/object:Gem::Requirement
         | 
| 257 182 | 
             
                none: false
         | 
| 258 183 | 
             
                requirements:
         | 
| 259 | 
            -
                - -  | 
| 184 | 
            +
                - - =
         | 
| 260 185 | 
             
                  - !ruby/object:Gem::Version
         | 
| 261 186 | 
             
                    version: 0.8.4
         | 
| 262 187 | 
             
              type: :development
         | 
| 263 188 | 
             
              prerelease: false
         | 
| 264 | 
            -
              version_requirements:  | 
| 265 | 
            -
                none: false
         | 
| 266 | 
            -
                requirements:
         | 
| 267 | 
            -
                - - '='
         | 
| 268 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 269 | 
            -
                    version: 0.8.4
         | 
| 189 | 
            +
              version_requirements: *70112214095380
         | 
| 270 190 | 
             
            description: Thumbnails images using httpthumbnailer and stored data on HTTP server
         | 
| 271 191 | 
             
              (S3)
         | 
| 272 192 | 
             
            email: jpastuszek@gmail.com
         | 
| @@ -286,6 +206,7 @@ files: | |
| 286 206 | 
             
            - Rakefile
         | 
| 287 207 | 
             
            - VERSION
         | 
| 288 208 | 
             
            - bin/httpimagestore
         | 
| 209 | 
            +
            - features/cache-control.feature
         | 
| 289 210 | 
             
            - features/httpimagestore.feature
         | 
| 290 211 | 
             
            - features/step_definitions/httpimagestore_steps.rb
         | 
| 291 212 | 
             
            - features/support/env.rb
         | 
| @@ -316,7 +237,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 316 237 | 
             
                  version: '0'
         | 
| 317 238 | 
             
                  segments:
         | 
| 318 239 | 
             
                  - 0
         | 
| 319 | 
            -
                  hash: - | 
| 240 | 
            +
                  hash: -3577536956281328176
         | 
| 320 241 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 321 242 | 
             
              none: false
         | 
| 322 243 | 
             
              requirements:
         | 
| @@ -325,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 325 246 | 
             
                  version: '0'
         | 
| 326 247 | 
             
            requirements: []
         | 
| 327 248 | 
             
            rubyforge_project: 
         | 
| 328 | 
            -
            rubygems_version: 1.8. | 
| 249 | 
            +
            rubygems_version: 1.8.15
         | 
| 329 250 | 
             
            signing_key: 
         | 
| 330 251 | 
             
            specification_version: 3
         | 
| 331 252 | 
             
            summary: HTTP based image storage and thumbnailer
         |