daff 1.1.6 → 1.1.7
Sign up to get free protection for your applications and to get access to all the features.
- 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: ! '[![Build Status](https://travis-ci.org/paulfitz/daff.svg?branch=mast
|
|
127
128
|
can run `daff`/`daff.py`/`daff.rb` as a utility program: ```` $ daff daff can produce
|
128
129
|
and apply tabular diffs. Call as: daff [--output OUTPUT.csv] a.csv b.csv daff [--output
|
129
130
|
OUTPUT.csv] parent.csv a.csv b.csv daff [--output OUTPUT.jsonbook] a.jsonbook b.jsonbook
|
130
|
-
daff patch [--output OUTPUT.csv]
|
131
|
-
|
132
|
-
|
133
|
-
|
131
|
+
daff patch [--inplace] [--output OUTPUT.csv] a.csv patch.csv daff merge [--inplace]
|
132
|
+
[--output OUTPUT.csv] parent.csv a.csv b.csv daff trim [--output OUTPUT.csv] source.csv
|
133
|
+
daff render [--output OUTPUT.html] diff.csv daff git daff version The --inplace
|
134
|
+
option to patch and merge will result in modification of a.csv. If you need more
|
135
|
+
control, here is the full list of flags: daff diff [--output OUTPUT.csv] [--context
|
136
|
+
NUM] [--all] [--act ACT] a.csv b.csv --context NUM: show NUM rows of context --all: do
|
134
137
|
not prune unchanged rows --act ACT: show only a certain kind of change (update,
|
135
|
-
insert, delete) 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'',
|