stilts 0.0.1
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/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/lib/stilts/configuration.rb +103 -0
- data/lib/stilts/rack.rb +14 -0
- data/lib/stilts/rails/.DS_Store +0 -0
- data/lib/stilts/rails/helpers.rb +37 -0
- data/lib/stilts/railtie.rb +26 -0
- data/lib/stilts/sender.rb +97 -0
- data/lib/stilts/version.rb +3 -0
- data/lib/stilts.rb +62 -0
- data/stilts.gemspec +23 -0
- metadata +90 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
module Stilts
|
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, :proxy_host, :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 port on which your server runs (defaults to 443 for secure
|
15
|
+
# connections, 80 for insecure connections).
|
16
|
+
attr_accessor :port
|
17
|
+
|
18
|
+
# +true+ for https connections, +false+ for http connections.
|
19
|
+
attr_accessor :secure
|
20
|
+
|
21
|
+
# A list of parameters that should be filtered out of what is sent to Hoptoad.
|
22
|
+
# By default, all "password" attributes will have their contents replaced.
|
23
|
+
attr_reader :params_filters
|
24
|
+
|
25
|
+
# A list of filters for cleaning and pruning the backtrace. See #filter_backtrace.
|
26
|
+
attr_reader :backtrace_filters
|
27
|
+
|
28
|
+
# A list of filters for ignoring exceptions. See #ignore_by_filter.
|
29
|
+
attr_reader :ignore_by_filters
|
30
|
+
|
31
|
+
# The path to the project in which the error occurred, such as the RAILS_ROOT
|
32
|
+
attr_accessor :project_root
|
33
|
+
|
34
|
+
# The url of the notifier library being used to send notifications
|
35
|
+
attr_accessor :notifier_url
|
36
|
+
|
37
|
+
# The logger used by
|
38
|
+
attr_accessor :logger
|
39
|
+
|
40
|
+
# The framework is configured to use
|
41
|
+
attr_accessor :framework
|
42
|
+
|
43
|
+
alias_method :secure?, :secure
|
44
|
+
|
45
|
+
def initialize
|
46
|
+
@secure = false
|
47
|
+
@host = 'localhost'
|
48
|
+
@framework = 'Standalone'
|
49
|
+
end
|
50
|
+
|
51
|
+
# Allows config options to be read like a hash
|
52
|
+
#
|
53
|
+
# @param [Symbol] option Key for a given attribute
|
54
|
+
def [](option)
|
55
|
+
send(option)
|
56
|
+
end
|
57
|
+
|
58
|
+
def url
|
59
|
+
url = URI::HTTP.build({
|
60
|
+
:host => @host,
|
61
|
+
:scheme => protocol,
|
62
|
+
:path => "/",
|
63
|
+
:port => @port
|
64
|
+
})
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns a hash of all configurable options
|
68
|
+
def to_hash
|
69
|
+
OPTIONS.inject({}) do |hash, option|
|
70
|
+
hash.merge(option.to_sym => send(option))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Returns a hash of all configurable options merged with +hash+
|
75
|
+
#
|
76
|
+
# @param [Hash] hash A set of configuration options that will take precedence over the defaults
|
77
|
+
def merge(hash)
|
78
|
+
to_hash.merge(hash)
|
79
|
+
end
|
80
|
+
|
81
|
+
def port
|
82
|
+
@port || default_port
|
83
|
+
end
|
84
|
+
|
85
|
+
def protocol
|
86
|
+
if secure?
|
87
|
+
'https'
|
88
|
+
else
|
89
|
+
'http'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def default_port
|
96
|
+
if secure?
|
97
|
+
443
|
98
|
+
else
|
99
|
+
80
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/stilts/rack.rb
ADDED
Binary file
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Stilts
|
2
|
+
module Helpers
|
3
|
+
|
4
|
+
def resize(image_source)
|
5
|
+
b = Benchmark.measure do
|
6
|
+
@response = Stilts.sender.send_to_resizer({:image_source => image_source}.to_json.to_s)
|
7
|
+
end
|
8
|
+
logger.debug { "RESIZER BENCHMARK :: #{b}" }
|
9
|
+
|
10
|
+
image_url = url
|
11
|
+
image_url.path = ""
|
12
|
+
image_tag("#{image_url}#{@response['image_url']}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def stream_resize(image_source)
|
16
|
+
b = Benchmark.measure do
|
17
|
+
@params = Addressable::URI.parse(url.to_s)
|
18
|
+
@params.query_values = {:image_source => image_source, :stream => "1"}
|
19
|
+
end
|
20
|
+
logger.debug { "STREAM BENCHMARK :: #{b}" }
|
21
|
+
|
22
|
+
stream_url = url
|
23
|
+
stream_url.path = "/resize"
|
24
|
+
stream_url.query = @params.query
|
25
|
+
stream_url.to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
def url
|
29
|
+
Stilts.configuration.url.dup
|
30
|
+
end
|
31
|
+
|
32
|
+
def logger
|
33
|
+
Stilts.configuration.logger
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'stilts'
|
2
|
+
require 'rails'
|
3
|
+
|
4
|
+
module Stilts
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
initializer "stilts.use_rack_middleware" do |app|
|
7
|
+
app.config.middleware.use "Stilts::Rack"
|
8
|
+
end
|
9
|
+
|
10
|
+
config.before_initialize do
|
11
|
+
Stilts.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
|
+
if defined?(ActionView::Base)
|
19
|
+
|
20
|
+
require 'stilts/rails/helpers'
|
21
|
+
ActionView::Base.send :include, Stilts::Helpers
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Stilts
|
2
|
+
class Sender
|
3
|
+
RESIZER_PATH = "/resize"
|
4
|
+
RESIZER_HEADERS = {
|
5
|
+
'Content-Type' => 'application/json',
|
6
|
+
'Accept' => 'application/json'
|
7
|
+
}
|
8
|
+
|
9
|
+
STREAMER_PATH = "/resize"
|
10
|
+
STREAMER_HEADERS = {
|
11
|
+
'Content-Type' => 'image/jpeg',
|
12
|
+
'Accept' => 'image/jpeg'
|
13
|
+
}
|
14
|
+
HTTP_ERRORS = [Timeout::Error,
|
15
|
+
Errno::EINVAL,
|
16
|
+
Errno::ECONNRESET,
|
17
|
+
EOFError,
|
18
|
+
Net::HTTPBadResponse,
|
19
|
+
Net::HTTPHeaderSyntaxError,
|
20
|
+
Net::ProtocolError,
|
21
|
+
Errno::ECONNREFUSED].freeze
|
22
|
+
|
23
|
+
attr_accessor :user_agent
|
24
|
+
|
25
|
+
def initialize(options = {})
|
26
|
+
[:protocol, :host, :port, :secure].each do |option|
|
27
|
+
instance_variable_set("@#{option}", options[option])
|
28
|
+
end
|
29
|
+
# , :http_open_timeout, :http_read_timeout
|
30
|
+
end
|
31
|
+
|
32
|
+
def send_to_resizer(data)
|
33
|
+
http =
|
34
|
+
Net::HTTP.new(url.host, url.port)
|
35
|
+
|
36
|
+
http.read_timeout = 5
|
37
|
+
http.open_timeout = 5
|
38
|
+
http.use_ssl = false
|
39
|
+
headers = RESIZER_HEADERS.merge({'User-Agent' => user_agent})
|
40
|
+
|
41
|
+
response = begin
|
42
|
+
logger.debug{"POSTED JSON: #{data} TO: #{url.to_s}" }
|
43
|
+
http.post(RESIZER_PATH, data, headers)
|
44
|
+
rescue *HTTP_ERRORS => e
|
45
|
+
log :error, "Timeout while contacting the server. #{e}"
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
case response
|
50
|
+
when Net::HTTPSuccess then
|
51
|
+
log :info, "Success: #{response.class}", response
|
52
|
+
return JSON.parse(response.body)
|
53
|
+
else
|
54
|
+
log :error, "Failure: #{response.class}", response
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def send_to_streamer(data)
|
59
|
+
http =
|
60
|
+
Net::HTTP.new(url.host, url.port)
|
61
|
+
|
62
|
+
http.read_timeout = 5
|
63
|
+
http.open_timeout = 5
|
64
|
+
http.use_ssl = false
|
65
|
+
|
66
|
+
response = begin
|
67
|
+
http.get(STREAMER_PATH+data, STREAMER_HEADERS)
|
68
|
+
rescue *HTTP_ERRORS => e
|
69
|
+
log :error, "Timeout while contacting the server. #{e}"
|
70
|
+
nil
|
71
|
+
end
|
72
|
+
|
73
|
+
case response
|
74
|
+
when Net::HTTPSuccess then
|
75
|
+
log :info, "Success: #{response.class}", response
|
76
|
+
return response.body
|
77
|
+
else
|
78
|
+
log :error, "Failure: #{response.class}", response
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def url
|
83
|
+
Stilts.configuration.url.dup
|
84
|
+
end
|
85
|
+
|
86
|
+
def log(level, message, response = nil)
|
87
|
+
logger.send level, LOG_PREFIX + message if logger
|
88
|
+
Stilts.report_environment_info
|
89
|
+
Stilts.report_response_body(response.body) if response && response.respond_to?(:body)
|
90
|
+
end
|
91
|
+
|
92
|
+
def logger
|
93
|
+
Stilts.configuration.logger
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
data/lib/stilts.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
module Stilts
|
2
|
+
require 'net/http'
|
3
|
+
require 'net/https'
|
4
|
+
require 'addressable/uri'
|
5
|
+
# begin
|
6
|
+
# require 'active_support'
|
7
|
+
# rescue LoadError
|
8
|
+
# require 'activesupport'
|
9
|
+
# end
|
10
|
+
|
11
|
+
require 'stilts/configuration'
|
12
|
+
require 'stilts/sender'
|
13
|
+
require 'stilts/rack'
|
14
|
+
require 'stilts/railtie.rb' if defined?(Rails)
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
LOG_PREFIX = "[Stilts] "
|
19
|
+
|
20
|
+
class << self
|
21
|
+
|
22
|
+
# The sender object is responsible for delivering formatted data to the server.
|
23
|
+
# Must respond to #send_to_hoptoad. See Stilts::Sender.
|
24
|
+
attr_accessor :sender
|
25
|
+
|
26
|
+
# A configuration object. Must act like a hash and return sensible
|
27
|
+
# values for all configuration options. See Stilts::Configuration.
|
28
|
+
attr_accessor :configuration
|
29
|
+
|
30
|
+
def configure(silent = false)
|
31
|
+
self.configuration ||= Configuration.new
|
32
|
+
yield(configuration)
|
33
|
+
self.sender = Sender.new(configuration)
|
34
|
+
end
|
35
|
+
|
36
|
+
def logger
|
37
|
+
self.configuration.logger
|
38
|
+
end
|
39
|
+
|
40
|
+
# Prints out the environment info to the log for debugging help
|
41
|
+
def report_environment_info
|
42
|
+
write_verbose_log("Environment Info: #{environment_info}")
|
43
|
+
end
|
44
|
+
|
45
|
+
# Prints out the response body from Stilts for debugging help
|
46
|
+
def report_response_body(response)
|
47
|
+
write_verbose_log("Response from Server: \n#{response}")
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns the Ruby version, Rails version, and current Rails environment
|
51
|
+
def environment_info
|
52
|
+
info = "[Ruby: #{RUBY_VERSION}]"
|
53
|
+
info << " [#{configuration.framework}]"
|
54
|
+
end
|
55
|
+
|
56
|
+
# Writes out the given message to the #logger
|
57
|
+
def write_verbose_log(message)
|
58
|
+
logger.info LOG_PREFIX + message if logger
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
data/stilts.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "stilts/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "stilts"
|
7
|
+
s.version = Stilts::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 = "stilts"
|
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
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: stilts
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Graham Powrie
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-01-17 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
|
+
description: ""
|
36
|
+
email:
|
37
|
+
- graham@developmentnow.com
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files: []
|
43
|
+
|
44
|
+
files:
|
45
|
+
- .gitignore
|
46
|
+
- Gemfile
|
47
|
+
- Rakefile
|
48
|
+
- lib/stilts.rb
|
49
|
+
- lib/stilts/configuration.rb
|
50
|
+
- lib/stilts/rack.rb
|
51
|
+
- lib/stilts/rails/.DS_Store
|
52
|
+
- lib/stilts/rails/helpers.rb
|
53
|
+
- lib/stilts/railtie.rb
|
54
|
+
- lib/stilts/sender.rb
|
55
|
+
- lib/stilts/version.rb
|
56
|
+
- stilts.gemspec
|
57
|
+
has_rdoc: true
|
58
|
+
homepage: ""
|
59
|
+
licenses: []
|
60
|
+
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
version: "0"
|
82
|
+
requirements: []
|
83
|
+
|
84
|
+
rubyforge_project: stilts
|
85
|
+
rubygems_version: 1.3.7
|
86
|
+
signing_key:
|
87
|
+
specification_version: 3
|
88
|
+
summary: On-the-fly image resizing and management for mobile devices
|
89
|
+
test_files: []
|
90
|
+
|