csv-diff-report 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/csv-diff-report/cli.rb +3 -1
- data/lib/csv-diff-report/excel.rb +2 -2
- data/lib/csv-diff-report/html.rb +8 -11
- data/lib/csv-diff-report/report.rb +15 -11
- data/lib/csv-diff-report/text.rb +44 -0
- metadata +20 -8
- checksums.yaml +0 -15
data/lib/csv-diff-report/cli.rb
CHANGED
@@ -45,6 +45,8 @@ class CSVDiff
|
|
45
45
|
keyword_arg :encoding, 'The encoding to use when opening the CSV files',
|
46
46
|
short_key: 'e'
|
47
47
|
flag_arg :tab_delimited, 'If true, the file is assumed to be tab-delimited rather than comma-delimited'
|
48
|
+
flag_arg :diff_common_fields_only, 'If true, only fields in both files are compared'
|
49
|
+
flag_arg :trim_whitespace, 'If true, trim leading/trailing whitespace before comparing fields'
|
48
50
|
flag_arg :ignore_header, 'If true, the first line in each source file is ignored; ' +
|
49
51
|
'requires the use of the --field-names option to name the fields'
|
50
52
|
flag_arg :ignore_case, 'If true, field comparisons are performed without regard to case'
|
@@ -63,7 +65,7 @@ class CSVDiff
|
|
63
65
|
|
64
66
|
usage_break 'Output Options'
|
65
67
|
keyword_arg :format, 'The format in which to produce the diff report',
|
66
|
-
default: 'HTML', validation: /^(html|
|
68
|
+
default: 'HTML', validation: /^(html|xlsx?|te?xt)$/i
|
67
69
|
keyword_arg :output, 'The path to save the diff report to. If not specified, the diff ' +
|
68
70
|
'report will be placed in the same directory as the FROM file, and will be named ' +
|
69
71
|
'Diff_<FROM>_to_<TO>.<FORMAT>'
|
@@ -50,11 +50,11 @@ class CSVDiff
|
|
50
50
|
xl.workbook.add_worksheet(name: 'Summary') do |sheet|
|
51
51
|
sheet.add_row do |row|
|
52
52
|
row.add_cell 'From:', :style => @xl_styles['Title']
|
53
|
-
row.add_cell
|
53
|
+
row.add_cell compare_from
|
54
54
|
end
|
55
55
|
sheet.add_row do |row|
|
56
56
|
row.add_cell 'To:', :style => @xl_styles['Title']
|
57
|
-
row.add_cell
|
57
|
+
row.add_cell compare_to
|
58
58
|
end
|
59
59
|
sheet.add_row
|
60
60
|
sheet.add_row ['Sheet', 'Adds', 'Deletes', 'Updates', 'Moves'], :style => @xl_styles['Title']
|
data/lib/csv-diff-report/html.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
1
3
|
|
2
4
|
class CSVDiff
|
3
5
|
|
@@ -6,7 +8,7 @@ class CSVDiff
|
|
6
8
|
|
7
9
|
private
|
8
10
|
|
9
|
-
# Generare a diff report in
|
11
|
+
# Generare a diff report in HTML format.
|
10
12
|
def html_output(output)
|
11
13
|
content = []
|
12
14
|
content << '<html>'
|
@@ -25,7 +27,7 @@ class CSVDiff
|
|
25
27
|
content << '</body>'
|
26
28
|
content << '</html>'
|
27
29
|
|
28
|
-
# Save
|
30
|
+
# Save page
|
29
31
|
path = "#{File.dirname(output)}/#{File.basename(output, File.extname(output))}.html"
|
30
32
|
File.open(path, 'w'){ |f| f.write(content.join("\n")) }
|
31
33
|
path
|
@@ -69,13 +71,8 @@ class CSVDiff
|
|
69
71
|
body << '<p>Source Locations:</p>'
|
70
72
|
body << '<table>'
|
71
73
|
body << '<tbody>'
|
72
|
-
|
73
|
-
|
74
|
-
body << "<tr><th>To:</th><td>#{File.dirname(@right)}</td></tr>"
|
75
|
-
else
|
76
|
-
body << "<tr><th>From:</th><td>#{@left}</td></tr>"
|
77
|
-
body << "<tr><th>To:</th><td>#{@right}</td></tr>"
|
78
|
-
end
|
74
|
+
body << "<tr><th>From:</th><td>#{@left}</td></tr>"
|
75
|
+
body << "<tr><th>To:</th><td>#{@right}</td></tr>"
|
79
76
|
body << '</tbody>'
|
80
77
|
body << '</table>'
|
81
78
|
body << '<br>'
|
@@ -161,9 +158,9 @@ class CSVDiff
|
|
161
158
|
style = chg.downcase if i == 1
|
162
159
|
end
|
163
160
|
body << '<td>'
|
164
|
-
body << "<span class='delete'>#{old}</span>" if old
|
161
|
+
body << "<span class='delete'>#{CGI.escapeHTML(old.to_s)}</span>" if old
|
165
162
|
body << '<br>' if old && old.to_s.length > 10
|
166
|
-
body << "<span#{style ? " class='#{style}'" : ''}>#{new}</span>"
|
163
|
+
body << "<span#{style ? " class='#{style}'" : ''}>#{CGI.escapeHTML(new.to_s)}</span>"
|
167
164
|
body << '</td>'
|
168
165
|
end
|
169
166
|
body << '</tr>'
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'csv-diff-report/excel'
|
2
2
|
require 'csv-diff-report/html'
|
3
|
+
require 'csv-diff-report/text'
|
3
4
|
|
4
5
|
|
5
6
|
class CSVDiff
|
@@ -12,6 +13,7 @@ class CSVDiff
|
|
12
13
|
|
13
14
|
include Excel
|
14
15
|
include Html
|
16
|
+
include Text
|
15
17
|
|
16
18
|
|
17
19
|
# Instantiate a new diff report object. Takes an optional block callback
|
@@ -49,7 +51,7 @@ class CSVDiff
|
|
49
51
|
@left = Pathname.new(diff.left.path)
|
50
52
|
@right = Pathname.new(diff.right.path)
|
51
53
|
end
|
52
|
-
diff.diff_warnings.each{ |warn| echo warn, :yellow }
|
54
|
+
diff.diff_warnings.each{ |warn| echo [warn, :yellow] }
|
53
55
|
out = []
|
54
56
|
out << ["Found #{diff.diffs.size} differences"]
|
55
57
|
diff.summary.each_with_index.map do |pair, i|
|
@@ -115,6 +117,8 @@ class CSVDiff
|
|
115
117
|
xl_output(path)
|
116
118
|
when format.to_s =~ /^html$/i || File.extname(path) =~ /html$/i
|
117
119
|
html_output(path)
|
120
|
+
when format.to_s =~ /^te?xt$/i || File.extname(path) =~ /txt$/i
|
121
|
+
text_output(path)
|
118
122
|
else
|
119
123
|
raise ArgumentError, "Unrecognised output format: #{format}"
|
120
124
|
end
|
@@ -160,16 +164,16 @@ class CSVDiff
|
|
160
164
|
if matches.size > 0
|
161
165
|
matched_fts.concat(matches)
|
162
166
|
else
|
163
|
-
echo "No file type matching '#{ft}' defined in .csvdiff", :yellow
|
164
|
-
echo "Known file types are: #{opt_file[:file_types].keys.join(', ')}", :yellow
|
167
|
+
echo ["No file type matching '#{ft}' defined in .csvdiff", :yellow]
|
168
|
+
echo ["Known file types are: #{opt_file[:file_types].keys.join(', ')}", :yellow]
|
165
169
|
end
|
166
170
|
end
|
167
171
|
else
|
168
172
|
if opt_file
|
169
|
-
echo "No file types are defined in .csvdiff", :yellow
|
173
|
+
echo ["No file types are defined in .csvdiff", :yellow]
|
170
174
|
else
|
171
|
-
echo "The file_types option can only be used when a " +
|
172
|
-
".csvdiff is present in the LEFT or current directory", :yellow
|
175
|
+
echo ["The file_types option can only be used when a " +
|
176
|
+
".csvdiff is present in the LEFT or current directory", :yellow]
|
173
177
|
end
|
174
178
|
end
|
175
179
|
matched_fts.uniq
|
@@ -191,8 +195,8 @@ class CSVDiff
|
|
191
195
|
if right_file.file?
|
192
196
|
diff_file(file, right_file.to_s, options, opt_file)
|
193
197
|
else
|
194
|
-
echo "Skipping file '#{File.basename(file)}', as there is " +
|
195
|
-
"no corresponding TO file", :yellow
|
198
|
+
echo ["Skipping file '#{File.basename(file)}', as there is " +
|
199
|
+
"no corresponding TO file", :yellow]
|
196
200
|
end
|
197
201
|
end
|
198
202
|
end
|
@@ -221,8 +225,8 @@ class CSVDiff
|
|
221
225
|
settings = opt_file && opt_file[:defaults] || {}
|
222
226
|
opt_file && opt_file[:file_types] && opt_file[:file_types].each do |file_type, hsh|
|
223
227
|
unless hsh[:pattern]
|
224
|
-
echo "Invalid setting for file_type #{file_type} in .csvdiff; " +
|
225
|
-
"missing a 'pattern' key to use to match files", :yellow
|
228
|
+
echo ["Invalid setting for file_type #{file_type} in .csvdiff; " +
|
229
|
+
"missing a 'pattern' key to use to match files", :yellow]
|
226
230
|
hsh[:pattern] = '-'
|
227
231
|
end
|
228
232
|
next if hsh[:pattern] == '-'
|
@@ -249,7 +253,7 @@ class CSVDiff
|
|
249
253
|
csv_src = CSVDiff::CSVSource.new(src.to_s, options)
|
250
254
|
out << [" #{csv_src.lines.size} lines read", :white]
|
251
255
|
echo(*out)
|
252
|
-
csv_src.warnings.each{ |warn| echo warn, :yellow }
|
256
|
+
csv_src.warnings.each{ |warn| echo [warn, :yellow] }
|
253
257
|
csv_src
|
254
258
|
end
|
255
259
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'csv'
|
2
|
+
|
3
|
+
|
4
|
+
class CSVDiff
|
5
|
+
|
6
|
+
# Defines functionality for exporting a Diff report in TEXT format. This is
|
7
|
+
# a CSV format where only fields with differences have values.
|
8
|
+
module Text
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# Generare a diff report in TEXT format.
|
13
|
+
def text_output(output)
|
14
|
+
path = "#{File.dirname(output)}/#{File.basename(output, File.extname(output))}.diff"
|
15
|
+
CSV.open(path, 'w') do |csv|
|
16
|
+
@diffs.each do |file_diff|
|
17
|
+
text_diff(csv, file_diff) if file_diff.diffs.size > 0
|
18
|
+
end
|
19
|
+
end
|
20
|
+
path
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def text_diff(csv, file_diff)
|
25
|
+
count = 0
|
26
|
+
|
27
|
+
all_fields = [:row, :action]
|
28
|
+
all_fields << :sibling_position unless file_diff.options[:ignore_moves]
|
29
|
+
all_fields.concat(file_diff.diff_fields)
|
30
|
+
|
31
|
+
csv << all_fields.map{ |fld| fld.is_a?(Symbol) ? titleize(fld) : fld }
|
32
|
+
file_diff.diffs.each do |key, diff|
|
33
|
+
row = all_fields.map do |field|
|
34
|
+
d = diff[field]
|
35
|
+
d = d.last if d.is_a?(Array)
|
36
|
+
d
|
37
|
+
end
|
38
|
+
csv << row
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv-diff-report
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Adam Gardiner
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2016-01-26 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: csv-diff
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,6 +30,7 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: arg-parser
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,6 +46,7 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: color-console
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -55,6 +62,7 @@ dependencies:
|
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: axlsx
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - ~>
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - ~>
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -80,37 +89,40 @@ executables:
|
|
80
89
|
extensions: []
|
81
90
|
extra_rdoc_files: []
|
82
91
|
files:
|
83
|
-
- LICENSE
|
84
92
|
- README.md
|
85
|
-
-
|
86
|
-
- lib/csv-diff-report.rb
|
93
|
+
- LICENSE
|
87
94
|
- lib/csv-diff-report/cli.rb
|
88
95
|
- lib/csv-diff-report/excel.rb
|
89
96
|
- lib/csv-diff-report/html.rb
|
90
97
|
- lib/csv-diff-report/report.rb
|
98
|
+
- lib/csv-diff-report/text.rb
|
99
|
+
- lib/csv-diff-report.rb
|
91
100
|
- lib/csv_diff_report.rb
|
101
|
+
- !binary |-
|
102
|
+
YmluL2NzdmRpZmY=
|
92
103
|
homepage: https://github.com/agardiner/csv-diff-report
|
93
104
|
licenses: []
|
94
|
-
metadata: {}
|
95
105
|
post_install_message:
|
96
106
|
rdoc_options: []
|
97
107
|
require_paths:
|
98
108
|
- lib
|
99
109
|
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
100
111
|
requirements:
|
101
112
|
- - ! '>='
|
102
113
|
- !ruby/object:Gem::Version
|
103
114
|
version: '0'
|
104
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
105
117
|
requirements:
|
106
118
|
- - ! '>='
|
107
119
|
- !ruby/object:Gem::Version
|
108
120
|
version: '0'
|
109
121
|
requirements: []
|
110
122
|
rubyforge_project:
|
111
|
-
rubygems_version:
|
123
|
+
rubygems_version: 1.8.21
|
112
124
|
signing_key:
|
113
|
-
specification_version:
|
125
|
+
specification_version: 3
|
114
126
|
summary: CSV Diff Report is a library for generating diff reports using the CSV Diff
|
115
127
|
gem
|
116
128
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
NmNhMzlmNDc4ZGQ5NWU1MjdlMjdmN2JlNTI4NGQ0NWE1ODY0ZmVlMw==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NjY0ODgxMmU1ZDFkZWQ2ZmY4MWQwNDU5NmM5YTUzNGJlODNmNzVkNw==
|
7
|
-
SHA512:
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
YTFiNmQ5YWZkNDllNmI0OGE3ZjI0ZjE2ZTYwY2U4YTUwZDliZDUzYTc1Njg1
|
10
|
-
NzBmOTg1YmFmMTkxY2VmNTdkNTliZTA0YTgzODJhMDZhOTFmN2U2MTlkZmQ1
|
11
|
-
MWEzMDcxM2U1NTZhNDVhMjgwYWI0MDNjNjA0NGRiOTZkMGUxNGY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
Y2Y4YzVjMzY1NGJlZTE0MTkzOGQ2YWEwODU1MzVmYjJmYzNhMWIxYTJjNDBh
|
14
|
-
NDQ5NTE1NTA0MjkyYmY0YTkxMmQ5NGUyYTkxYTE3NTQ5YzEzODJjMWI3NTJj
|
15
|
-
MzQ1ZTQyMmI1NzcxOWY3OWI4ZTNkZDYwZmE3MjkzYzEyMGVkNWE=
|