kronk 1.2.5 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemtest +0 -0
- data/History.rdoc +30 -2
- data/Manifest.txt +14 -0
- data/README.rdoc +5 -7
- data/Rakefile +88 -4
- data/bin/kronk +2 -1
- data/bin/yzma +13 -0
- data/lib/kronk.rb +112 -430
- data/lib/kronk/cmd.rb +469 -0
- data/lib/kronk/data_set.rb +38 -44
- data/lib/kronk/diff.rb +105 -112
- data/lib/kronk/diff/ascii_format.rb +35 -0
- data/lib/kronk/diff/color_format.rb +49 -0
- data/lib/kronk/request.rb +6 -6
- data/lib/kronk/test.rb +15 -0
- data/lib/kronk/test/assertions.rb +97 -0
- data/lib/kronk/test/core_ext.rb +65 -0
- data/lib/kronk/test/helper_methods.rb +86 -0
- data/lib/yzma.rb +174 -0
- data/lib/yzma/randomizer.rb +54 -0
- data/lib/yzma/report.rb +47 -0
- data/test/test_assertions.rb +93 -0
- data/test/test_core_ext.rb +74 -0
- data/test/test_data_set.rb +41 -32
- data/test/test_diff.rb +50 -24
- data/test/test_helper_methods.rb +177 -0
- data/test/test_kronk.rb +3 -1
- metadata +36 -19
data/.gemtest
ADDED
File without changes
|
data/History.rdoc
CHANGED
@@ -1,13 +1,41 @@
|
|
1
|
+
=== 1.3.0 / 2011-06
|
2
|
+
|
3
|
+
* Major Enhancements:
|
4
|
+
|
5
|
+
* Added auto-querying functionality with param randomizing.
|
6
|
+
|
7
|
+
* Added test helper methods, assertions, and core extensions.
|
8
|
+
|
9
|
+
* Enhancements:
|
10
|
+
|
11
|
+
* Updated dependencies json ~>1.5, nokogiri ~>1.4, i18n >=0.5
|
12
|
+
|
13
|
+
* Reimplemented the diff logic to a LCS algorithm.
|
14
|
+
|
15
|
+
* Added support for ranges and 'index,length' pairs to DataSet path parsing.
|
16
|
+
|
17
|
+
* Moved kronk config files to the ~/.kronk folder.
|
18
|
+
|
19
|
+
* Made path matching case-insensitive.
|
20
|
+
|
21
|
+
* Deprecated and moved cmd functionality into Kronk::Cmd class.
|
22
|
+
|
23
|
+
* Bugfixes:
|
24
|
+
|
25
|
+
* Fix for path lookup of parents when parent is the root data object.
|
26
|
+
|
27
|
+
* Handling of reset connection errors.
|
28
|
+
|
1
29
|
=== 1.2.5 / 2011-03-09
|
2
30
|
|
3
31
|
* Bugfixes:
|
4
32
|
|
5
33
|
* Small fix to the diff functionality.
|
6
|
-
Swapping left and right would not always
|
34
|
+
Swapping left and right would not always yield the same behavior.
|
7
35
|
|
8
36
|
=== 1.2.4 / 2011-03-04
|
9
37
|
|
10
|
-
*
|
38
|
+
* Bugfixes:
|
11
39
|
|
12
40
|
* Cleaner exit on sigint.
|
13
41
|
|
data/Manifest.txt
CHANGED
@@ -4,13 +4,24 @@ Manifest.txt
|
|
4
4
|
README.rdoc
|
5
5
|
Rakefile
|
6
6
|
bin/kronk
|
7
|
+
bin/yzma
|
7
8
|
lib/kronk.rb
|
9
|
+
lib/kronk/cmd.rb
|
8
10
|
lib/kronk/data_set.rb
|
9
11
|
lib/kronk/diff.rb
|
12
|
+
lib/kronk/diff/ascii_format.rb
|
13
|
+
lib/kronk/diff/color_format.rb
|
10
14
|
lib/kronk/plist_parser.rb
|
11
15
|
lib/kronk/request.rb
|
12
16
|
lib/kronk/response.rb
|
17
|
+
lib/kronk/test.rb
|
18
|
+
lib/kronk/test/assertions.rb
|
19
|
+
lib/kronk/test/core_ext.rb
|
20
|
+
lib/kronk/test/helper_methods.rb
|
13
21
|
lib/kronk/xml_parser.rb
|
22
|
+
lib/yzma.rb
|
23
|
+
lib/yzma/randomizer.rb
|
24
|
+
lib/yzma/report.rb
|
14
25
|
script/kronk_completion
|
15
26
|
test/mocks/200_response.json
|
16
27
|
test/mocks/200_response.plist
|
@@ -18,6 +29,9 @@ test/mocks/200_response.txt
|
|
18
29
|
test/mocks/200_response.xml
|
19
30
|
test/mocks/301_response.txt
|
20
31
|
test/mocks/302_response.txt
|
32
|
+
test/test_assertions.rb
|
33
|
+
test/test_core_ext.rb
|
34
|
+
test/test_helper_methods.rb
|
21
35
|
test/test_data_set.rb
|
22
36
|
test/test_diff.rb
|
23
37
|
test/test_helper.rb
|
data/README.rdoc
CHANGED
@@ -11,8 +11,6 @@ Kronk was made possible by the sponsoring of AT&T Interactive.
|
|
11
11
|
|
12
12
|
* Parse and display or diff data from http response body and/or headers.
|
13
13
|
|
14
|
-
* Follow redirects automatically.
|
15
|
-
|
16
14
|
* Include or exclude specific data points with file-glob-like paths.
|
17
15
|
|
18
16
|
* Supports json, rails-ish xml, and plist.
|
@@ -27,13 +25,13 @@ Kronk was made possible by the sponsoring of AT&T Interactive.
|
|
27
25
|
|
28
26
|
* Easy-to-read output (color or ascii, line numbers, etc).
|
29
27
|
|
30
|
-
*
|
28
|
+
* URI-specific configuration.
|
31
29
|
|
32
|
-
|
30
|
+
* Helper methods for test suites.
|
33
31
|
|
34
|
-
* Auto-
|
32
|
+
* Auto-query reports with request randomization support.
|
35
33
|
|
36
|
-
*
|
34
|
+
* Yes, it works on Windows.
|
37
35
|
|
38
36
|
== SYNOPSIS:
|
39
37
|
|
@@ -246,7 +244,7 @@ single quotes around some of your paths.
|
|
246
244
|
|
247
245
|
== INSTALL:
|
248
246
|
|
249
|
-
$
|
247
|
+
$ gem install kronk
|
250
248
|
|
251
249
|
== DEVELOPERS:
|
252
250
|
|
data/Rakefile
CHANGED
@@ -3,7 +3,18 @@
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'hoe'
|
5
5
|
|
6
|
-
|
6
|
+
|
7
|
+
if ENV['version']
|
8
|
+
gem 'kronk', ENV['version']
|
9
|
+
else
|
10
|
+
$: << "lib"
|
11
|
+
Hoe.plugin :isolate
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'kronk'
|
15
|
+
|
16
|
+
puts "kronk-#{Kronk::VERSION}"
|
17
|
+
|
7
18
|
|
8
19
|
Hoe.spec 'kronk' do
|
9
20
|
developer('Jeremie Castagna', 'yaksnrainbows@gmail.com')
|
@@ -12,9 +23,9 @@ Hoe.spec 'kronk' do
|
|
12
23
|
self.extra_rdoc_files = FileList['*.rdoc']
|
13
24
|
|
14
25
|
self.extra_deps << ['plist', '~>3.1.0']
|
15
|
-
self.extra_deps << ['json', '~>1.
|
16
|
-
self.extra_deps << ['nokogiri', '~>1.
|
17
|
-
self.extra_deps << ['i18n', '
|
26
|
+
self.extra_deps << ['json', '~>1.5']
|
27
|
+
self.extra_deps << ['nokogiri', '~>1.4']
|
28
|
+
self.extra_deps << ['i18n', '>=0.5']
|
18
29
|
self.extra_deps << ['activesupport', '>=2.0.0']
|
19
30
|
self.extra_deps << ['cookiejar', '~>0.3.0']
|
20
31
|
self.extra_deps << ['rack', '~>1.0']
|
@@ -22,4 +33,77 @@ Hoe.spec 'kronk' do
|
|
22
33
|
self.extra_dev_deps << ['mocha', '~>0.9.10']
|
23
34
|
end
|
24
35
|
|
36
|
+
|
37
|
+
class Object
|
38
|
+
|
39
|
+
BENCHMARKS = {}
|
40
|
+
|
41
|
+
def bm name=nil
|
42
|
+
start = Time.now
|
43
|
+
yield
|
44
|
+
span = Time.now - start
|
45
|
+
|
46
|
+
if BENCHMARKS[name]
|
47
|
+
t = BENCHMARKS[name][:time]
|
48
|
+
w = BENCHMARKS[name][:weight]
|
49
|
+
|
50
|
+
t = t + span
|
51
|
+
w += 1
|
52
|
+
|
53
|
+
BENCHMARKS[name] = {:time => t, :weight => w}
|
54
|
+
else
|
55
|
+
BENCHMARKS[name] = {:time => span, :weight => 1}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def benchmark num=1000
|
62
|
+
start = Time.now
|
63
|
+
|
64
|
+
num.times do
|
65
|
+
yield
|
66
|
+
end
|
67
|
+
|
68
|
+
puts "Ran #{num} times: #{(Time.now - start).to_f / num}"
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
namespace :bm do
|
73
|
+
|
74
|
+
desc "Run performance benchmarks on diff and parsing"
|
75
|
+
task :full do
|
76
|
+
|
77
|
+
benchmark(100) do
|
78
|
+
Kronk.compare("prod.txt", "beta.txt").count
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
desc "Run performance benchmarks on diffs"
|
84
|
+
task :diff do
|
85
|
+
left = Kronk::Request.retrieve("prod.txt").parsed_body
|
86
|
+
right = Kronk::Request.retrieve("beta.txt").parsed_body
|
87
|
+
|
88
|
+
diff = Kronk::Diff.new_from_data left, right
|
89
|
+
|
90
|
+
arr1 = diff.str1.split "\n"
|
91
|
+
arr2 = diff.str2.split "\n"
|
92
|
+
|
93
|
+
benchmark(100) do
|
94
|
+
#arr1.each{|i| 0.upto(5){|j| foo = j+123}}
|
95
|
+
#arr2.each{|i| foo = 'foobar'}
|
96
|
+
#arr2.each{|i| i == 'foobar'}
|
97
|
+
diff.create_diff
|
98
|
+
#diff.common_sequences arr1, arr2
|
99
|
+
#diff.find_common arr1, arr2
|
100
|
+
#`diff prod.txt beta.txt`
|
101
|
+
end
|
102
|
+
|
103
|
+
Object::BENCHMARKS.each do |name, bm|
|
104
|
+
puts "#{name} (#{bm[:weight]/100}): #{bm[:time] / 100}"
|
105
|
+
end rescue nil
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
25
109
|
# vim: syntax=ruby
|
data/bin/kronk
CHANGED
data/bin/yzma
ADDED
data/lib/kronk.rb
CHANGED
@@ -11,18 +11,13 @@ require 'yaml'
|
|
11
11
|
class Kronk
|
12
12
|
|
13
13
|
# This gem's version.
|
14
|
-
VERSION = '1.
|
15
|
-
|
16
|
-
|
17
|
-
##
|
18
|
-
# Returns true if kronk is running on ruby for windows.
|
19
|
-
|
20
|
-
def self.windows?
|
21
|
-
!!(RUBY_PLATFORM.downcase =~ /mswin|mingw|cygwin/)
|
22
|
-
end
|
14
|
+
VERSION = '1.3.0'
|
23
15
|
|
24
16
|
|
17
|
+
require 'kronk/cmd'
|
25
18
|
require 'kronk/data_set'
|
19
|
+
require 'kronk/diff/ascii_format'
|
20
|
+
require 'kronk/diff/color_format'
|
26
21
|
require 'kronk/diff'
|
27
22
|
require 'kronk/response'
|
28
23
|
require 'kronk/request'
|
@@ -30,20 +25,20 @@ class Kronk
|
|
30
25
|
require 'kronk/xml_parser'
|
31
26
|
|
32
27
|
|
33
|
-
#
|
34
|
-
|
28
|
+
# Config directory.
|
29
|
+
CONFIG_DIR = File.expand_path "~/.kronk"
|
35
30
|
|
31
|
+
# Default config file to load. Defaults to ~/.kronk.
|
32
|
+
DEFAULT_CONFIG_FILE = File.join CONFIG_DIR, "rc"
|
36
33
|
|
37
34
|
# Default cache file.
|
38
|
-
DEFAULT_CACHE_FILE = File.
|
39
|
-
|
35
|
+
DEFAULT_CACHE_FILE = File.join CONFIG_DIR, "cache"
|
40
36
|
|
41
37
|
# Default cookies file.
|
42
|
-
DEFAULT_COOKIES_FILE = File.
|
43
|
-
|
38
|
+
DEFAULT_COOKIES_FILE = File.join CONFIG_DIR, "cookies"
|
44
39
|
|
45
40
|
# Default file with history of unique URIs. (Used for autocomplete)
|
46
|
-
DEFAULT_HISTORY_FILE = File.
|
41
|
+
DEFAULT_HISTORY_FILE = File.join CONFIG_DIR, "history"
|
47
42
|
|
48
43
|
|
49
44
|
# Default Content-Type header to parser mapping.
|
@@ -141,42 +136,12 @@ class Kronk
|
|
141
136
|
##
|
142
137
|
# Creates the default config file at the given path.
|
143
138
|
|
144
|
-
def self.make_config_file
|
145
|
-
|
146
|
-
file << DEFAULT_CONFIG.to_yaml
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
|
151
|
-
##
|
152
|
-
# Find a fully qualified ruby namespace/constant.
|
139
|
+
def self.make_config_file
|
140
|
+
Dir.mkdir CONFIG_DIR unless File.directory? CONFIG_DIR
|
153
141
|
|
154
|
-
|
155
|
-
|
156
|
-
curr = self
|
157
|
-
|
158
|
-
until consts.empty? do
|
159
|
-
curr = curr.const_get consts.shift
|
142
|
+
File.open DEFAULT_CONFIG_FILE, "w+" do |file|
|
143
|
+
file << DEFAULT_CONFIG.to_yaml
|
160
144
|
end
|
161
|
-
|
162
|
-
curr
|
163
|
-
end
|
164
|
-
|
165
|
-
|
166
|
-
##
|
167
|
-
# Returns the config-defined parser class for a given content type.
|
168
|
-
|
169
|
-
def self.parser_for content_type
|
170
|
-
parser_pair =
|
171
|
-
config[:content_types].select do |key, value|
|
172
|
-
(content_type =~ %r{#{key}([^\w]|$)}) && value
|
173
|
-
end.to_a
|
174
|
-
|
175
|
-
return if parser_pair.empty?
|
176
|
-
|
177
|
-
parser = parser_pair[0][1]
|
178
|
-
parser = find_const parser if String === parser || Symbol === parser
|
179
|
-
parser
|
180
145
|
end
|
181
146
|
|
182
147
|
|
@@ -186,14 +151,14 @@ class Kronk
|
|
186
151
|
# Returns cmd_opts Hash if none found.
|
187
152
|
|
188
153
|
def self.merge_options_for_uri uri, cmd_opts={}
|
189
|
-
return cmd_opts if config[:no_uri_options]
|
154
|
+
return cmd_opts if Kronk.config[:no_uri_options]
|
190
155
|
|
191
156
|
out_opts = Hash.new.merge cmd_opts
|
192
157
|
|
193
|
-
config[:uri_options].each do |matcher,
|
194
|
-
next unless (uri == matcher || uri =~ %r{#{matcher}}) && Hash ===
|
158
|
+
Kronk.config[:uri_options].each do |matcher, opts|
|
159
|
+
next unless (uri == matcher || uri =~ %r{#{matcher}}) && Hash === opts
|
195
160
|
|
196
|
-
|
161
|
+
opts.each do |key, val|
|
197
162
|
if !out_opts[key]
|
198
163
|
out_opts[key] = val
|
199
164
|
next
|
@@ -245,39 +210,34 @@ class Kronk
|
|
245
210
|
|
246
211
|
|
247
212
|
##
|
248
|
-
#
|
249
|
-
|
250
|
-
def self.query_password str=nil
|
251
|
-
$stderr << "#{(str || "Password:")} "
|
252
|
-
system "stty -echo"
|
253
|
-
password = $stdin.gets.chomp
|
254
|
-
ensure
|
255
|
-
system "stty echo"
|
256
|
-
$stderr << "\n"
|
257
|
-
password
|
258
|
-
end
|
213
|
+
# Find a fully qualified ruby namespace/constant.
|
259
214
|
|
215
|
+
def self.find_const namespace
|
216
|
+
consts = namespace.to_s.split "::"
|
217
|
+
curr = self
|
260
218
|
|
261
|
-
|
262
|
-
|
219
|
+
until consts.empty? do
|
220
|
+
curr = curr.const_get consts.shift
|
221
|
+
end
|
263
222
|
|
264
|
-
|
265
|
-
file ||= config[:cookies_file]
|
266
|
-
@cookie_jar = YAML.load_file file if File.file? file
|
267
|
-
@cookie_jar ||= CookieJar::Jar.new
|
268
|
-
@cookie_jar.expire_cookies
|
269
|
-
@cookie_jar
|
223
|
+
curr
|
270
224
|
end
|
271
225
|
|
272
226
|
|
273
227
|
##
|
274
|
-
#
|
228
|
+
# Returns the config-defined parser class for a given content type.
|
275
229
|
|
276
|
-
def self.
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
230
|
+
def self.parser_for content_type
|
231
|
+
parser_pair =
|
232
|
+
config[:content_types].select do |key, value|
|
233
|
+
(content_type =~ %r{#{key}([^\w]|$)}) && value
|
234
|
+
end.to_a
|
235
|
+
|
236
|
+
return if parser_pair.empty?
|
237
|
+
|
238
|
+
parser = parser_pair[0][1]
|
239
|
+
parser = find_const parser if String === parser || Symbol === parser
|
240
|
+
parser
|
281
241
|
end
|
282
242
|
|
283
243
|
|
@@ -298,6 +258,29 @@ class Kronk
|
|
298
258
|
end
|
299
259
|
|
300
260
|
|
261
|
+
##
|
262
|
+
# Load the saved cookies file.
|
263
|
+
|
264
|
+
def self.load_cookie_jar file=nil
|
265
|
+
file ||= config[:cookies_file]
|
266
|
+
@cookie_jar = YAML.load_file file if File.file? file
|
267
|
+
@cookie_jar ||= CookieJar::Jar.new
|
268
|
+
@cookie_jar.expire_cookies
|
269
|
+
@cookie_jar
|
270
|
+
end
|
271
|
+
|
272
|
+
|
273
|
+
##
|
274
|
+
# Save the cookie jar to file.
|
275
|
+
|
276
|
+
def self.save_cookie_jar file=nil
|
277
|
+
file ||= config[:cookies_file]
|
278
|
+
File.open(file, "w") do |f|
|
279
|
+
f.write @cookie_jar.to_yaml
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
|
301
284
|
##
|
302
285
|
# Returns the Kronk history array of accessed URLs.
|
303
286
|
|
@@ -313,8 +296,10 @@ class Kronk
|
|
313
296
|
# Writes the URL history to the history file.
|
314
297
|
|
315
298
|
def self.save_history
|
299
|
+
history_str = self.history.uniq.join($/)
|
300
|
+
|
316
301
|
File.open self.config[:history_file], "w" do |file|
|
317
|
-
file.write
|
302
|
+
file.write history_str
|
318
303
|
end
|
319
304
|
end
|
320
305
|
|
@@ -372,397 +357,94 @@ class Kronk
|
|
372
357
|
Diff.ordered_data_string data, options[:struct]
|
373
358
|
|
374
359
|
rescue Response::MissingParser
|
375
|
-
|
360
|
+
Cmd.warn "No parser for #{resp['Content-Type']} [#{uri}]"
|
376
361
|
resp.selective_string options
|
377
362
|
end
|
378
363
|
end
|
379
364
|
end
|
380
365
|
|
381
366
|
|
367
|
+
###
|
368
|
+
# Deprecated methods...
|
369
|
+
###
|
382
370
|
|
383
|
-
##
|
384
|
-
# Start an IRB console with the given http response object.
|
385
|
-
|
386
|
-
def self.irb resp
|
387
|
-
require 'irb'
|
388
|
-
|
389
|
-
$http_response = resp
|
390
|
-
$response = begin
|
391
|
-
resp.parsed_body
|
392
|
-
rescue Response::MissingParser
|
393
|
-
resp.body
|
394
|
-
end
|
395
371
|
|
396
|
-
|
397
|
-
|
372
|
+
def self.deprecated method_name, replacement=nil
|
373
|
+
replacement &&= ", use #{replacement}"
|
374
|
+
replacement ||= " with no replacement"
|
398
375
|
|
399
|
-
|
400
|
-
exit 1
|
376
|
+
Cmd.warn "#{method_name} deprecated#{replacement}"
|
401
377
|
end
|
402
378
|
|
403
379
|
|
404
380
|
##
|
405
|
-
#
|
406
|
-
|
407
|
-
def self.run argv=ARGV
|
408
|
-
begin
|
409
|
-
load_config
|
410
|
-
|
411
|
-
rescue Errno::ENOENT
|
412
|
-
make_config_file
|
413
|
-
|
414
|
-
$stderr << "\nNo config file was found.\n\n"
|
415
|
-
$stderr << "Created default config in #{DEFAULT_CONFIG_FILE}\n"
|
416
|
-
$stderr << "Edit file if necessary and try again.\n"
|
417
|
-
exit 2
|
418
|
-
end
|
419
|
-
|
420
|
-
load_cookie_jar
|
381
|
+
# Deprecated! Use Kronk::Cmd::irb
|
421
382
|
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
at_exit do
|
427
|
-
save_cookie_jar
|
428
|
-
save_history
|
429
|
-
end
|
430
|
-
|
431
|
-
trap 'INT' do
|
432
|
-
exit 2
|
433
|
-
end
|
434
|
-
|
435
|
-
|
436
|
-
options[:cache_response] = config[:cache_file] if config[:cache_file]
|
437
|
-
|
438
|
-
uri1, uri2 = options.delete :uris
|
439
|
-
|
440
|
-
if uri1 && uri2
|
441
|
-
diff = compare uri1, uri2, options
|
442
|
-
puts "#{diff.formatted}\n" unless config[:brief]
|
443
|
-
|
444
|
-
if config[:verbose] || config[:brief]
|
445
|
-
$stdout << "Found #{diff.count} diff(s).\n"
|
446
|
-
end
|
383
|
+
def self.irb resp
|
384
|
+
deprecated "Kronk::irb", "Kronk::Cmd::irb"
|
385
|
+
Cmd.irb resp
|
386
|
+
end
|
447
387
|
|
448
|
-
exit 1 if diff.count > 0
|
449
388
|
|
450
|
-
|
451
|
-
|
452
|
-
out = Diff.insert_line_nums out if config[:show_lines]
|
453
|
-
puts out
|
454
|
-
end
|
389
|
+
##
|
390
|
+
# Deprecated! Use Kronk::Cmd::move_config_file
|
455
391
|
|
456
|
-
|
457
|
-
|
458
|
-
|
392
|
+
def self.move_config_file
|
393
|
+
deprecated "Kronk::move_config_file", "Kronk::Cmd::move_config_file"
|
394
|
+
Cmd.move_config_file
|
459
395
|
end
|
460
396
|
|
461
397
|
|
462
398
|
##
|
463
|
-
#
|
399
|
+
# Deprecated! Use Kronk::Cmd::query_password
|
464
400
|
|
465
|
-
def self.
|
466
|
-
|
401
|
+
def self.query_password str=nil
|
402
|
+
deprecated "Kronk::query_password", "Kronk::Cmd::query_password"
|
403
|
+
Cmd.query_password str
|
467
404
|
end
|
468
405
|
|
469
406
|
|
470
407
|
##
|
471
|
-
#
|
408
|
+
# Deprecated! Use Kronk::Cmd::parse_args
|
472
409
|
|
473
410
|
def self.parse_args argv
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
:proxy => {},
|
478
|
-
:uris => [],
|
479
|
-
:with_headers => false
|
480
|
-
}
|
481
|
-
|
482
|
-
options = parse_data_path_args options, argv
|
483
|
-
|
484
|
-
opts = OptionParser.new do |opt|
|
485
|
-
opt.program_name = File.basename $0
|
486
|
-
opt.version = VERSION
|
487
|
-
opt.release = nil
|
488
|
-
|
489
|
-
opt.banner = <<-STR
|
490
|
-
|
491
|
-
#{opt.program_name} #{opt.version}
|
492
|
-
|
493
|
-
Parse and run diffs against data from live and cached http responses.
|
494
|
-
|
495
|
-
Usage:
|
496
|
-
#{opt.program_name} --help
|
497
|
-
#{opt.program_name} --version
|
498
|
-
#{opt.program_name} uri1 [uri2] [options...] [-- data-paths]
|
499
|
-
|
500
|
-
Examples:
|
501
|
-
#{opt.program_name} http://example.com/A
|
502
|
-
#{opt.program_name} http://example.com/B --prev --raw
|
503
|
-
#{opt.program_name} http://example.com/B.xml local/file/B.json
|
504
|
-
#{opt.program_name} file1.json file2.json -- **/key1=val1 -root/key?
|
505
|
-
|
506
|
-
Arguments after -- will be used to focus the diff on specific data points.
|
507
|
-
If the data paths start with a '-' the matched data points will be removed.
|
508
|
-
If the data paths start with a ":" the parent of the matched data is used.
|
509
|
-
The ':' and '-' modifiers may be used together in that order (':-').
|
510
|
-
|
511
|
-
Options:
|
512
|
-
STR
|
513
|
-
|
514
|
-
opt.on('--ascii', 'Return ascii formatted diff') do
|
515
|
-
config[:diff_format] = :ascii_diff
|
516
|
-
end
|
517
|
-
|
518
|
-
|
519
|
-
opt.on('--color', 'Return color formatted diff') do
|
520
|
-
config[:diff_format] = :color_diff
|
521
|
-
end
|
522
|
-
|
523
|
-
|
524
|
-
opt.on('--completion', 'Print bash completion file path and exit') do
|
525
|
-
file = File.join(File.dirname(__FILE__), "../script/kronk_completion")
|
526
|
-
puts File.expand_path(file)
|
527
|
-
exit 2
|
528
|
-
end
|
529
|
-
|
530
|
-
|
531
|
-
opt.on('--config STR', String,
|
532
|
-
'Load the given Kronk config file') do |value|
|
533
|
-
load_config value
|
534
|
-
end
|
535
|
-
|
536
|
-
|
537
|
-
opt.on('-q', '--brief', 'Output only whether URI responses differ') do
|
538
|
-
config[:brief] = true
|
539
|
-
end
|
540
|
-
|
541
|
-
|
542
|
-
opt.on('--format STR', String,
|
543
|
-
'Use a custom diff formatter') do |value|
|
544
|
-
config[:diff_format] = value
|
545
|
-
end
|
546
|
-
|
547
|
-
|
548
|
-
opt.on('-i', '--include [header1,header2]', Array,
|
549
|
-
'Include all or given headers in response') do |value|
|
550
|
-
options[:with_headers] ||= []
|
551
|
-
|
552
|
-
if value
|
553
|
-
options[:with_headers].concat value if
|
554
|
-
Array === options[:with_headers]
|
555
|
-
else
|
556
|
-
options[:with_headers] = true
|
557
|
-
end
|
558
|
-
end
|
559
|
-
|
560
|
-
|
561
|
-
opt.on('-I', '--head [header1,header2]', Array,
|
562
|
-
'Use all or given headers only in the response') do |value|
|
563
|
-
options[:with_headers] ||= []
|
564
|
-
|
565
|
-
if value
|
566
|
-
options[:with_headers].concat value if
|
567
|
-
Array === options[:with_headers]
|
568
|
-
else
|
569
|
-
options[:with_headers] = true
|
570
|
-
end
|
571
|
-
|
572
|
-
options[:no_body] = true
|
573
|
-
end
|
574
|
-
|
575
|
-
|
576
|
-
opt.on('--irb', 'Start an IRB console') do
|
577
|
-
options[:irb] = true
|
578
|
-
end
|
579
|
-
|
580
|
-
|
581
|
-
opt.on('--lines', 'Show line numbers') do
|
582
|
-
config[:show_lines] = true
|
583
|
-
end
|
584
|
-
|
585
|
-
|
586
|
-
opt.on('--no-opts', 'Turn off config URI options') do
|
587
|
-
config[:no_uri_options] = true
|
588
|
-
end
|
589
|
-
|
590
|
-
|
591
|
-
opt.on('--parser STR', String,
|
592
|
-
'Override default parser') do |value|
|
593
|
-
options[:parser] = value
|
594
|
-
end
|
595
|
-
|
596
|
-
|
597
|
-
opt.on('--prev', 'Use last response to diff against') do
|
598
|
-
options[:uris].unshift :cache
|
599
|
-
end
|
600
|
-
|
601
|
-
|
602
|
-
opt.on('--raw', 'Run diff on the raw data returned') do
|
603
|
-
options[:raw] = true
|
604
|
-
end
|
605
|
-
|
606
|
-
|
607
|
-
opt.on('-r', '--require lib1,lib2', Array,
|
608
|
-
'Require a library or gem') do |value|
|
609
|
-
options[:requires] ||= []
|
610
|
-
options[:requires].concat value
|
611
|
-
end
|
612
|
-
|
613
|
-
|
614
|
-
opt.on('--struct', 'Run diff on the data structure') do
|
615
|
-
options[:struct] = true
|
616
|
-
end
|
617
|
-
|
618
|
-
|
619
|
-
opt.on('-V', '--verbose', 'Make the operation more talkative') do
|
620
|
-
config[:verbose] = true
|
621
|
-
end
|
622
|
-
|
623
|
-
|
624
|
-
opt.separator <<-STR
|
625
|
-
|
626
|
-
HTTP Options:
|
627
|
-
STR
|
628
|
-
|
629
|
-
opt.on('--clear-cookies', 'Delete all saved cookies') do
|
630
|
-
clear_cookies!
|
631
|
-
end
|
632
|
-
|
633
|
-
|
634
|
-
opt.on('-d', '--data STR', String,
|
635
|
-
'Post data with the request') do |value|
|
636
|
-
options[:data] = value
|
637
|
-
options[:http_method] ||= 'POST'
|
638
|
-
end
|
639
|
-
|
640
|
-
|
641
|
-
opt.on('-H', '--header STR', String,
|
642
|
-
'Header to pass to the server request') do |value|
|
643
|
-
options[:headers] ||= {}
|
644
|
-
|
645
|
-
key, value = value.split ": ", 2
|
646
|
-
options[:headers][key] = value.strip
|
647
|
-
end
|
648
|
-
|
649
|
-
|
650
|
-
opt.on('-A', '--user-agent STR', String,
|
651
|
-
'User-Agent to send to server or a valid alias') do |value|
|
652
|
-
options[:user_agent] = value
|
653
|
-
end
|
654
|
-
|
655
|
-
|
656
|
-
opt.on('-L', '--location [NUM]', Integer,
|
657
|
-
'Follow the location header always or num times') do |value|
|
658
|
-
options[:follow_redirects] = value || true
|
659
|
-
end
|
660
|
-
|
661
|
-
|
662
|
-
opt.on('--no-cookies', 'Don\'t use cookies for this session') do
|
663
|
-
options[:no_cookies] = true
|
664
|
-
end
|
665
|
-
|
666
|
-
|
667
|
-
opt.on('-?', '--query STR', String,
|
668
|
-
'Append query to URLs') do |value|
|
669
|
-
options[:query] = value
|
670
|
-
end
|
671
|
-
|
672
|
-
|
673
|
-
opt.on('--suff STR', String,
|
674
|
-
'Add common path items to the end of each URL') do |value|
|
675
|
-
options[:uri_suffix] = value
|
676
|
-
end
|
677
|
-
|
678
|
-
|
679
|
-
opt.on('--timeout INT', Integer,
|
680
|
-
'Timeout for http connection in seconds') do |value|
|
681
|
-
config[:timeout] = value
|
682
|
-
end
|
683
|
-
|
684
|
-
|
685
|
-
opt.on('-U', '--proxy-user STR', String,
|
686
|
-
'Set proxy user and/or password: usr[:pass]') do |value|
|
687
|
-
options[:proxy][:username], options[:proxy][:password] =
|
688
|
-
value.split ":", 2
|
689
|
-
|
690
|
-
options[:proxy][:password] ||= query_password "Proxy password:"
|
691
|
-
end
|
692
|
-
|
693
|
-
|
694
|
-
opt.on('-u', '--user STR', String,
|
695
|
-
'Set server auth user and/or password: usr[:pass]') do |value|
|
696
|
-
options[:auth][:username], options[:auth][:password] =
|
697
|
-
value.split ":", 2
|
698
|
-
|
699
|
-
options[:auth][:password] ||= query_password "Server password:"
|
700
|
-
end
|
701
|
-
|
702
|
-
|
703
|
-
opt.on('-X', '--request STR', String,
|
704
|
-
'The request method to use') do |value|
|
705
|
-
options[:http_method] = value
|
706
|
-
end
|
707
|
-
|
708
|
-
|
709
|
-
opt.on('-x', '--proxy STR', String,
|
710
|
-
'Use HTTP proxy on given port: host[:port]') do |value|
|
711
|
-
options[:proxy][:address], options[:proxy][:port] = value.split ":", 2
|
712
|
-
end
|
713
|
-
|
714
|
-
opt.separator nil
|
715
|
-
end
|
716
|
-
|
717
|
-
opts.parse! argv
|
718
|
-
|
719
|
-
unless $stdin.tty?
|
720
|
-
io = StringIO.new $stdin.read
|
721
|
-
options[:uris] << io
|
722
|
-
end
|
723
|
-
|
724
|
-
options[:uris].concat argv
|
725
|
-
options[:uris].slice!(2..-1)
|
726
|
-
|
727
|
-
argv.clear
|
411
|
+
deprecated "Kronk::parse_args", "Kronk::Cmd::parse_args"
|
412
|
+
Cmd.parse_args argv
|
413
|
+
end
|
728
414
|
|
729
|
-
raise OptionParser::MissingArgument, "You must enter at least one URI" if
|
730
|
-
options[:uris].empty?
|
731
415
|
|
732
|
-
|
416
|
+
##
|
417
|
+
# Deprecated! Use Kronk::Cmd::parse_data_path_args
|
733
418
|
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
exit 1
|
419
|
+
def self.parse_data_path_args options, argv
|
420
|
+
deprecated "Kronk::parse_data_path_args", "Kronk::Cmd::parse_data_path_args"
|
421
|
+
Cmd.parse_data_path_args options, argv
|
738
422
|
end
|
739
423
|
|
740
424
|
|
741
425
|
##
|
742
|
-
#
|
743
|
-
# Returns the array [only_paths, except_paths]
|
426
|
+
# Deprecated! Use Kronk::Cmd::run
|
744
427
|
|
745
|
-
def self.
|
746
|
-
|
428
|
+
def self.run argv=ARGV
|
429
|
+
deprecated "Kronk::run", "Kronk::Cmd::run"
|
430
|
+
Cmd.run argv
|
431
|
+
end
|
747
432
|
|
748
|
-
data_paths = argv.slice! argv.index("--")..-1
|
749
|
-
data_paths.shift
|
750
433
|
|
751
|
-
|
752
|
-
|
753
|
-
(options[:ignore_data] ||= []) << path[1..-1]
|
434
|
+
##
|
435
|
+
# Deprecated! Use Kronk::Cmd::verbose
|
754
436
|
|
755
|
-
|
756
|
-
|
437
|
+
def self.verbose str
|
438
|
+
deprecated "Kronk::verbose", "Kronk::Cmd::verbose"
|
439
|
+
Cmd.verbose str
|
440
|
+
end
|
757
441
|
|
758
|
-
elsif path[0,1] == ":"
|
759
|
-
(options[:only_data_with] ||= []) << path[1..-1]
|
760
442
|
|
761
|
-
|
762
|
-
|
763
|
-
end
|
764
|
-
end
|
443
|
+
##
|
444
|
+
# Deprecated! Use Kronk::Cmd::windows?
|
765
445
|
|
766
|
-
|
446
|
+
def self.windows?
|
447
|
+
deprecated "Kronk::windows?", "Kronk::Cmd::windows?"
|
448
|
+
Cmd.windows?
|
767
449
|
end
|
768
450
|
end
|