kronk 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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"
|