kronk 1.7.6 → 1.7.7

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 CHANGED
@@ -1,3 +1,11 @@
1
+ === 1.7.7 / 2011-11-08
2
+
3
+ * Enhancements:
4
+
5
+ * Support for YAML parsing.
6
+
7
+ * Stream chunk size now expressed as hexa-decimals.
8
+
1
9
  === 1.7.6 / 2011-10-28
2
10
 
3
11
  * Bugfixes:
data/Manifest.txt CHANGED
@@ -36,6 +36,7 @@ lib/kronk/test.rb
36
36
  lib/kronk/test/assertions.rb
37
37
  lib/kronk/test/helper_methods.rb
38
38
  lib/kronk/xml_parser.rb
39
+ lib/kronk/yaml_parser.rb
39
40
  script/kronk_completion
40
41
  test/mocks/200_response.json
41
42
  test/mocks/200_response.plist
data/TODO.rdoc CHANGED
@@ -1,5 +1,15 @@
1
1
  = TODO
2
2
 
3
+ * QPS for player.
4
+
5
+ * Support for response streaming.
6
+
7
+ * Support for X-Url-\d and x-alt-location-\d redirects.
8
+
9
+ * Support for gzip.
10
+
11
+ * Player input IO timeout.
12
+
3
13
  * Investigate Kronk console.
4
14
 
5
15
  == Done
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.6'
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
  ##
@@ -34,10 +34,12 @@ class Kronk
34
34
 
35
35
  # Default Content-Type header to parser mapping.
36
36
  DEFAULT_CONTENT_TYPES = {
37
- 'js' => 'JSON',
38
- 'json' => 'JSON',
39
- 'plist' => 'PlistParser',
40
- 'xml' => 'XMLParser'
37
+ 'js' => 'JSON',
38
+ 'json' => 'JSON',
39
+ 'plist' => 'PlistParser',
40
+ 'xml' => 'XMLParser',
41
+ 'yaml' => 'YamlParser',
42
+ 'yml' => 'YamlParser'
41
43
  }
42
44
 
43
45
 
@@ -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 plain decimal form.
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
- # #=> "23\r\nthis is the first chunk\r\n"
16
+ # #=> "17\r\nthis is the first chunk\r\n"
17
17
  #
18
18
  # kronk.request io2
19
19
  # out.result kronk
20
- # #=> "16\r\nthis is the rest\r\n"
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
@@ -1,19 +1,19 @@
1
1
  class Kronk
2
2
 
3
3
  ##
4
- # Simple plist wrapper to add :parse method.
4
+ # Simple plist wrapper to support Kronk's parser interface.
5
5
 
6
6
  class PlistParser
7
7
 
8
8
  ##
9
- # Alias for Plist.parse_xml
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(ParserError, "unparsable Plist")
16
+ raise ParserError, "unparsable Plist"
17
17
 
18
18
  rescue LoadError => e
19
19
  raise unless e.message =~ /-- plist/
@@ -37,12 +37,9 @@ class Kronk
37
37
  end
38
38
 
39
39
 
40
- attr_accessor :body, :bytes, :byterate, :code, :headers,
41
- :raw, :stringify_opts, :request, :uri
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 = @_res.to_hash.dup
62
- @headers.keys.each{|h| @headers[h] = @headers[h].join(", ")}
58
+ @headers = @encoding = @parser = nil
63
59
 
64
- @encoding = "utf-8" unless @headers["content-type"]
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
- # Force the encoding of the raw response and body
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 parser=nil
183
+ def parsed_body new_parser=nil
154
184
  @parsed_body ||= nil
155
185
 
156
- return @parsed_body if @parsed_body && !parser
186
+ return @parsed_body if @parsed_body && !new_parser
157
187
 
158
- parser ||= @parser
188
+ new_parser ||= parser
159
189
 
160
190
  begin
161
- parser = Kronk.parser_for(parser) || Kronk.find_const(parser)
191
+ new_parser = Kronk.parser_for(new_parser) ||
192
+ Kronk.find_const(new_parser)
162
193
  rescue NameError
163
- raise InvalidParser, "No such parser: #{parser}"
164
- end if String === parser
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 parser
198
+ "No parser for Content-Type: #{@_res['Content-Type']}" unless new_parser
168
199
 
169
200
  begin
170
- @parsed_body = parser.parse(self.body) or raise RuntimeError
201
+ @parsed_body = new_parser.parse(self.body) or raise RuntimeError
171
202
 
172
203
  rescue RuntimeError, ::Exception => e
173
- msg = ParserError === e ? e.message : "#{parser} failed parsing body"
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
- headers = @headers.dup
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
- headers.delete key unless
227
+ out_headers.delete key unless
195
228
  include_headers.include? key.to_s.downcase
196
229
  end
197
230
 
198
- headers
231
+ out_headers
199
232
 
200
233
  when true
201
- headers
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] || @parser || options[:no_body])
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 @encoding if str.respond_to? :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' => "XMLParser"
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
- date: 2011-10-29 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2011-11-08 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: json
16
- requirement: &2168882440 !ruby/object:Gem::Requirement
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: '1.5'
22
+ - !ruby/object:Gem::Version
23
+ version: "1.5"
22
24
  type: :runtime
23
- prerelease: false
24
- version_requirements: *2168882440
25
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
26
27
  name: cookiejar
27
- requirement: &2168881680 !ruby/object:Gem::Requirement
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
- prerelease: false
35
- version_requirements: *2168881680
36
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
37
38
  name: plist
38
- requirement: &2168880700 !ruby/object:Gem::Requirement
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
- prerelease: false
46
- version_requirements: *2168880700
47
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
48
49
  name: nokogiri
49
- requirement: &2168879840 !ruby/object:Gem::Requirement
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: '1.4'
55
+ - !ruby/object:Gem::Version
56
+ version: "1.4"
55
57
  type: :development
56
- prerelease: false
57
- version_requirements: *2168879840
58
- - !ruby/object:Gem::Dependency
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
59
60
  name: mocha
60
- requirement: &2168878580 !ruby/object:Gem::Requirement
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
- prerelease: false
68
- version_requirements: *2168878580
69
- - !ruby/object:Gem::Dependency
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
70
71
  name: em-http-request
71
- requirement: &2168877780 !ruby/object:Gem::Requirement
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
- prerelease: false
79
- version_requirements: *2168877780
80
- - !ruby/object:Gem::Dependency
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
81
82
  name: hoe
82
- requirement: &2168876780 !ruby/object:Gem::Requirement
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: '2.11'
88
+ - !ruby/object:Gem::Version
89
+ version: "2.12"
88
90
  type: :development
89
- prerelease: false
90
- version_requirements: *2168876780
91
- description: ! 'Kronk runs diffs against data from live and cached http responses.
92
-
93
- Kronk was made possible by the sponsoring of AT&T Interactive.'
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
- extra_rdoc_files:
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: '0'
186
- segments:
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: '0'
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.10
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