daff 1.3.19 → 1.3.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5779d0129f0184e4c86479f7440a1e2c8505f872
4
- data.tar.gz: 52eb0674f40911afc12b9b9ed0ac56f22a0926c6
3
+ metadata.gz: 789c2b60552eec41ff58691630caade704b305ef
4
+ data.tar.gz: 9952f96cbeb8c69fb24ef6986bf331262a7afa45
5
5
  SHA512:
6
- metadata.gz: 822b821a2b9dd5feb1539b5a5c72797e91c5829cdabd0c5dcb50f150d7df0a22d40e407b3385567f33254a204d77d2bef18daf9f3948c96d1cc1e2d59da3232a
7
- data.tar.gz: 44d38a2e32fdf8f2e47bc112f206268f996c88e1b6e6b3dce25019a7c905dafb562f59a4330458b95ca888f5316cd697027831b83c3ac310b3627836c878ae41
6
+ metadata.gz: c7e34325bb072173c308b36003d75247c715b12ce43cb4f86c6cb61cd0ff7ec21ef58f9ba99ee9df03ef4e7524731b6bf5414a2788a225301ce00531398f6c5f
7
+ data.tar.gz: 0d1324b67cb9a37853fcf7af02c5357153d9b23fc9c53e7629e17ae9cc6f4415cee46d8c22a414bf425743f34fe7d90548f8c3fd550ceb4ff4fc2c8a6adb0c36
@@ -16,14 +16,14 @@ def haxe_me(source_name)
16
16
  end
17
17
  old_get = instance_method(:[]) rescue nil
18
18
  define_method(:[]) do |x|
19
- return old_get.bind(self).(x) if x.is_a?(Fixnum)
19
+ return old_get.bind(self).(x) if x.is_a?(Integer)
20
20
  tag = _haxe_vars_[x]
21
21
  return instance_variable_get(tag) if tag
22
22
  method x
23
23
  end
24
24
  old_set = instance_method(:[]=) rescue nil
25
25
  define_method(:[]=) do |x,y|
26
- return old_set.bind(self).(x,y) if x.is_a?(Fixnum)
26
+ return old_set.bind(self).(x,y) if x.is_a?(Integer)
27
27
  instance_variable_set(_haxe_vars_[x],y)
28
28
  end
29
29
  define_method(:haxe_name) do
@@ -57,10 +57,12 @@ require_relative 'lib/coopy/combined_table_body'
57
57
  require_relative 'lib/coopy/combined_table_head'
58
58
  require_relative 'lib/coopy/compare_flags'
59
59
  require_relative 'lib/coopy/compare_table'
60
+ require_relative 'lib/coopy/conflict_info'
60
61
  require_relative 'lib/coopy/coopy'
61
62
  require_relative 'lib/coopy/cross_match'
62
63
  require_relative 'lib/coopy/csv'
63
64
  require_relative 'lib/coopy/diff_render'
65
+ require_relative 'lib/coopy/diff_summary'
64
66
  require_relative 'lib/coopy/flat_cell_builder'
65
67
  require_relative 'lib/coopy/row'
66
68
  require_relative 'lib/coopy/highlight_patch'
@@ -425,7 +425,10 @@ module Coopy
425
425
  align.link(-1,i3) if !used.include?(i3)
426
426
  end
427
427
  end
428
- align.link(0,0) if ha > 0 && hb > 0
428
+ if ha > 0 && hb > 0
429
+ align.link(0,0)
430
+ align.headers(0,0)
431
+ end
429
432
  end
430
433
 
431
434
  def align_columns(align,a,b)
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ module Coopy
5
+ class ConflictInfo
6
+
7
+ def initialize(row,col,pvalue,lvalue,rvalue)
8
+ @row = row
9
+ @col = col
10
+ @pvalue = pvalue
11
+ @lvalue = lvalue
12
+ @rvalue = rvalue
13
+ end
14
+
15
+ attr_accessor :row
16
+ attr_accessor :col
17
+ attr_accessor :pvalue
18
+ attr_accessor :lvalue
19
+ attr_accessor :rvalue
20
+ haxe_me ["coopy", "ConflictInfo"]
21
+ end
22
+
23
+ end
@@ -13,6 +13,7 @@ module Coopy
13
13
 
14
14
  attr_accessor :format_preference
15
15
  attr_accessor :delim_preference
16
+ attr_accessor :csv_eol_preference
16
17
  attr_accessor :extern_preference
17
18
  attr_accessor :output_format
18
19
  attr_accessor :output_format_set
@@ -31,6 +32,7 @@ module Coopy
31
32
  @extern_preference = false
32
33
  @format_preference = nil
33
34
  @delim_preference = nil
35
+ @csv_eol_preference = nil
34
36
  @output_format = "copy"
35
37
  @output_format_set = false
36
38
  @nested_output = false
@@ -67,6 +69,10 @@ module Coopy
67
69
  when "ssv"
68
70
  @format_preference = "csv"
69
71
  @delim_preference = ";"
72
+ @format_preference = "csv"
73
+ when "psv"
74
+ @format_preference = "csv"
75
+ @delim_preference = [128169].pack("U")
70
76
  when "sqlite3"
71
77
  @format_preference = "sqlite"
72
78
  when "sqlite"
@@ -133,7 +139,7 @@ module Coopy
133
139
  @format_preference = "csv" if @format_preference == "sqlite" && !@extern_preference
134
140
  if render == nil
135
141
  if @format_preference == "csv"
136
- csv = ::Coopy::Csv.new(@delim_preference)
142
+ csv = ::Coopy::Csv.new(@delim_preference,@csv_eol_preference)
137
143
  txt = csv.render_table(t)
138
144
  elsif @format_preference == "ndjson"
139
145
  txt = ::Coopy::Ndjson.new(t).render
@@ -153,12 +159,12 @@ module Coopy
153
159
  txt
154
160
  end
155
161
 
156
- def save_tables(name,os,use_color)
162
+ def save_tables(name,os,use_color,is_diff)
157
163
  self.set_format(@output_format) if @output_format != "copy"
158
164
  txt = ""
159
165
  self.check_format(name)
160
166
  render = nil
161
- render = ::Coopy::TerminalDiffRender.new(@flags) if use_color
167
+ render = ::Coopy::TerminalDiffRender.new(@flags,@delim_preference,is_diff) if use_color
162
168
  order = os.get_order
163
169
  return self.save_table(name,os.one,render) if order.length == 1
164
170
  return self.render_tables(name,os) if @format_preference == "html" || @format_preference == "www"
@@ -270,22 +276,27 @@ module Coopy
270
276
  output
271
277
  end
272
278
 
273
- def run_diff(parent,a,b,flags,output)
274
- ct = ::Coopy::Coopy.compare_tables3(parent,a,b,flags)
275
- align = ct.align
276
- td = ::Coopy::TableDiff.new(align,flags)
277
- o = ::Coopy::SimpleTable.new(0,0)
278
- os = ::Coopy::Tables.new(o)
279
- td.hilite_with_nesting(os)
279
+ def use_color(flags,output)
280
280
  use_color = flags.terminal_format == "ansi"
281
281
  if flags.terminal_format == nil
282
- if (output == nil || output == "-") && (@output_format == "copy" || @output_format == "csv")
282
+ if (output == nil || output == "-") && (@output_format == "copy" || @output_format == "csv" || @output_format == "psv")
283
283
  if @io != nil
284
284
  use_color = @io.is_tty if @io.is_tty_known
285
285
  end
286
286
  end
287
287
  end
288
- self.save_tables(output,os,use_color)
288
+ use_color
289
+ end
290
+
291
+ def run_diff(parent,a,b,flags,output)
292
+ ct = ::Coopy::Coopy.compare_tables3(parent,a,b,flags)
293
+ align = ct.align
294
+ td = ::Coopy::TableDiff.new(align,flags)
295
+ o = ::Coopy::SimpleTable.new(0,0)
296
+ os = ::Coopy::Tables.new(o)
297
+ td.hilite_with_nesting(os)
298
+ use_color = self.use_color(flags,output)
299
+ self.save_tables(output,os,use_color,true)
289
300
  end
290
301
 
291
302
  public
@@ -322,6 +333,7 @@ module Coopy
322
333
  csv = ::Coopy::Csv.new(@delim_preference)
323
334
  output = ::Coopy::SimpleTable.new(0,0)
324
335
  csv.parse_table(txt,output)
336
+ @csv_eol_preference = csv.get_discovered_eol if @csv_eol_preference == nil
325
337
  output.trim_blank if output != nil
326
338
  output
327
339
  end
@@ -658,6 +670,24 @@ module Coopy
658
670
  @flags.padding_strategy = args[i + 1]
659
671
  args.slice!(i,2)
660
672
  break
673
+ elsif tag == "-e" || tag == "--eol"
674
+ more = true
675
+ ending = args[i + 1]
676
+ if ending == "crlf"
677
+ ending = "\r\n"
678
+ elsif ending == "lf"
679
+ ending = "\n"
680
+ elsif ending == "cr"
681
+ ending = "\r"
682
+ elsif ending == "auto"
683
+ ending = nil
684
+ else
685
+ io.write_stderr("Expected line ending of either 'crlf' or 'lf' but got " + _hx_str(ending) + "\n")
686
+ return 1
687
+ end
688
+ @csv_eol_preference = ending
689
+ args.slice!(i,2)
690
+ break
661
691
  end
662
692
  end
663
693
  end
@@ -692,57 +722,69 @@ module Coopy
692
722
  io.write_stderr("\n")
693
723
  return 0
694
724
  end
695
- io.write_stderr("daff can produce and apply tabular diffs.\n")
696
- io.write_stderr("Call as:\n")
697
- io.write_stderr(" daff [--color] [--no-color] [--output OUTPUT.csv] a.csv b.csv\n")
698
- io.write_stderr(" daff [--output OUTPUT.html] a.csv b.csv\n")
699
- io.write_stderr(" daff [--output OUTPUT.csv] parent.csv a.csv b.csv\n")
700
- io.write_stderr(" daff [--output OUTPUT.ndjson] a.ndjson b.ndjson\n")
701
- io.write_stderr(" daff [--www] a.csv b.csv\n")
702
- io.write_stderr(" daff patch [--inplace] [--output OUTPUT.csv] a.csv patch.csv\n")
703
- io.write_stderr(" daff merge [--inplace] [--output OUTPUT.csv] parent.csv a.csv b.csv\n")
704
- io.write_stderr(" daff trim [--output OUTPUT.csv] source.csv\n")
705
- io.write_stderr(" daff render [--output OUTPUT.html] diff.csv\n")
706
- io.write_stderr(" daff copy in.csv out.tsv\n")
707
- io.write_stderr(" daff git\n")
708
- io.write_stderr(" daff version\n")
709
- io.write_stderr("\n")
710
- io.write_stderr("The --inplace option to patch and merge will result in modification of a.csv.\n")
711
- io.write_stderr("\n")
712
- io.write_stderr("If you need more control, here is the full list of flags:\n")
713
- io.write_stderr(" daff diff [--output OUTPUT.csv] [--context NUM] [--all] [--act ACT] a.csv b.csv\n")
714
- io.write_stderr(" --act ACT: show only a certain kind of change (update, insert, delete)\n")
715
- io.write_stderr(" --all: do not prune unchanged rows or columns\n")
716
- io.write_stderr(" --all-rows: do not prune unchanged rows\n")
717
- io.write_stderr(" --all-columns: do not prune unchanged columns\n")
718
- io.write_stderr(" --color: highlight changes with terminal colors (default in terminals)\n")
719
- io.write_stderr(" --context NUM: show NUM rows of context\n")
720
- io.write_stderr(" --id: specify column to use as primary key (repeat for multi-column key)\n")
721
- io.write_stderr(" --ignore: specify column to ignore completely (can repeat)\n")
722
- io.write_stderr(" --index: include row/columns numbers from original tables\n")
723
- io.write_stderr(" --input-format [csv|tsv|ssv|json]: set format to expect for input\n")
724
- io.write_stderr(" --no-color: make sure terminal colors are not used\n")
725
- io.write_stderr(" --ordered: assume row order is meaningful (default for CSV)\n")
726
- io.write_stderr(" --output-format [csv|tsv|ssv|json|copy|html]: set format for output\n")
727
- io.write_stderr(" --padding [dense|sparse|smart]: set padding method for aligning columns\n")
728
- io.write_stderr(" --table NAME: compare the named table, used with SQL sources\n")
729
- io.write_stderr(" --unordered: assume row order is meaningless (default for json formats)\n")
730
- io.write_stderr(" -w / --ignore-whitespace: ignore changes in leading/trailing whitespace\n")
731
- io.write_stderr(" -i / --ignore-case: ignore differences in case\n")
732
- io.write_stderr("\n")
733
- io.write_stderr(" daff render [--output OUTPUT.html] [--css CSS.css] [--fragment] [--plain] diff.csv\n")
734
- io.write_stderr(" --css CSS.css: generate a suitable css file to go with the html\n")
735
- io.write_stderr(" --fragment: generate just a html fragment rather than a page\n")
736
- io.write_stderr(" --plain: do not use fancy utf8 characters to make arrows prettier\n")
737
- io.write_stderr(" --www: send output to a browser\n")
738
- return 1
725
+ if args.length < 1
726
+ io.write_stderr("daff can produce and apply tabular diffs.\n")
727
+ io.write_stderr("Call as:\n")
728
+ io.write_stderr(" daff [--color] [--no-color] [--output OUTPUT.csv] a.csv b.csv\n")
729
+ io.write_stderr(" daff [--output OUTPUT.html] a.csv b.csv\n")
730
+ io.write_stderr(" daff [--output OUTPUT.csv] parent.csv a.csv b.csv\n")
731
+ io.write_stderr(" daff [--output OUTPUT.ndjson] a.ndjson b.ndjson\n")
732
+ io.write_stderr(" daff [--www] a.csv b.csv\n")
733
+ io.write_stderr(" daff patch [--inplace] [--output OUTPUT.csv] a.csv patch.csv\n")
734
+ io.write_stderr(" daff merge [--inplace] [--output OUTPUT.csv] parent.csv a.csv b.csv\n")
735
+ io.write_stderr(" daff trim [--output OUTPUT.csv] source.csv\n")
736
+ io.write_stderr(" daff render [--output OUTPUT.html] diff.csv\n")
737
+ io.write_stderr(" daff copy in.csv out.tsv\n")
738
+ io.write_stderr(" daff in.csv\n")
739
+ io.write_stderr(" daff git\n")
740
+ io.write_stderr(" daff version\n")
741
+ io.write_stderr("\n")
742
+ io.write_stderr("The --inplace option to patch and merge will result in modification of a.csv.\n")
743
+ io.write_stderr("\n")
744
+ io.write_stderr("If you need more control, here is the full list of flags:\n")
745
+ io.write_stderr(" daff diff [--output OUTPUT.csv] [--context NUM] [--all] [--act ACT] a.csv b.csv\n")
746
+ io.write_stderr(" --act ACT: show only a certain kind of change (update, insert, delete)\n")
747
+ io.write_stderr(" --all: do not prune unchanged rows or columns\n")
748
+ io.write_stderr(" --all-rows: do not prune unchanged rows\n")
749
+ io.write_stderr(" --all-columns: do not prune unchanged columns\n")
750
+ io.write_stderr(" --color: highlight changes with terminal colors (default in terminals)\n")
751
+ io.write_stderr(" --context NUM: show NUM rows of context\n")
752
+ io.write_stderr(" --id: specify column to use as primary key (repeat for multi-column key)\n")
753
+ io.write_stderr(" --ignore: specify column to ignore completely (can repeat)\n")
754
+ io.write_stderr(" --index: include row/columns numbers from original tables\n")
755
+ io.write_stderr(" --input-format [csv|tsv|ssv|psv|json]: set format to expect for input\n")
756
+ io.write_stderr(" --eol [crlf|lf|cr|auto]: separator between rows of csv output.\n")
757
+ io.write_stderr(" --no-color: make sure terminal colors are not used\n")
758
+ io.write_stderr(" --ordered: assume row order is meaningful (default for CSV)\n")
759
+ io.write_stderr(" --output-format [csv|tsv|ssv|psv|json|copy|html]: set format for output\n")
760
+ io.write_stderr(" --padding [dense|sparse|smart]: set padding method for aligning columns\n")
761
+ io.write_stderr(" --table NAME: compare the named table, used with SQL sources\n")
762
+ io.write_stderr(" --unordered: assume row order is meaningless (default for json formats)\n")
763
+ io.write_stderr(" -w / --ignore-whitespace: ignore changes in leading/trailing whitespace\n")
764
+ io.write_stderr(" -i / --ignore-case: ignore differences in case\n")
765
+ io.write_stderr("\n")
766
+ io.write_stderr(" daff render [--output OUTPUT.html] [--css CSS.css] [--fragment] [--plain] diff.csv\n")
767
+ io.write_stderr(" --css CSS.css: generate a suitable css file to go with the html\n")
768
+ io.write_stderr(" --fragment: generate just a html fragment rather than a page\n")
769
+ io.write_stderr(" --plain: do not use fancy utf8 characters to make arrows prettier\n")
770
+ io.write_stderr(" --www: send output to a browser\n")
771
+ return 1
772
+ end
739
773
  end
740
774
  cmd1 = args[0]
741
775
  offset = 1
742
776
  if !Lambda.has(["diff","patch","merge","trim","render","git","version","copy"],cmd1)
743
- if (cmd1.index(".",nil || 0) || -1) != -1 || (cmd1.index("--",nil || 0) || -1) == 0
777
+ if (cmd1.index("--",nil || 0) || -1) == 0
744
778
  cmd1 = "diff"
745
779
  offset = 0
780
+ elsif (cmd1.index(".",nil || 0) || -1) != -1
781
+ if args.length == 2
782
+ cmd1 = "diff"
783
+ offset = 0
784
+ elsif args.length == 1
785
+ cmd1 = "copy"
786
+ offset = 0
787
+ end
746
788
  end
747
789
  end
748
790
  if cmd1 == "git"
@@ -816,7 +858,9 @@ module Coopy
816
858
  elsif cmd1 == "render"
817
859
  self.render_table(output,a)
818
860
  elsif cmd1 == "copy"
819
- self.save_table(output,a)
861
+ os = ::Coopy::Tables.new(a)
862
+ os.add("untitled")
863
+ self.save_tables(output,os,self.use_color(@flags,output),false)
820
864
  end
821
865
  if ok
822
866
  return 0
@@ -835,7 +879,7 @@ module Coopy
835
879
  class << self
836
880
  attr_accessor :version
837
881
  end
838
- @version = "1.3.19"
882
+ @version = "1.3.25"
839
883
 
840
884
  def Coopy.diff_as_html(local,remote,flags = nil)
841
885
  comp = ::Coopy::TableComparisonState.new
@@ -4,7 +4,7 @@
4
4
  module Coopy
5
5
  class Csv
6
6
 
7
- def initialize(delim = ",")
7
+ def initialize(delim = ",",eol = nil)
8
8
  @cursor = 0
9
9
  @row_ended = false
10
10
  if delim == nil
@@ -12,6 +12,8 @@ module Coopy
12
12
  else
13
13
  @delim = delim
14
14
  end
15
+ @discovered_eol = nil
16
+ @preferred_eol = eol
15
17
  end
16
18
 
17
19
  protected
@@ -20,10 +22,14 @@ module Coopy
20
22
  attr_accessor :row_ended
21
23
  attr_accessor :has_structure
22
24
  attr_accessor :delim
25
+ attr_accessor :discovered_eol
26
+ attr_accessor :preferred_eol
23
27
 
24
28
  public
25
29
 
26
30
  def render_table(t)
31
+ eol = @preferred_eol
32
+ eol = "\r\n" if eol == nil
27
33
  result = ""
28
34
  txt = ""
29
35
  v = t.get_cell_view
@@ -39,7 +45,7 @@ module Coopy
39
45
  txt += self.render_cell(v,stream.get_cell(x))
40
46
  end
41
47
  end
42
- txt += "\r\n"
48
+ txt += eol
43
49
  end
44
50
  txt
45
51
  end
@@ -48,17 +54,45 @@ module Coopy
48
54
  return "NULL" if d == nil
49
55
  str = v.to_s(d)
50
56
  need_quote = false
51
- begin
57
+ if str.length > 0
58
+ need_quote = true if str[0] == " " || str[str.length - 1] == " "
59
+ end
60
+ if !need_quote
52
61
  _g1 = 0
53
62
  _g = str.length
54
63
  while(_g1 < _g)
55
64
  i = _g1
56
65
  _g1+=1
57
66
  ch = str[i]
58
- if ch == "\"" || ch == "'" || ch == @delim || ch == "\r" || ch == "\n" || ch == "\t" || ch == " "
67
+ if ch == "\"" || ch == "'" || ch == "\r" || ch == "\n" || ch == "\t"
59
68
  need_quote = true
60
69
  break
61
70
  end
71
+ if ch == @delim[0]
72
+ if @delim.length == 1
73
+ need_quote = true
74
+ break
75
+ end
76
+ if i + @delim.length <= str.length
77
+ match = true
78
+ begin
79
+ _g3 = 1
80
+ _g2 = @delim.length
81
+ while(_g3 < _g2)
82
+ j = _g3
83
+ _g3+=1
84
+ if str[i + j] != @delim[j]
85
+ match = false
86
+ break
87
+ end
88
+ end
89
+ end
90
+ if match
91
+ need_quote = true
92
+ break
93
+ end
94
+ end
95
+ end
62
96
  end
63
97
  end
64
98
  result = ""
@@ -66,8 +100,8 @@ module Coopy
66
100
  line_buf = ""
67
101
  begin
68
102
  _g11 = 0
69
- _g2 = str.length
70
- while(_g11 < _g2)
103
+ _g4 = str.length
104
+ while(_g11 < _g4)
71
105
  i1 = _g11
72
106
  _g11+=1
73
107
  ch1 = str[i1]
@@ -165,14 +199,39 @@ module Coopy
165
199
  first_non_underscore = i if ch != 95 && i < first_non_underscore
166
200
  if @has_structure
167
201
  if !quoting
168
- break if ch == (@delim[0].ord rescue nil)
202
+ if ch == (@delim[0].ord rescue nil)
203
+ break if @delim.length == 1
204
+ if i + @delim.length <= txt.length
205
+ match = true
206
+ begin
207
+ _g3 = 1
208
+ _g2 = @delim.length
209
+ while(_g3 < _g2)
210
+ j = _g3
211
+ _g3+=1
212
+ if txt[i + j] != @delim[j]
213
+ match = false
214
+ break
215
+ end
216
+ end
217
+ end
218
+ if match
219
+ last_processed += @delim.length - 1
220
+ break
221
+ end
222
+ end
223
+ end
169
224
  if ch == 13 || ch == 10
170
225
  ch2 = (txt[i + 1].ord rescue nil)
171
226
  if ch2 != nil
172
227
  if ch2 != ch
173
- last_processed+=1 if ch2 == 13 || ch2 == 10
228
+ if ch2 == 13 || ch2 == 10
229
+ @discovered_eol = _hx_str([ch].pack("U")) + _hx_str([ch2].pack("U")) if @discovered_eol == nil
230
+ last_processed+=1
231
+ end
174
232
  end
175
233
  end
234
+ @discovered_eol = [ch].pack("U") if @discovered_eol == nil
176
235
  @row_ended = true
177
236
  break
178
237
  end
@@ -217,6 +276,14 @@ module Coopy
217
276
  self.parse_cell_part(txt)
218
277
  end
219
278
 
279
+ def get_discovered_eol
280
+ @discovered_eol
281
+ end
282
+
283
+ def set_preferred_eol(eol)
284
+ @preferred_eol = eol
285
+ end
286
+
220
287
  haxe_me ["coopy", "Csv"]
221
288
  end
222
289
 
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ module Coopy
5
+ class DiffSummary
6
+
7
+ def initialize
8
+ end
9
+
10
+ attr_accessor :row_deletes
11
+ attr_accessor :row_inserts
12
+ attr_accessor :row_updates
13
+ attr_accessor :row_reorders
14
+ attr_accessor :col_deletes
15
+ attr_accessor :col_inserts
16
+ attr_accessor :col_updates
17
+ attr_accessor :col_renames
18
+ attr_accessor :col_reorders
19
+ attr_accessor :row_count_initial_with_header
20
+ attr_accessor :row_count_final_with_header
21
+ attr_accessor :row_count_initial
22
+ attr_accessor :row_count_final
23
+ attr_accessor :col_count_initial
24
+ attr_accessor :col_count_final
25
+ haxe_me ["coopy", "DiffSummary"]
26
+ end
27
+
28
+ end
@@ -26,6 +26,7 @@ module Coopy
26
26
  attr_accessor :column_mix_local
27
27
  attr_accessor :column_mix_remote
28
28
  attr_accessor :conflicts
29
+ attr_accessor :conflict_infos
29
30
 
30
31
  def shuffle_dimension(dim_units,len,fate,cl,cr)
31
32
  at = 0
@@ -98,6 +99,7 @@ module Coopy
98
99
 
99
100
  def apply
100
101
  @conflicts = 0
102
+ @conflict_infos = Array.new
101
103
  ct = ::Coopy::Coopy.compare_tables3(@parent,@local,@remote)
102
104
  align = ct.align
103
105
  @order = align.to_order
@@ -130,6 +132,7 @@ module Coopy
130
132
  else
131
133
  @local.set_cell(col.l,row.l,::Coopy::Merger.make_conflicted_cell(view,pcell,lcell,rcell))
132
134
  @conflicts+=1
135
+ self.add_conflict_info(row.l,col.l,view,pcell,lcell,rcell)
133
136
  end
134
137
  end
135
138
  end
@@ -174,8 +177,16 @@ module Coopy
174
177
  @conflicts
175
178
  end
176
179
 
180
+ def get_conflict_infos
181
+ @conflict_infos
182
+ end
183
+
177
184
  # protected - in ruby this doesn't play well with static/inline methods
178
185
 
186
+ def add_conflict_info(row,col,view,pcell,lcell,rcell)
187
+ @conflict_infos.push(::Coopy::ConflictInfo.new(row,col,view.to_s(pcell),view.to_s(lcell),view.to_s(rcell)))
188
+ end
189
+
179
190
  def Merger.make_conflicted_cell(view,pcell,lcell,rcell)
180
191
  view.to_datum("((( " + _hx_str(view.to_s(pcell)) + " ))) " + _hx_str(view.to_s(lcell)) + " /// " + _hx_str(view.to_s(rcell)))
181
192
  end
@@ -157,8 +157,8 @@ module Coopy
157
157
  end
158
158
  blks.sort! {|a,b|
159
159
  diff = blk_len[b] - blk_len[a]
160
- return diff if diff != 0
161
- a - b
160
+ diff = a - b if diff == 0
161
+ diff
162
162
  }
163
163
  moved = Array.new
164
164
  while(blks.length > 0)
@@ -51,6 +51,16 @@ module Coopy
51
51
  attr_accessor :diff_found
52
52
  attr_accessor :schema_diff_found
53
53
  attr_accessor :preserve_columns
54
+ attr_accessor :row_deletes
55
+ attr_accessor :row_inserts
56
+ attr_accessor :row_updates
57
+ attr_accessor :row_reorders
58
+ attr_accessor :col_deletes
59
+ attr_accessor :col_inserts
60
+ attr_accessor :col_updates
61
+ attr_accessor :col_renames
62
+ attr_accessor :col_reorders
63
+ attr_accessor :column_units_updated
54
64
  attr_accessor :nested
55
65
  attr_accessor :nesting_present
56
66
 
@@ -267,6 +277,16 @@ module Coopy
267
277
  @top_line_done = false
268
278
  @diff_found = false
269
279
  @schema_diff_found = false
280
+ @row_deletes = 0
281
+ @row_inserts = 0
282
+ @row_updates = 0
283
+ @row_reorders = 0
284
+ @col_deletes = 0
285
+ @col_inserts = 0
286
+ @col_updates = 0
287
+ @col_renames = 0
288
+ @col_reorders = 0
289
+ @column_units_updated = {}
270
290
  end
271
291
 
272
292
  def setup_tables
@@ -445,6 +465,7 @@ module Coopy
445
465
  if @active_column != nil
446
466
  @active_column[j] = 1 if @allow_update
447
467
  end
468
+ @col_inserts+=1 if @allow_update
448
469
  end
449
470
  if cunit.r < 0 && cunit.lp >= 0
450
471
  @have_schema = true
@@ -452,6 +473,7 @@ module Coopy
452
473
  if @active_column != nil
453
474
  @active_column[j] = 1 if @allow_update
454
475
  end
476
+ @col_deletes+=1 if @allow_update
455
477
  end
456
478
  if cunit.r >= 0 && cunit.lp >= 0
457
479
  if @p.get_height >= @rp_header && @b.get_height >= @rb_header
@@ -462,7 +484,10 @@ module Coopy
462
484
  act = "("
463
485
  act += @v.to_s(pp)
464
486
  act += ")"
465
- @active_column[j] = 1 if @active_column != nil
487
+ if @active_column != nil
488
+ @active_column[j] = 1
489
+ @col_renames+=1
490
+ end
466
491
  end
467
492
  end
468
493
  end
@@ -470,6 +495,7 @@ module Coopy
470
495
  act = ":" + _hx_str(act)
471
496
  @have_schema = true
472
497
  @active_column = nil if @active_column != nil
498
+ @col_reorders+=1
473
499
  end
474
500
  @schema.push(act)
475
501
  end
@@ -823,7 +849,8 @@ module Coopy
823
849
  [ll_out,rr_out,pp_out]
824
850
  end
825
851
 
826
- def scan_row(unit,output,at,i)
852
+ def scan_row(unit,output,at,i,out)
853
+ row_update = false
827
854
  begin
828
855
  _g1 = 0
829
856
  _g = @column_units.length
@@ -898,6 +925,10 @@ module Coopy
898
925
  end
899
926
  cell = dd
900
927
  if have_dd_to && @allow_update
928
+ if !row_update
929
+ @row_updates+=1 if out == 0
930
+ row_update = true
931
+ end
901
932
  @active_column[j] = 1 if @active_column != nil
902
933
  if @sep == ""
903
934
  if @builder.need_separator
@@ -926,6 +957,10 @@ module Coopy
926
957
  cell = @builder.conflict(dd,dd_to_alt,dd_to)
927
958
  @act = @conflict_sep
928
959
  end
960
+ if !@column_units_updated.include?(j)
961
+ @column_units_updated[j] = true
962
+ @col_updates+=1
963
+ end
929
964
  end
930
965
  @act = "+" if @act == "" && @have_addition
931
966
  if @act == "+++"
@@ -1019,8 +1054,9 @@ module Coopy
1019
1054
  @publish = @flags.show_unchanged
1020
1055
  dummy = false
1021
1056
  if out == 1
1022
- @publish = @active_row[i] > 0
1023
- dummy = @active_row[i] == 3
1057
+ value = @active_row[i]
1058
+ @publish = value != nil && value > 0
1059
+ dummy = value != nil && value == 3
1024
1060
  next if dummy && showed_dummy
1025
1061
  next if !@publish
1026
1062
  end
@@ -1046,14 +1082,19 @@ module Coopy
1046
1082
  @have_addition = false
1047
1083
  skip = false
1048
1084
  @act = ""
1049
- @act = ":" if reordered
1085
+ if reordered
1086
+ @act = ":"
1087
+ @row_reorders+=1 if out == 0
1088
+ end
1050
1089
  if unit.p < 0 && unit.l < 0 && unit.r >= 0
1051
1090
  skip = true if !@allow_insert
1052
1091
  @act = "+++"
1092
+ @row_inserts+=1 if out == 0 && !skip
1053
1093
  end
1054
1094
  if (unit.p >= 0 || !@has_parent) && unit.l >= 0 && unit.r < 0
1055
1095
  skip = true if !@allow_delete
1056
1096
  @act = "---"
1097
+ @row_deletes+=1 if out == 0 && !skip
1057
1098
  end
1058
1099
  if skip
1059
1100
  if !@publish
@@ -1061,7 +1102,7 @@ module Coopy
1061
1102
  end
1062
1103
  next
1063
1104
  end
1064
- self.scan_row(unit,output,at,i)
1105
+ self.scan_row(unit,output,at,i,out)
1065
1106
  end
1066
1107
  end
1067
1108
  end
@@ -1118,6 +1159,26 @@ module Coopy
1118
1159
  @align.comp
1119
1160
  end
1120
1161
 
1162
+ def get_summary
1163
+ ds = ::Coopy::DiffSummary.new
1164
+ ds.row_deletes = @row_deletes
1165
+ ds.row_inserts = @row_inserts
1166
+ ds.row_updates = @row_updates
1167
+ ds.row_reorders = @row_reorders
1168
+ ds.col_deletes = @col_deletes
1169
+ ds.col_inserts = @col_inserts
1170
+ ds.col_updates = @col_updates
1171
+ ds.col_renames = @col_renames
1172
+ ds.col_reorders = @col_reorders
1173
+ ds.row_count_initial_with_header = @align.get_source.get_height
1174
+ ds.row_count_final_with_header = @align.get_target.get_height
1175
+ ds.row_count_initial = @align.get_source.get_height - @align.get_source_header - 1
1176
+ ds.row_count_final = @align.get_target.get_height - @align.get_target_header - 1
1177
+ ds.col_count_initial = @align.get_source.get_width
1178
+ ds.col_count_final = @align.get_target.get_width
1179
+ ds
1180
+ end
1181
+
1121
1182
  haxe_me ["coopy", "TableDiff"]
1122
1183
  end
1123
1184
 
@@ -4,7 +4,7 @@
4
4
  module Coopy
5
5
  class TerminalDiffRender
6
6
 
7
- def initialize(flags = nil)
7
+ def initialize(flags = nil,delim = nil,diff = true)
8
8
  @align_columns = true
9
9
  @wide_columns = false
10
10
  @use_glyphs = true
@@ -14,6 +14,12 @@ module Coopy
14
14
  @wide_columns = true if flags.padding_strategy == "sparse"
15
15
  @use_glyphs = flags.use_glyphs
16
16
  end
17
+ if delim != nil
18
+ @delim = delim
19
+ else
20
+ @delim = ","
21
+ end
22
+ @diff = diff
17
23
  end
18
24
 
19
25
  protected
@@ -26,6 +32,8 @@ module Coopy
26
32
  attr_accessor :wide_columns
27
33
  attr_accessor :use_glyphs
28
34
  attr_accessor :flags
35
+ attr_accessor :delim
36
+ attr_accessor :diff
29
37
 
30
38
  public
31
39
 
@@ -43,14 +51,14 @@ module Coopy
43
51
  @v = t.get_cell_view
44
52
  @codes = {}
45
53
  @codes["header"] = "\x1B[0;1m"
54
+ @codes["minor"] = "\x1B[33m"
55
+ @codes["done"] = "\x1B[0m"
46
56
  @codes["meta"] = "\x1B[0;1m"
47
57
  @codes["spec"] = "\x1B[35;1m"
48
58
  @codes["add"] = "\x1B[32;1m"
49
59
  @codes["conflict"] = "\x1B[33;1m"
50
60
  @codes["modify"] = "\x1B[34;1m"
51
61
  @codes["remove"] = "\x1B[31;1m"
52
- @codes["minor"] = "\x1B[2m"
53
- @codes["done"] = "\x1B[0m"
54
62
  sizes = nil
55
63
  sizes = self.pick_sizes(t) if @align_columns
56
64
  begin
@@ -65,7 +73,6 @@ module Coopy
65
73
  while(_g1 < w)
66
74
  x = _g1
67
75
  _g1+=1
68
- txt += _hx_str(@codes["minor"]) + "," + _hx_str(@codes["done"]) if x > 0
69
76
  if sizes != nil
70
77
  spaces = target - at
71
78
  begin
@@ -78,6 +85,7 @@ module Coopy
78
85
  end
79
86
  end
80
87
  end
88
+ txt += _hx_str(@codes["minor"]) + _hx_str(@delim) + _hx_str(@codes["done"]) if x > 0
81
89
  txt += self.get_text(x,y,true)
82
90
  if sizes != nil
83
91
  bit = self.get_text(x,y,false)
@@ -101,7 +109,7 @@ module Coopy
101
109
  def get_text(x,y,color)
102
110
  val = @t.get_cell(x,y)
103
111
  cell = ::Coopy::DiffRender.render_cell(@t,@v,x,y)
104
- if color
112
+ if color && @diff
105
113
  code = nil
106
114
  code = @codes[cell.category] if cell.category != nil
107
115
  if cell.category_given_tr != nil
@@ -127,6 +135,8 @@ module Coopy
127
135
  val = _hx_str(code) + _hx_str(val.to_s) + _hx_str(@codes["done"])
128
136
  end
129
137
  end
138
+ elsif color && !@diff
139
+ val = _hx_str(@codes["header"]) + _hx_str(val.to_s) + _hx_str(@codes["done"]) if y == 0
130
140
  elsif @use_glyphs
131
141
  val = cell.pretty_value
132
142
  else
@@ -159,7 +169,8 @@ module Coopy
159
169
  y = _g1
160
170
  _g1+=1
161
171
  txt = self.get_text(x,y,false)
162
- row = y if txt == "@@" && row == -1
172
+ row = y if txt == "@@" && row == -1 && @diff
173
+ row = y if row == -1 && !@diff
163
174
  len = txt.length
164
175
  mmin = len if y == row
165
176
  m += len
@@ -18,10 +18,10 @@ module Rb
18
18
 
19
19
  def Boot.__instanceof(o,cl)
20
20
  return false if cl == nil
21
- if cl == Fixnum
22
- return o.is_a? Fixnum
21
+ if cl == Integer
22
+ return o.is_a? Integer
23
23
  elsif cl == Float
24
- return o.is_a?(Float) || o.is_a?(Fixnum)
24
+ return o.is_a?(Float) || o.is_a?(Integer)
25
25
  elsif cl == TrueClass
26
26
  return ((o.is_a? TrueClass)||(o.is_a? FalseClass))
27
27
  elsif cl == String
@@ -14,7 +14,7 @@
14
14
  return ValueType.tbool
15
15
  when "String"
16
16
  return ValueType.tclass(String)
17
- when "Fixnum"
17
+ when "Integer"
18
18
  return ValueType.tint
19
19
  when "Float"
20
20
  return ValueType.tfloat
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daff
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.19
4
+ version: 1.3.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Smith
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-11-08 00:00:00.000000000 Z
12
+ date: 2017-08-17 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Diff and patch tables
15
15
  email:
@@ -32,10 +32,12 @@ files:
32
32
  - lib/lib/coopy/combined_table_head.rb
33
33
  - lib/lib/coopy/compare_flags.rb
34
34
  - lib/lib/coopy/compare_table.rb
35
+ - lib/lib/coopy/conflict_info.rb
35
36
  - lib/lib/coopy/coopy.rb
36
37
  - lib/lib/coopy/cross_match.rb
37
38
  - lib/lib/coopy/csv.rb
38
39
  - lib/lib/coopy/diff_render.rb
40
+ - lib/lib/coopy/diff_summary.rb
39
41
  - lib/lib/coopy/flat_cell_builder.rb
40
42
  - lib/lib/coopy/highlight_patch.rb
41
43
  - lib/lib/coopy/highlight_patch_unit.rb
@@ -113,17 +115,17 @@ require_paths:
113
115
  - lib
114
116
  required_ruby_version: !ruby/object:Gem::Requirement
115
117
  requirements:
116
- - - '>='
118
+ - - ">="
117
119
  - !ruby/object:Gem::Version
118
120
  version: '0'
119
121
  required_rubygems_version: !ruby/object:Gem::Requirement
120
122
  requirements:
121
- - - '>='
123
+ - - ">="
122
124
  - !ruby/object:Gem::Version
123
125
  version: '0'
124
126
  requirements: []
125
127
  rubyforge_project:
126
- rubygems_version: 2.4.8
128
+ rubygems_version: 2.6.10
127
129
  signing_key:
128
130
  specification_version: 4
129
131
  summary: '[![Build Status](https://travis-ci.org/paulfitz/daff.svg?branch=master)](https://travis-ci.org/paulfitz/daff)