kronk 1.0.2 → 1.0.3
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.txt +15 -1
- data/Rakefile +5 -5
- data/lib/kronk.rb +65 -20
- data/lib/kronk/data_set.rb +93 -7
- data/lib/kronk/diff.rb +33 -9
- data/lib/kronk/response.rb +7 -6
- data/test/test_data_set.rb +87 -0
- data/test/test_kronk.rb +28 -4
- data/test/test_response.rb +21 -0
- metadata +12 -15
data/History.txt
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
-
=== 1.0.
|
1
|
+
=== 1.0.3 / 2010-12-09
|
2
|
+
|
3
|
+
* Enhancements:
|
4
|
+
|
5
|
+
* Supports overriding the parser from the command line.
|
6
|
+
|
7
|
+
* Support for ignoring or collecting parents of matched data paths.
|
8
|
+
|
9
|
+
* Support for uri-specific options in the .kronk config.
|
10
|
+
|
11
|
+
* Bugfixes:
|
12
|
+
|
13
|
+
* Lines are displayed for non-diff requests.
|
14
|
+
|
15
|
+
=== 1.0.2 / 2010-12-07
|
2
16
|
|
3
17
|
* Enhancements:
|
4
18
|
|
data/Rakefile
CHANGED
@@ -8,13 +8,13 @@ Hoe.plugin :isolate
|
|
8
8
|
Hoe.spec 'kronk' do
|
9
9
|
developer('Jeremie Castagna', 'yaksnrainbows@gmail.com')
|
10
10
|
|
11
|
-
self.extra_deps << ['plist', '
|
12
|
-
self.extra_deps << ['json', '
|
13
|
-
self.extra_deps << ['nokogiri', '
|
14
|
-
self.extra_deps << ['i18n', '
|
11
|
+
self.extra_deps << ['plist', '~>3.1.0']
|
12
|
+
self.extra_deps << ['json', '~>1.2']
|
13
|
+
self.extra_deps << ['nokogiri', '~>1.3']
|
14
|
+
self.extra_deps << ['i18n', '~>0.5']
|
15
15
|
self.extra_deps << ['activesupport', '>=2.0.0']
|
16
16
|
|
17
|
-
self.extra_dev_deps << ['mocha', '
|
17
|
+
self.extra_dev_deps << ['mocha', '~>0.9.10']
|
18
18
|
end
|
19
19
|
|
20
20
|
# vim: syntax=ruby
|
data/lib/kronk.rb
CHANGED
@@ -17,7 +17,7 @@ require 'yaml'
|
|
17
17
|
class Kronk
|
18
18
|
|
19
19
|
# This gem's version.
|
20
|
-
VERSION = '1.0.
|
20
|
+
VERSION = '1.0.3'
|
21
21
|
|
22
22
|
|
23
23
|
require 'kronk/data_set'
|
@@ -51,7 +51,8 @@ class Kronk
|
|
51
51
|
:diff_format => :ascii_diff,
|
52
52
|
:show_lines => false,
|
53
53
|
:cache_file => DEFAULT_CACHE_FILE,
|
54
|
-
:requires => []
|
54
|
+
:requires => [],
|
55
|
+
:uri_options => {}
|
55
56
|
}
|
56
57
|
|
57
58
|
|
@@ -69,6 +70,7 @@ class Kronk
|
|
69
70
|
def self.load_config filepath=DEFAULT_CONFIG_FILE
|
70
71
|
conf = YAML.load_file DEFAULT_CONFIG_FILE
|
71
72
|
content_types = conf.delete :content_types
|
73
|
+
uri_options = conf.delete :uri_options
|
72
74
|
|
73
75
|
if conf[:requires]
|
74
76
|
requires = [*conf.delete(:requires)]
|
@@ -76,6 +78,8 @@ class Kronk
|
|
76
78
|
self.config[:requires].concat requires
|
77
79
|
end
|
78
80
|
|
81
|
+
self.config[:uri_options].merge! uri_options if uri_options
|
82
|
+
|
79
83
|
self.config[:content_types].merge!(content_types) if content_types
|
80
84
|
self.config.merge! conf
|
81
85
|
end
|
@@ -132,6 +136,19 @@ class Kronk
|
|
132
136
|
end
|
133
137
|
|
134
138
|
|
139
|
+
##
|
140
|
+
# Returns config-defined options for a given uri.
|
141
|
+
# Returns empty Hash if none found.
|
142
|
+
|
143
|
+
def self.options_for_uri uri
|
144
|
+
config[:uri_options].each do |key, options|
|
145
|
+
return options if uri == key || uri =~ %r{#{key}}
|
146
|
+
end
|
147
|
+
|
148
|
+
Hash.new
|
149
|
+
end
|
150
|
+
|
151
|
+
|
135
152
|
##
|
136
153
|
# Make requests, parse the responses and compare the data.
|
137
154
|
# If the second argument is omitted or is passed :cache, will
|
@@ -142,8 +159,10 @@ class Kronk
|
|
142
159
|
# :data:: Hash/String - the data to pass to the http request
|
143
160
|
# :headers:: Hash - extra headers to pass to the request
|
144
161
|
# :http_method:: Symbol - the http method to use; defaults to :get
|
162
|
+
# :only_data:: String/Array - extracts the data from given data paths
|
145
163
|
# :ignore_data:: String/Array - defines which data points to exclude
|
146
164
|
# :with_headers:: Bool/String/Array - defines which headers to include
|
165
|
+
# :parser:: Object - The parser to use for the body; default nil
|
147
166
|
# :raw:: Bool - run diff on raw strings
|
148
167
|
#
|
149
168
|
# Returns a diff object.
|
@@ -164,10 +183,13 @@ class Kronk
|
|
164
183
|
# Return a diff object from two responses' raw data.
|
165
184
|
|
166
185
|
def self.raw_diff query1, query2, options={}
|
167
|
-
|
168
|
-
|
186
|
+
opts1 = options.merge options_for_uri(query1)
|
187
|
+
opts2 = options.merge options_for_uri(query2)
|
169
188
|
|
170
|
-
|
189
|
+
resp1 = Request.retrieve query1, opts1
|
190
|
+
resp2 = Request.retrieve query2, opts2
|
191
|
+
|
192
|
+
Diff.new resp1.selective_string(opts1), resp2.selective_string(opts2)
|
171
193
|
end
|
172
194
|
|
173
195
|
|
@@ -175,11 +197,14 @@ class Kronk
|
|
175
197
|
# Return a diff object from two parsed responses.
|
176
198
|
|
177
199
|
def self.data_diff query1, query2, options={}
|
178
|
-
|
179
|
-
|
200
|
+
opts1 = options.merge options_for_uri(query1)
|
201
|
+
opts2 = options.merge options_for_uri(query2)
|
202
|
+
|
203
|
+
resp1 = Request.retrieve query1, opts1
|
204
|
+
resp2 = Request.retrieve query2, opts2
|
180
205
|
|
181
|
-
Diff.new_from_data resp1.selective_data(
|
182
|
-
resp2.selective_data(
|
206
|
+
Diff.new_from_data resp1.selective_data(opts1),
|
207
|
+
resp2.selective_data(opts2),
|
183
208
|
options
|
184
209
|
end
|
185
210
|
|
@@ -215,11 +240,19 @@ class Kronk
|
|
215
240
|
verbose "\n\nFound #{diff.count} diff(s).\n"
|
216
241
|
|
217
242
|
elsif options[:raw]
|
218
|
-
|
243
|
+
options = options.merge options_for_uri(uri1)
|
244
|
+
|
245
|
+
out = Request.retrieve(uri1, options).selective_string options
|
246
|
+
out = Diff.insert_line_nums out if config[:show_lines]
|
247
|
+
puts out
|
219
248
|
|
220
249
|
else
|
250
|
+
options = options.merge options_for_uri(uri1)
|
251
|
+
|
221
252
|
data = Request.retrieve(uri1, options).selective_data options
|
222
|
-
|
253
|
+
out = Diff.ordered_data_string data, options[:struct]
|
254
|
+
out = Diff.insert_line_nums out if config[:show_lines]
|
255
|
+
puts out
|
223
256
|
end
|
224
257
|
|
225
258
|
rescue Request::NotFoundError, Response::MissingParser => e
|
@@ -246,7 +279,7 @@ class Kronk
|
|
246
279
|
:uris => []
|
247
280
|
}
|
248
281
|
|
249
|
-
options
|
282
|
+
options = parse_data_path_args options, argv
|
250
283
|
|
251
284
|
opts = OptionParser.new do |opt|
|
252
285
|
opt.program_name = File.basename $0
|
@@ -269,6 +302,8 @@ Kronk runs diffs against data from live and cached http responses.
|
|
269
302
|
|
270
303
|
Arguments after -- will be used to focus the diff on specific data points.
|
271
304
|
If the data paths start with a '-' the matched data points will be removed.
|
305
|
+
If the data paths start with a ":" the parent of the matched data is used.
|
306
|
+
The ':' and '-' modifiers may be used together in that order (':-').
|
272
307
|
|
273
308
|
Options:
|
274
309
|
STR
|
@@ -378,6 +413,12 @@ Kronk runs diffs against data from live and cached http responses.
|
|
378
413
|
end
|
379
414
|
|
380
415
|
|
416
|
+
opt.on('--parser STR', String,
|
417
|
+
'Override default parser') do |value|
|
418
|
+
options[:parser] = value
|
419
|
+
end
|
420
|
+
|
421
|
+
|
381
422
|
opt.on('-V', '--verbose', 'Make the operation more talkative') do
|
382
423
|
config[:verbose] = true
|
383
424
|
end
|
@@ -404,23 +445,27 @@ Kronk runs diffs against data from live and cached http responses.
|
|
404
445
|
# Searches ARGV and returns data paths to add or exclude in the diff.
|
405
446
|
# Returns the array [only_paths, except_paths]
|
406
447
|
|
407
|
-
def self.parse_data_path_args argv
|
408
|
-
return unless argv.include? "--"
|
448
|
+
def self.parse_data_path_args options, argv
|
449
|
+
return options unless argv.include? "--"
|
409
450
|
|
410
451
|
data_paths = argv.slice! argv.index("--")..-1
|
411
452
|
data_paths.shift
|
412
453
|
|
413
|
-
only_paths = nil
|
414
|
-
except_paths = nil
|
415
|
-
|
416
454
|
data_paths.each do |path|
|
417
455
|
if path[0,1] == "-"
|
418
|
-
(
|
456
|
+
(options[:ignore_data] ||= []) << path[1..-1]
|
457
|
+
|
458
|
+
elsif path[0,2] == ":-"
|
459
|
+
(options[:ignore_data_with] ||= []) << path[2..-1]
|
460
|
+
|
461
|
+
elsif path[0,1] == ":"
|
462
|
+
(options[:only_data_with] ||= []) << path[1..-1]
|
463
|
+
|
419
464
|
else
|
420
|
-
(
|
465
|
+
(options[:only_data] ||= []) << path
|
421
466
|
end
|
422
467
|
end
|
423
468
|
|
424
|
-
|
469
|
+
options
|
425
470
|
end
|
426
471
|
end
|
data/lib/kronk/data_set.rb
CHANGED
@@ -12,10 +12,55 @@ class Kronk
|
|
12
12
|
end
|
13
13
|
|
14
14
|
|
15
|
+
##
|
16
|
+
# Retrieves the data at the given path array.
|
17
|
+
|
18
|
+
def data_at_path path
|
19
|
+
self.class.data_at_path @data, path
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
##
|
24
|
+
# Checks if data is available at the given path.
|
25
|
+
|
26
|
+
def data_at_path? path
|
27
|
+
self.class.data_at_path? @data, path
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
##
|
32
|
+
# Modify the data object by passing inclusive or exclusive data paths.
|
33
|
+
# Supports the following options:
|
34
|
+
# :only_data:: String/Array - keep data with that matches the paths
|
35
|
+
# :only_data_with:: String/Array - keep data with a matched child
|
36
|
+
# :ignore_data:: String/Array - remove data with that matches the paths
|
37
|
+
# :ignore_data_with:: String/Array - remove data with a matched child
|
38
|
+
#
|
39
|
+
# Note: the data is processed in the following order:
|
40
|
+
# * only_data_with
|
41
|
+
# * ignore_data_with
|
42
|
+
# * only_data
|
43
|
+
# * ignore_data
|
44
|
+
|
45
|
+
def modify options
|
46
|
+
collect_data_points options[:only_data_with], true if
|
47
|
+
options[:only_data_with]
|
48
|
+
|
49
|
+
delete_data_points options[:ignore_data_with], true if
|
50
|
+
options[:ignore_data_with]
|
51
|
+
|
52
|
+
collect_data_points options[:only_data] if options[:only_data]
|
53
|
+
|
54
|
+
delete_data_points options[:ignore_data] if options[:ignore_data]
|
55
|
+
|
56
|
+
@data
|
57
|
+
end
|
58
|
+
|
59
|
+
|
15
60
|
##
|
16
61
|
# Keep only specific data points from the data structure.
|
17
62
|
|
18
|
-
def collect_data_points data_paths
|
63
|
+
def collect_data_points data_paths, affect_parent=false
|
19
64
|
new_data = @data.class.new
|
20
65
|
|
21
66
|
[*data_paths].each do |data_path|
|
@@ -26,8 +71,13 @@ class Kronk
|
|
26
71
|
|
27
72
|
path.each_with_index do |key, i|
|
28
73
|
|
29
|
-
if i == path.length - 1
|
74
|
+
if i == path.length - 1 && !affect_parent
|
30
75
|
new_curr_data[key] = curr_data[key]
|
76
|
+
|
77
|
+
elsif i == path.length - 2 && affect_parent
|
78
|
+
new_curr_data[key] = curr_data[key]
|
79
|
+
break
|
80
|
+
|
31
81
|
else
|
32
82
|
new_curr_data[key] ||= curr_data[key].class.new
|
33
83
|
new_curr_data = new_curr_data[key]
|
@@ -44,12 +94,19 @@ class Kronk
|
|
44
94
|
##
|
45
95
|
# Remove specific data points from the data structure.
|
46
96
|
|
47
|
-
def delete_data_points data_paths
|
97
|
+
def delete_data_points data_paths, affect_parent=false
|
48
98
|
[*data_paths].each do |data_path|
|
49
|
-
find_data data_path do |obj, k,
|
50
|
-
|
51
|
-
|
52
|
-
|
99
|
+
find_data data_path do |obj, k, path|
|
100
|
+
|
101
|
+
if affect_parent && data_at_path?(path)
|
102
|
+
parent_data = data_at_path path[0..-3]
|
103
|
+
del_method = Array === parent_data ? :delete_at : :delete
|
104
|
+
|
105
|
+
parent_data.send del_method, path[-2]
|
106
|
+
|
107
|
+
else
|
108
|
+
del_method = Array === obj ? :delete_at : :delete
|
109
|
+
obj.send del_method, k
|
53
110
|
end
|
54
111
|
end
|
55
112
|
end
|
@@ -100,6 +157,33 @@ class Kronk
|
|
100
157
|
end
|
101
158
|
|
102
159
|
|
160
|
+
##
|
161
|
+
# Checks if data is available at the given path.
|
162
|
+
|
163
|
+
def self.data_at_path? data, path
|
164
|
+
data_at_path(data, path)
|
165
|
+
true
|
166
|
+
|
167
|
+
rescue NoMethodError, TypeError
|
168
|
+
false
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
##
|
173
|
+
# Retrieve the data at the given path array location.
|
174
|
+
|
175
|
+
def self.data_at_path data, path
|
176
|
+
curr = data
|
177
|
+
path.each do |p|
|
178
|
+
raise TypeError, "Expected instance of Array or Hash" unless
|
179
|
+
Array === curr || Hash === curr
|
180
|
+
curr = curr[p]
|
181
|
+
end
|
182
|
+
|
183
|
+
curr
|
184
|
+
end
|
185
|
+
|
186
|
+
|
103
187
|
##
|
104
188
|
# Parses a given data point and returns an array with the following:
|
105
189
|
# - Key to match
|
@@ -175,6 +259,8 @@ class Kronk
|
|
175
259
|
found = match_data_item(mkey, key) &&
|
176
260
|
match_data_item(mvalue, value)
|
177
261
|
|
262
|
+
#puts "Found: #{data.inspect} #{mkey.inspect} -> #{key.inspect}" if found
|
263
|
+
|
178
264
|
yield data, key, curr_path if found
|
179
265
|
yield_data_points data[key], mkey, mvalue, true, curr_path, &block if
|
180
266
|
recursive
|
data/lib/kronk/diff.rb
CHANGED
@@ -12,8 +12,13 @@ class Kronk
|
|
12
12
|
|
13
13
|
class AsciiFormat
|
14
14
|
|
15
|
-
def self.lines
|
16
|
-
|
15
|
+
def self.lines line_nums, col_width
|
16
|
+
out =
|
17
|
+
[*line_nums].map do |lnum|
|
18
|
+
lnum.to_s.rjust col_width
|
19
|
+
end.join "|"
|
20
|
+
|
21
|
+
"#{out} "
|
17
22
|
end
|
18
23
|
|
19
24
|
|
@@ -38,11 +43,13 @@ class Kronk
|
|
38
43
|
|
39
44
|
class ColorFormat
|
40
45
|
|
41
|
-
def self.lines
|
42
|
-
|
43
|
-
|
46
|
+
def self.lines line_nums, col_width
|
47
|
+
out =
|
48
|
+
[*line_nums].map do |lnum|
|
49
|
+
lnum.to_s.rjust col_width
|
50
|
+
end.join "\033[32m"
|
44
51
|
|
45
|
-
"\033[7;31m#{
|
52
|
+
"\033[7;31m#{out}\033[0m "
|
46
53
|
end
|
47
54
|
|
48
55
|
|
@@ -116,6 +123,23 @@ class Kronk
|
|
116
123
|
end
|
117
124
|
|
118
125
|
|
126
|
+
##
|
127
|
+
# Adds line numbers to each lines of a String.
|
128
|
+
|
129
|
+
def self.insert_line_nums str, formatter=nil
|
130
|
+
format = Diff.formatter formatter || Kronk.config[:diff_format]
|
131
|
+
|
132
|
+
out = ""
|
133
|
+
width = str.lines.count.to_s.length
|
134
|
+
|
135
|
+
str.split("\n").each_with_index do |line, i|
|
136
|
+
out << "#{format.lines(i+1, width)}#{line}\n"
|
137
|
+
end
|
138
|
+
|
139
|
+
out
|
140
|
+
end
|
141
|
+
|
142
|
+
|
119
143
|
##
|
120
144
|
# Returns a formatter from a symbol or string. Returns nil if not found.
|
121
145
|
|
@@ -235,7 +259,7 @@ class Kronk
|
|
235
259
|
line1 = line1.next
|
236
260
|
line2 = line2.next
|
237
261
|
|
238
|
-
lines = format.lines line1, line2, width if options[:show_lines]
|
262
|
+
lines = format.lines [line1, line2], width if options[:show_lines]
|
239
263
|
"#{lines}#{format.common item}"
|
240
264
|
|
241
265
|
when Array
|
@@ -243,13 +267,13 @@ class Kronk
|
|
243
267
|
|
244
268
|
item[0] = item[0].map do |str|
|
245
269
|
line1 = line1.next
|
246
|
-
lines = format.lines line1, nil, width if options[:show_lines]
|
270
|
+
lines = format.lines [line1, nil], width if options[:show_lines]
|
247
271
|
"#{lines}#{format.deleted str}"
|
248
272
|
end
|
249
273
|
|
250
274
|
item[1] = item[1].map do |str|
|
251
275
|
line2 = line2.next
|
252
|
-
lines = format.lines nil, line2, width if options[:show_lines]
|
276
|
+
lines = format.lines [nil, line2], width if options[:show_lines]
|
253
277
|
"#{lines}#{format.added str}"
|
254
278
|
end
|
255
279
|
|
data/lib/kronk/response.rb
CHANGED
@@ -87,6 +87,11 @@ class Kronk
|
|
87
87
|
@parsed_body ||= nil
|
88
88
|
|
89
89
|
return @parsed_body if @parsed_body && !parser
|
90
|
+
|
91
|
+
if String === parser
|
92
|
+
parser = Kronk.parser_for(parser) || Kronk.find_const(parser)
|
93
|
+
end
|
94
|
+
|
90
95
|
parser ||= Kronk.parser_for self['Content-Type']
|
91
96
|
|
92
97
|
raise MissingParser,
|
@@ -165,6 +170,7 @@ class Kronk
|
|
165
170
|
# the response. Supports the following options:
|
166
171
|
# :no_body:: Bool - Don't return the body; default nil
|
167
172
|
# :with_headers:: Bool/String/Array - Return headers; default nil
|
173
|
+
# :parser:: Object - The parser to use for the body; default nil
|
168
174
|
# :ignore_data:: String/Array - Removes the data from given data paths
|
169
175
|
# :only_data:: String/Array - Extracts the data from given data paths
|
170
176
|
|
@@ -172,12 +178,7 @@ class Kronk
|
|
172
178
|
data = nil
|
173
179
|
|
174
180
|
unless options[:no_body]
|
175
|
-
|
176
|
-
|
177
|
-
ds.collect_data_points options[:only_data] if options[:only_data]
|
178
|
-
ds.delete_data_points options[:ignore_data] if options[:ignore_data]
|
179
|
-
|
180
|
-
data = ds.data
|
181
|
+
data = DataSet.new(parsed_body(options[:parser])).modify options
|
181
182
|
end
|
182
183
|
|
183
184
|
if options[:with_headers]
|
data/test/test_data_set.rb
CHANGED
@@ -31,6 +31,52 @@ class TestDataSet < Test::Unit::TestCase
|
|
31
31
|
end
|
32
32
|
|
33
33
|
|
34
|
+
def test_modify_only_data
|
35
|
+
data = @dataset_mock.modify :only_data => "subs/1"
|
36
|
+
assert_equal({"subs" => [nil, "b"]}, data)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def test_modify_ignore_data
|
41
|
+
data = @dataset_mock.modify :ignore_data => "subs/1"
|
42
|
+
|
43
|
+
expected = mock_data
|
44
|
+
expected['subs'].delete_at 1
|
45
|
+
|
46
|
+
assert_equal expected, data
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def test_modify_only_data
|
51
|
+
data = @dataset_mock.modify :only_data => "subs/1"
|
52
|
+
assert_equal({"subs" => [nil, "b"]}, data)
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def test_modify_only_and_ignored_data
|
57
|
+
data = @dataset_mock.modify :ignore_data => "subs/1", :only_data => "subs/1"
|
58
|
+
assert_equal({"subs" => [nil]}, data)
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
def test_collect_data_points_affect_parent_array
|
63
|
+
data = @dataset_mock.collect_data_points "**=(A|a)?", true
|
64
|
+
|
65
|
+
expected = {
|
66
|
+
"root" => [nil, ["A1", "A2"]],
|
67
|
+
"subs" => ["a", "b"]
|
68
|
+
}
|
69
|
+
|
70
|
+
assert_equal expected, data
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
def test_collect_data_points_affect_parent_hash
|
75
|
+
data = @dataset_mock.collect_data_points "**=bar?", true
|
76
|
+
assert_equal({"tests"=>{:foo=>:bar, "test"=>[[1, 2], 2.123]}}, data)
|
77
|
+
end
|
78
|
+
|
79
|
+
|
34
80
|
def test_collect_data_points_single
|
35
81
|
data = @dataset_mock.collect_data_points "subs/1"
|
36
82
|
assert_equal({"subs" => [nil, "b"]}, data)
|
@@ -69,6 +115,47 @@ class TestDataSet < Test::Unit::TestCase
|
|
69
115
|
end
|
70
116
|
|
71
117
|
|
118
|
+
def test_delete_data_points_affect_parent_array
|
119
|
+
data = @dataset_mock.delete_data_points "**/test/0/*", true
|
120
|
+
|
121
|
+
expected = mock_data
|
122
|
+
expected['root'][3]['test'].delete_at 0
|
123
|
+
expected['tests']['test'].delete_at 0
|
124
|
+
|
125
|
+
assert_equal expected, data
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
def test_delete_data_points_affect_parent_array_value
|
130
|
+
data = @dataset_mock.delete_data_points "**/test/0/*=D*", true
|
131
|
+
|
132
|
+
expected = mock_data
|
133
|
+
expected['root'][3]['test'].delete_at 0
|
134
|
+
|
135
|
+
assert_equal expected, data
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
def test_delete_data_points_affect_parent_hash
|
140
|
+
data = @dataset_mock.delete_data_points "subs/1", true
|
141
|
+
|
142
|
+
expected = mock_data
|
143
|
+
expected.delete 'subs'
|
144
|
+
|
145
|
+
assert_equal expected, data
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
def test_delete_data_points_affect_parent_hash_value
|
150
|
+
data = @dataset_mock.delete_data_points "**/*=a", true
|
151
|
+
|
152
|
+
expected = mock_data
|
153
|
+
expected.delete 'subs'
|
154
|
+
|
155
|
+
assert_equal expected, data
|
156
|
+
end
|
157
|
+
|
158
|
+
|
72
159
|
def test_delete_data_points_single
|
73
160
|
data = @dataset_mock.delete_data_points "subs/1"
|
74
161
|
|
data/test/test_kronk.rb
CHANGED
@@ -13,7 +13,8 @@ class TestKronk < Test::Unit::TestCase
|
|
13
13
|
:cache_file => Kronk::DEFAULT_CACHE_FILE,
|
14
14
|
:diff_format => :ascii_diff,
|
15
15
|
:show_lines => false,
|
16
|
-
:requires => []
|
16
|
+
:requires => [],
|
17
|
+
:uri_options => {}
|
17
18
|
}
|
18
19
|
|
19
20
|
assert_equal expected, Kronk::DEFAULT_CONFIG
|
@@ -30,6 +31,7 @@ class TestKronk < Test::Unit::TestCase
|
|
30
31
|
:cache_file => Kronk::DEFAULT_CACHE_FILE,
|
31
32
|
:show_lines => false,
|
32
33
|
:requires => [],
|
34
|
+
:uri_options => {'example.com' => {:parser => 'JSON'}},
|
33
35
|
:foo => :bar
|
34
36
|
}
|
35
37
|
|
@@ -51,6 +53,7 @@ class TestKronk < Test::Unit::TestCase
|
|
51
53
|
:requires => [],
|
52
54
|
:show_lines => false,
|
53
55
|
:ignore_headers => ["Content-Type"],
|
56
|
+
:uri_options => {'example.com' => {:parser => 'JSON'}},
|
54
57
|
:foo => :bar
|
55
58
|
}
|
56
59
|
|
@@ -106,6 +109,20 @@ class TestKronk < Test::Unit::TestCase
|
|
106
109
|
end
|
107
110
|
|
108
111
|
|
112
|
+
def test_options_for_uri
|
113
|
+
old_uri_opts = Kronk.config[:uri_options].dup
|
114
|
+
Kronk.config[:uri_options] = {
|
115
|
+
'example' => 'options1',
|
116
|
+
'example.com' => 'options2'
|
117
|
+
}
|
118
|
+
|
119
|
+
assert_equal 'options1', Kronk.options_for_uri("http://example.com/path")
|
120
|
+
assert_equal Hash.new, Kronk.options_for_uri("http://thing.com/path")
|
121
|
+
|
122
|
+
Kronk.config[:uri_options] = old_uri_opts
|
123
|
+
end
|
124
|
+
|
125
|
+
|
109
126
|
def test_compare_raw
|
110
127
|
diff = Kronk.compare "test/mocks/200_response.json",
|
111
128
|
"test/mocks/200_response.xml",
|
@@ -145,6 +162,7 @@ class TestKronk < Test::Unit::TestCase
|
|
145
162
|
assert_equal exp_diff.formatted, diff.formatted
|
146
163
|
end
|
147
164
|
|
165
|
+
|
148
166
|
def test_raw_diff
|
149
167
|
diff = Kronk.raw_diff "test/mocks/200_response.json",
|
150
168
|
"test/mocks/200_response.xml",
|
@@ -185,10 +203,16 @@ class TestKronk < Test::Unit::TestCase
|
|
185
203
|
|
186
204
|
|
187
205
|
def test_parse_data_path_args
|
188
|
-
|
206
|
+
options = {}
|
207
|
+
argv = %w{this is --argv -- one -two -- -three four :parents :-not_parents}
|
208
|
+
|
209
|
+
options = Kronk.parse_data_path_args options, argv
|
210
|
+
|
211
|
+
assert_equal %w{one four}, options[:only_data]
|
212
|
+
assert_equal %w{two - three}, options[:ignore_data]
|
189
213
|
|
190
|
-
assert_equal
|
191
|
-
|
214
|
+
assert_equal %w{parents}, options[:only_data_with]
|
215
|
+
assert_equal %w{not_parents}, options[:ignore_data_with]
|
192
216
|
|
193
217
|
assert_equal %w{this is --argv}, argv
|
194
218
|
end
|
data/test/test_response.rb
CHANGED
@@ -54,6 +54,18 @@ class TestResponse < Test::Unit::TestCase
|
|
54
54
|
end
|
55
55
|
|
56
56
|
|
57
|
+
def test_parsed_body_string_parser
|
58
|
+
raw = File.read "test/mocks/200_response.json"
|
59
|
+
expected = JSON.parse raw.split("\r\n\r\n")[1]
|
60
|
+
|
61
|
+
assert_equal expected, @json_resp.parsed_body
|
62
|
+
|
63
|
+
assert_raises RuntimeError do
|
64
|
+
@json_resp.parsed_body 'PlistParser'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
57
69
|
def test_parsed_body_plist
|
58
70
|
raw = File.read "test/mocks/200_response.plist"
|
59
71
|
expected = Kronk::PlistParser.parse raw.split("\r\n\r\n")[1]
|
@@ -173,6 +185,15 @@ class TestResponse < Test::Unit::TestCase
|
|
173
185
|
end
|
174
186
|
|
175
187
|
|
188
|
+
def test_selective_data_parser
|
189
|
+
assert_raises RuntimeError do
|
190
|
+
@json_resp.selective_data :parser => Kronk::PlistParser
|
191
|
+
end
|
192
|
+
|
193
|
+
assert @json_resp.selective_data(:parser => JSON)
|
194
|
+
end
|
195
|
+
|
196
|
+
|
176
197
|
def test_selective_data_single_header
|
177
198
|
body = JSON.parse @json_resp.body
|
178
199
|
expected =
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 1.0.
|
8
|
+
- 3
|
9
|
+
version: 1.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jeremie Castagna
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-09 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -23,7 +23,7 @@ dependencies:
|
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
segments:
|
29
29
|
- 3
|
@@ -38,13 +38,12 @@ dependencies:
|
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ~>
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
segments:
|
44
44
|
- 1
|
45
45
|
- 2
|
46
|
-
|
47
|
-
version: 1.2.0
|
46
|
+
version: "1.2"
|
48
47
|
type: :runtime
|
49
48
|
version_requirements: *id002
|
50
49
|
- !ruby/object:Gem::Dependency
|
@@ -53,13 +52,12 @@ dependencies:
|
|
53
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
53
|
none: false
|
55
54
|
requirements:
|
56
|
-
- -
|
55
|
+
- - ~>
|
57
56
|
- !ruby/object:Gem::Version
|
58
57
|
segments:
|
59
58
|
- 1
|
60
59
|
- 3
|
61
|
-
|
62
|
-
version: 1.3.3
|
60
|
+
version: "1.3"
|
63
61
|
type: :runtime
|
64
62
|
version_requirements: *id003
|
65
63
|
- !ruby/object:Gem::Dependency
|
@@ -68,13 +66,12 @@ dependencies:
|
|
68
66
|
requirement: &id004 !ruby/object:Gem::Requirement
|
69
67
|
none: false
|
70
68
|
requirements:
|
71
|
-
- -
|
69
|
+
- - ~>
|
72
70
|
- !ruby/object:Gem::Version
|
73
71
|
segments:
|
74
72
|
- 0
|
75
73
|
- 5
|
76
|
-
|
77
|
-
version: 0.5.0
|
74
|
+
version: "0.5"
|
78
75
|
type: :runtime
|
79
76
|
version_requirements: *id004
|
80
77
|
- !ruby/object:Gem::Dependency
|
@@ -113,7 +110,7 @@ dependencies:
|
|
113
110
|
requirement: &id007 !ruby/object:Gem::Requirement
|
114
111
|
none: false
|
115
112
|
requirements:
|
116
|
-
- -
|
113
|
+
- - ~>
|
117
114
|
- !ruby/object:Gem::Version
|
118
115
|
segments:
|
119
116
|
- 0
|
@@ -186,7 +183,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
186
183
|
requirements:
|
187
184
|
- - ">="
|
188
185
|
- !ruby/object:Gem::Version
|
189
|
-
hash:
|
186
|
+
hash: 2734576429023002030
|
190
187
|
segments:
|
191
188
|
- 0
|
192
189
|
version: "0"
|