Class: Hork

Inherits:
Object
  • Object
show all
Defined in:
lib/hork.rb

Constant Summary collapse

VERSION =
"1.0.0"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Hork

Returns a new instance of Hork.



10
11
12
13
14
15
# File 'lib/hork.rb', line 10

def initialize(app)
  @app              = app
  @css_compressor   = YUI::CssCompressor.new
  @js_compressor    = YUI::JavaScriptCompressor.new(:munge => true)
  @compressed_files = {}
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



8
9
10
# File 'lib/hork.rb', line 8

def app
  @app
end

#compressed_filesObject (readonly)

Returns the value of attribute compressed_files.



8
9
10
# File 'lib/hork.rb', line 8

def compressed_files
  @compressed_files
end

#css_compressorObject (readonly)

Returns the value of attribute css_compressor.



8
9
10
# File 'lib/hork.rb', line 8

def css_compressor
  @css_compressor
end

#js_compressorObject (readonly)

Returns the value of attribute js_compressor.



8
9
10
# File 'lib/hork.rb', line 8

def js_compressor
  @js_compressor
end

Instance Method Details

#call(env) ⇒ Object



17
18
19
20
21
22
23
24
25
# File 'lib/hork.rb', line 17

def call(env)
  status, headers, body = response = app.call(env)

  case headers["Content-Type"]
  when /\bcss\b/        then compress_response(:css, *response)
  when /\bjavascript\b/ then compress_response(:js,  *response)
  else response
  end
end

#compress(type, source) ⇒ Object



33
34
35
36
# File 'lib/hork.rb', line 33

def compress(type, source)
  compressed_files[Digest::MD5.hexdigest(source)] ||=
    send("#{type}_compressor").compress(source)
end

#compress_response(type, status, headers, body) ⇒ Object



27
28
29
30
31
# File 'lib/hork.rb', line 27

def compress_response(type, status, headers, body)
  compressed_body = compress(type, read_body(body))
  headers["Content-Length"] = Rack::Utils.bytesize(compressed_body).to_s
  [status, headers, [compressed_body]]
end

#read_body(source_body) ⇒ Object



38
39
40
41
42
# File 'lib/hork.rb', line 38

def read_body(source_body)
  "".tap do |body|
    source_body.each { |part| body << part }
  end
end