kronk 1.7.8 → 1.8.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/History.rdoc +32 -0
- data/Manifest.txt +5 -5
- data/README.rdoc +5 -3
- data/Rakefile +3 -4
- data/TODO.rdoc +22 -6
- data/lib/kronk.rb +13 -7
- data/lib/kronk/buffered_io.rb +26 -0
- data/lib/kronk/cmd.rb +58 -44
- data/lib/kronk/constants.rb +5 -6
- data/lib/kronk/diff.rb +12 -13
- data/lib/kronk/diff/output.rb +1 -1
- data/lib/kronk/http.rb +105 -0
- data/lib/kronk/player.rb +74 -82
- data/lib/kronk/player/benchmark.rb +34 -35
- data/lib/kronk/player/stream.rb +6 -6
- data/lib/kronk/player/suite.rb +17 -16
- data/lib/kronk/player/tsv.rb +51 -0
- data/lib/kronk/queue_runner.rb +126 -102
- data/lib/kronk/request.rb +144 -82
- data/lib/kronk/response.rb +520 -202
- data/lib/kronk/test/helper_methods.rb +1 -1
- data/test/mocks/200_gzip.txt +0 -0
- data/test/mocks/200_inflate.txt +0 -0
- data/test/test_assertions.rb +1 -1
- data/test/test_cmd.rb +18 -11
- data/test/test_diff.rb +39 -0
- data/test/test_helper.rb +18 -14
- data/test/test_helper_methods.rb +5 -4
- data/test/test_kronk.rb +8 -11
- data/test/test_player.rb +67 -123
- data/test/test_request.rb +8 -14
- data/test/test_response.rb +228 -60
- metadata +20 -31
- data/lib/kronk/async.rb +0 -118
- data/lib/kronk/async/em_ext.rb +0 -34
- data/lib/kronk/async/request.rb +0 -73
- data/lib/kronk/async/response.rb +0 -70
- data/lib/kronk/player/output.rb +0 -49
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kronk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.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:
|
12
|
+
date: 2012-01-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
16
|
-
requirement: &
|
16
|
+
requirement: &70357826961820 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '1.5'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70357826961820
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: cookiejar
|
27
|
-
requirement: &
|
27
|
+
requirement: &70357826961200 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.3.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70357826961200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: plist
|
38
|
-
requirement: &
|
38
|
+
requirement: &70357826960660 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 3.1.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70357826960660
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: nokogiri
|
49
|
-
requirement: &
|
49
|
+
requirement: &70357826960080 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '1.4'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70357826960080
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: mocha
|
60
|
-
requirement: &
|
60
|
+
requirement: &70357826959520 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,21 +65,10 @@ dependencies:
|
|
65
65
|
version: 0.9.12
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: em-http-request
|
71
|
-
requirement: &2152143020 !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
|
-
requirements:
|
74
|
-
- - ~>
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 1.0.0
|
77
|
-
type: :development
|
78
|
-
prerelease: false
|
79
|
-
version_requirements: *2152143020
|
68
|
+
version_requirements: *70357826959520
|
80
69
|
- !ruby/object:Gem::Dependency
|
81
70
|
name: hoe
|
82
|
-
requirement: &
|
71
|
+
requirement: &70357826958980 !ruby/object:Gem::Requirement
|
83
72
|
none: false
|
84
73
|
requirements:
|
85
74
|
- - ~>
|
@@ -87,7 +76,7 @@ dependencies:
|
|
87
76
|
version: '2.12'
|
88
77
|
type: :development
|
89
78
|
prerelease: false
|
90
|
-
version_requirements: *
|
79
|
+
version_requirements: *70357826958980
|
91
80
|
description: ! 'Kronk runs diffs against data from live and cached http responses.
|
92
81
|
|
93
82
|
Kronk was made possible by the sponsoring of AT&T Interactive.'
|
@@ -109,10 +98,6 @@ files:
|
|
109
98
|
- Rakefile
|
110
99
|
- bin/kronk
|
111
100
|
- lib/kronk.rb
|
112
|
-
- lib/kronk/async.rb
|
113
|
-
- lib/kronk/async/em_ext.rb
|
114
|
-
- lib/kronk/async/request.rb
|
115
|
-
- lib/kronk/async/response.rb
|
116
101
|
- lib/kronk/cmd.rb
|
117
102
|
- lib/kronk/constants.rb
|
118
103
|
- lib/kronk/core_ext.rb
|
@@ -121,6 +106,8 @@ files:
|
|
121
106
|
- lib/kronk/diff/ascii_format.rb
|
122
107
|
- lib/kronk/diff/color_format.rb
|
123
108
|
- lib/kronk/diff/output.rb
|
109
|
+
- lib/kronk/http.rb
|
110
|
+
- lib/kronk/buffered_io.rb
|
124
111
|
- lib/kronk/path.rb
|
125
112
|
- lib/kronk/path/matcher.rb
|
126
113
|
- lib/kronk/path/match.rb
|
@@ -128,10 +115,10 @@ files:
|
|
128
115
|
- lib/kronk/player.rb
|
129
116
|
- lib/kronk/player/benchmark.rb
|
130
117
|
- lib/kronk/player/input_reader.rb
|
131
|
-
- lib/kronk/player/output.rb
|
132
118
|
- lib/kronk/player/request_parser.rb
|
133
119
|
- lib/kronk/player/suite.rb
|
134
120
|
- lib/kronk/player/stream.rb
|
121
|
+
- lib/kronk/player/tsv.rb
|
135
122
|
- lib/kronk/plist_parser.rb
|
136
123
|
- lib/kronk/queue_runner.rb
|
137
124
|
- lib/kronk/request.rb
|
@@ -142,6 +129,8 @@ files:
|
|
142
129
|
- lib/kronk/xml_parser.rb
|
143
130
|
- lib/kronk/yaml_parser.rb
|
144
131
|
- script/kronk_completion
|
132
|
+
- test/mocks/200_gzip.txt
|
133
|
+
- test/mocks/200_inflate.txt
|
145
134
|
- test/mocks/200_response.json
|
146
135
|
- test/mocks/200_response.plist
|
147
136
|
- test/mocks/200_response.txt
|
@@ -192,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
181
|
version: '0'
|
193
182
|
requirements: []
|
194
183
|
rubyforge_project: kronk
|
195
|
-
rubygems_version: 1.8.
|
184
|
+
rubygems_version: 1.8.11
|
196
185
|
signing_key:
|
197
186
|
specification_version: 3
|
198
187
|
summary: Kronk runs diffs against data from live and cached http responses
|
data/lib/kronk/async.rb
DELETED
@@ -1,118 +0,0 @@
|
|
1
|
-
require 'kronk'
|
2
|
-
require 'kronk/async/em_ext'
|
3
|
-
require 'kronk/async/request'
|
4
|
-
require 'kronk/async/response'
|
5
|
-
|
6
|
-
class Kronk
|
7
|
-
|
8
|
-
##
|
9
|
-
# Returns an EM::MultiRequest instance from a url, file, or IO pair.
|
10
|
-
# Calls the given block with a Kronk::Diff object on completion or error.
|
11
|
-
# Assigns @response, @responses, @diff. Must be called from an EM loop.
|
12
|
-
#
|
13
|
-
# kronk.compare_async uri1, uri2 do |diff, err|
|
14
|
-
# # handle diff, responses, or error
|
15
|
-
# end
|
16
|
-
|
17
|
-
def compare_async uri1, uri2
|
18
|
-
multi = EM::MultiRequest.new
|
19
|
-
|
20
|
-
str1 = str2 = ""
|
21
|
-
res1 = res2 = nil
|
22
|
-
err1 = err2 = nil
|
23
|
-
|
24
|
-
conn1 = request_async uri1 do |res, err|
|
25
|
-
err1 = err and next if err
|
26
|
-
res1 = res
|
27
|
-
str1 = res.stringify
|
28
|
-
end
|
29
|
-
|
30
|
-
conn2 = request_async uri2 do |res, err|
|
31
|
-
err2 = err and next if err
|
32
|
-
res2 = res
|
33
|
-
str2 = res.stringify
|
34
|
-
end
|
35
|
-
|
36
|
-
multi.add :left, conn1
|
37
|
-
multi.add :right, conn2
|
38
|
-
|
39
|
-
multi.callback do
|
40
|
-
next yield(nil, (err1 || err2)) if err1 || err2
|
41
|
-
|
42
|
-
@responses = [res1, res2]
|
43
|
-
@response = res2
|
44
|
-
|
45
|
-
opts = {:labels => [res1.uri, res2.uri]}.merge @options
|
46
|
-
@diff = Diff.new str1, str2, opts
|
47
|
-
|
48
|
-
yield @diff
|
49
|
-
end
|
50
|
-
|
51
|
-
multi
|
52
|
-
|
53
|
-
rescue => e
|
54
|
-
yield nil, e
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
##
|
59
|
-
# Returns an EventMachine Connection instance from a url, file, or IO.
|
60
|
-
# Calls the given block with a Kronk::Response object on completion or error.
|
61
|
-
# Assigns @response, @responses, @diff. Must be called from an EM loop.
|
62
|
-
#
|
63
|
-
# kronk.request_async uri do |resp, err|
|
64
|
-
# # handle response or error
|
65
|
-
# end
|
66
|
-
|
67
|
-
def request_async uri
|
68
|
-
options = Kronk.config[:no_uri_options] ? @options : options_for_uri(uri)
|
69
|
-
|
70
|
-
rdir = options[:follow_redirects]
|
71
|
-
|
72
|
-
handler = Proc.new do |resp, err|
|
73
|
-
next yield(resp, err) if err
|
74
|
-
|
75
|
-
resp.parser = options[:parser] if options[:parser]
|
76
|
-
resp.stringify_opts = options
|
77
|
-
|
78
|
-
if resp.redirect? && (rdir == true || Fixnum === rdir && rdir > 0)
|
79
|
-
Cmd.verbose "Following redirect to #{resp.location}"
|
80
|
-
|
81
|
-
rdir = rdir - 1 if Fixnum === rdir
|
82
|
-
opts = options_for_uri resp.location
|
83
|
-
resp.follow_redirect_async(opts, &handler)
|
84
|
-
|
85
|
-
else
|
86
|
-
@responses = [resp]
|
87
|
-
@response = resp
|
88
|
-
@diff = nil
|
89
|
-
|
90
|
-
yield resp if block_given?
|
91
|
-
|
92
|
-
resp
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
if IO === uri
|
97
|
-
Cmd.verbose "Reading IO #{uri}"
|
98
|
-
Response.from_async_io(uri, &handler)
|
99
|
-
|
100
|
-
elsif StringIO === uri
|
101
|
-
Cmd.verbose "Reading IO #{uri}"
|
102
|
-
handler.call Response.new(uri)
|
103
|
-
|
104
|
-
elsif File.file? uri.to_s
|
105
|
-
Cmd.verbose "Reading file: #{uri}\n"
|
106
|
-
handler.call Response.read_file(uri)
|
107
|
-
|
108
|
-
else
|
109
|
-
req = Request.new uri, options
|
110
|
-
Cmd.verbose "Retrieving URL: #{req.uri}\n"
|
111
|
-
conn = req.retrieve_async(&handler)
|
112
|
-
conn.callback{ Kronk.history << uri }
|
113
|
-
end
|
114
|
-
|
115
|
-
rescue => e
|
116
|
-
yield nil, e
|
117
|
-
end
|
118
|
-
end
|
data/lib/kronk/async/em_ext.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'em-http-request'
|
2
|
-
|
3
|
-
module EventMachine
|
4
|
-
class HttpClient
|
5
|
-
attr_accessor :raw_response
|
6
|
-
|
7
|
-
alias em_parse_response_header parse_response_header
|
8
|
-
|
9
|
-
def parse_response_header header, version, status
|
10
|
-
out = em_parse_response_header header, version, status
|
11
|
-
|
12
|
-
rheader = @response_header
|
13
|
-
|
14
|
-
@raw_response = "HTTP/#{rheader.http_version} "
|
15
|
-
@raw_response << "#{rheader.status} #{rheader.http_reason}\r\n"
|
16
|
-
|
17
|
-
header.each do |key, val|
|
18
|
-
@raw_response << "#{key}: #{val}\r\n"
|
19
|
-
end
|
20
|
-
|
21
|
-
@raw_response << "\r\n"
|
22
|
-
|
23
|
-
out
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
alias em_on_decoded_body_data on_decoded_body_data
|
28
|
-
|
29
|
-
def on_decoded_body_data data
|
30
|
-
@raw_response << data
|
31
|
-
em_on_decoded_body_data data
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/lib/kronk/async/request.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
class Kronk
|
2
|
-
class Request
|
3
|
-
|
4
|
-
class EMError < Kronk::Exception; end
|
5
|
-
|
6
|
-
##
|
7
|
-
# Retrieve this requests' response asynchronously with em-http-request.
|
8
|
-
# Returns a EM::HttpConnection instance.
|
9
|
-
#
|
10
|
-
# Passing a block will yield a Kronk::Response instance and/or
|
11
|
-
# an Exception instance if an error was caught.
|
12
|
-
#
|
13
|
-
# req = Request.new "example.com"
|
14
|
-
# em_req = req.retrieve_async do |kronk_response, err|
|
15
|
-
# # do something with Kronk::Response instance here
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# em_req.callback { ... }
|
19
|
-
# em_req.error { ... }
|
20
|
-
|
21
|
-
def retrieve_async &block
|
22
|
-
header_opts = @headers.dup
|
23
|
-
|
24
|
-
if @auth && !@auth.empty?
|
25
|
-
header_opts['Authorization'] ||= []
|
26
|
-
header_opts['Authorization'][0] = @auth[:username] if @auth[:username]
|
27
|
-
header_opts['Authorization'][1] = @auth[:password] if @auth[:password]
|
28
|
-
end
|
29
|
-
|
30
|
-
conn = async_http
|
31
|
-
|
32
|
-
start_time = Time.now
|
33
|
-
req = conn.setup_request @http_method,
|
34
|
-
:head => header_opts, :body => @body, &block
|
35
|
-
|
36
|
-
req.callback do |resp|
|
37
|
-
elapsed_time = Time.now - start_time
|
38
|
-
@response = Response.new resp.raw_response, nil, self
|
39
|
-
@response.time = elapsed_time
|
40
|
-
yield @response, nil
|
41
|
-
end if block_given?
|
42
|
-
|
43
|
-
req.errback do |c|
|
44
|
-
err = c.error ?
|
45
|
-
EMError.new(c.error) :
|
46
|
-
Kronk::NotFoundError.new("#{@uri} could not be found")
|
47
|
-
|
48
|
-
yield nil, err
|
49
|
-
end
|
50
|
-
|
51
|
-
req
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
##
|
56
|
-
# Return an EM::HttpRequest instance.
|
57
|
-
|
58
|
-
def async_http
|
59
|
-
unless @proxy.empty?
|
60
|
-
proxy_opts = @proxy.dup
|
61
|
-
proxy_opts[:authorization] = [
|
62
|
-
proxy_opts.delete(:username),
|
63
|
-
proxy_opts.delete(:password)
|
64
|
-
] if proxy_opts[:username] || proxy_opts[:password]
|
65
|
-
end
|
66
|
-
|
67
|
-
EventMachine::HttpRequest.new @uri,
|
68
|
-
:connect_timeout => @timeout,
|
69
|
-
:inactivity_timeout => @timeout,
|
70
|
-
:proxy => proxy_opts
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/lib/kronk/async/response.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
class Kronk
|
2
|
-
class Response
|
3
|
-
|
4
|
-
class AsyncHandler < EM::Connection
|
5
|
-
attr_accessor :buffer
|
6
|
-
|
7
|
-
def initialize req
|
8
|
-
@buffer = ""
|
9
|
-
@callback = nil
|
10
|
-
@_req = req
|
11
|
-
@_res = nil
|
12
|
-
end
|
13
|
-
|
14
|
-
|
15
|
-
def callback &block
|
16
|
-
@callback = block
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
def receive_data str
|
21
|
-
@buffer << str
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def unbind
|
26
|
-
return unless @callback
|
27
|
-
|
28
|
-
@_res = Kronk::Response.new @buffer, nil, @_req
|
29
|
-
err = Kronk::Request::EMError.new "IO read error" if error?
|
30
|
-
|
31
|
-
@callback.call @_res, err
|
32
|
-
|
33
|
-
rescue => e
|
34
|
-
@callback.call @_res, e
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
##
|
40
|
-
# Response.new with asynchronous IO input.
|
41
|
-
# Returns an EM::Connection subclass (AsyncHandler) instance.
|
42
|
-
#
|
43
|
-
# Passing a block will yield a Kronk::Response instance and/or
|
44
|
-
# an Exception instance if an error was caught.
|
45
|
-
#
|
46
|
-
# conn = Response.from_async_io do |resp, err|
|
47
|
-
# # do something with Kronk::Response instance here
|
48
|
-
# end
|
49
|
-
|
50
|
-
def self.from_async_io io, req=nil, &block
|
51
|
-
conn = EM.attach io, AsyncHandler, req
|
52
|
-
conn.comm_inactivity_timeout = 2
|
53
|
-
conn.callback(&block)
|
54
|
-
conn
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
##
|
59
|
-
# Follow the redirect and return a new Response instance.
|
60
|
-
# Returns nil if not redirect-able.
|
61
|
-
#
|
62
|
-
# Passing a block will yield a Kronk::Response instance and/or
|
63
|
-
# an Exception instance if an error was caught.
|
64
|
-
|
65
|
-
def follow_redirect_async opts={}, &block
|
66
|
-
return if !redirect?
|
67
|
-
Request.new(self.location, opts).retrieve_async(&block)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|