kronk 1.2.1 → 1.2.2
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 +11 -0
- data/Manifest.txt +1 -0
- data/README.rdoc +30 -11
- data/lib/kronk.rb +35 -2
- data/lib/kronk/diff.rb +0 -5
- data/lib/kronk/request.rb +23 -18
- data/script/kronk_completion +22 -0
- data/test/test_kronk.rb +5 -0
- data/test/test_request.rb +1 -0
- data/test/test_xml_parser.rb +1 -0
- metadata +25 -28
data/History.rdoc
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
=== 1.2.2 / 2011-02-19
|
2
|
+
|
3
|
+
* Enhancements:
|
4
|
+
|
5
|
+
* Added support for default host to avoid having to write out
|
6
|
+
the most commonly used host name (e.g. http://localhost:3000)
|
7
|
+
|
8
|
+
* Added support for bash completion of URIs.
|
9
|
+
|
10
|
+
* Explicitely passing the http protocol is now optional.
|
11
|
+
|
1
12
|
=== 1.2.1 / 2011-01-21
|
2
13
|
|
3
14
|
* Enhancements:
|
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -27,6 +27,8 @@ Kronk was made possible by the sponsoring of AT&T Interactive.
|
|
27
27
|
|
28
28
|
* Easy-to-read output (color or ascii, line numbers, etc).
|
29
29
|
|
30
|
+
* Yes, it works on Windows.
|
31
|
+
|
30
32
|
== FUTURE:
|
31
33
|
|
32
34
|
* Auto-queryer with optional param randomizing.
|
@@ -37,35 +39,37 @@ Kronk was made possible by the sponsoring of AT&T Interactive.
|
|
37
39
|
|
38
40
|
Check if your json response returns the same data as your xml variety:
|
39
41
|
|
40
|
-
$ kronk
|
42
|
+
$ kronk host.com/path.json host.com/path.xml
|
41
43
|
|
42
44
|
Compare body structure only (uses datatypes instead of values):
|
43
45
|
|
44
|
-
$ kronk
|
46
|
+
$ kronk host.com/path.json host.com/path.xml --struct
|
45
47
|
|
46
48
|
Call comparison with similar uri suffixes:
|
47
49
|
|
48
|
-
$ kronk
|
50
|
+
$ kronk host.com/path.json host.com/path.xml --suff '?page=1'
|
49
51
|
|
50
|
-
Compare response with the previous call:
|
52
|
+
Compare response over ssl with the previous call:
|
51
53
|
|
52
|
-
$ kronk
|
54
|
+
$ kronk https://host.com/path --prev
|
53
55
|
|
54
56
|
Compare response with a local file:
|
55
57
|
|
56
|
-
$ kronk
|
58
|
+
$ kronk host.com/path.json ./saved_response.json
|
57
59
|
|
58
60
|
Do a simple text diff on the http response, including headers:
|
59
61
|
|
60
|
-
$ kronk
|
62
|
+
$ kronk host.com/A/path.json host.com/B/path.json --raw -i
|
61
63
|
|
62
64
|
Run it to display formatted data:
|
63
65
|
|
64
|
-
$ kronk
|
66
|
+
$ kronk host.com/path.json
|
65
67
|
|
66
|
-
Run it to display raw data with headers:
|
68
|
+
Run it to display raw data with headers from the default host (localhost:3000).
|
69
|
+
Default host is assumed when the path starts with "/" and no local files match
|
70
|
+
the given path:
|
67
71
|
|
68
|
-
$ kronk
|
72
|
+
$ kronk /path.json --raw -i
|
69
73
|
|
70
74
|
Parse the data and run an IRB console with the response:
|
71
75
|
|
@@ -135,6 +139,17 @@ Show line numbers in the output:
|
|
135
139
|
|
136
140
|
:show_lines: true
|
137
141
|
|
142
|
+
Assign a default host to use when none is specified:
|
143
|
+
|
144
|
+
:default_host: http://localhost:3000
|
145
|
+
|
146
|
+
=== Bash Completion:
|
147
|
+
|
148
|
+
Bash completion is available by sourcing the file returned by:
|
149
|
+
|
150
|
+
$ kronk --completion
|
151
|
+
[gem path]/script/kronk_completion
|
152
|
+
|
138
153
|
== DATA TRAVERSING:
|
139
154
|
|
140
155
|
One of Kronk's most powerful features is its ability to segregate data.
|
@@ -225,6 +240,10 @@ single quotes around some of your paths.
|
|
225
240
|
|
226
241
|
* json gem
|
227
242
|
|
243
|
+
* rack gem
|
244
|
+
|
245
|
+
* cookiejar gem
|
246
|
+
|
228
247
|
== INSTALL:
|
229
248
|
|
230
249
|
$ sudo gem install kronk
|
@@ -242,7 +261,7 @@ and generate the RDoc.
|
|
242
261
|
|
243
262
|
(The MIT License)
|
244
263
|
|
245
|
-
Copyright (c) 2010 Jeremie Castagna
|
264
|
+
Copyright (c) 2010, 2011 Jeremie Castagna
|
246
265
|
|
247
266
|
Permission is hereby granted, free of charge, to any person obtaining
|
248
267
|
a copy of this software and associated documentation files (the
|
data/lib/kronk.rb
CHANGED
@@ -11,7 +11,7 @@ require 'yaml'
|
|
11
11
|
class Kronk
|
12
12
|
|
13
13
|
# This gem's version.
|
14
|
-
VERSION = '1.2.
|
14
|
+
VERSION = '1.2.2'
|
15
15
|
|
16
16
|
|
17
17
|
##
|
@@ -42,6 +42,10 @@ class Kronk
|
|
42
42
|
DEFAULT_COOKIES_FILE = File.expand_path "~/.kronk_cookies"
|
43
43
|
|
44
44
|
|
45
|
+
# Default file with history of unique URIs. (Used for autocomplete)
|
46
|
+
DEFAULT_HISTORY_FILE = File.expand_path "~/.kronk_history"
|
47
|
+
|
48
|
+
|
45
49
|
# Default Content-Type header to parser mapping.
|
46
50
|
DEFAULT_CONTENT_TYPES = {
|
47
51
|
'js' => 'JSON',
|
@@ -81,10 +85,12 @@ class Kronk
|
|
81
85
|
# Default config to use.
|
82
86
|
DEFAULT_CONFIG = {
|
83
87
|
:content_types => DEFAULT_CONTENT_TYPES.dup,
|
88
|
+
:default_host => "http://localhost:3000",
|
84
89
|
:diff_format => :ascii_diff,
|
85
90
|
:show_lines => false,
|
86
91
|
:cache_file => DEFAULT_CACHE_FILE,
|
87
92
|
:cookies_file => DEFAULT_COOKIES_FILE,
|
93
|
+
:history_file => DEFAULT_HISTORY_FILE,
|
88
94
|
:use_cookies => true,
|
89
95
|
:requires => [],
|
90
96
|
:uri_options => {},
|
@@ -290,6 +296,20 @@ class Kronk
|
|
290
296
|
end
|
291
297
|
|
292
298
|
|
299
|
+
##
|
300
|
+
# Writes the given URIs to the history file.
|
301
|
+
|
302
|
+
def self.save_history *uris
|
303
|
+
path = self.config[:history_file]
|
304
|
+
|
305
|
+
uris.concat File.readlines(path).map{|line| line.strip} if File.file?(path)
|
306
|
+
|
307
|
+
File.open path, "w" do |file|
|
308
|
+
file.write uris.uniq.join($/)
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
|
293
313
|
##
|
294
314
|
# Make requests, parse the responses and compare the data.
|
295
315
|
# Query arguments may be set to the special value :cache to use the
|
@@ -410,12 +430,15 @@ class Kronk
|
|
410
430
|
$stdout << "Found #{diff.count} diff(s).\n"
|
411
431
|
end
|
412
432
|
|
433
|
+
save_history uri1, uri2
|
413
434
|
exit 1 if diff.count > 0
|
414
435
|
|
415
436
|
else
|
416
437
|
out = retrieve_data_string uri1, options
|
417
438
|
out = Diff.insert_line_nums out if config[:show_lines]
|
418
439
|
puts out
|
440
|
+
|
441
|
+
save_history uri1
|
419
442
|
end
|
420
443
|
|
421
444
|
rescue Request::NotFoundError, Response::MissingParser => e
|
@@ -452,7 +475,10 @@ class Kronk
|
|
452
475
|
opt.release = nil
|
453
476
|
|
454
477
|
opt.banner = <<-STR
|
455
|
-
|
478
|
+
|
479
|
+
#{opt.program_name} #{opt.version}
|
480
|
+
|
481
|
+
Parse and run diffs against data from live and cached http responses.
|
456
482
|
|
457
483
|
Usage:
|
458
484
|
#{opt.program_name} --help
|
@@ -483,6 +509,13 @@ Kronk runs diffs against data from live and cached http responses.
|
|
483
509
|
end
|
484
510
|
|
485
511
|
|
512
|
+
opt.on('--completion', 'Print bash completion file path and exit') do
|
513
|
+
file = File.join(File.dirname(__FILE__), "../script/kronk_completion")
|
514
|
+
puts File.expand_path(file)
|
515
|
+
exit 2
|
516
|
+
end
|
517
|
+
|
518
|
+
|
486
519
|
opt.on('--config STR', String,
|
487
520
|
'Load the given Kronk config file') do |value|
|
488
521
|
load_config value
|
data/lib/kronk/diff.rb
CHANGED
data/lib/kronk/request.rb
CHANGED
@@ -51,7 +51,7 @@ class Kronk
|
|
51
51
|
resp =
|
52
52
|
if IO === query || StringIO === query
|
53
53
|
retrieve_io query, options
|
54
|
-
elsif
|
54
|
+
elsif query == :cache || File.file?(query)
|
55
55
|
retrieve_file query, options
|
56
56
|
else
|
57
57
|
retrieve_uri query, options
|
@@ -71,14 +71,6 @@ class Kronk
|
|
71
71
|
end
|
72
72
|
|
73
73
|
|
74
|
-
##
|
75
|
-
# Check if a URI should be treated as a local file.
|
76
|
-
|
77
|
-
def self.local? uri
|
78
|
-
!(uri =~ %r{^\w+://})
|
79
|
-
end
|
80
|
-
|
81
|
-
|
82
74
|
##
|
83
75
|
# Read http response from a file and return a HTTPResponse instance.
|
84
76
|
|
@@ -178,15 +170,7 @@ class Kronk
|
|
178
170
|
# :proxy:: Hash/String - http proxy to use; defaults to nil
|
179
171
|
|
180
172
|
def self.call http_method, uri, options={}
|
181
|
-
|
182
|
-
|
183
|
-
uri = "#{uri}#{suffix}" if suffix
|
184
|
-
uri = URI.parse uri unless URI === uri
|
185
|
-
|
186
|
-
if options[:query]
|
187
|
-
query = build_query options[:query]
|
188
|
-
uri.query = [uri.query, query].compact.join "&"
|
189
|
-
end
|
173
|
+
uri = build_uri uri, options
|
190
174
|
|
191
175
|
data = options[:data]
|
192
176
|
data &&= build_query data
|
@@ -240,6 +224,27 @@ class Kronk
|
|
240
224
|
end
|
241
225
|
|
242
226
|
|
227
|
+
##
|
228
|
+
# Build the URI to use for the request from the given uri or
|
229
|
+
# path and options.
|
230
|
+
|
231
|
+
def self.build_uri uri, options={}
|
232
|
+
suffix = options.delete :uri_suffix
|
233
|
+
|
234
|
+
uri = "http://#{uri}" unless uri =~ %r{^(\w+://|/)}
|
235
|
+
uri = "#{uri}#{suffix}" if suffix
|
236
|
+
uri = URI.parse uri unless URI === uri
|
237
|
+
uri = URI.parse(Kronk.config[:default_host]) + uri unless uri.host
|
238
|
+
|
239
|
+
if options[:query]
|
240
|
+
query = build_query options[:query]
|
241
|
+
uri.query = [uri.query, query].compact.join "&"
|
242
|
+
end
|
243
|
+
|
244
|
+
uri
|
245
|
+
end
|
246
|
+
|
247
|
+
|
243
248
|
##
|
244
249
|
# Checks if cookies should be used and set.
|
245
250
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
_kronk()
|
4
|
+
{
|
5
|
+
local cur prev opts kronk_keys
|
6
|
+
COMPREPLY=()
|
7
|
+
cur="${COMP_WORDS[COMP_CWORD]}"
|
8
|
+
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
9
|
+
|
10
|
+
kronk_keys="$HOME/.kronk_history"
|
11
|
+
|
12
|
+
|
13
|
+
if [ -f "$kronk_keys" ]; then
|
14
|
+
opts=$(cat $kronk_keys)
|
15
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
16
|
+
return 0
|
17
|
+
fi
|
18
|
+
|
19
|
+
return 1
|
20
|
+
}
|
21
|
+
|
22
|
+
complete -d -X '.[^./]*' -F _kronk kronk
|
data/test/test_kronk.rb
CHANGED
@@ -12,6 +12,8 @@ class TestKronk < Test::Unit::TestCase
|
|
12
12
|
},
|
13
13
|
:cache_file => Kronk::DEFAULT_CACHE_FILE,
|
14
14
|
:cookies_file => Kronk::DEFAULT_COOKIES_FILE,
|
15
|
+
:history_file => Kronk::DEFAULT_HISTORY_FILE,
|
16
|
+
:default_host => "http://localhost:3000",
|
15
17
|
:diff_format => :ascii_diff,
|
16
18
|
:show_lines => false,
|
17
19
|
:use_cookies => true,
|
@@ -33,6 +35,7 @@ class TestKronk < Test::Unit::TestCase
|
|
33
35
|
:ignore_headers => ["Content-Type"],
|
34
36
|
:cache_file => Kronk::DEFAULT_CACHE_FILE,
|
35
37
|
:cookies_file => Kronk::DEFAULT_COOKIES_FILE,
|
38
|
+
:history_file => Kronk::DEFAULT_HISTORY_FILE,
|
36
39
|
:show_lines => false,
|
37
40
|
:use_cookies => true,
|
38
41
|
:requires => [],
|
@@ -54,9 +57,11 @@ class TestKronk < Test::Unit::TestCase
|
|
54
57
|
'plist' => "PlistParser",
|
55
58
|
'xml' => "XMLParser"
|
56
59
|
},
|
60
|
+
:default_host => "http://localhost:3000",
|
57
61
|
:diff_format => :ascii_diff,
|
58
62
|
:cache_file => Kronk::DEFAULT_CACHE_FILE,
|
59
63
|
:cookies_file => Kronk::DEFAULT_COOKIES_FILE,
|
64
|
+
:history_file => Kronk::DEFAULT_HISTORY_FILE,
|
60
65
|
:requires => [],
|
61
66
|
:show_lines => false,
|
62
67
|
:use_cookies => true,
|
data/test/test_request.rb
CHANGED
@@ -68,6 +68,7 @@ class TestRequest < Test::Unit::TestCase
|
|
68
68
|
def test_retrieve_cached
|
69
69
|
query = "path/to/file.txt"
|
70
70
|
options = {:foo => "bar"}
|
71
|
+
File.expects(:file?).with(query).returns true
|
71
72
|
Kronk::Request.expects(:retrieve_file).with query, options
|
72
73
|
|
73
74
|
Kronk::Request.retrieve query, options
|
data/test/test_xml_parser.rb
CHANGED
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kronk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 1
|
7
8
|
- 2
|
8
|
-
-
|
9
|
-
version: 1.2.
|
9
|
+
- 2
|
10
|
+
version: 1.2.2
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Jeremie Castagna
|
@@ -14,7 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2011-
|
18
|
+
date: 2011-02-21 00:00:00 -08:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
@@ -25,6 +26,7 @@ dependencies:
|
|
25
26
|
requirements:
|
26
27
|
- - ~>
|
27
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
28
30
|
segments:
|
29
31
|
- 3
|
30
32
|
- 1
|
@@ -40,6 +42,7 @@ dependencies:
|
|
40
42
|
requirements:
|
41
43
|
- - ~>
|
42
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 11
|
43
46
|
segments:
|
44
47
|
- 1
|
45
48
|
- 2
|
@@ -54,6 +57,7 @@ dependencies:
|
|
54
57
|
requirements:
|
55
58
|
- - ~>
|
56
59
|
- !ruby/object:Gem::Version
|
60
|
+
hash: 9
|
57
61
|
segments:
|
58
62
|
- 1
|
59
63
|
- 3
|
@@ -68,6 +72,7 @@ dependencies:
|
|
68
72
|
requirements:
|
69
73
|
- - ~>
|
70
74
|
- !ruby/object:Gem::Version
|
75
|
+
hash: 1
|
71
76
|
segments:
|
72
77
|
- 0
|
73
78
|
- 5
|
@@ -82,6 +87,7 @@ dependencies:
|
|
82
87
|
requirements:
|
83
88
|
- - ">="
|
84
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 15
|
85
91
|
segments:
|
86
92
|
- 2
|
87
93
|
- 0
|
@@ -97,6 +103,7 @@ dependencies:
|
|
97
103
|
requirements:
|
98
104
|
- - ~>
|
99
105
|
- !ruby/object:Gem::Version
|
106
|
+
hash: 19
|
100
107
|
segments:
|
101
108
|
- 0
|
102
109
|
- 3
|
@@ -112,57 +119,45 @@ dependencies:
|
|
112
119
|
requirements:
|
113
120
|
- - ~>
|
114
121
|
- !ruby/object:Gem::Version
|
122
|
+
hash: 15
|
115
123
|
segments:
|
116
124
|
- 1
|
117
125
|
- 0
|
118
126
|
version: "1.0"
|
119
127
|
type: :runtime
|
120
128
|
version_requirements: *id007
|
121
|
-
- !ruby/object:Gem::Dependency
|
122
|
-
name: rubyforge
|
123
|
-
prerelease: false
|
124
|
-
requirement: &id008 !ruby/object:Gem::Requirement
|
125
|
-
none: false
|
126
|
-
requirements:
|
127
|
-
- - ">="
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
segments:
|
130
|
-
- 2
|
131
|
-
- 0
|
132
|
-
- 4
|
133
|
-
version: 2.0.4
|
134
|
-
type: :development
|
135
|
-
version_requirements: *id008
|
136
129
|
- !ruby/object:Gem::Dependency
|
137
130
|
name: mocha
|
138
131
|
prerelease: false
|
139
|
-
requirement: &
|
132
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
140
133
|
none: false
|
141
134
|
requirements:
|
142
135
|
- - ~>
|
143
136
|
- !ruby/object:Gem::Version
|
137
|
+
hash: 47
|
144
138
|
segments:
|
145
139
|
- 0
|
146
140
|
- 9
|
147
141
|
- 10
|
148
142
|
version: 0.9.10
|
149
143
|
type: :development
|
150
|
-
version_requirements: *
|
144
|
+
version_requirements: *id008
|
151
145
|
- !ruby/object:Gem::Dependency
|
152
146
|
name: hoe
|
153
147
|
prerelease: false
|
154
|
-
requirement: &
|
148
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
155
149
|
none: false
|
156
150
|
requirements:
|
157
151
|
- - ">="
|
158
152
|
- !ruby/object:Gem::Version
|
153
|
+
hash: 47
|
159
154
|
segments:
|
160
155
|
- 2
|
161
|
-
-
|
162
|
-
-
|
163
|
-
version: 2.
|
156
|
+
- 8
|
157
|
+
- 0
|
158
|
+
version: 2.8.0
|
164
159
|
type: :development
|
165
|
-
version_requirements: *
|
160
|
+
version_requirements: *id009
|
166
161
|
description: |-
|
167
162
|
Kronk runs diffs against data from live and cached http responses.
|
168
163
|
Kronk was made possible by the sponsoring of AT&T Interactive.
|
@@ -190,6 +185,7 @@ files:
|
|
190
185
|
- lib/kronk/request.rb
|
191
186
|
- lib/kronk/response.rb
|
192
187
|
- lib/kronk/xml_parser.rb
|
188
|
+
- script/kronk_completion
|
193
189
|
- test/mocks/200_response.json
|
194
190
|
- test/mocks/200_response.plist
|
195
191
|
- test/mocks/200_response.txt
|
@@ -218,7 +214,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
218
214
|
requirements:
|
219
215
|
- - ">="
|
220
216
|
- !ruby/object:Gem::Version
|
221
|
-
hash:
|
217
|
+
hash: 3
|
222
218
|
segments:
|
223
219
|
- 0
|
224
220
|
version: "0"
|
@@ -227,13 +223,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
223
|
requirements:
|
228
224
|
- - ">="
|
229
225
|
- !ruby/object:Gem::Version
|
226
|
+
hash: 3
|
230
227
|
segments:
|
231
228
|
- 0
|
232
229
|
version: "0"
|
233
230
|
requirements: []
|
234
231
|
|
235
232
|
rubyforge_project: kronk
|
236
|
-
rubygems_version: 1.
|
233
|
+
rubygems_version: 1.5.2
|
237
234
|
signing_key:
|
238
235
|
specification_version: 3
|
239
236
|
summary: Kronk runs diffs against data from live and cached http responses
|