daff 1.2.6 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -6
  3. data/bin/daff.rb +0 -0
  4. data/lib/daff.rb +6 -0
  5. data/lib/lib/coopy/alignment.rb +146 -169
  6. data/lib/lib/coopy/cell_builder.rb +1 -1
  7. data/lib/lib/coopy/cell_info.rb +2 -1
  8. data/lib/lib/coopy/column_change.rb +16 -0
  9. data/lib/lib/coopy/compare_flags.rb +33 -5
  10. data/lib/lib/coopy/compare_table.rb +219 -99
  11. data/lib/lib/coopy/coopy.rb +205 -99
  12. data/lib/lib/coopy/csv.rb +17 -22
  13. data/lib/lib/coopy/diff_render.rb +16 -8
  14. data/lib/lib/coopy/flat_cell_builder.rb +11 -8
  15. data/lib/lib/coopy/highlight_patch.rb +363 -63
  16. data/lib/lib/coopy/highlight_patch_unit.rb +1 -1
  17. data/lib/lib/coopy/index.rb +21 -8
  18. data/lib/lib/coopy/index_item.rb +7 -3
  19. data/lib/lib/coopy/index_pair.rb +13 -10
  20. data/lib/lib/coopy/merger.rb +3 -3
  21. data/lib/lib/coopy/meta.rb +17 -0
  22. data/lib/lib/coopy/mover.rb +7 -5
  23. data/lib/lib/coopy/ndjson.rb +2 -2
  24. data/lib/lib/coopy/nested_cell_builder.rb +7 -7
  25. data/lib/lib/coopy/ordering.rb +6 -2
  26. data/lib/lib/coopy/property_change.rb +16 -0
  27. data/lib/lib/coopy/row.rb +1 -0
  28. data/lib/lib/coopy/row_change.rb +42 -0
  29. data/lib/lib/coopy/row_stream.rb +11 -0
  30. data/lib/lib/coopy/simple_table.rb +84 -30
  31. data/lib/lib/coopy/simple_view.rb +8 -8
  32. data/lib/lib/coopy/sparse_sheet.rb +1 -1
  33. data/lib/lib/coopy/sql_column.rb +22 -10
  34. data/lib/lib/coopy/sql_compare.rb +397 -85
  35. data/lib/lib/coopy/sql_database.rb +2 -0
  36. data/lib/lib/coopy/sql_helper.rb +5 -0
  37. data/lib/lib/coopy/sql_table.rb +122 -19
  38. data/lib/lib/coopy/sql_table_name.rb +1 -1
  39. data/lib/lib/coopy/sqlite_helper.rb +250 -3
  40. data/lib/lib/coopy/table.rb +1 -0
  41. data/lib/lib/coopy/table_diff.rb +643 -464
  42. data/lib/lib/coopy/table_io.rb +19 -6
  43. data/lib/lib/coopy/table_modifier.rb +1 -1
  44. data/lib/lib/coopy/table_stream.rb +102 -0
  45. data/lib/lib/coopy/terminal_diff_render.rb +4 -3
  46. data/lib/lib/coopy/unit.rb +22 -2
  47. data/lib/lib/coopy/viterbi.rb +4 -4
  48. data/lib/lib/haxe/ds/int_map.rb +1 -1
  49. data/lib/lib/haxe/ds/string_map.rb +1 -1
  50. data/lib/lib/haxe/format/json_parser.rb +1 -1
  51. data/lib/lib/haxe/format/json_printer.rb +1 -1
  52. data/lib/lib/haxe/io/bytes.rb +2 -2
  53. data/lib/lib/haxe/io/eof.rb +1 -1
  54. data/lib/lib/haxe/io/output.rb +1 -1
  55. data/lib/lib/hx_overrides.rb +1 -1
  56. data/lib/lib/hx_sys.rb +9 -5
  57. data/lib/lib/lambda.rb +3 -3
  58. data/lib/lib/list.rb +1 -1
  59. data/lib/lib/rb/ruby_iterator.rb +2 -2
  60. data/lib/lib/reflect.rb +1 -1
  61. data/lib/lib/sys/io/file_output.rb +1 -1
  62. data/lib/lib/sys/io/hx_file.rb +1 -1
  63. data/lib/lib/x_list/list_iterator.rb +2 -2
  64. metadata +29 -25
  65. data/lib/lib/coopy/table_text.rb +0 -26
  66. data/lib/lib/haxe/io/bytes_buffer.rb +0 -19
  67. data/lib/lib/haxe/io/bytes_input.rb +0 -13
  68. data/lib/lib/haxe/io/bytes_output.rb +0 -33
  69. data/lib/lib/haxe/io/input.rb +0 -11
@@ -25,28 +25,23 @@ module Coopy
25
25
 
26
26
  def render_table(t)
27
27
  result = ""
28
- w = t.get_width
29
- h = t.get_height
30
28
  txt = ""
31
29
  v = t.get_cell_view
32
- begin
33
- _g = 0
34
- while(_g < h)
35
- y = _g
36
- _g+=1
37
- begin
38
- _g1 = 0
39
- while(_g1 < w)
40
- x = _g1
41
- _g1+=1
42
- txt += @delim if x > 0
43
- txt += self.render_cell(v,t.get_cell(x,y))
44
- end
30
+ stream = ::Coopy::TableStream.new(t)
31
+ w = stream.width
32
+ while(stream.fetch)
33
+ begin
34
+ _g = 0
35
+ while(_g < w)
36
+ x = _g
37
+ _g+=1
38
+ txt += @delim if x > 0
39
+ txt += self.render_cell(v,stream.get_cell(x))
45
40
  end
46
- txt += "\r\n"
47
41
  end
42
+ txt += "\r\n"
48
43
  end
49
- return txt
44
+ txt
50
45
  end
51
46
 
52
47
  def render_cell(v,d)
@@ -89,7 +84,7 @@ module Coopy
89
84
  end
90
85
  end
91
86
  result += "\"" if need_quote
92
- return result
87
+ result
93
88
  end
94
89
 
95
90
  def parse_table(txt,tab)
@@ -120,13 +115,13 @@ module Coopy
120
115
  end
121
116
  @cursor+=1
122
117
  end
123
- return true
118
+ true
124
119
  end
125
120
 
126
121
  def make_table(txt)
127
122
  tab = ::Coopy::SimpleTable.new(0,0)
128
123
  self.parse_table(txt,tab)
129
- return tab
124
+ tab
130
125
  end
131
126
 
132
127
  protected
@@ -191,7 +186,7 @@ module Coopy
191
186
  return result[1..-1] if result[del..-1] == "NULL"
192
187
  end
193
188
  end
194
- return result
189
+ result
195
190
  end
196
191
 
197
192
  public
@@ -200,7 +195,7 @@ module Coopy
200
195
  @cursor = 0
201
196
  @row_ended = false
202
197
  @has_structure = false
203
- return self.parse_cell_part(txt)
198
+ self.parse_cell_part(txt)
204
199
  end
205
200
 
206
201
  haxe_me ["coopy", "Csv"]
@@ -85,11 +85,11 @@ module Coopy
85
85
  public
86
86
 
87
87
  def html
88
- return @text_to_insert.join("")
88
+ @text_to_insert.join("")
89
89
  end
90
90
 
91
91
  def to_s
92
- return self.html
92
+ self.html
93
93
  end
94
94
 
95
95
  def render(tab)
@@ -121,7 +121,7 @@ module Coopy
121
121
  ::Coopy::DiffRender.examine_cell(off,row,view,txt,"",txt,corner,cell,off)
122
122
  row_mode = cell.category
123
123
  change_row = row if row_mode == "spec"
124
- if row_mode == "header" || row_mode == "spec" || row_mode == "index"
124
+ if row_mode == "header" || row_mode == "spec" || row_mode == "index" || row_mode == "meta"
125
125
  self.set_section("head")
126
126
  else
127
127
  self.set_section("body")
@@ -141,11 +141,11 @@ module Coopy
141
141
  end
142
142
  end
143
143
  render.end_table
144
- return self
144
+ self
145
145
  end
146
146
 
147
147
  def sample_css
148
- return ".highlighter .add { \n background-color: #7fff7f;\n}\n\n.highlighter .remove { \n background-color: #ff7f7f;\n}\n\n.highlighter td.modify { \n background-color: #7f7fff;\n}\n\n.highlighter td.conflict { \n background-color: #f00;\n}\n\n.highlighter .spec { \n background-color: #aaa;\n}\n\n.highlighter .move { \n background-color: #ffa;\n}\n\n.highlighter .null { \n color: #888;\n}\n\n.highlighter table { \n border-collapse:collapse;\n}\n\n.highlighter td, .highlighter th {\n border: 1px solid #2D4068;\n padding: 3px 7px 2px;\n}\n\n.highlighter th, .highlighter .header { \n background-color: #aaf;\n font-weight: bold;\n padding-bottom: 4px;\n padding-top: 5px;\n text-align:left;\n}\n\n.highlighter tr.header th {\n border-bottom: 2px solid black;\n}\n\n.highlighter tr.index td, .highlighter .index, .highlighter tr.header th.index {\n background-color: white;\n border: none;\n}\n\n.highlighter .gap {\n color: #888;\n}\n\n.highlighter td {\n empty-cells: show;\n}\n"
148
+ ".highlighter .add { \n background-color: #7fff7f;\n}\n\n.highlighter .remove { \n background-color: #ff7f7f;\n}\n\n.highlighter td.modify { \n background-color: #7f7fff;\n}\n\n.highlighter td.conflict { \n background-color: #f00;\n}\n\n.highlighter .spec { \n background-color: #aaa;\n}\n\n.highlighter .move { \n background-color: #ffa;\n}\n\n.highlighter .null { \n color: #888;\n}\n\n.highlighter table { \n border-collapse:collapse;\n}\n\n.highlighter td, .highlighter th {\n border: 1px solid #2D4068;\n padding: 3px 7px 2px;\n}\n\n.highlighter th, .highlighter .header, .highlighter .meta {\n background-color: #aaf;\n font-weight: bold;\n padding-bottom: 4px;\n padding-top: 5px;\n text-align:left;\n}\n\n.highlighter tr.header th {\n border-bottom: 2px solid black;\n}\n\n.highlighter tr.index td, .highlighter .index, .highlighter tr.header th.index {\n background-color: white;\n border: none;\n}\n\n.highlighter .gap {\n color: #888;\n}\n\n.highlighter td {\n empty-cells: show;\n}\n"
149
149
  end
150
150
 
151
151
  def complete_html
@@ -165,12 +165,20 @@ module Coopy
165
165
  cell.pretty_separator = ""
166
166
  cell.conflicted = false
167
167
  cell.updated = false
168
- cell.pvalue = cell.lvalue = cell.rvalue = nil
168
+ cell.meta = cell.pvalue = cell.lvalue = cell.rvalue = nil
169
169
  cell.value = value
170
170
  cell.value = "" if cell.value == nil
171
171
  cell.pretty_value = cell.value
172
172
  vrow = "" if vrow == nil
173
173
  vcol = "" if vcol == nil
174
+ if vrow.length >= 3 && vrow[0] == "@" && vrow[1] != "@"
175
+ idx = vrow.index("@",1 || 0) || -1
176
+ if idx >= 0
177
+ cell.meta = vrow[1,idx - 1]
178
+ vrow = vrow[idx + 1,vrow.length]
179
+ cell.category = "meta"
180
+ end
181
+ end
174
182
  removed_column = false
175
183
  cell.category = "move" if vrow == ":"
176
184
  cell.category = "index" if vrow == "" && offset == 1 && y == 0
@@ -278,7 +286,7 @@ module Coopy
278
286
  il+=1
279
287
  end
280
288
  end
281
- return slo
289
+ slo
282
290
  end
283
291
 
284
292
  public
@@ -293,7 +301,7 @@ module Coopy
293
301
  off = 0
294
302
  end
295
303
  ::Coopy::DiffRender.examine_cell(x,y,view,tab.get_cell(x,y),view.to_s(tab.get_cell(x,off)),view.to_s(tab.get_cell(off,y)),corner,cell,off)
296
- return cell
304
+ cell
297
305
  end
298
306
 
299
307
  haxe_me ["coopy", "DiffRender"]
@@ -4,7 +4,8 @@
4
4
  module Coopy
5
5
  class FlatCellBuilder
6
6
 
7
- def initialize
7
+ def initialize(flags)
8
+ @flags = flags
8
9
  end
9
10
 
10
11
  # protected - in ruby this doesn't play well with static/inline methods
@@ -12,11 +13,12 @@ module Coopy
12
13
  attr_accessor :view
13
14
  attr_accessor :separator
14
15
  attr_accessor :conflict_separator
16
+ attr_accessor :flags
15
17
 
16
18
  public
17
19
 
18
20
  def need_separator
19
- return true
21
+ true
20
22
  end
21
23
 
22
24
  def set_separator(separator)
@@ -32,19 +34,20 @@ module Coopy
32
34
  end
33
35
 
34
36
  def update(local,remote)
35
- return @view.to_datum(_hx_str(::Coopy::FlatCellBuilder.quote_for_diff(@view,local)) + _hx_str(@separator) + _hx_str(::Coopy::FlatCellBuilder.quote_for_diff(@view,remote)))
37
+ @view.to_datum(_hx_str(::Coopy::FlatCellBuilder.quote_for_diff(@view,local)) + _hx_str(@separator) + _hx_str(::Coopy::FlatCellBuilder.quote_for_diff(@view,remote)))
36
38
  end
37
39
 
38
40
  def conflict(parent,local,remote)
39
- return _hx_str(@view.to_s(parent)) + _hx_str(@conflict_separator) + _hx_str(@view.to_s(local)) + _hx_str(@conflict_separator) + _hx_str(@view.to_s(remote))
41
+ _hx_str(@view.to_s(parent)) + _hx_str(@conflict_separator) + _hx_str(@view.to_s(local)) + _hx_str(@conflict_separator) + _hx_str(@view.to_s(remote))
40
42
  end
41
43
 
42
44
  def marker(label)
43
- return @view.to_datum(label)
45
+ @view.to_datum(label)
44
46
  end
45
47
 
46
- def links(unit)
47
- return @view.to_datum(unit.to_s)
48
+ def links(unit,row_like)
49
+ return @view.to_datum(unit.to_base26string) if @flags.count_like_a_spreadsheet && !row_like
50
+ @view.to_datum(unit.to_s)
48
51
  end
49
52
 
50
53
  def FlatCellBuilder.quote_for_diff(v,d)
@@ -63,7 +66,7 @@ module Coopy
63
66
  end
64
67
  end
65
68
  str = "_" + _hx_str(str) if str[score..-1] == _nil
66
- return str
69
+ str
67
70
  end
68
71
 
69
72
  haxe_me ["coopy", "FlatCellBuilder"]
@@ -4,11 +4,14 @@
4
4
  module Coopy
5
5
  class HighlightPatch
6
6
 
7
- def initialize(source,patch)
7
+ def initialize(source,patch,flags = nil)
8
8
  @source = source
9
9
  @patch = patch
10
+ @flags = flags
11
+ @flags = ::Coopy::CompareFlags.new if flags == nil
10
12
  @view = patch.get_cell_view
11
13
  @source_view = source.get_cell_view
14
+ @meta = source.get_meta
12
15
  end
13
16
 
14
17
  protected
@@ -35,6 +38,8 @@ module Coopy
35
38
  attr_accessor :indexes
36
39
  attr_accessor :source_in_patch_col
37
40
  attr_accessor :patch_in_source_col
41
+ attr_accessor :dest_in_patch_col
42
+ attr_accessor :patch_in_dest_col
38
43
  attr_accessor :patch_in_source_row
39
44
  attr_accessor :last_source_row
40
45
  attr_accessor :actions
@@ -43,6 +48,15 @@ module Coopy
43
48
  attr_accessor :col_permutation
44
49
  attr_accessor :col_permutation_rev
45
50
  attr_accessor :have_dropped_columns
51
+ attr_accessor :header_row
52
+ attr_accessor :preamble_row
53
+ attr_accessor :flags
54
+ attr_accessor :meta_change
55
+ attr_accessor :process_meta
56
+ attr_accessor :prev_meta
57
+ attr_accessor :next_meta
58
+ attr_accessor :finished_columns
59
+ attr_accessor :meta
46
60
 
47
61
  def reset
48
62
  @header = {}
@@ -58,7 +72,7 @@ module Coopy
58
72
  @current_row = -1
59
73
  @row_info = ::Coopy::CellInfo.new
60
74
  @cell_info = ::Coopy::CellInfo.new
61
- @source_in_patch_col = @patch_in_source_col = nil
75
+ @source_in_patch_col = @patch_in_source_col = @patch_in_dest_col = nil
62
76
  @patch_in_source_row = {}
63
77
  @indexes = nil
64
78
  @last_source_row = -1
@@ -68,6 +82,17 @@ module Coopy
68
82
  @col_permutation = nil
69
83
  @col_permutation_rev = nil
70
84
  @have_dropped_columns = false
85
+ @header_row = 0
86
+ @preamble_row = 0
87
+ @meta_change = false
88
+ @process_meta = false
89
+ @prev_meta = nil
90
+ @next_meta = nil
91
+ @finished_columns = false
92
+ end
93
+
94
+ def process_meta
95
+ @process_meta = true
71
96
  end
72
97
 
73
98
  public
@@ -94,6 +119,7 @@ module Coopy
94
119
  @actions.push(((str != nil) ? str : ""))
95
120
  end
96
121
  end
122
+ @preamble_row = @header_row = @rc_offset
97
123
  begin
98
124
  _g11 = 0
99
125
  _g2 = @patch.get_height
@@ -103,9 +129,9 @@ module Coopy
103
129
  self.apply_row(r1)
104
130
  end
105
131
  end
106
- self.finish_rows
107
132
  self.finish_columns
108
- return true
133
+ self.finish_rows
134
+ true
109
135
  end
110
136
 
111
137
  protected
@@ -130,6 +156,24 @@ module Coopy
130
156
  end
131
157
  end
132
158
 
159
+ def need_dest_columns
160
+ return if @patch_in_dest_col != nil
161
+ @patch_in_dest_col = {}
162
+ @dest_in_patch_col = {}
163
+ begin
164
+ _g = 0
165
+ _g1 = @cmods
166
+ while(_g < _g1.length)
167
+ cmod = _g1[_g]
168
+ _g+=1
169
+ if cmod.patch_row != -1
170
+ @patch_in_dest_col[cmod.patch_row] = cmod.dest_row
171
+ @dest_in_patch_col[cmod.dest_row] = cmod.patch_row
172
+ end
173
+ end
174
+ end
175
+ end
176
+
133
177
  def need_source_index
134
178
  return if @indexes != nil
135
179
  state = ::Coopy::TableComparisonState.new
@@ -143,34 +187,111 @@ module Coopy
143
187
  self.need_source_columns
144
188
  end
145
189
 
190
+ def set_meta_prop(target,column_name,prop_name,value)
191
+ return if column_name == nil
192
+ return if prop_name == nil
193
+ if !target.include?(column_name)
194
+ value1 = Array.new
195
+ target[column_name] = value1
196
+ end
197
+ change = ::Coopy::PropertyChange.new
198
+ change.prev_name = prop_name
199
+ change.name = prop_name
200
+ value = nil if value == ""
201
+ change.val = value
202
+ target[column_name].push(change)
203
+ end
204
+
205
+ def apply_meta_row(code)
206
+ self.need_source_columns
207
+ codes = code.split("@")
208
+ prop_name = ""
209
+ prop_name = codes[codes.length - 2] if codes.length > 1
210
+ code = codes[codes.length - 1] if codes.length > 0
211
+ @prev_meta = {} if @prev_meta == nil
212
+ @next_meta = {} if @next_meta == nil
213
+ begin
214
+ _g1 = @payload_col
215
+ _g = @payload_top
216
+ while(_g1 < _g)
217
+ i = _g1
218
+ _g1+=1
219
+ txt = self.get_string(i)
220
+ idx_patch = i
221
+ idx_src = nil
222
+ if @patch_in_source_col.include?(idx_patch)
223
+ idx_src = @patch_in_source_col[idx_patch]
224
+ else
225
+ idx_src = -1
226
+ end
227
+ prev_name = nil
228
+ name = nil
229
+ prev_name = @source.get_cell(idx_src,0) if idx_src != -1
230
+ name = @header[idx_patch] if @header.include?(idx_patch)
231
+ ::Coopy::DiffRender.examine_cell(0,0,@view,txt,"",code,"",@cell_info)
232
+ if @cell_info.updated
233
+ self.set_meta_prop(@prev_meta,prev_name,prop_name,@cell_info.lvalue)
234
+ self.set_meta_prop(@next_meta,name,prop_name,@cell_info.rvalue)
235
+ else
236
+ self.set_meta_prop(@prev_meta,prev_name,prop_name,@cell_info.value)
237
+ self.set_meta_prop(@next_meta,name,prop_name,@cell_info.value)
238
+ end
239
+ end
240
+ end
241
+ end
242
+
146
243
  def apply_row(r)
147
244
  @current_row = r
148
245
  code = @actions[r]
246
+ done = false
149
247
  if r == 0 && @rc_offset > 0
248
+ done = true
150
249
  elsif code == "@@"
250
+ @preamble_row = @header_row = r
151
251
  self.apply_header
152
252
  self.apply_action("@@")
253
+ done = true
153
254
  elsif code == "!"
255
+ @preamble_row = @header_row = r
154
256
  self.apply_meta
155
- elsif code == "+++"
156
- self.apply_action(code)
157
- elsif code == "---"
158
- self.apply_action(code)
159
- elsif code == "+" || code == ":"
160
- self.apply_action(code)
161
- elsif (code.index("->",nil || 0) || -1) >= 0
162
- self.apply_action("->")
163
- else
164
- @last_source_row = -1
257
+ done = true
258
+ elsif (code.index("@",nil || 0) || -1) == 0
259
+ @flags.add_warning("cannot usefully apply diffs with metadata yet: '" + _hx_str(code) + "'")
260
+ @preamble_row = r
261
+ self.apply_meta_row(code)
262
+ if @process_meta
263
+ codes = code.split("@")
264
+ code = codes[codes.length - 1] if codes.length > 0
265
+ else
266
+ @meta_change = true
267
+ done = true
268
+ end
269
+ @meta_change = true
270
+ done = true
271
+ end
272
+ return if @process_meta
273
+ if !done
274
+ self.finish_columns
275
+ if code == "+++"
276
+ self.apply_action(code)
277
+ elsif code == "---"
278
+ self.apply_action(code)
279
+ elsif code == "+" || code == ":"
280
+ self.apply_action(code)
281
+ elsif (code.index("->",nil || 0) || -1) >= 0
282
+ self.apply_action("->")
283
+ else
284
+ @last_source_row = -1
285
+ end
165
286
  end
166
287
  end
167
288
 
168
289
  def get_datum(c)
169
- return @patch.get_cell(c,@current_row)
290
+ @patch.get_cell(c,@current_row)
170
291
  end
171
292
 
172
293
  def get_string(c)
173
- return @view.to_s(self.get_datum(c))
294
+ @view.to_s(self.get_datum(c))
174
295
  end
175
296
 
176
297
  def apply_meta
@@ -224,12 +345,13 @@ module Coopy
224
345
  end
225
346
  end
226
347
  end
227
- self.apply_action("+++") if @source.get_height == 0
348
+ if !self.use_meta_for_row_changes
349
+ self.apply_action("+++") if @source.get_height == 0
350
+ end
228
351
  end
229
352
 
230
353
  def look_up(del = 0)
231
- at = @patch_in_source_row[@current_row + del]
232
- return at if at != nil
354
+ return @patch_in_source_row[@current_row + del] if @patch_in_source_row.include?(@current_row + del)
233
355
  result = -1
234
356
  @current_row += del
235
357
  if @current_row >= 0 && @current_row < @patch.get_height
@@ -239,9 +361,28 @@ module Coopy
239
361
  idx = _g1[_g]
240
362
  _g+=1
241
363
  match = idx.query_by_content(self)
242
- next if match.spot_a != 1
243
- result = match.item_a.lst[0]
244
- break
364
+ next if match.spot_a == 0
365
+ if match.spot_a == 1
366
+ result = match.item_a.lst[0]
367
+ break
368
+ end
369
+ if @current_row > 0
370
+ prev = @patch_in_source_row[@current_row - 1]
371
+ if prev != nil
372
+ lst = match.item_a.lst
373
+ begin
374
+ _g2 = 0
375
+ while(_g2 < lst.length)
376
+ row = lst[_g2]
377
+ _g2+=1
378
+ if row == prev + 1
379
+ result = row
380
+ break
381
+ end
382
+ end
383
+ end
384
+ end
385
+ end
245
386
  end
246
387
  end
247
388
  begin
@@ -249,10 +390,64 @@ module Coopy
249
390
  result
250
391
  end
251
392
  @current_row -= del
252
- return result
393
+ result
394
+ end
395
+
396
+ def apply_action_external(code)
397
+ return if code == "@@"
398
+ rc = ::Coopy::RowChange.new
399
+ rc.action = code
400
+ self.check_act
401
+ rc.cond = {} if code != "+++"
402
+ rc.val = {} if code != "---"
403
+ have_column = false
404
+ begin
405
+ _g1 = @payload_col
406
+ _g = @payload_top
407
+ while(_g1 < _g)
408
+ i = _g1
409
+ _g1+=1
410
+ prev_name = @header[i]
411
+ name = prev_name
412
+ name = @header_rename[prev_name] if @header_rename.include?(prev_name)
413
+ cact = @modifier[i]
414
+ next if cact == "..."
415
+ next if name == nil || name == ""
416
+ txt = self.get_string(i)
417
+ updated = false
418
+ if @row_info.updated
419
+ self.get_pre_string(txt)
420
+ updated = @cell_info.updated
421
+ end
422
+ if cact == "+++" && code != "---"
423
+ if txt != nil && txt != ""
424
+ rc.val = {} if rc.val == nil
425
+ rc.val[name] = txt
426
+ have_column = true
427
+ end
428
+ end
429
+ if updated
430
+ rc.cond[name] = @cell_info.lvalue
431
+ rc.val[name] = @cell_info.rvalue
432
+ elsif code == "+++"
433
+ rc.val[name] = txt if cact != "---"
434
+ elsif cact != "+++" && cact != "---"
435
+ rc.cond[name] = txt
436
+ end
437
+ end
438
+ end
439
+ if rc.action == "+"
440
+ return if !have_column
441
+ rc.action = "->"
442
+ end
443
+ @meta.change_row(rc)
253
444
  end
254
445
 
255
446
  def apply_action(code)
447
+ if self.use_meta_for_row_changes
448
+ self.apply_action_external(code)
449
+ return
450
+ end
256
451
  mod = ::Coopy::HighlightPatchUnit.new
257
452
  mod.code = code
258
453
  mod.add = code == "+++"
@@ -264,7 +459,14 @@ module Coopy
264
459
  next_act = @actions[@current_row + 1]
265
460
  mod.source_next_row = self.look_up(1) if next_act != "+++" && next_act != "..."
266
461
  if mod.add
267
- mod.source_prev_row = self.look_up(-1) if @actions[@current_row - 1] != "+++"
462
+ if @actions[@current_row - 1] != "+++"
463
+ if @actions[@current_row - 1] == "@@"
464
+ mod.source_prev_row = 0
465
+ @last_source_row = 0
466
+ else
467
+ mod.source_prev_row = self.look_up(-1)
468
+ end
469
+ end
268
470
  mod.source_row = mod.source_prev_row
269
471
  mod.source_row_offset = 1 if mod.source_row != -1
270
472
  else
@@ -286,7 +488,7 @@ module Coopy
286
488
  return txt if !@row_info.updated
287
489
  ::Coopy::DiffRender.examine_cell(0,0,@view,txt,"",@row_info.value,"",@cell_info)
288
490
  return txt if !@cell_info.updated
289
- return @cell_info.lvalue
491
+ @cell_info.lvalue
290
492
  end
291
493
 
292
494
  public
@@ -294,7 +496,11 @@ module Coopy
294
496
  def get_row_string(c)
295
497
  at = @source_in_patch_col[c]
296
498
  return "NOT_FOUND" if at == nil
297
- return self.get_pre_string(self.get_string(at))
499
+ self.get_pre_string(self.get_string(at))
500
+ end
501
+
502
+ def is_preamble
503
+ @current_row <= @preamble_row
298
504
  end
299
505
 
300
506
  protected
@@ -308,11 +514,11 @@ module Coopy
308
514
  return -1 if a.source_row + a.source_row_offset < b.source_row + b.source_row_offset
309
515
  return 1 if a.patch_row > b.patch_row
310
516
  return -1 if a.patch_row < b.patch_row
311
- return 0
517
+ 0
312
518
  end
313
519
 
314
520
  def process_mods(rmods,fate,len)
315
- rmods.sort{|a,b| self.sort_mods(a,b)}
521
+ rmods.sort!{|a,b| self.sort_mods(a,b)}
316
522
  offset = 0
317
523
  last = -1
318
524
  target = 0
@@ -348,7 +554,9 @@ module Coopy
348
554
  if mod.source_row >= 0
349
555
  last = mod.source_row + mod.source_row_offset
350
556
  last+=1 if mod.rem
351
- else
557
+ elsif mod.add && mod.source_next_row != -1
558
+ last = mod.source_next_row + mod.source_row_offset
559
+ elsif mod.rem || mod.add
352
560
  last = -1
353
561
  end
354
562
  end
@@ -363,7 +571,17 @@ module Coopy
363
571
  last+=1
364
572
  end
365
573
  end
366
- return len + offset
574
+ len + offset
575
+ end
576
+
577
+ def use_meta_for_column_changes
578
+ return false if @meta == nil
579
+ @meta.use_for_column_changes
580
+ end
581
+
582
+ def use_meta_for_row_changes
583
+ return false if @meta == nil
584
+ @meta.use_for_row_changes
367
585
  end
368
586
 
369
587
  def compute_ordering(mods,permutation,permutation_rev,dim)
@@ -433,7 +651,7 @@ module Coopy
433
651
  while(_g2 < dim)
434
652
  i1 = _g2
435
653
  _g2+=1
436
- if meta_from_unit.include?(logical)
654
+ if logical != nil && meta_from_unit.include?(logical)
437
655
  cursor = meta_from_unit[logical]
438
656
  else
439
657
  cursor = nil
@@ -482,7 +700,39 @@ module Coopy
482
700
  self.compute_ordering(@mods,@row_permutation,@row_permutation_rev,@source.get_height)
483
701
  end
484
702
 
703
+ def fill_in_new_columns
704
+ _g = 0
705
+ _g1 = @cmods
706
+ while(_g < _g1.length)
707
+ cmod = _g1[_g]
708
+ _g+=1
709
+ if !cmod.rem
710
+ if cmod.add
711
+ begin
712
+ _g2 = 0
713
+ _g3 = @mods
714
+ while(_g2 < _g3.length)
715
+ mod = _g3[_g2]
716
+ _g2+=1
717
+ if mod.patch_row != -1 && mod.dest_row != -1
718
+ d = @patch.get_cell(cmod.patch_row,mod.patch_row)
719
+ @source.set_cell(cmod.dest_row,mod.dest_row,d)
720
+ end
721
+ end
722
+ end
723
+ hdr = @header[cmod.patch_row]
724
+ @source.set_cell(cmod.dest_row,0,@view.to_datum(hdr))
725
+ end
726
+ end
727
+ end
728
+ end
729
+
485
730
  def finish_rows
731
+ return if self.use_meta_for_row_changes
732
+ if @source.get_width == 0
733
+ @source.resize(0,0) if @source.get_height != 0
734
+ return
735
+ end
486
736
  fate = Array.new
487
737
  self.permute_rows
488
738
  if @row_permutation.length > 0
@@ -497,6 +747,7 @@ module Coopy
497
747
  @source.insert_or_delete_rows(@row_permutation,@row_permutation.length) if @row_permutation.length > 0
498
748
  len = self.process_mods(@mods,fate,@source.get_height)
499
749
  @source.insert_or_delete_rows(fate,len)
750
+ self.need_dest_columns
500
751
  begin
501
752
  _g2 = 0
502
753
  _g11 = @mods
@@ -508,7 +759,7 @@ module Coopy
508
759
  _it = ::Rb::RubyIterator.new(@header_post.values)
509
760
  while(_it.has_next) do
510
761
  c = _it._next
511
- offset = @patch_in_source_col[c]
762
+ offset = @patch_in_dest_col[c]
512
763
  @source.set_cell(offset,mod1.dest_row,@patch.get_cell(c,mod1.patch_row)) if offset != nil && offset >= 0
513
764
  end
514
765
  elsif mod1.update
@@ -523,12 +774,26 @@ module Coopy
523
774
  next if !@cell_info.updated
524
775
  next if @cell_info.conflicted
525
776
  d = @view.to_datum(@csv.parse_cell(@cell_info.rvalue))
526
- @source.set_cell(@patch_in_source_col[c1],mod1.dest_row,d)
777
+ offset1 = @patch_in_dest_col[c1]
778
+ @source.set_cell(@patch_in_dest_col[c1],mod1.dest_row,d) if offset1 != nil && offset1 >= 0
527
779
  end
528
780
  end
529
781
  end
530
782
  end
531
783
  end
784
+ self.fill_in_new_columns
785
+ begin
786
+ _g12 = 0
787
+ _g3 = @source.get_width
788
+ while(_g12 < _g3)
789
+ i = _g12
790
+ _g12+=1
791
+ name = @view.to_s(@source.get_cell(i,0))
792
+ next_name = @header_rename[name]
793
+ next if next_name == nil
794
+ @source.set_cell(i,0,@view.to_datum(next_name))
795
+ end
796
+ end
532
797
  end
533
798
 
534
799
  def permute_columns
@@ -540,6 +805,8 @@ module Coopy
540
805
  end
541
806
 
542
807
  def finish_columns
808
+ return if @finished_columns
809
+ @finished_columns = true
543
810
  self.need_source_columns
544
811
  begin
545
812
  _g1 = @payload_col
@@ -551,7 +818,8 @@ module Coopy
551
818
  hdr = @header[i]
552
819
  act = "" if act == nil
553
820
  if act == "---"
554
- at = @patch_in_source_col[i]
821
+ at = -1
822
+ at = @patch_in_source_col[i] if @patch_in_source_col.include?(i)
555
823
  mod = ::Coopy::HighlightPatchUnit.new
556
824
  mod.code = act
557
825
  mod.rem = true
@@ -570,15 +838,17 @@ module Coopy
570
838
  mod1.patch_row = i
571
839
  @cmods.push(mod1)
572
840
  elsif act != "..."
841
+ at1 = -1
842
+ at1 = @patch_in_source_col[i] if @patch_in_source_col.include?(i)
573
843
  mod2 = ::Coopy::HighlightPatchUnit.new
574
844
  mod2.code = act
575
845
  mod2.patch_row = i
576
- mod2.source_row = @patch_in_source_col[i]
846
+ mod2.source_row = at1
577
847
  @cmods.push(mod2)
578
848
  end
579
849
  end
580
850
  end
581
- at1 = -1
851
+ at2 = -1
582
852
  rat = -1
583
853
  begin
584
854
  _g11 = 0
@@ -587,8 +857,8 @@ module Coopy
587
857
  i1 = _g11
588
858
  _g11+=1
589
859
  icode = @cmods[i1].code
590
- at1 = @cmods[i1].source_row if icode != "+++" && icode != "---"
591
- @cmods[i1 + 1].source_prev_row = at1
860
+ at2 = @cmods[i1].source_row if icode != "+++" && icode != "---"
861
+ @cmods[i1 + 1].source_prev_row = at2
592
862
  j = @cmods.length - 1 - i1
593
863
  jcode = @cmods[j].code
594
864
  rat = @cmods[j].source_row if jcode != "+++" && jcode != "---"
@@ -608,49 +878,79 @@ module Coopy
608
878
  mod3.source_row = @col_permutation[mod3.source_row] if mod3.source_row >= 0
609
879
  end
610
880
  end
611
- @source.insert_or_delete_columns(@col_permutation,@col_permutation.length)
881
+ @source.insert_or_delete_columns(@col_permutation,@col_permutation.length) if !self.use_meta_for_column_changes
612
882
  end
613
883
  end
614
884
  len = self.process_mods(@cmods,fate,@source.get_width)
615
- @source.insert_or_delete_columns(fate,len)
885
+ if !self.use_meta_for_column_changes
886
+ @source.insert_or_delete_columns(fate,len)
887
+ return
888
+ end
889
+ changed = false
616
890
  begin
617
891
  _g4 = 0
618
892
  _g13 = @cmods
619
893
  while(_g4 < _g13.length)
620
- cmod = _g13[_g4]
894
+ mod4 = _g13[_g4]
621
895
  _g4+=1
622
- if !cmod.rem
623
- if cmod.add
624
- begin
625
- _g21 = 0
626
- _g31 = @mods
627
- while(_g21 < _g31.length)
628
- mod4 = _g31[_g21]
629
- _g21+=1
630
- if mod4.patch_row != -1 && mod4.dest_row != -1
631
- d = @patch.get_cell(cmod.patch_row,mod4.patch_row)
632
- @source.set_cell(cmod.dest_row,mod4.dest_row,d)
633
- end
634
- end
635
- end
636
- hdr1 = @header[cmod.patch_row]
637
- @source.set_cell(cmod.dest_row,0,@view.to_datum(hdr1))
638
- end
896
+ if mod4.code != ""
897
+ changed = true
898
+ break
639
899
  end
640
900
  end
641
901
  end
902
+ return if !changed
903
+ columns = Array.new
904
+ target = {}
905
+ inc = lambda {|x|
906
+ if x < 0
907
+ return x
908
+ else
909
+ return x + 1
910
+ end
911
+ }
642
912
  begin
643
913
  _g14 = 0
644
- _g5 = @source.get_width
914
+ _g5 = fate.length
645
915
  while(_g14 < _g5)
646
916
  i2 = _g14
647
917
  _g14+=1
648
- name = @view.to_s(@source.get_cell(i2,0))
649
- next_name = @header_rename[name]
650
- next if next_name == nil
651
- @source.set_cell(i2,0,@view.to_datum(next_name))
918
+ begin
919
+ value = (inc).call(fate[i2])
920
+ target[i2] = value
921
+ end
922
+ end
923
+ end
924
+ self.need_source_columns
925
+ self.need_dest_columns
926
+ begin
927
+ _g15 = 1
928
+ _g6 = @patch.get_width
929
+ while(_g15 < _g6)
930
+ idx_patch = _g15
931
+ _g15+=1
932
+ change = ::Coopy::ColumnChange.new
933
+ idx_src = nil
934
+ if @patch_in_source_col.include?(idx_patch)
935
+ idx_src = @patch_in_source_col[idx_patch]
936
+ else
937
+ idx_src = -1
938
+ end
939
+ prev_name = nil
940
+ name = nil
941
+ prev_name = @source.get_cell(idx_src,0) if idx_src != -1
942
+ if @modifier[idx_patch] != "---"
943
+ name = @header[idx_patch] if @header.include?(idx_patch)
944
+ end
945
+ change.prev_name = prev_name
946
+ change.name = name
947
+ if @next_meta != nil
948
+ change.props = @next_meta[name] if @next_meta.include?(name)
949
+ end
950
+ columns.push(change)
652
951
  end
653
952
  end
953
+ @meta.alter_columns(columns)
654
954
  end
655
955
 
656
956
  haxe_me ["coopy", "HighlightPatch"]