kronk 1.5.4 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +14 -0
- data/Manifest.txt +8 -2
- data/README.rdoc +6 -0
- data/TODO.rdoc +12 -0
- data/lib/kronk.rb +6 -2
- data/lib/kronk/cmd.rb +18 -2
- data/lib/kronk/constants.rb +1 -0
- data/lib/kronk/data_renderer.rb +95 -22
- data/lib/kronk/diff.rb +18 -64
- data/lib/kronk/diff/ascii_format.rb +11 -0
- data/lib/kronk/diff/color_format.rb +14 -2
- data/lib/kronk/diff/output.rb +155 -0
- data/lib/kronk/path.rb +48 -153
- data/lib/kronk/path/matcher.rb +189 -0
- data/lib/kronk/path/path_match.rb +74 -0
- data/lib/kronk/path/transaction.rb +157 -47
- data/lib/kronk/player/benchmark.rb +2 -1
- data/lib/kronk/player/suite.rb +8 -0
- data/lib/kronk/response.rb +7 -6
- data/test/test_cmd.rb +29 -8
- data/test/test_data_string.rb +58 -0
- data/test/test_diff.rb +137 -36
- data/test/test_helper.rb +2 -0
- data/test/test_kronk.rb +19 -3
- data/test/test_path.rb +87 -170
- data/test/test_path_match.rb +60 -0
- data/test/test_path_matcher.rb +329 -0
- data/test/test_response.rb +10 -10
- data/test/test_transaction.rb +132 -3
- metadata +82 -75
data/History.rdoc
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
=== 1.6.0 / 2011-09-11
|
2
|
+
|
3
|
+
* Major Enhancements:
|
4
|
+
|
5
|
+
* Diff output limited context with a default of 3 lines.
|
6
|
+
|
7
|
+
* Enhancements:
|
8
|
+
|
9
|
+
* Parsed headers output is a Hash of Strings instead of Arrays.
|
10
|
+
|
11
|
+
* Bugfixes:
|
12
|
+
|
13
|
+
* Path transaction fixes for accessing and yielding already removed data.
|
14
|
+
|
1
15
|
=== 1.5.4 / 2011-09-02
|
2
16
|
|
3
17
|
* Bugfixes:
|
data/Manifest.txt
CHANGED
@@ -12,7 +12,10 @@ lib/kronk/data_renderer.rb
|
|
12
12
|
lib/kronk/diff.rb
|
13
13
|
lib/kronk/diff/ascii_format.rb
|
14
14
|
lib/kronk/diff/color_format.rb
|
15
|
+
lib/kronk/diff/output.rb
|
15
16
|
lib/kronk/path.rb
|
17
|
+
lib/kronk/path/matcher.rb
|
18
|
+
lib/kronk/path/path_match.rb
|
16
19
|
lib/kronk/path/transaction.rb
|
17
20
|
lib/kronk/player.rb
|
18
21
|
lib/kronk/player/benchmark.rb
|
@@ -38,14 +41,17 @@ test/mocks/302_response.txt
|
|
38
41
|
test/mocks/cookies.yml
|
39
42
|
test/mocks/get_request.txt
|
40
43
|
test/test_assertions.rb
|
41
|
-
test/test_core_ext.rb
|
42
44
|
test/test_cmd.rb
|
43
|
-
test/
|
45
|
+
test/test_core_ext.rb
|
46
|
+
test/test_data_string.rb
|
44
47
|
test/test_diff.rb
|
45
48
|
test/test_helper.rb
|
49
|
+
test/test_helper_methods.rb
|
46
50
|
test/test_input_reader.rb
|
47
51
|
test/test_kronk.rb
|
48
52
|
test/test_path.rb
|
53
|
+
test/test_path_match.rb
|
54
|
+
test/test_path_matcher.rb
|
49
55
|
test/test_player.rb
|
50
56
|
test/test_request.rb
|
51
57
|
test/test_request_parser.rb
|
data/README.rdoc
CHANGED
@@ -89,6 +89,12 @@ a regexp and values are evaluated by const_get.
|
|
89
89
|
plist: PlistParser
|
90
90
|
json: JSON
|
91
91
|
|
92
|
+
Number of lines of context to use for diff. Full diff is returned when
|
93
|
+
set to false:
|
94
|
+
|
95
|
+
:context: 5 # show 5 lines before and after diff
|
96
|
+
:context: false # show the full file
|
97
|
+
|
92
98
|
How to format the diff output. Supports the "special" values
|
93
99
|
:ascii_diff and :color_diff or any string that will correctly
|
94
100
|
resolve to a constant:
|
data/TODO.rdoc
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
= TODO
|
2
|
+
|
3
|
+
* Support data diffing for arrays (including data struct).
|
4
|
+
|
5
|
+
* Allow for showing diffed sections of a diff only.
|
6
|
+
Do it by sorted paths? Example:
|
7
|
+
- "/path/foo": "value1"
|
8
|
+
+ "/path/bar": "value1"
|
9
|
+
|
10
|
+
* Should these Path case be handled as looking for a blank node or any node?
|
11
|
+
"/path/foo="
|
12
|
+
"/path/=foo"
|
data/lib/kronk.rb
CHANGED
@@ -14,7 +14,7 @@ require 'yaml'
|
|
14
14
|
class Kronk
|
15
15
|
|
16
16
|
# This gem's version.
|
17
|
-
VERSION = '1.
|
17
|
+
VERSION = '1.6.0'
|
18
18
|
|
19
19
|
require 'kronk/constants'
|
20
20
|
require 'kronk/player'
|
@@ -26,10 +26,13 @@ class Kronk
|
|
26
26
|
require 'kronk/player/input_reader'
|
27
27
|
require 'kronk/cmd'
|
28
28
|
require 'kronk/path'
|
29
|
+
require 'kronk/path/path_match'
|
30
|
+
require 'kronk/path/matcher'
|
29
31
|
require 'kronk/path/transaction'
|
30
32
|
require 'kronk/data_renderer'
|
31
33
|
require 'kronk/diff/ascii_format'
|
32
34
|
require 'kronk/diff/color_format'
|
35
|
+
require 'kronk/diff/output'
|
33
36
|
require 'kronk/diff'
|
34
37
|
require 'kronk/response'
|
35
38
|
require 'kronk/request'
|
@@ -277,7 +280,8 @@ class Kronk
|
|
277
280
|
@responses = [res1, res2]
|
278
281
|
@response = res2
|
279
282
|
|
280
|
-
|
283
|
+
opts = {:labels => [res1.uri, res2.uri]}.merge @options
|
284
|
+
@diff = Diff.new str1, str2, opts
|
281
285
|
end
|
282
286
|
|
283
287
|
|
data/lib/kronk/cmd.rb
CHANGED
@@ -115,6 +115,12 @@ Parse and run diffs against data from live and cached http responses.
|
|
115
115
|
end
|
116
116
|
|
117
117
|
|
118
|
+
opt.on('--context [NUM]', Integer,
|
119
|
+
'Show NUM context lines for diff') do |value|
|
120
|
+
options[:context] = value || Kronk.config[:context] || 3
|
121
|
+
end
|
122
|
+
|
123
|
+
|
118
124
|
opt.on('-q', '--brief', 'Output only whether URI responses differ') do
|
119
125
|
Kronk.config[:brief] = true
|
120
126
|
end
|
@@ -126,6 +132,11 @@ Parse and run diffs against data from live and cached http responses.
|
|
126
132
|
end
|
127
133
|
|
128
134
|
|
135
|
+
opt.on('--full', 'Show the full diff') do
|
136
|
+
options[:context] = false
|
137
|
+
end
|
138
|
+
|
139
|
+
|
129
140
|
opt.on('-i', '--include [HEADER1,HEADER2]', Array,
|
130
141
|
'Include all or given headers in response') do |value|
|
131
142
|
options[:with_headers] ||= []
|
@@ -161,7 +172,7 @@ Parse and run diffs against data from live and cached http responses.
|
|
161
172
|
end
|
162
173
|
|
163
174
|
|
164
|
-
opt.on('--irb', 'Start an IRB console') do
|
175
|
+
opt.on('--irb', 'Start an IRB console with the response') do
|
165
176
|
options[:irb] = true
|
166
177
|
end
|
167
178
|
|
@@ -182,6 +193,11 @@ Parse and run diffs against data from live and cached http responses.
|
|
182
193
|
end
|
183
194
|
|
184
195
|
|
196
|
+
opt.on('--paths', 'Render data as path value pairs') do
|
197
|
+
Kronk.config[:render_paths] = true
|
198
|
+
end
|
199
|
+
|
200
|
+
|
185
201
|
opt.on('--prev', 'Use last response to diff against') do
|
186
202
|
options[:uris].unshift Kronk.config[:cache_file]
|
187
203
|
end
|
@@ -280,7 +296,7 @@ Parse and run diffs against data from live and cached http responses.
|
|
280
296
|
'Header to pass to the server request') do |value|
|
281
297
|
options[:headers] ||= {}
|
282
298
|
|
283
|
-
key, value = value.split
|
299
|
+
key, value = value.split(/:\s*/, 2)
|
284
300
|
options[:headers][key] = value.to_s.strip
|
285
301
|
end
|
286
302
|
|
data/lib/kronk/constants.rb
CHANGED
data/lib/kronk/data_renderer.rb
CHANGED
@@ -1,5 +1,62 @@
|
|
1
1
|
class Kronk
|
2
2
|
|
3
|
+
##
|
4
|
+
# A String with per-line metadata.
|
5
|
+
|
6
|
+
class DataString < String
|
7
|
+
|
8
|
+
attr_accessor :meta
|
9
|
+
|
10
|
+
def initialize str="", metadata=nil
|
11
|
+
@meta = [metadata].compact * str.length
|
12
|
+
super str
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
##
|
17
|
+
# Add a string with metadata to the data string.
|
18
|
+
|
19
|
+
def append str, metadata=nil
|
20
|
+
dstr = self.class.new str
|
21
|
+
dstr.meta = [metadata] * str.length
|
22
|
+
self << dstr
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def << str
|
27
|
+
if str.class == self.class
|
28
|
+
@meta.concat str.meta
|
29
|
+
else
|
30
|
+
@meta.concat([@meta.last] * str.length)
|
31
|
+
end
|
32
|
+
super str
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def [] arg
|
37
|
+
dstr = self.class.new super
|
38
|
+
dstr.meta = @meta[arg]
|
39
|
+
dstr
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def split pattern=$;, *more
|
44
|
+
arr = super
|
45
|
+
i = 0
|
46
|
+
interval = 0
|
47
|
+
interval = (self.length - arr.join.length) / (arr.length - 1) if
|
48
|
+
arr.length > 1
|
49
|
+
|
50
|
+
arr.map do |str|
|
51
|
+
ds = self.class.new str
|
52
|
+
ds.meta = @meta[i,str.length]
|
53
|
+
i += str.length + interval
|
54
|
+
ds
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
3
60
|
##
|
4
61
|
# Creates ordered data strings for rendering to the output.
|
5
62
|
|
@@ -21,6 +78,7 @@ class Kronk
|
|
21
78
|
end
|
22
79
|
end
|
23
80
|
|
81
|
+
|
24
82
|
##
|
25
83
|
# Returns a json data string that is diff-able, meaning sorted by
|
26
84
|
# Hash keys when available.
|
@@ -40,52 +98,67 @@ class Kronk
|
|
40
98
|
end
|
41
99
|
|
42
100
|
|
43
|
-
|
101
|
+
##
|
102
|
+
# Turns a data set into an ordered string output for diff-ing.
|
103
|
+
|
104
|
+
def self.ordered_data_string data, struct_only=false, path=[], &block
|
44
105
|
i_width = Kronk.config[:indentation] || 1
|
45
|
-
indent
|
46
|
-
|
106
|
+
indent = (path.length + 1) * i_width
|
107
|
+
pad = " " * indent
|
108
|
+
path_str = Path.join path
|
47
109
|
|
48
110
|
case data
|
49
111
|
|
50
112
|
when Hash
|
51
|
-
return "{}" if data.empty?
|
52
|
-
|
53
|
-
output = "{\n"
|
113
|
+
return DataString.new("{}", path_str) if data.empty?
|
114
|
+
output = DataString.new "{\n", path_str
|
54
115
|
|
55
116
|
sorted_keys = sort_any data.keys
|
56
117
|
|
57
118
|
data_values =
|
58
119
|
sorted_keys.map do |key|
|
59
|
-
value
|
60
|
-
|
61
|
-
subdata
|
62
|
-
"#{pad}#{ yield(:key, key) }#{ yield(:key_assign) }
|
120
|
+
value = data[key]
|
121
|
+
new_path = path.dup << key
|
122
|
+
subdata = ordered_data_string value, struct_only, new_path, &block
|
123
|
+
line = "#{pad}#{ yield(:key, key) }#{ yield(:key_assign) } "
|
124
|
+
line = DataString.new line, path_str
|
125
|
+
line << subdata
|
63
126
|
end
|
64
127
|
|
65
|
-
|
66
|
-
|
128
|
+
data_values.each_with_index do |val, i|
|
129
|
+
val << "," unless i == data_values.length - 1
|
130
|
+
output << val << "\n"
|
131
|
+
end
|
67
132
|
|
68
|
-
|
69
|
-
return "[]" if data.empty?
|
133
|
+
output.append(("#{" " * (indent - i_width)}}"), path_str)
|
70
134
|
|
71
|
-
|
135
|
+
when Array
|
136
|
+
return DataString.new("[]", path_str) if data.empty?
|
137
|
+
output = DataString.new "[\n", path_str
|
72
138
|
|
73
139
|
data_values =
|
74
|
-
data.map do |
|
75
|
-
|
76
|
-
|
140
|
+
(0...data.length).map do |key|
|
141
|
+
value = data[key]
|
142
|
+
new_path = path.dup << key
|
143
|
+
subdata = ordered_data_string value, struct_only, new_path, &block
|
144
|
+
line = DataString.new pad, path_str
|
145
|
+
line << subdata
|
77
146
|
end
|
78
147
|
|
79
|
-
|
80
|
-
|
148
|
+
data_values.each_with_index do |val, i|
|
149
|
+
val << "," unless i == data_values.length - 1
|
150
|
+
output << val << "\n"
|
151
|
+
end
|
152
|
+
|
153
|
+
output.append(("#{" " * (indent - i_width)}]"), path_str)
|
81
154
|
|
82
155
|
else
|
83
|
-
struct_only ? yield(:struct, data) : yield(:value, data)
|
156
|
+
output = struct_only ? yield(:struct, data) : yield(:value, data)
|
157
|
+
DataString.new(output.to_s, path_str)
|
84
158
|
end
|
85
159
|
end
|
86
160
|
|
87
161
|
|
88
|
-
|
89
162
|
##
|
90
163
|
# Sorts an array of any combination of string, integer, or symbols.
|
91
164
|
|
data/lib/kronk/diff.rb
CHANGED
@@ -9,9 +9,9 @@ class Kronk
|
|
9
9
|
##
|
10
10
|
# Creates a new diff from two data objects.
|
11
11
|
|
12
|
-
def self.new_from_data data1, data2,
|
13
|
-
new ordered_data_string(data1,
|
14
|
-
ordered_data_string(data2,
|
12
|
+
def self.new_from_data data1, data2, opts={}
|
13
|
+
new ordered_data_string(data1, opts[:struct]),
|
14
|
+
ordered_data_string(data2, opts[:struct]), opts
|
15
15
|
end
|
16
16
|
|
17
17
|
|
@@ -20,6 +20,8 @@ class Kronk
|
|
20
20
|
# Hash keys when available.
|
21
21
|
|
22
22
|
def self.ordered_data_string data, struct_only=false
|
23
|
+
data = Kronk::Path.pathed(data) if Kronk.config[:render_paths]
|
24
|
+
|
23
25
|
case Kronk.config[:render_lang].to_s
|
24
26
|
when 'ruby' then DataRenderer.ruby(data, struct_only)
|
25
27
|
else
|
@@ -32,7 +34,7 @@ class Kronk
|
|
32
34
|
# Adds line numbers to each lines of a String.
|
33
35
|
|
34
36
|
def self.insert_line_nums str, formatter=nil
|
35
|
-
format = Diff.formatter formatter || Kronk.config[:diff_format]
|
37
|
+
format = Diff::Output.formatter formatter || Kronk.config[:diff_format]
|
36
38
|
|
37
39
|
out = ""
|
38
40
|
width = str.lines.count.to_s.length
|
@@ -45,26 +47,14 @@ class Kronk
|
|
45
47
|
end
|
46
48
|
|
47
49
|
|
48
|
-
|
49
|
-
# Returns a formatter from a symbol or string. Returns nil if not found.
|
50
|
-
|
51
|
-
def self.formatter name
|
52
|
-
return AsciiFormat if name == :ascii_diff
|
53
|
-
return ColorFormat if name == :color_diff
|
54
|
-
Kronk.find_const name rescue name
|
55
|
-
end
|
56
|
-
|
50
|
+
attr_accessor :str1, :str2, :char, :output
|
57
51
|
|
58
|
-
|
59
|
-
|
60
|
-
def initialize str1, str2, char=/\r?\n/
|
52
|
+
def initialize str1, str2, opts={}
|
61
53
|
@str1 = str1
|
62
54
|
@str2 = str2
|
63
|
-
@char = char
|
64
55
|
@diff_ary = nil
|
65
|
-
@
|
66
|
-
@
|
67
|
-
self.class.formatter(Kronk.config[:diff_format]) || AsciiFormat
|
56
|
+
@char = opts[:char] || /\r?\n/
|
57
|
+
@output = Output.new self, opts
|
68
58
|
end
|
69
59
|
|
70
60
|
|
@@ -81,6 +71,7 @@ class Kronk
|
|
81
71
|
|
82
72
|
def create_diff
|
83
73
|
diff_ary = []
|
74
|
+
return diff_ary if @str1.empty? && @str2.empty?
|
84
75
|
|
85
76
|
arr1 = @str1.split @char
|
86
77
|
arr2 = @str2.split @char
|
@@ -207,54 +198,17 @@ class Kronk
|
|
207
198
|
|
208
199
|
##
|
209
200
|
# Returns a formatted output as a string.
|
210
|
-
# Supported options are:
|
211
|
-
# :join_char:: String - The string used to join lines; default "\n"
|
212
|
-
# :show_lines:: Boolean - Insert line numbers or not; default @show_lines
|
213
|
-
# :formatter:: Object - The formatter to use; default @formatter
|
214
|
-
|
215
|
-
def formatted options={}
|
216
|
-
options = {
|
217
|
-
:join_char => "\n",
|
218
|
-
:show_lines => @show_lines,
|
219
|
-
:formatter => @formatter
|
220
|
-
}.merge options
|
221
|
-
|
222
|
-
format = options[:formatter]
|
223
|
-
|
224
|
-
line1 = line2 = 0
|
225
201
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
width = (lines1 > lines2 ? lines1 : lines2).to_s.length
|
230
|
-
|
231
|
-
diff_array.map do |item|
|
232
|
-
case item
|
233
|
-
when String
|
234
|
-
line1 = line1.next
|
235
|
-
line2 = line2.next
|
236
|
-
|
237
|
-
lines = format.lines [line1, line2], width if options[:show_lines]
|
238
|
-
"#{lines}#{format.common item}"
|
202
|
+
def formatted opts={}
|
203
|
+
@output.render if any?
|
204
|
+
end
|
239
205
|
|
240
|
-
when Array
|
241
|
-
item = item.dup
|
242
206
|
|
243
|
-
|
244
|
-
|
245
|
-
lines = format.lines [line1, nil], width if options[:show_lines]
|
246
|
-
"#{lines}#{format.deleted str}"
|
247
|
-
end
|
248
|
-
|
249
|
-
item[1] = item[1].map do |str|
|
250
|
-
line2 = line2.next
|
251
|
-
lines = format.lines [nil, line2], width if options[:show_lines]
|
252
|
-
"#{lines}#{format.added str}"
|
253
|
-
end
|
207
|
+
##
|
208
|
+
# Returns true if any diff is found.
|
254
209
|
|
255
|
-
|
256
|
-
|
257
|
-
end.flatten.join options[:join_char]
|
210
|
+
def any?
|
211
|
+
!!diff_array.find{|i| Array === i }
|
258
212
|
end
|
259
213
|
|
260
214
|
|