dink 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dink.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Dink
2
+
3
+ ### Currently under development, you probably don't want to download this.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/dink.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "dink/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "dink"
7
+ s.version = Dink::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Graham Powrie"]
10
+ s.email = ["graham@developmentnow.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{On-the-fly image resizing and management for mobile devices}
13
+ s.description = %q{}
14
+
15
+ s.rubyforge_project = "dink"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency('addressable', '~> 2.2.2')
23
+ s.add_dependency('json', '~> 1.4.6')
24
+ end
data/lib/dink/batch.rb ADDED
@@ -0,0 +1,39 @@
1
+ module Dink
2
+ class Batch
3
+
4
+ attr_accessor :images
5
+
6
+ # Batch is just an array of images
7
+ def initialize
8
+ self.images = []
9
+ end
10
+
11
+ # Send images to Dink for transformation, first +screen+ and translate +to_json+
12
+ def deliver
13
+ Dink.sender.send_image_process_data(self.to_json)
14
+ end
15
+
16
+ # Ready images for transport across voidy vastness of teh interweb
17
+ def to_json
18
+ JSON.generate(self.images.collect{|i| i.to_hash})
19
+ end
20
+
21
+ # :nodoc:
22
+ def << image
23
+ self.images << image
24
+ end
25
+
26
+ # :nodoc:
27
+ def size
28
+ self.images.size
29
+ end
30
+ alias_method :length, :size
31
+
32
+ # :nodoc:
33
+ def empty?
34
+ return true if self.size == 0
35
+ false
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,104 @@
1
+ module Dink
2
+ # Used to set up and modify settings for the notifier.
3
+ class Configuration
4
+
5
+ OPTIONS = [:api_key, :host, :http_open_timeout, :http_read_timeout, :project_root,
6
+ :port, :protocol, :secure, :framework].freeze
7
+
8
+ # The API key for your project, found on the project edit form.
9
+ attr_accessor :api_key
10
+
11
+ # The host to connect to
12
+ attr_accessor :host
13
+
14
+ # The CDN host to connect to
15
+ attr_accessor :cdn_host
16
+
17
+ # The port on which your server runs (defaults to 443 for secure
18
+ # connections, 80 for insecure connections).
19
+ attr_accessor :port
20
+
21
+ # +true+ for https connections, +false+ for http connections.
22
+ attr_accessor :secure
23
+
24
+ # The path to the project in which the error occurred, such as the RAILS_ROOT
25
+ attr_accessor :project_root
26
+
27
+ # The logger used by
28
+ attr_accessor :logger
29
+
30
+ # The framework is configured to use
31
+ attr_accessor :framework
32
+
33
+ # The HTTP open timeout in seconds (defaults to 2).
34
+ attr_accessor :http_open_timeout
35
+
36
+ # The HTTP read timeout in seconds (defaults to 5).
37
+ attr_accessor :http_read_timeout
38
+
39
+ alias_method :secure?, :secure
40
+
41
+ def initialize
42
+ @secure = false
43
+ @host ||= 'dink.developmentnow.com'
44
+ @port ||= 80
45
+ @cdn_host = 'd15ceu2kbcb932.cloudfront.net'
46
+ @framework = 'Standalone'
47
+ @protocol = protocol
48
+ @http_open_timeout = 2
49
+ @http_read_timeout = 10
50
+ end
51
+
52
+ # Allows config options to be read like a hash
53
+ #
54
+ # @param [Symbol] option Key for a given attribute
55
+ def [](option)
56
+ send(option)
57
+ end
58
+
59
+ def url
60
+ url = URI::HTTP.build({
61
+ :host => @host,
62
+ :scheme => protocol,
63
+ :path => "/",
64
+ :port => @port
65
+ })
66
+ end
67
+
68
+ # Returns a hash of all configurable options
69
+ def to_hash
70
+ OPTIONS.inject({}) do |hash, option|
71
+ hash.merge(option.to_sym => send(option))
72
+ end
73
+ end
74
+
75
+ # Returns a hash of all configurable options merged with +hash+
76
+ #
77
+ # @param [Hash] hash A set of configuration options that will take precedence over the defaults
78
+ def merge(hash)
79
+ to_hash.merge(hash)
80
+ end
81
+
82
+ def port
83
+ @port || default_port
84
+ end
85
+
86
+ def protocol
87
+ if secure?
88
+ 'https'
89
+ else
90
+ 'http'
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def default_port
97
+ if secure?
98
+ 443
99
+ else
100
+ 80
101
+ end
102
+ end
103
+ end
104
+ end
data/lib/dink/image.rb ADDED
@@ -0,0 +1,72 @@
1
+ module Dink
2
+
3
+ # Intermediate utility class for image manipulation
4
+ class Image
5
+
6
+ SLUG_ABBREVIATIONS = {
7
+ :device_width_ratio => "dwr"
8
+ }
9
+
10
+ PROCESS_OPTIONS = [
11
+ "device_width_ratio"
12
+ ]
13
+
14
+ # The public location of the image
15
+ attr_accessor :source, :device_width_ratio
16
+
17
+ # :nodoc:
18
+ def initialize(source, options)
19
+ self.source = source
20
+ self.device_width_ratio = options[:device_width_ratio] || 1
21
+ end
22
+
23
+ # Generates a SHA1 represenation for a particular URL
24
+ def url_id
25
+ Digest::SHA1.hexdigest(self.source)
26
+ end
27
+
28
+ # Combines resizing parameters into a short, unique slug to be appended to the final image name
29
+ def params_slug
30
+ PROCESS_OPTIONS.map do |option|
31
+ param_slug(option)
32
+ end.join("")
33
+ end
34
+
35
+ # The full image name, a combination of +url_id+ and +params_slug+
36
+ def name
37
+ url_id + "_" + params_slug
38
+ end
39
+
40
+ # Location on server that will server this image
41
+ def cdn_url
42
+ Dink.configuration.protocol + "://" +
43
+ Dink.configuration.cdn_host +
44
+ "/images/" +
45
+ Dink.configuration.api_key + "/" +
46
+ self.name
47
+ end
48
+
49
+ def deliver
50
+ Dink.sender.send_image_process_data("[#{self.to_json}]")
51
+ end
52
+
53
+ # Ready images for transport across voidy vastness of teh interweb
54
+ def to_json
55
+ JSON.generate(self.to_hash)
56
+ end
57
+
58
+ # A hash representation of the image attributes
59
+ def to_hash
60
+ {
61
+ :source => self.source,
62
+ :name => self.name,
63
+ }
64
+ end
65
+
66
+ private
67
+ def param_slug(param_name)
68
+ SLUG_ABBREVIATIONS[param_name.to_sym] + self.send(param_name).to_s
69
+ end
70
+
71
+ end
72
+ end
data/lib/dink/rack.rb ADDED
@@ -0,0 +1,14 @@
1
+ # Simply grab the headers out of the request for use later
2
+ module Dink
3
+ class Rack
4
+
5
+ def initialize(app)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ Dink.sender.user_agent = env["HTTP_USER_AGENT"]
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
Binary file
@@ -0,0 +1,31 @@
1
+ module Dink
2
+ module Helpers
3
+ include ActionView::Helpers
4
+
5
+ # Take image transform parameters and generate an image tag and stick it into the batch
6
+ def dink!(source, process_options = {}, image_options = {})
7
+ image = Dink::Image.new(source, process_options).deliver
8
+ Rails.logger.debug{ image.inspect }
9
+ # @image_batch << image
10
+ image_tag(image["results"]["url"], image_options)
11
+ end
12
+
13
+ # def stream_resize(image_source)
14
+ # b = Benchmark.measure do
15
+ # @params = Addressable::URI.parse(url.to_s) # TODO get URI.parse out of Addressable to remove the dependency
16
+ # @params.query_values = {:image_source => image_source, :stream => "1"}
17
+ # end
18
+ # # logger.debug { "STREAM BENCHMARK :: #{b}" }
19
+ #
20
+ # stream_url = url
21
+ # stream_url.path = "/resize"
22
+ # stream_url.query = @params.query
23
+ # stream_url.to_s
24
+ # end
25
+
26
+ def logger
27
+ Dink.configuration.logger
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,17 @@
1
+ module Dink
2
+ module Hooks
3
+
4
+ def self.included(base)
5
+ base.before_filter :image_batch
6
+ base.append_before_filter :deliver_batch
7
+ end
8
+
9
+ def image_batch
10
+ @image_batch = Dink::Batch.new
11
+ end
12
+ def deliver_batch
13
+ @image_batch.deliver unless @image_batch.empty?
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ require 'dink'
2
+ require 'rails'
3
+
4
+ module Dink
5
+ class Railtie < Rails::Railtie
6
+ initializer "dink.use_rack_middleware" do |app|
7
+ app.config.middleware.use "Dink::Rack"
8
+ end
9
+
10
+ config.before_initialize do
11
+ Dink.configure do |config|
12
+ # config.host = "localhost"
13
+ # config.port = 3000
14
+ config.logger ||= Rails.logger
15
+ config.framework = "Rails: #{::Rails::VERSION::STRING}"
16
+ end
17
+
18
+ config.to_prepare do
19
+ require 'dink/rails/hooks'
20
+ ActiveSupport.on_load(:action_controller) do
21
+ include Dink::Hooks
22
+ end
23
+ end
24
+
25
+
26
+ if defined?(ActionView::Base)
27
+
28
+ require 'dink/rails/helpers'
29
+ ActionView::Base.send :include, Dink::Helpers
30
+
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ module Dink
2
+ class Receiver
3
+
4
+ def initialize(options = {})
5
+ end
6
+
7
+ def receive(response)
8
+ case response
9
+ when Net::HTTPSuccess then
10
+ log :info, "Success: #{response.class}", response
11
+
12
+ return JSON.parse(response.body)
13
+ else
14
+ log :error, "Failure: #{response.class}", response
15
+ end
16
+ end
17
+
18
+ def logger
19
+ Dink.configuration.logger
20
+ end
21
+
22
+ def log(level, message, response = nil)
23
+ logger.send level, LOG_PREFIX + message if logger
24
+ Dink.report_environment_info
25
+ Dink.report_response_body(response.body) if response && response.respond_to?(:body)
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,55 @@
1
+ module Dink
2
+ class Sender
3
+ PROCESS_HEADERS = {
4
+ 'Content-Type' => 'application/json',
5
+ 'Accept' => 'application/json'
6
+ }
7
+
8
+ HTTP_ERRORS = [Timeout::Error,
9
+ Errno::EINVAL,
10
+ Errno::ECONNRESET,
11
+ EOFError,
12
+ Net::HTTPBadResponse,
13
+ Net::HTTPHeaderSyntaxError,
14
+ Net::ProtocolError,
15
+ Errno::ECONNREFUSED].freeze
16
+
17
+ attr_accessor :user_agent
18
+
19
+ def initialize(options = {})
20
+ [:protocol, :host, :port, :secure, :http_open_timeout, :http_read_timeout].each do |option|
21
+ instance_variable_set("@#{option}", options[option])
22
+ end
23
+ end
24
+
25
+ def send_image_process_data(data)
26
+ http = Net::HTTP.new(@host, @port)
27
+
28
+ http.read_timeout = @http_read_timeout
29
+ http.open_timeout = @http_open_timeout
30
+ http.use_ssl = false
31
+ headers = PROCESS_HEADERS.merge({'User-Agent' => user_agent})
32
+
33
+ log :debug "Sending to: #{@host}:#{@port}"
34
+ response = begin
35
+ http.post("/link/#{Dink.configuration.api_key}", data, headers)
36
+ rescue *HTTP_ERRORS => e
37
+ log :error, "Timeout while contacting the server. #{e}"
38
+ nil
39
+ end
40
+
41
+ Dink.receiver.receive(response)
42
+ end
43
+
44
+ def log(level, message, response = nil)
45
+ logger.send level, LOG_PREFIX + message if logger
46
+ Dink.report_environment_info
47
+ Dink.report_response_body(response.body) if response && response.respond_to?(:body)
48
+ end
49
+
50
+ def logger
51
+ Dink.configuration.logger
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,3 @@
1
+ module Dink
2
+ VERSION = "0.0.4"
3
+ end
data/lib/dink.rb ADDED
@@ -0,0 +1,67 @@
1
+ module Dink
2
+ require 'net/http'
3
+ require 'net/https'
4
+ require 'addressable/uri'
5
+ require 'json'
6
+ # begin
7
+ # require 'active_support'
8
+ # rescue LoadError
9
+ # require 'activesupport'
10
+ # end
11
+
12
+ require 'dink/configuration'
13
+ require 'dink/sender'
14
+ require 'dink/receiver'
15
+ require 'dink/rack'
16
+ require 'dink/image'
17
+ require 'dink/batch'
18
+ require 'dink/railtie' if defined?(Rails)
19
+
20
+ LOG_PREFIX = "[Dink] "
21
+
22
+ class << self
23
+
24
+ # The sender object is responsible for delivering formatted data to the server.
25
+ attr_accessor :sender
26
+
27
+ # A configuration object. Must act like a hash and return sensible
28
+ # values for all configuration options. See Dink::Configuration.
29
+ attr_accessor :configuration
30
+
31
+ # A receiver of requests
32
+ attr_accessor :receiver
33
+
34
+ def configure(silent = false)
35
+ self.configuration ||= Configuration.new
36
+ yield(configuration)
37
+ self.sender = Sender.new(configuration)
38
+ self.receiver = Receiver.new(configuration)
39
+ end
40
+
41
+ def logger
42
+ self.configuration.logger
43
+ end
44
+
45
+ # Prints out the environment info to the log for debugging help
46
+ def report_environment_info
47
+ write_verbose_log("Environment Info: #{environment_info}")
48
+ end
49
+
50
+ # Prints out the response body from Dink for debugging help
51
+ def report_response_body(response)
52
+ write_verbose_log("Response from Server: \n#{response}")
53
+ end
54
+
55
+ # Returns the Ruby version, Rails version, and current Rails environment
56
+ def environment_info
57
+ info = "[Ruby: #{RUBY_VERSION}]"
58
+ info << " [#{configuration.framework}]"
59
+ end
60
+
61
+ # Writes out the given message to the #logger
62
+ def write_verbose_log(message)
63
+ logger.info LOG_PREFIX + message if logger
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dink/batch')
3
+
4
+ describe Dink::Batch do
5
+ before(:each) do
6
+ @image1, @image2 = random_image, random_image
7
+ @batch = Dink::Batch.new
8
+ end
9
+
10
+ it "should gather up all the images on a page for resizing" do
11
+ pending "This should really be an integration test"
12
+ end
13
+
14
+ it "should accept new images like an array" do
15
+ @batch << @image1
16
+ @batch.size.should be 1
17
+ end
18
+
19
+ it "should respond to empty?" do
20
+ @batch.empty?.should be true
21
+ @batch << @image1
22
+ @batch.empty?.should be false
23
+ end
24
+
25
+ it "should respond to #to_json" do
26
+ @batch << @image1
27
+ @batch << @image2
28
+ @batch.to_json.should be_a_kind_of(String)
29
+ end
30
+
31
+ describe "#deliver" do
32
+ before(:each) do
33
+ @batch << @image1
34
+ @batch << @image2
35
+ end
36
+
37
+ it "should send a hash of unprocessed images to Dink" do
38
+ Dink.sender.user_agent = "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3"
39
+ @batch.deliver
40
+ end
41
+ end
42
+
43
+ # describe "#screen" do
44
+ # it "should check local cache to see if any of the images have already been processed" do
45
+ # pending
46
+ # end
47
+ # it "should skip sending of already processed images to Dink" do
48
+ # pending
49
+ # # cache fake result, try to resend image
50
+ # end
51
+ # end
52
+
53
+
54
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dink/rails/helpers')
3
+
4
+ describe Dink::Configuration do
5
+
6
+ it "should bla" do
7
+ pending
8
+ end
9
+
10
+ def assert_config_default(option, default_value, config = nil)
11
+ config ||= Dink::Configuration.new
12
+ assert_equal default_value, config.send(option)
13
+ end
14
+
15
+ end
@@ -0,0 +1,22 @@
1
+ require "rails"
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dink/rails/helpers')
4
+ include Dink::Helpers
5
+
6
+ describe Dink::Helpers do
7
+
8
+ before(:each) do
9
+ @image_batch = Dink::Batch.new
10
+ @image = test_images[rand(3)]
11
+ end
12
+
13
+ describe "#transform" do
14
+ it "should respond with some image tag HTML" do
15
+
16
+ transform_image("http://bla.com/image.jpg", {}).should =~ /^\<img/
17
+
18
+
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,6 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dink/rails/hooks')
3
+
4
+ describe Dink::Hooks do
5
+
6
+ end
@@ -0,0 +1,72 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dink/image')
3
+
4
+ describe Dink::Image do
5
+
6
+ before(:each) do
7
+ @image = random_image
8
+ end
9
+
10
+ it "should have some default values assigned" do
11
+ assert_default_value :device_width_ratio, 1
12
+ end
13
+
14
+ describe "#url_id" do
15
+ it "should generate a unique id for an image based on it's URL" do
16
+ id = @image.url_id
17
+ id.should be_a_kind_of(String)
18
+ id.length.should be 40
19
+ end
20
+ end
21
+
22
+ describe "#params_slug" do
23
+ it "should respond with a string representation of the transform parameters " do
24
+ @image.params_slug.should be_a_kind_of(String)
25
+ end
26
+ end
27
+
28
+ describe "#name" do
29
+ it "should respond with the url_id and abbreviated transform params" do
30
+ @image.name.should =~ /^[\w\d]{40}_[\w\d]+$/
31
+ end
32
+ end
33
+
34
+ describe "#s3_url" do
35
+ it "should respond with the full url of a post-transform and distributed image" do
36
+ @image.cdn_url.should =~ /^http:\/\//
37
+ end
38
+ end
39
+
40
+ describe "#to_hash" do
41
+ it "should respond to to_hash" do
42
+ @image.to_hash.should be_a_kind_of(Hash)
43
+ end
44
+ it "should have some specific keys" do
45
+ hash = @image.to_hash
46
+ hash[:source].should_not be nil
47
+ hash[:name].should_not be nil
48
+ end
49
+ end
50
+
51
+ describe "#cached?" do
52
+ it "should return true if the image name is in local cache" do
53
+ pending
54
+ end
55
+ it "should return false if the image name is not found in local cache" do
56
+ pending
57
+ end
58
+ end
59
+
60
+ describe "#to_json" do
61
+ it "should respond to to_json" do
62
+ json = @image.to_json
63
+ json.should be_a_kind_of(String)
64
+ JSON.parse(json).should be_a_kind_of(Hash)
65
+ end
66
+ end
67
+
68
+ def assert_default_value(option, default_value)
69
+ default_value.should be @image.send(option)
70
+ end
71
+
72
+ end
@@ -0,0 +1,10 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dink/receiver')
3
+
4
+ describe Dink::Receiver do
5
+
6
+ it "should log the round-trip time" do
7
+ pending
8
+ end
9
+
10
+ end
@@ -0,0 +1,28 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dink')
2
+ require "rails/all"
3
+
4
+ RSpec.configure do |config|
5
+ # == Mock Framework
6
+ config.mock_with :rspec
7
+ end
8
+
9
+
10
+ def test_images
11
+ [
12
+ { :source => "http://www.crazy-frog.us/donthotlink-crazy-frog-1024x768-1.jpg",
13
+ :options => {} },
14
+ { :source => "https://totalfright.websitesource.net/mm5/pics/32901.jpg",
15
+ :options => {} },
16
+ { :source => "http://iamthatmommy.files.wordpress.com/2010/04/unicorn1.jpg",
17
+ :options => {} }
18
+ ]
19
+ end
20
+
21
+ def random_image
22
+ image_number = rand(test_images.size)
23
+ Dink::Image.new(test_images[image_number][:source], test_images[image_number][:options])
24
+ end
25
+
26
+ Dink.configure do |c|
27
+ c.api_key = "1234123412341234"
28
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dink')
3
+
4
+ describe Dink do
5
+
6
+ describe "#configure" do
7
+ it "should have with an API key or raise an error" do
8
+ pending
9
+ end
10
+ end
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dink
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 4
9
+ version: 0.0.4
10
+ platform: ruby
11
+ authors:
12
+ - Graham Powrie
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-02-18 00:00:00 -08:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: addressable
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 2
31
+ - 2
32
+ version: 2.2.2
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: json
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 1
45
+ - 4
46
+ - 6
47
+ version: 1.4.6
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ description: ""
51
+ email:
52
+ - graham@developmentnow.com
53
+ executables: []
54
+
55
+ extensions: []
56
+
57
+ extra_rdoc_files: []
58
+
59
+ files:
60
+ - .gitignore
61
+ - Gemfile
62
+ - README.md
63
+ - Rakefile
64
+ - dink.gemspec
65
+ - lib/dink.rb
66
+ - lib/dink/batch.rb
67
+ - lib/dink/configuration.rb
68
+ - lib/dink/image.rb
69
+ - lib/dink/rack.rb
70
+ - lib/dink/rails/.DS_Store
71
+ - lib/dink/rails/helpers.rb
72
+ - lib/dink/rails/hooks.rb
73
+ - lib/dink/railtie.rb
74
+ - lib/dink/receiver.rb
75
+ - lib/dink/sender.rb
76
+ - lib/dink/version.rb
77
+ - spec/batch_spec.rb
78
+ - spec/configuration_spec.rb
79
+ - spec/helpers_spec.rb
80
+ - spec/hooks_spec.rb
81
+ - spec/image_spec.rb
82
+ - spec/receiver_spec.rb
83
+ - spec/spec_helper.rb
84
+ - spec/stilts_spec.rb
85
+ has_rdoc: true
86
+ homepage: ""
87
+ licenses: []
88
+
89
+ post_install_message:
90
+ rdoc_options: []
91
+
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ segments:
108
+ - 0
109
+ version: "0"
110
+ requirements: []
111
+
112
+ rubyforge_project: dink
113
+ rubygems_version: 1.3.7
114
+ signing_key:
115
+ specification_version: 3
116
+ summary: On-the-fly image resizing and management for mobile devices
117
+ test_files:
118
+ - spec/batch_spec.rb
119
+ - spec/configuration_spec.rb
120
+ - spec/helpers_spec.rb
121
+ - spec/hooks_spec.rb
122
+ - spec/image_spec.rb
123
+ - spec/receiver_spec.rb
124
+ - spec/spec_helper.rb
125
+ - spec/stilts_spec.rb