csv-diff-report 0.3.5 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/csv-diff-report/cli.rb +3 -1
- data/lib/csv-diff-report/html.rb +35 -13
- data/lib/csv-diff-report/report.rb +4 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62b8aefdb52e2872454da14a06c24fa6619f164b
|
4
|
+
data.tar.gz: 7224773cd94a741c278990ab924bb5aea3b8fbde
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 881ef630cda8f08a5d766190a884b8224b12377bd507abc2a934283a4c3f678318f4ac64d194d576e361b7137f65ca5e407a4249dba8c2c86cdbf66ba532747d
|
7
|
+
data.tar.gz: fe758fdb2ee804dfa627c8b4397307e80f385aedbd34b2816683b9f0441744dcc901f80320e98b64e88234e8c1be199f2519a95f1219e487ac8dc9836c49a3a5
|
data/lib/csv-diff-report/cli.rb
CHANGED
@@ -67,6 +67,8 @@ class CSVDiff
|
|
67
67
|
short_key: 'i'
|
68
68
|
|
69
69
|
usage_break 'Diff Options:'
|
70
|
+
keyword_arg :options_file, 'Path to an options file that contains settings based on file types. ' +
|
71
|
+
'Defaults to searching for a file named .csvdiff in the FROM or current directory.'
|
70
72
|
flag_arg :ignore_case, 'If true, field comparisons are performed without regard to case.'
|
71
73
|
flag_arg :diff_common_fields_only, 'If true, only fields in both files are compared.',
|
72
74
|
short_key: 'C'
|
@@ -90,7 +92,7 @@ class CSVDiff
|
|
90
92
|
short_key: 'o'
|
91
93
|
keyword_arg :output_fields, 'The names or indexes of the fields to include in the diff output.',
|
92
94
|
short_key: 'O', on_parse: :parse_fields
|
93
|
-
|
95
|
+
flag_arg :include_matched, 'If true, fields that match on lines with differences are included ' +
|
94
96
|
'in the diff output; by default, matching fields are not included in the diff output.'
|
95
97
|
|
96
98
|
|
data/lib/csv-diff-report/html.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
require 'cgi'
|
2
|
+
begin
|
3
|
+
require 'lcs-diff'
|
4
|
+
rescue LoadError
|
5
|
+
end
|
2
6
|
|
3
7
|
|
4
8
|
class CSVDiff
|
@@ -14,11 +18,13 @@ class CSVDiff
|
|
14
18
|
content << '<html>'
|
15
19
|
content << '<head>'
|
16
20
|
content << '<title>Diff Report</title>'
|
17
|
-
content << '<meta http-equiv="Content-Type" content="text/html; charset=
|
21
|
+
content << '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'
|
18
22
|
content << html_styles
|
19
23
|
content << '</head>'
|
20
24
|
content << '<body>'
|
21
25
|
|
26
|
+
@lcs_available = !!defined?(Diff::LCS)
|
27
|
+
|
22
28
|
html_summary(content)
|
23
29
|
@diffs.each do |file_diff|
|
24
30
|
html_diff(content, file_diff) if file_diff.diffs.size > 0
|
@@ -38,14 +44,15 @@ class CSVDiff
|
|
38
44
|
def html_styles
|
39
45
|
style = <<-EOT
|
40
46
|
<style>
|
41
|
-
@font-face {font-family: Calibri;}
|
47
|
+
@font-face {font-family: Calibri, Helvetica, sans-serif;}
|
42
48
|
|
43
|
-
h1 {font-family: Calibri; font-size: 16pt;}
|
44
|
-
h2 {font-family: Calibri; font-size: 14pt; margin: 1em 0em .2em;}
|
45
|
-
h3 {font-family: Calibri; font-size: 12pt; margin: 1em 0em .2em;}
|
46
|
-
body {font-family: Calibri; font-size: 11pt;}
|
49
|
+
h1 {font-family: Calibri, Helvetica, sans-serif; font-size: 16pt;}
|
50
|
+
h2 {font-family: Calibri, Helvetica, sans-serif; font-size: 14pt; margin: 1em 0em .2em;}
|
51
|
+
h3 {font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; margin: 1em 0em .2em;}
|
52
|
+
body {font-family: Calibri, Helvetica, sans-serif; font-size: 11pt;}
|
47
53
|
p {margin: .2em 0em;}
|
48
|
-
|
54
|
+
code {font-size: 8pt; white-space: pre;}
|
55
|
+
table {font-family: Calibri, Helvetica, sans-serif; font-size: 10pt; line-height: 12pt; border-collapse: collapse;}
|
49
56
|
th {background-color: #00205B; color: white; font-size: 11pt; font-weight: bold; text-align: left;
|
50
57
|
border: 1px solid #DDDDFF; padding: 1px 5px;}
|
51
58
|
td {border: 1px solid #DDDDFF; padding: 1px 5px;}
|
@@ -69,7 +76,9 @@ class CSVDiff
|
|
69
76
|
def html_summary(body)
|
70
77
|
body << '<h2>Summary</h2>'
|
71
78
|
|
72
|
-
body <<
|
79
|
+
body << "<p>Diff report generated at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}.</p>"
|
80
|
+
|
81
|
+
body << '<h3>Source Locations</h3>'
|
73
82
|
body << '<table>'
|
74
83
|
body << '<tbody>'
|
75
84
|
body << "<tr><th>From:</th><td>#{@left}</td></tr>"
|
@@ -77,7 +86,7 @@ class CSVDiff
|
|
77
86
|
body << '</tbody>'
|
78
87
|
body << '</table>'
|
79
88
|
body << '<br>'
|
80
|
-
body << '<
|
89
|
+
body << '<h3>Files</hs>'
|
81
90
|
body << '<table>'
|
82
91
|
body << '<thead>'
|
83
92
|
body << "<tr><th rowspan=2>File</th><th colspan=2 class='center'>Lines</th><th colspan=4 class='center'>Diffs</th></tr>"
|
@@ -160,12 +169,25 @@ class CSVDiff
|
|
160
169
|
style = chg.downcase if i == 1
|
161
170
|
elsif file_diff.options[:include_matched]
|
162
171
|
style = 'matched'
|
163
|
-
|
172
|
+
new = file_diff.right[key] && file_diff.right[key][field]
|
164
173
|
end
|
165
174
|
body << '<td>'
|
166
|
-
|
167
|
-
|
168
|
-
|
175
|
+
if style == 'update' && @lcs_available && old && new && (old.to_s.lines.count > 1 || new.to_s.lines.count > 1)
|
176
|
+
body << '<code>'
|
177
|
+
Diff::LCS.diff(old.lines, new.lines).each_with_index do |chg_set, j|
|
178
|
+
body << '...' unless j == 0
|
179
|
+
chg_set.each do |lcs_diff|
|
180
|
+
body << "#{lcs_diff.position} <span class='#{
|
181
|
+
lcs_diff.action == '+' ? 'add' : 'delete'}'>#{
|
182
|
+
CGI.escapeHTML(lcs_diff.element.to_s.chomp)}</span>"
|
183
|
+
end
|
184
|
+
end
|
185
|
+
body << '</code>'
|
186
|
+
else
|
187
|
+
body << "<span class='delete'>#{CGI.escapeHTML(old.to_s)}</span>" if old
|
188
|
+
body << '<br>' if old && old.to_s.length > 10
|
189
|
+
body << "<span#{style ? " class='#{style}'" : ''}>#{CGI.escapeHTML(new.to_s)}</span>"
|
190
|
+
end
|
169
191
|
body << '</td>'
|
170
192
|
end
|
171
193
|
body << '</tr>'
|
@@ -83,13 +83,13 @@ class CSVDiff
|
|
83
83
|
echo "Performing file diff:"
|
84
84
|
echo " From File: #{@left}"
|
85
85
|
echo " To File: #{@right}"
|
86
|
-
opt_file = load_opt_file(@left.dirname)
|
86
|
+
opt_file = load_opt_file(options.fetch(:options_file, @left.dirname))
|
87
87
|
diff_file(@left.to_s, @right.to_s, options, opt_file)
|
88
88
|
elsif @left.directory? && @right.directory?
|
89
89
|
echo "Performing directory diff:"
|
90
90
|
echo " From directory: #{@left}"
|
91
91
|
echo " To directory: #{@right}"
|
92
|
-
opt_file = load_opt_file(@left)
|
92
|
+
opt_file = load_opt_file(options.fetch(:options_file, @left))
|
93
93
|
if fts = options[:file_types]
|
94
94
|
file_types = find_matching_file_types(fts, opt_file)
|
95
95
|
file_types.each do |file_type|
|
@@ -133,7 +133,8 @@ class CSVDiff
|
|
133
133
|
|
134
134
|
# Loads an options file from +dir+
|
135
135
|
def load_opt_file(dir)
|
136
|
-
opt_path = Pathname(dir
|
136
|
+
opt_path = Pathname(dir)
|
137
|
+
opt_path += '.csvdiff' if opt_path.directory?
|
137
138
|
opt_path = Pathname('.csvdiff') unless opt_path.exist?
|
138
139
|
if opt_path.exist?
|
139
140
|
echo "Loading options from '#{opt_path}'"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csv-diff-report
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Gardiner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: csv-diff
|
@@ -117,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
117
|
version: '0'
|
118
118
|
requirements: []
|
119
119
|
rubyforge_project:
|
120
|
-
rubygems_version: 2.5.2
|
120
|
+
rubygems_version: 2.5.2.3
|
121
121
|
signing_key:
|
122
122
|
specification_version: 4
|
123
123
|
summary: CSV Diff Report is a library for generating diff reports using the CSV Diff
|