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.
@@ -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|xls(x)?)$/i
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 @diffs.size > 1 ? File.dirname(compare_from) : compare_from
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 @diffs.size > 1 ? File.dirname(compare_to) : compare_to
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']
@@ -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 XLSX format.
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 workbook
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
- if @diffs.size > 1
73
- body << "<tr><th>From:</th><td>#{File.dirname(@left)}</td></tr>"
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.1
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: 2015-02-24 00:00:00.000000000 Z
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
- - bin/csvdiff
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: 2.4.1
123
+ rubygems_version: 1.8.21
112
124
  signing_key:
113
- specification_version: 4
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=