daff 1.1.6 → 1.1.7
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.
- data/README.md +12 -30
- data/lib/daff.rb +1 -0
- data/lib/lib/coopy/coopy.rb +19 -7
- data/lib/lib/coopy/table_io.rb +0 -2
- data/lib/lib/coopy/terminal_diff_render.rb +60 -0
- metadata +33 -37
data/README.md
CHANGED
@@ -46,9 +46,14 @@ Call as:
|
|
46
46
|
daff [--output OUTPUT.csv] a.csv b.csv
|
47
47
|
daff [--output OUTPUT.csv] parent.csv a.csv b.csv
|
48
48
|
daff [--output OUTPUT.jsonbook] a.jsonbook b.jsonbook
|
49
|
-
daff patch [--output OUTPUT.csv]
|
49
|
+
daff patch [--inplace] [--output OUTPUT.csv] a.csv patch.csv
|
50
|
+
daff merge [--inplace] [--output OUTPUT.csv] parent.csv a.csv b.csv
|
50
51
|
daff trim [--output OUTPUT.csv] source.csv
|
51
52
|
daff render [--output OUTPUT.html] diff.csv
|
53
|
+
daff git
|
54
|
+
daff version
|
55
|
+
|
56
|
+
The --inplace option to patch and merge will result in modification of a.csv.
|
52
57
|
|
53
58
|
If you need more control, here is the full list of flags:
|
54
59
|
daff diff [--output OUTPUT.csv] [--context NUM] [--all] [--act ACT] a.csv b.csv
|
@@ -56,6 +61,9 @@ If you need more control, here is the full list of flags:
|
|
56
61
|
--all: do not prune unchanged rows
|
57
62
|
--act ACT: show only a certain kind of change (update, insert, delete)
|
58
63
|
|
64
|
+
daff diff --git path old-file old-hex old-mode new-file new-hex new-mode
|
65
|
+
--git: process arguments provided by git to diff drivers
|
66
|
+
|
59
67
|
daff render [--output OUTPUT.html] [--css CSS.css] [--fragment] [--plain] diff.csv
|
60
68
|
--css CSS.css: generate a suitable css file to go with the html
|
61
69
|
--fragment: generate just a html fragment rather than a page
|
@@ -65,35 +73,9 @@ If you need more control, here is the full list of flags:
|
|
65
73
|
Using with git
|
66
74
|
--------------
|
67
75
|
|
68
|
-
Run `daff git csv` to
|
69
|
-
|
70
|
-
|
71
|
-
````
|
72
|
-
$ daff git csv
|
73
|
-
You can use daff to improve git's handling of csv files, by using it as a
|
74
|
-
diff driver (for showing what has changed) and as a merge driver (for merging
|
75
|
-
changes between multiple versions). Here is how.
|
76
|
-
|
77
|
-
Create and add a file called .gitattributes in the root directory of your
|
78
|
-
repository, containing:
|
79
|
-
|
80
|
-
*.csv diff=daff-diff
|
81
|
-
*.csv merge=daff-merge
|
82
|
-
|
83
|
-
Create a file called .gitconfig in your home directory (or alternatively
|
84
|
-
open .git/config for a particular repository) and add:
|
85
|
-
|
86
|
-
[merge "daff-merge"]
|
87
|
-
name = daff tabular merge
|
88
|
-
driver = daff merge --output %A %O %A %B
|
89
|
-
|
90
|
-
[diff "daff-diff"]
|
91
|
-
command = daff diff --git
|
92
|
-
|
93
|
-
Make sure you can run daff from the command-line as just "daff" - if not,
|
94
|
-
replace "daff" in the driver and command lines above with the correct way
|
95
|
-
to call it.
|
96
|
-
````
|
76
|
+
Run `daff git csv` to install daff as a diff and merge handler
|
77
|
+
for `*.csv` files in your repository. Run `daff git` for instructions
|
78
|
+
on doing this manually.
|
97
79
|
|
98
80
|
The library
|
99
81
|
-----------
|
data/lib/daff.rb
CHANGED
@@ -51,6 +51,7 @@ require_relative 'lib/coopy/table_diff'
|
|
51
51
|
require_relative 'lib/coopy/table_io'
|
52
52
|
require_relative 'lib/coopy/table_modifier'
|
53
53
|
require_relative 'lib/coopy/table_text'
|
54
|
+
require_relative 'lib/coopy/terminal_diff_render'
|
54
55
|
require_relative 'lib/coopy/unit'
|
55
56
|
require_relative 'lib/coopy/viewed_datum'
|
56
57
|
require_relative 'lib/coopy/viterbi'
|
data/lib/lib/coopy/coopy.rb
CHANGED
@@ -170,7 +170,7 @@ module Coopy
|
|
170
170
|
key = "add_diff_driver_" + _hx_str(format1)
|
171
171
|
if !@status.include?(key)
|
172
172
|
if !have_diff_driver
|
173
|
-
r = self.command(io,"git",["config","--global","diff.daff-" + _hx_str(format1) + ".command",_hx_str(@daff_cmd) + " diff --git"])
|
173
|
+
r = self.command(io,"git",["config","--global","diff.daff-" + _hx_str(format1) + ".command",_hx_str(@daff_cmd) + " diff --color --git"])
|
174
174
|
return r if r == 999
|
175
175
|
io.write_stdout("- Added diff driver for " + _hx_str(format1) + "\n")
|
176
176
|
else
|
@@ -258,6 +258,7 @@ module Coopy
|
|
258
258
|
pretty = true
|
259
259
|
inplace = false
|
260
260
|
git = false
|
261
|
+
color = false
|
261
262
|
flags = ::Coopy::CompareFlags.new
|
262
263
|
flags.always_show_header = true
|
263
264
|
while(more)
|
@@ -320,6 +321,11 @@ module Coopy
|
|
320
321
|
git = true
|
321
322
|
args.slice!(i,1)
|
322
323
|
break
|
324
|
+
elsif tag == "--color"
|
325
|
+
more = true
|
326
|
+
color = true
|
327
|
+
args.slice!(i,1)
|
328
|
+
break
|
323
329
|
end
|
324
330
|
end
|
325
331
|
end
|
@@ -345,18 +351,18 @@ module Coopy
|
|
345
351
|
io.write_stdout(" *.csv merge=daff-csv\n")
|
346
352
|
io.write_stdout("\nCreate a file called .gitconfig in your home directory (or alternatively\nopen .git/config for a particular repository) and add:\n\n")
|
347
353
|
io.write_stdout(" [diff \"daff-csv\"]\n")
|
348
|
-
io.write_stdout(" command = daff diff --git\n")
|
354
|
+
io.write_stdout(" command = daff diff --color --git\n")
|
349
355
|
io.write_stderr("\n")
|
350
356
|
io.write_stdout(" [merge \"daff-csv\"]\n")
|
351
357
|
io.write_stdout(" name = daff tabular merge\n")
|
352
358
|
io.write_stdout(" driver = daff merge --output %A %O %A %B\n\n")
|
353
|
-
io.write_stderr("Make sure you can run daff from the command-line as just \"daff\" - if not,\nreplace \"daff\" in the driver and command lines above with the correct way\nto call it.")
|
359
|
+
io.write_stderr("Make sure you can run daff from the command-line as just \"daff\" - if not,\nreplace \"daff\" in the driver and command lines above with the correct way\nto call it. Omit --color if your terminal does not support ANSI colors.")
|
354
360
|
io.write_stderr("\n")
|
355
361
|
return 0
|
356
362
|
end
|
357
363
|
io.write_stderr("daff can produce and apply tabular diffs.\n")
|
358
364
|
io.write_stderr("Call as:\n")
|
359
|
-
io.write_stderr(" daff [--output OUTPUT.csv] a.csv b.csv\n")
|
365
|
+
io.write_stderr(" daff [--color] [--output OUTPUT.csv] a.csv b.csv\n")
|
360
366
|
io.write_stderr(" daff [--output OUTPUT.csv] parent.csv a.csv b.csv\n")
|
361
367
|
io.write_stderr(" daff [--output OUTPUT.jsonbook] a.jsonbook b.jsonbook\n")
|
362
368
|
io.write_stderr(" daff patch [--inplace] [--output OUTPUT.csv] a.csv patch.csv\n")
|
@@ -370,6 +376,7 @@ module Coopy
|
|
370
376
|
io.write_stderr("\n")
|
371
377
|
io.write_stderr("If you need more control, here is the full list of flags:\n")
|
372
378
|
io.write_stderr(" daff diff [--output OUTPUT.csv] [--context NUM] [--all] [--act ACT] a.csv b.csv\n")
|
379
|
+
io.write_stderr(" --color: highlight changes with terminal colors\n")
|
373
380
|
io.write_stderr(" --context NUM: show NUM rows of context\n")
|
374
381
|
io.write_stderr(" --all: do not prune unchanged rows\n")
|
375
382
|
io.write_stderr(" --act ACT: show only a certain kind of change (update, insert, delete)\n")
|
@@ -436,7 +443,12 @@ module Coopy
|
|
436
443
|
td = ::Coopy::TableDiff.new(align,flags)
|
437
444
|
o = ::Coopy::SimpleTable.new(0,0)
|
438
445
|
td.hilite(o)
|
439
|
-
|
446
|
+
if color
|
447
|
+
render = ::Coopy::TerminalDiffRender.new
|
448
|
+
tool.save_text(output,render.render(o))
|
449
|
+
else
|
450
|
+
tool.save_table(output,o)
|
451
|
+
end
|
440
452
|
elsif cmd1 == "patch"
|
441
453
|
patcher = ::Coopy::HighlightPatch.new(a,b)
|
442
454
|
patcher.apply
|
@@ -468,7 +480,7 @@ module Coopy
|
|
468
480
|
class << self
|
469
481
|
attr_accessor :version
|
470
482
|
end
|
471
|
-
@version = "1.1.
|
483
|
+
@version = "1.1.7"
|
472
484
|
|
473
485
|
def Coopy.compare_tables(local,remote)
|
474
486
|
ct = ::Coopy::CompareTable.new
|
@@ -642,7 +654,7 @@ module Coopy
|
|
642
654
|
txt += "\n"
|
643
655
|
end
|
644
656
|
end
|
645
|
-
::Haxe::Log._trace.call(txt,{ file_name: "Coopy.hx", line_number:
|
657
|
+
::Haxe::Log._trace.call(txt,{ file_name: "Coopy.hx", line_number: 627, class_name: "coopy.Coopy", method_name: "show"})
|
646
658
|
end
|
647
659
|
|
648
660
|
def Coopy.jsonify(t)
|
data/lib/lib/coopy/table_io.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
module Coopy
|
5
|
+
class TerminalDiffRender
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
end
|
9
|
+
|
10
|
+
def render(t)
|
11
|
+
csv = ::Coopy::Csv.new
|
12
|
+
result = ""
|
13
|
+
w = t.get_width
|
14
|
+
h = t.get_height
|
15
|
+
txt = ""
|
16
|
+
v = t.get_cell_view
|
17
|
+
tt = ::Coopy::TableText.new(t)
|
18
|
+
codes = {}
|
19
|
+
codes["header"] = "\x1B[0;1m"
|
20
|
+
codes["add"] = "\x1B[32;1m"
|
21
|
+
codes["conflict"] = "\x1B[33;1m"
|
22
|
+
codes["modify"] = "\x1B[34;1m"
|
23
|
+
codes["remove"] = "\x1B[31;1m"
|
24
|
+
codes["done"] = "\x1B[0m"
|
25
|
+
begin
|
26
|
+
_g = 0
|
27
|
+
while(_g < h)
|
28
|
+
y = _g
|
29
|
+
_g+=1
|
30
|
+
begin
|
31
|
+
_g1 = 0
|
32
|
+
while(_g1 < w)
|
33
|
+
x = _g1
|
34
|
+
_g1+=1
|
35
|
+
txt += "," if x > 0
|
36
|
+
val = tt.get_cell_text(x,y)
|
37
|
+
val = "" if val == nil
|
38
|
+
cell = ::Coopy::DiffRender.render_cell(tt,x,y)
|
39
|
+
code = nil
|
40
|
+
code = codes[cell.category] if cell.category != nil
|
41
|
+
if code != nil
|
42
|
+
if cell.rvalue != nil
|
43
|
+
val = _hx_str(codes["remove"]) + _hx_str(cell.lvalue) + _hx_str(codes["modify"]) + _hx_str(cell.separator) + _hx_str(codes["add"]) + _hx_str(cell.rvalue) + _hx_str(codes["done"])
|
44
|
+
val = _hx_str(codes["conflict"]) + _hx_str(cell.pvalue) + _hx_str(codes["modify"]) + _hx_str(cell.separator) + _hx_str(val) if cell.pvalue != nil
|
45
|
+
else
|
46
|
+
val = _hx_str(code) + _hx_str(val) + _hx_str(codes["done"])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
txt += csv.render_cell(v,val)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
txt += "\r\n"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
return txt
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
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.1.
|
4
|
+
version: 1.1.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-07-
|
13
|
+
date: 2014-07-17 00:00:00.000000000 Z
|
14
14
|
dependencies: []
|
15
15
|
description: Diff and patch tables
|
16
16
|
email:
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/lib/coopy/cross_match.rb
|
43
43
|
- lib/lib/coopy/table_diff.rb
|
44
44
|
- lib/lib/coopy/alignment.rb
|
45
|
+
- lib/lib/coopy/terminal_diff_render.rb
|
45
46
|
- lib/lib/coopy/table_modifier.rb
|
46
47
|
- lib/lib/coopy/highlight_patch.rb
|
47
48
|
- lib/lib/coopy/table_text.rb
|
@@ -127,42 +128,37 @@ summary: ! '[ daff
|
136
|
-
|
137
|
-
--
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
[
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
``` We can now compute the alignment between the rows and columns in the two tables:
|
160
|
-
```js var alignment = daff.compareTables(table1,table2).align(); ``` To produce
|
161
|
-
a diff from the alignment, we first need a table for the output: ```js var data_diff
|
162
|
-
= []; var table_diff = new daff.TableView(data_diff); ``` Using default options
|
163
|
-
for the diff: ```js var flags = new daff.CompareFlags(); var highlighter = new daff.TableDiff(alignment,flags);
|
164
|
-
highlighter.hilite(table_diff); ``` The diff is now in `data_diff` in highlighter
|
165
|
-
format, see specification here: > http://share.find.coop/doc/spec_hilite.html ```js
|
138
|
+
insert, delete) daff diff --git path old-file old-hex old-mode new-file new-hex
|
139
|
+
new-mode --git: process arguments provided by git to diff drivers daff
|
140
|
+
render [--output OUTPUT.html] [--css CSS.css] [--fragment] [--plain] diff.csv --css
|
141
|
+
CSS.css: generate a suitable css file to go with the html --fragment: generate
|
142
|
+
just a html fragment rather than a page --plain: do not use fancy utf8 characters
|
143
|
+
to make arrows prettier ```` Using with git -------------- Run `daff git csv`
|
144
|
+
to install daff as a diff and merge handler for `*.csv` files in your repository. Run
|
145
|
+
`daff git` for instructions on doing this manually. The library ----------- You
|
146
|
+
can use `daff` as a library from any supported language. We take here the example
|
147
|
+
of Javascript. To use `daff` on a webpage, first include `daff.js`: ```html <script
|
148
|
+
src="daff.js"></script> ``` Or if using node outside the browser: ```js var daff
|
149
|
+
= require(''daff''); ``` For concreteness, assume we have two versions of a table,
|
150
|
+
`data1` and `data2`: ```js var data1 = [ [''Country'',''Capital''], [''Ireland'',''Dublin''],
|
151
|
+
[''France'',''Paris''], [''Spain'',''Barcelona''] ]; var data2 = [ [''Country'',''Code'',''Capital''],
|
152
|
+
[''Ireland'',''ie'',''Dublin''], [''France'',''fr'',''Paris''], [''Spain'',''es'',''Madrid''],
|
153
|
+
[''Germany'',''de'',''Berlin''] ]; ``` To make those tables accessible to the library,
|
154
|
+
we wrap them in `daff.TableView`: ```js var table1 = new daff.TableView(data1);
|
155
|
+
var table2 = new daff.TableView(data2); ``` We can now compute the alignment between
|
156
|
+
the rows and columns in the two tables: ```js var alignment = daff.compareTables(table1,table2).align();
|
157
|
+
``` To produce a diff from the alignment, we first need a table for the output:
|
158
|
+
```js var data_diff = []; var table_diff = new daff.TableView(data_diff); ``` Using
|
159
|
+
default options for the diff: ```js var flags = new daff.CompareFlags(); var highlighter
|
160
|
+
= new daff.TableDiff(alignment,flags); highlighter.hilite(table_diff); ``` The
|
161
|
+
diff is now in `data_diff` in highlighter format, see specification here: > http://share.find.coop/doc/spec_hilite.html ```js
|
166
162
|
[ [ ''!'', '''', ''+++'', '''' ], [ ''@@'', ''Country'', ''Code'', ''Capital'' ],
|
167
163
|
[ ''+'', ''Ireland'', ''ie'', ''Dublin'' ], [ ''+'', ''France'', ''fr'', ''Paris''
|
168
164
|
], [ ''->'', ''Spain'', ''es'', ''Barcelona->Madrid'' ], [ ''+++'', ''Germany'',
|