kronk 1.7.6 → 1.7.7
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +8 -0
- data/Manifest.txt +1 -0
- data/TODO.rdoc +10 -0
- data/lib/kronk.rb +2 -1
- data/lib/kronk/constants.rb +6 -4
- data/lib/kronk/player/stream.rb +5 -4
- data/lib/kronk/plist_parser.rb +3 -3
- data/lib/kronk/response.rb +77 -46
- data/lib/kronk/yaml_parser.rb +18 -0
- data/test/test_kronk.rb +6 -2
- metadata +77 -75
data/History.rdoc
CHANGED
data/Manifest.txt
CHANGED
data/TODO.rdoc
CHANGED
data/lib/kronk.rb
CHANGED
@@ -14,7 +14,7 @@ require 'yaml'
|
|
14
14
|
class Kronk
|
15
15
|
|
16
16
|
# This gem's version.
|
17
|
-
VERSION = '1.7.
|
17
|
+
VERSION = '1.7.7'
|
18
18
|
|
19
19
|
require 'kronk/constants'
|
20
20
|
require 'kronk/queue_runner'
|
@@ -39,6 +39,7 @@ class Kronk
|
|
39
39
|
require 'kronk/request'
|
40
40
|
require 'kronk/plist_parser'
|
41
41
|
require 'kronk/xml_parser'
|
42
|
+
require 'kronk/yaml_parser'
|
42
43
|
|
43
44
|
|
44
45
|
##
|
data/lib/kronk/constants.rb
CHANGED
@@ -34,10 +34,12 @@ class Kronk
|
|
34
34
|
|
35
35
|
# Default Content-Type header to parser mapping.
|
36
36
|
DEFAULT_CONTENT_TYPES = {
|
37
|
-
'js'
|
38
|
-
'json'
|
39
|
-
'plist'
|
40
|
-
'xml'
|
37
|
+
'js' => 'JSON',
|
38
|
+
'json' => 'JSON',
|
39
|
+
'plist' => 'PlistParser',
|
40
|
+
'xml' => 'XMLParser',
|
41
|
+
'yaml' => 'YamlParser',
|
42
|
+
'yml' => 'YamlParser'
|
41
43
|
}
|
42
44
|
|
43
45
|
|
data/lib/kronk/player/stream.rb
CHANGED
@@ -3,7 +3,7 @@ class Kronk
|
|
3
3
|
##
|
4
4
|
# Outputs Player results as a stream of Kronk outputs
|
5
5
|
# in chunked form, each chunk being one response and the number
|
6
|
-
# of octets being expressed in
|
6
|
+
# of octets being expressed in hexadecimal form.
|
7
7
|
#
|
8
8
|
# out = Player::StreamOutput.new
|
9
9
|
#
|
@@ -13,11 +13,11 @@ class Kronk
|
|
13
13
|
# kronk = Kronk.new
|
14
14
|
# kronk.request io1
|
15
15
|
# out.result kronk
|
16
|
-
# #=> "
|
16
|
+
# #=> "17\r\nthis is the first chunk\r\n"
|
17
17
|
#
|
18
18
|
# kronk.request io2
|
19
19
|
# out.result kronk
|
20
|
-
# #=> "
|
20
|
+
# #=> "10\r\nthis is the rest\r\n"
|
21
21
|
#
|
22
22
|
# Note: This output class will not render errors.
|
23
23
|
|
@@ -34,7 +34,7 @@ class Kronk
|
|
34
34
|
|
35
35
|
return unless output
|
36
36
|
|
37
|
-
output = "#{output.length}\r\n#{output}\r\n"
|
37
|
+
output = "#{"%X" % output.length}\r\n#{output}\r\n"
|
38
38
|
|
39
39
|
mutex.synchronize do
|
40
40
|
$stdout << output
|
@@ -45,6 +45,7 @@ class Kronk
|
|
45
45
|
|
46
46
|
|
47
47
|
def completed
|
48
|
+
$stdout << "0\r\n\r\n"
|
48
49
|
$stdout.flush
|
49
50
|
true
|
50
51
|
end
|
data/lib/kronk/plist_parser.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
class Kronk
|
2
2
|
|
3
3
|
##
|
4
|
-
# Simple plist wrapper to
|
4
|
+
# Simple plist wrapper to support Kronk's parser interface.
|
5
5
|
|
6
6
|
class PlistParser
|
7
7
|
|
8
8
|
##
|
9
|
-
#
|
9
|
+
# Wrapper for Plist.parse_xml
|
10
10
|
|
11
11
|
def self.parse plist
|
12
12
|
require 'plist'
|
13
13
|
Plist.parse_xml(plist) || raise(ParserError, "invalid Plist")
|
14
14
|
|
15
15
|
rescue RuntimeError
|
16
|
-
raise
|
16
|
+
raise ParserError, "unparsable Plist"
|
17
17
|
|
18
18
|
rescue LoadError => e
|
19
19
|
raise unless e.message =~ /-- plist/
|
data/lib/kronk/response.rb
CHANGED
@@ -37,12 +37,9 @@ class Kronk
|
|
37
37
|
end
|
38
38
|
|
39
39
|
|
40
|
-
attr_accessor :body, :
|
41
|
-
:raw, :stringify_opts, :
|
40
|
+
attr_accessor :body, :code,
|
41
|
+
:raw, :request, :stringify_opts, :time, :uri
|
42
42
|
|
43
|
-
attr_reader :encoding, :parser, :time
|
44
|
-
|
45
|
-
alias to_hash headers
|
46
43
|
alias to_s raw
|
47
44
|
|
48
45
|
##
|
@@ -58,36 +55,23 @@ class Kronk
|
|
58
55
|
@_res, debug_io = request_from_io(io)
|
59
56
|
end
|
60
57
|
|
61
|
-
@headers
|
62
|
-
@headers.keys.each{|h| @headers[h] = @headers[h].join(", ")}
|
58
|
+
@headers = @encoding = @parser = nil
|
63
59
|
|
64
|
-
@
|
65
|
-
c_type = @headers["content-type"] =~ ENCODING_MATCHER
|
66
|
-
@encoding = $2 if c_type
|
67
|
-
@encoding ||= "ASCII-8BIT"
|
68
|
-
@encoding = Encoding.find(@encoding) if defined?(Encoding)
|
60
|
+
@time = 0
|
69
61
|
|
70
62
|
raw_req, raw_resp, bytes = read_raw_from debug_io
|
71
63
|
@raw = try_force_encoding raw_resp
|
72
64
|
|
73
65
|
@request = request || raw_req && Request.parse(try_force_encoding raw_req)
|
74
66
|
|
75
|
-
@time = 0
|
76
|
-
|
77
67
|
@body = try_force_encoding(@_res.body) if @_res.body
|
78
68
|
@body ||= @raw.split("\r\n\r\n",2)[1]
|
79
69
|
|
80
|
-
@bytes = (@headers["content-length"] || @body.bytes.count).to_i
|
81
|
-
|
82
70
|
@code = @_res.code
|
83
71
|
|
84
|
-
@parser = Kronk.parser_for @headers["content-type"]
|
85
|
-
|
86
72
|
@uri = @request.uri if @request && @request.uri
|
87
73
|
@uri = URI.parse io.path if File === io
|
88
74
|
|
89
|
-
@byterate = 0
|
90
|
-
|
91
75
|
@stringify_opts = {}
|
92
76
|
end
|
93
77
|
|
@@ -108,6 +92,24 @@ class Kronk
|
|
108
92
|
end
|
109
93
|
|
110
94
|
|
95
|
+
##
|
96
|
+
# If time was set, returns bytes-per-second for the whole response,
|
97
|
+
# including headers.
|
98
|
+
|
99
|
+
def byterate
|
100
|
+
return 0 unless @raw && @time.to_f > 0
|
101
|
+
@byterate = self.total_bytes / @time.to_f
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
##
|
106
|
+
# Size of the body in bytes.
|
107
|
+
|
108
|
+
def bytes
|
109
|
+
(headers["content-length"] || @body.bytes.count).to_i
|
110
|
+
end
|
111
|
+
|
112
|
+
|
111
113
|
##
|
112
114
|
# Cookie header accessor.
|
113
115
|
|
@@ -117,7 +119,22 @@ class Kronk
|
|
117
119
|
|
118
120
|
|
119
121
|
##
|
120
|
-
#
|
122
|
+
# Return the Ruby-1.9 encoding of the body, or String representation
|
123
|
+
# for Ruby-1.8.
|
124
|
+
|
125
|
+
def encoding
|
126
|
+
return @encoding if @encoding
|
127
|
+
@encoding = "utf-8" unless headers["content-type"]
|
128
|
+
c_type = headers["content-type"] =~ ENCODING_MATCHER
|
129
|
+
@encoding = $2 if c_type
|
130
|
+
@encoding ||= "ASCII-8BIT"
|
131
|
+
@encoding = Encoding.find(@encoding) if defined?(Encoding)
|
132
|
+
@encoding
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
##
|
137
|
+
# Force the encoding of the raw response and body.
|
121
138
|
|
122
139
|
def force_encoding new_encoding
|
123
140
|
new_encoding = Encoding.find new_encoding unless Encoding === new_encoding
|
@@ -128,6 +145,19 @@ class Kronk
|
|
128
145
|
end
|
129
146
|
|
130
147
|
|
148
|
+
##
|
149
|
+
# Accessor for downcased headers.
|
150
|
+
|
151
|
+
def headers
|
152
|
+
return @headers if @headers
|
153
|
+
@headers = @_res.to_hash.dup
|
154
|
+
@headers.keys.each{|h| @headers[h] = @headers[h].join(", ")}
|
155
|
+
@headers
|
156
|
+
end
|
157
|
+
|
158
|
+
alias to_hash headers
|
159
|
+
|
160
|
+
|
131
161
|
##
|
132
162
|
# If there was an error parsing the input as a standard http response,
|
133
163
|
# the input is assumed to be a body and HeadlessResponse is used.
|
@@ -150,27 +180,30 @@ class Kronk
|
|
150
180
|
# If no parser is given will look for the default parser based on
|
151
181
|
# the Content-Type, or will return the cached parsed body if available.
|
152
182
|
|
153
|
-
def parsed_body
|
183
|
+
def parsed_body new_parser=nil
|
154
184
|
@parsed_body ||= nil
|
155
185
|
|
156
|
-
return @parsed_body if @parsed_body && !
|
186
|
+
return @parsed_body if @parsed_body && !new_parser
|
157
187
|
|
158
|
-
|
188
|
+
new_parser ||= parser
|
159
189
|
|
160
190
|
begin
|
161
|
-
|
191
|
+
new_parser = Kronk.parser_for(new_parser) ||
|
192
|
+
Kronk.find_const(new_parser)
|
162
193
|
rescue NameError
|
163
|
-
raise InvalidParser, "No such parser: #{
|
164
|
-
end if String ===
|
194
|
+
raise InvalidParser, "No such parser: #{new_parser}"
|
195
|
+
end if String === new_parser
|
165
196
|
|
166
197
|
raise MissingParser,
|
167
|
-
"No parser for Content-Type: #{@_res['Content-Type']}" unless
|
198
|
+
"No parser for Content-Type: #{@_res['Content-Type']}" unless new_parser
|
168
199
|
|
169
200
|
begin
|
170
|
-
@parsed_body =
|
201
|
+
@parsed_body = new_parser.parse(self.body) or raise RuntimeError
|
171
202
|
|
172
203
|
rescue RuntimeError, ::Exception => e
|
173
|
-
msg = ParserError === e ?
|
204
|
+
msg = ParserError === e ?
|
205
|
+
e.message : "#{new_parser} failed parsing body"
|
206
|
+
|
174
207
|
msg << " returned by #{@uri}" if @uri
|
175
208
|
raise ParserError, msg
|
176
209
|
end
|
@@ -181,7 +214,7 @@ class Kronk
|
|
181
214
|
# Returns the parsed header hash.
|
182
215
|
|
183
216
|
def parsed_header include_headers=true
|
184
|
-
|
217
|
+
out_headers = headers.dup
|
185
218
|
|
186
219
|
case include_headers
|
187
220
|
when nil, false
|
@@ -191,18 +224,26 @@ class Kronk
|
|
191
224
|
include_headers = [*include_headers].map{|h| h.to_s.downcase}
|
192
225
|
|
193
226
|
headers.each do |key, value|
|
194
|
-
|
227
|
+
out_headers.delete key unless
|
195
228
|
include_headers.include? key.to_s.downcase
|
196
229
|
end
|
197
230
|
|
198
|
-
|
231
|
+
out_headers
|
199
232
|
|
200
233
|
when true
|
201
|
-
|
234
|
+
out_headers
|
202
235
|
end
|
203
236
|
end
|
204
237
|
|
205
238
|
|
239
|
+
##
|
240
|
+
# The parser to use on the body.
|
241
|
+
|
242
|
+
def parser
|
243
|
+
@parser ||= Kronk.parser_for headers["content-type"]
|
244
|
+
end
|
245
|
+
|
246
|
+
|
206
247
|
##
|
207
248
|
# Assign the parser.
|
208
249
|
|
@@ -342,7 +383,7 @@ class Kronk
|
|
342
383
|
def stringify options={}, &block
|
343
384
|
options = options.empty? ? @stringify_opts : merge_stringify_opts(options)
|
344
385
|
|
345
|
-
if !options[:raw] && (options[:parser] ||
|
386
|
+
if !options[:raw] && (options[:parser] || parser || options[:no_body])
|
346
387
|
data = selective_data options, &block
|
347
388
|
DataString.new data, options
|
348
389
|
else
|
@@ -387,16 +428,6 @@ class Kronk
|
|
387
428
|
end
|
388
429
|
|
389
430
|
|
390
|
-
##
|
391
|
-
# Assign how long the request took in seconds.
|
392
|
-
|
393
|
-
def time= new_time
|
394
|
-
@time = new_time
|
395
|
-
@byterate = self.total_bytes / @time.to_f if @raw && @time > 0
|
396
|
-
@time
|
397
|
-
end
|
398
|
-
|
399
|
-
|
400
431
|
##
|
401
432
|
# Number of bytes of the response including the header.
|
402
433
|
|
@@ -487,7 +518,7 @@ class Kronk
|
|
487
518
|
# Returns the string given with the new encoding.
|
488
519
|
|
489
520
|
def try_force_encoding str
|
490
|
-
str.force_encoding
|
521
|
+
str.force_encoding encoding if str.respond_to? :force_encoding
|
491
522
|
str
|
492
523
|
end
|
493
524
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Kronk
|
2
|
+
|
3
|
+
##
|
4
|
+
# Simple yaml wrapper to support Kronk's parser interface.
|
5
|
+
|
6
|
+
class YamlParser
|
7
|
+
|
8
|
+
##
|
9
|
+
# Wrapper for YAML.load
|
10
|
+
|
11
|
+
def self.parse yaml
|
12
|
+
YAML.load(yaml) || raise(ParserError, "unparsable YAML")
|
13
|
+
|
14
|
+
rescue ArgumentError
|
15
|
+
raise ParserError, "unparsable YAML"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/test/test_kronk.rb
CHANGED
@@ -9,7 +9,9 @@ class TestKronk < Test::Unit::TestCase
|
|
9
9
|
'js' => 'JSON',
|
10
10
|
'json' => 'JSON',
|
11
11
|
'plist' => 'PlistParser',
|
12
|
-
'xml' => 'XMLParser'
|
12
|
+
'xml' => 'XMLParser',
|
13
|
+
'yaml' => 'YamlParser',
|
14
|
+
'yml' => 'YamlParser'
|
13
15
|
},
|
14
16
|
:context => nil,
|
15
17
|
:cache_file => Kronk::DEFAULT_CACHE_FILE,
|
@@ -68,7 +70,9 @@ class TestKronk < Test::Unit::TestCase
|
|
68
70
|
'js' => "JsEngine",
|
69
71
|
'json' => "JSON",
|
70
72
|
'plist' => "PlistParser",
|
71
|
-
'xml' =>
|
73
|
+
'xml' => 'XMLParser',
|
74
|
+
'yaml' => 'YamlParser',
|
75
|
+
'yml' => 'YamlParser'
|
72
76
|
},
|
73
77
|
:context => 3,
|
74
78
|
:default_host => "http://localhost:3000",
|
metadata
CHANGED
@@ -1,107 +1,109 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: kronk
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.6
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 1.7.7
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Jeremie Castagna
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2011-11-08 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
15
16
|
name: json
|
16
|
-
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
19
|
none: false
|
18
|
-
requirements:
|
20
|
+
requirements:
|
19
21
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version:
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "1.5"
|
22
24
|
type: :runtime
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
26
27
|
name: cookiejar
|
27
|
-
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
30
|
none: false
|
29
|
-
requirements:
|
31
|
+
requirements:
|
30
32
|
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
33
|
+
- !ruby/object:Gem::Version
|
32
34
|
version: 0.3.0
|
33
35
|
type: :runtime
|
34
|
-
|
35
|
-
|
36
|
-
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
37
38
|
name: plist
|
38
|
-
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
41
|
none: false
|
40
|
-
requirements:
|
42
|
+
requirements:
|
41
43
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
44
|
+
- !ruby/object:Gem::Version
|
43
45
|
version: 3.1.0
|
44
46
|
type: :development
|
45
|
-
|
46
|
-
|
47
|
-
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
48
49
|
name: nokogiri
|
49
|
-
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
52
|
none: false
|
51
|
-
requirements:
|
53
|
+
requirements:
|
52
54
|
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "1.4"
|
55
57
|
type: :development
|
56
|
-
|
57
|
-
|
58
|
-
- !ruby/object:Gem::Dependency
|
58
|
+
version_requirements: *id004
|
59
|
+
- !ruby/object:Gem::Dependency
|
59
60
|
name: mocha
|
60
|
-
|
61
|
+
prerelease: false
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
61
63
|
none: false
|
62
|
-
requirements:
|
64
|
+
requirements:
|
63
65
|
- - ~>
|
64
|
-
- !ruby/object:Gem::Version
|
66
|
+
- !ruby/object:Gem::Version
|
65
67
|
version: 0.9.12
|
66
68
|
type: :development
|
67
|
-
|
68
|
-
|
69
|
-
- !ruby/object:Gem::Dependency
|
69
|
+
version_requirements: *id005
|
70
|
+
- !ruby/object:Gem::Dependency
|
70
71
|
name: em-http-request
|
71
|
-
|
72
|
+
prerelease: false
|
73
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
72
74
|
none: false
|
73
|
-
requirements:
|
75
|
+
requirements:
|
74
76
|
- - ~>
|
75
|
-
- !ruby/object:Gem::Version
|
77
|
+
- !ruby/object:Gem::Version
|
76
78
|
version: 1.0.0
|
77
79
|
type: :development
|
78
|
-
|
79
|
-
|
80
|
-
- !ruby/object:Gem::Dependency
|
80
|
+
version_requirements: *id006
|
81
|
+
- !ruby/object:Gem::Dependency
|
81
82
|
name: hoe
|
82
|
-
|
83
|
+
prerelease: false
|
84
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
83
85
|
none: false
|
84
|
-
requirements:
|
86
|
+
requirements:
|
85
87
|
- - ~>
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version:
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "2.12"
|
88
90
|
type: :development
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
email:
|
91
|
+
version_requirements: *id007
|
92
|
+
description: |-
|
93
|
+
Kronk runs diffs against data from live and cached http responses.
|
94
|
+
Kronk was made possible by the sponsoring of AT&T Interactive.
|
95
|
+
email:
|
95
96
|
- yaksnrainbows@gmail.com
|
96
|
-
executables:
|
97
|
+
executables:
|
97
98
|
- kronk
|
98
99
|
extensions: []
|
99
|
-
|
100
|
+
|
101
|
+
extra_rdoc_files:
|
100
102
|
- Manifest.txt
|
101
103
|
- History.rdoc
|
102
104
|
- README.rdoc
|
103
105
|
- TODO.rdoc
|
104
|
-
files:
|
106
|
+
files:
|
105
107
|
- .autotest
|
106
108
|
- History.rdoc
|
107
109
|
- Manifest.txt
|
@@ -140,6 +142,7 @@ files:
|
|
140
142
|
- lib/kronk/test/assertions.rb
|
141
143
|
- lib/kronk/test/helper_methods.rb
|
142
144
|
- lib/kronk/xml_parser.rb
|
145
|
+
- lib/kronk/yaml_parser.rb
|
143
146
|
- script/kronk_completion
|
144
147
|
- test/mocks/200_response.json
|
145
148
|
- test/mocks/200_response.plist
|
@@ -171,34 +174,33 @@ files:
|
|
171
174
|
- .gemtest
|
172
175
|
homepage: https://github.com/yaksnrainbows/kronk
|
173
176
|
licenses: []
|
177
|
+
|
174
178
|
post_install_message:
|
175
|
-
rdoc_options:
|
179
|
+
rdoc_options:
|
176
180
|
- --main
|
177
181
|
- README.rdoc
|
178
|
-
require_paths:
|
182
|
+
require_paths:
|
179
183
|
- lib
|
180
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
184
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
181
185
|
none: false
|
182
|
-
requirements:
|
183
|
-
- -
|
184
|
-
- !ruby/object:Gem::Version
|
185
|
-
version:
|
186
|
-
|
187
|
-
- 0
|
188
|
-
hash: -2280556396485806807
|
189
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - ">="
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: "0"
|
190
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
191
|
none: false
|
191
|
-
requirements:
|
192
|
-
- -
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
version:
|
192
|
+
requirements:
|
193
|
+
- - ">="
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: "0"
|
195
196
|
requirements: []
|
197
|
+
|
196
198
|
rubyforge_project: kronk
|
197
|
-
rubygems_version: 1.8.
|
199
|
+
rubygems_version: 1.8.11
|
198
200
|
signing_key:
|
199
201
|
specification_version: 3
|
200
202
|
summary: Kronk runs diffs against data from live and cached http responses
|
201
|
-
test_files:
|
203
|
+
test_files:
|
202
204
|
- test/test_assertions.rb
|
203
205
|
- test/test_cmd.rb
|
204
206
|
- test/test_core_ext.rb
|