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 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