daff 1.3.19 → 1.3.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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)