daff 1.1.19 → 1.2.1

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.
@@ -42,8 +42,6 @@ module Coopy
42
42
  attr_accessor :col_permutation_rev
43
43
  attr_accessor :have_dropped_columns
44
44
 
45
- public
46
-
47
45
  def reset
48
46
  @header = {}
49
47
  @header_pre = {}
@@ -70,6 +68,8 @@ module Coopy
70
68
  @have_dropped_columns = false
71
69
  end
72
70
 
71
+ public
72
+
73
73
  def apply
74
74
  self.reset
75
75
  return true if @patch.get_width < 2
@@ -133,9 +133,9 @@ module Coopy
133
133
  state = ::Coopy::TableComparisonState.new
134
134
  state.a = @source
135
135
  state.b = @source
136
- comp = ::Coopy::CompareTable.new
136
+ comp = ::Coopy::CompareTable.new(state)
137
137
  comp.store_indexes
138
- comp.attach(state)
138
+ comp.run
139
139
  comp.align
140
140
  @indexes = comp.get_indexes
141
141
  self.need_source_columns
@@ -515,7 +515,7 @@ module Coopy
515
515
  ::Coopy::DiffRender.examine_cell(0,0,txt,"",@row_info.value,"",@cell_info)
516
516
  next if !@cell_info.updated
517
517
  next if @cell_info.conflicted
518
- d = @view.to_datum(@csv.parse_single_cell(@cell_info.rvalue))
518
+ d = @view.to_datum(@csv.parse_cell(@cell_info.rvalue))
519
519
  @source.set_cell(@patch_in_source_col[c1],mod1.dest_row,d)
520
520
  end
521
521
  end
@@ -7,8 +7,12 @@ module Coopy
7
7
  def initialize
8
8
  end
9
9
 
10
+ # protected - in ruby this doesn't play well with static/inline methods
11
+
10
12
  attr_accessor :lst
11
13
 
14
+ public
15
+
12
16
  def add(i)
13
17
  @lst = Array.new if @lst == nil
14
18
  @lst.push(i)
@@ -18,11 +18,6 @@ module Coopy
18
18
 
19
19
  public
20
20
 
21
- def add_column(i)
22
- @ia.add_column(i)
23
- @ib.add_column(i)
24
- end
25
-
26
21
  def add_columns(ca,cb)
27
22
  @ia.add_column(ca)
28
23
  @ib.add_column(cb)
@@ -27,8 +27,6 @@ module Coopy
27
27
  attr_accessor :column_mix_remote
28
28
  attr_accessor :conflicts
29
29
 
30
- public
31
-
32
30
  def shuffle_dimension(dim_units,len,fate,cl,cr)
33
31
  at = 0
34
32
  begin
@@ -96,6 +94,8 @@ module Coopy
96
94
  @local.insert_or_delete_rows(fate,hfate)
97
95
  end
98
96
 
97
+ public
98
+
99
99
  def apply
100
100
  @conflicts = 0
101
101
  ct = ::Coopy::Coopy.compare_tables3(@parent,@local,@remote)
@@ -174,6 +174,8 @@ module Coopy
174
174
  return @conflicts
175
175
  end
176
176
 
177
+ # protected - in ruby this doesn't play well with static/inline methods
178
+
177
179
  def Merger.make_conflicted_cell(view,pcell,lcell,rcell)
178
180
  return view.to_datum("((( " + _hx_str(view.to_s(pcell)) + " ))) " + _hx_str(view.to_s(lcell)) + " /// " + _hx_str(view.to_s(rcell)))
179
181
  end
@@ -4,9 +4,6 @@
4
4
  module Coopy
5
5
  class Mover
6
6
 
7
- def initialize
8
- end
9
-
10
7
  def Mover.move_units(units)
11
8
  isrc = Array.new
12
9
  idest = Array.new
@@ -59,7 +56,7 @@ module Coopy
59
56
  return ::Coopy::Mover.move_without_extras(isrc,idest)
60
57
  end
61
58
 
62
- def Mover.move_with_extras(isrc,idest)
59
+ def Mover.move(isrc,idest)
63
60
  len = isrc.length
64
61
  len2 = idest.length
65
62
  in_src = {}
@@ -110,6 +107,8 @@ module Coopy
110
107
  return ::Coopy::Mover.move_without_extras(src,dest)
111
108
  end
112
109
 
110
+ # protected - in ruby this doesn't play well with static/inline methods
111
+
113
112
  def Mover.move_without_extras(src,dest)
114
113
  return nil if src.length != dest.length
115
114
  return [] if src.length <= 1
@@ -26,8 +26,6 @@ module Coopy
26
26
  def height=(__v) @height = __v end
27
27
  def width() get_width end
28
28
  def width=(__v) @width = __v end
29
- def size() get_size end
30
- def size=(__v) @size = __v end
31
29
 
32
30
  def get_width
33
31
  return @w
@@ -37,10 +35,6 @@ module Coopy
37
35
  return @h
38
36
  end
39
37
 
40
- def get_size
41
- return @h
42
- end
43
-
44
38
  def get_cell(x,y)
45
39
  return @data[x + y * @w]
46
40
  end
@@ -214,6 +208,28 @@ module Coopy
214
208
  return nil
215
209
  end
216
210
 
211
+ def clone
212
+ result = ::Coopy::SimpleTable.new(self.get_width,self.get_height)
213
+ begin
214
+ _g1 = 0
215
+ _g = self.get_height
216
+ while(_g1 < _g)
217
+ i = _g1
218
+ _g1+=1
219
+ begin
220
+ _g3 = 0
221
+ _g2 = self.get_width
222
+ while(_g3 < _g2)
223
+ j = _g3
224
+ _g3+=1
225
+ result.set_cell(j,i,self.get_cell(j,i))
226
+ end
227
+ end
228
+ end
229
+ end
230
+ return result
231
+ end
232
+
217
233
  def SimpleTable.table_to_string(tab)
218
234
  x = ""
219
235
  begin
@@ -241,6 +257,30 @@ module Coopy
241
257
  return x
242
258
  end
243
259
 
260
+ def SimpleTable.table_is_similar(tab1,tab2)
261
+ return false if tab1.get_width != tab2.get_width
262
+ return false if tab1.get_height != tab2.get_height
263
+ v = tab1.get_cell_view
264
+ begin
265
+ _g1 = 0
266
+ _g = tab1.get_height
267
+ while(_g1 < _g)
268
+ i = _g1
269
+ _g1+=1
270
+ begin
271
+ _g3 = 0
272
+ _g2 = tab1.get_width
273
+ while(_g3 < _g2)
274
+ j = _g3
275
+ _g3+=1
276
+ return false if !v.equals(tab1.get_cell(j,i),tab2.get_cell(j,i))
277
+ end
278
+ end
279
+ end
280
+ end
281
+ return true
282
+ end
283
+
244
284
  haxe_me
245
285
  end
246
286
 
@@ -12,18 +12,6 @@ module Coopy
12
12
  return "" + _hx_str(d.to_s)
13
13
  end
14
14
 
15
- def get_bag(d)
16
- return nil
17
- end
18
-
19
- def get_table(d)
20
- return nil
21
- end
22
-
23
- def has_structure(d)
24
- return false
25
- end
26
-
27
15
  def equals(d1,d2)
28
16
  return true if d1 == nil && d2 == nil
29
17
  return true if d1 == nil && "" + _hx_str(d2.to_s) == ""
@@ -15,6 +15,7 @@ module Coopy
15
15
  def get_width() puts "Abstract Table.get_width called" end
16
16
  def get_height() puts "Abstract Table.get_height called" end
17
17
  def getData() puts "Abstract Table.getData called" end
18
+ def clone() puts "Abstract Table.clone called" end
18
19
  haxe_me
19
20
  end
20
21
 
@@ -22,6 +22,8 @@ module Coopy
22
22
  @builder = builder
23
23
  end
24
24
 
25
+ protected
26
+
25
27
  def get_separator(t,t2,root)
26
28
  sep = root
27
29
  w = t.get_width
@@ -91,8 +93,6 @@ module Coopy
91
93
  return str
92
94
  end
93
95
 
94
- protected
95
-
96
96
  def is_reordered(m,ct)
97
97
  reordered = false
98
98
  l = -1
@@ -4,20 +4,20 @@
4
4
  module Coopy
5
5
  class TableText
6
6
 
7
- def initialize(rows)
8
- @rows = rows
9
- @view = rows.get_cell_view
7
+ def initialize(tab)
8
+ @tab = tab
9
+ @view = tab.get_cell_view
10
10
  end
11
11
 
12
12
  protected
13
13
 
14
- attr_accessor :rows
14
+ attr_accessor :tab
15
15
  attr_accessor :view
16
16
 
17
17
  public
18
18
 
19
19
  def get_cell_text(x,y)
20
- return @view.to_s(@rows.get_cell(x,y))
20
+ return @view.to_s(@tab.get_cell(x,y))
21
21
  end
22
22
 
23
23
  haxe_me
@@ -57,6 +57,8 @@ module Coopy
57
57
  return false
58
58
  end
59
59
 
60
+ # protected - in ruby this doesn't play well with static/inline methods
61
+
60
62
  def Unit.describe(i)
61
63
  if i >= 0
62
64
  return "" + _hx_str(i)
@@ -4,9 +4,6 @@
4
4
  module Coopy
5
5
  class View
6
6
  def toString(d) puts "Abstract View.toString called" end
7
- def getBag(d) puts "Abstract View.getBag called" end
8
- def getTable(d) puts "Abstract View.getTable called" end
9
- def hasStructure(d) puts "Abstract View.hasStructure called" end
10
7
  def equals(d1,d2) puts "Abstract View.equals called" end
11
8
  def toDatum(str) puts "Abstract View.toDatum called" end
12
9
  haxe_me
@@ -41,11 +41,15 @@ module Coopy
41
41
  @path.resize(1,@t,-1)
42
42
  end
43
43
 
44
+ protected
45
+
44
46
  def assert_mode(_next)
45
47
  @index+=1 if _next == 0 && @mode == 1
46
48
  @mode = _next
47
49
  end
48
50
 
51
+ public
52
+
49
53
  def add_transition(s0,s1,c)
50
54
  resize = false
51
55
  if s0 >= @k
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.19
4
+ version: 1.2.1
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-10-24 00:00:00.000000000 Z
13
+ date: 2014-10-28 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Diff and patch tables
16
16
  email:
@@ -32,13 +32,10 @@ files:
32
32
  - lib/lib/hx_overrides.rb
33
33
  - lib/lib/coopy/simple_table.rb
34
34
  - lib/lib/coopy/cell_builder.rb
35
- - lib/lib/coopy/workspace.rb
36
35
  - lib/lib/coopy/compare_table.rb
37
36
  - lib/lib/coopy/table_io.rb
38
37
  - lib/lib/coopy/flat_cell_builder.rb
39
- - lib/lib/coopy/compare.rb
40
38
  - lib/lib/coopy/index_item.rb
41
- - lib/lib/coopy/simple_cell.rb
42
39
  - lib/lib/coopy/index_pair.rb
43
40
  - lib/lib/coopy/diff_render.rb
44
41
  - lib/lib/coopy/cross_match.rb
@@ -50,11 +47,8 @@ files:
50
47
  - lib/lib/coopy/table_text.rb
51
48
  - lib/lib/coopy/simple_view.rb
52
49
  - lib/lib/coopy/row.rb
53
- - lib/lib/coopy/change_type.rb
54
50
  - lib/lib/coopy/index.rb
55
- - lib/lib/coopy/bag.rb
56
51
  - lib/lib/coopy/coopy.rb
57
- - lib/lib/coopy/viewed_datum.rb
58
52
  - lib/lib/coopy/cell_info.rb
59
53
  - lib/lib/coopy/view.rb
60
54
  - lib/lib/coopy/highlight_patch_unit.rb
@@ -65,17 +59,13 @@ files:
65
59
  - lib/lib/coopy/csv.rb
66
60
  - lib/lib/coopy/ordering.rb
67
61
  - lib/lib/coopy/merger.rb
68
- - lib/lib/coopy/change.rb
69
62
  - lib/lib/coopy/sparse_sheet.rb
70
- - lib/lib/coopy/report.rb
71
63
  - lib/lib/coopy/table.rb
72
64
  - lib/lib/coopy/viterbi.rb
73
65
  - lib/lib/list.rb
74
66
  - lib/lib/sys/io/hx_file.rb
75
67
  - lib/lib/sys/io/file_output.rb
76
- - lib/lib/sys/io/file.rb
77
68
  - lib/lib/sys/io/file_handle.rb
78
- - lib/lib/_list/list_iterator.rb
79
69
  - lib/lib/x_list/list_iterator.rb
80
70
  - lib/lib/string_buf.rb
81
71
  - lib/lib/haxe/imap.rb
@@ -87,12 +77,10 @@ files:
87
77
  - lib/lib/haxe/io/bytes.rb
88
78
  - lib/lib/haxe/io/error.rb
89
79
  - lib/lib/haxe/io/output.rb
90
- - lib/lib/haxe/log.rb
91
80
  - lib/lib/haxe/ds/int_map.rb
92
81
  - lib/lib/haxe/ds/string_map.rb
93
82
  - lib/lib/haxe/format/json_parser.rb
94
83
  - lib/lib/haxe/format/json_printer.rb
95
- - lib/lib/sys.rb
96
84
  - bin/daff.rb
97
85
  - README.md
98
86
  homepage: https://github.com/paulfitz/daff
@@ -127,50 +115,51 @@ summary: ! '[![Build Status](https://travis-ci.org/paulfitz/daff.svg?branch=mast
127
115
  data diff =============== This is a library for comparing tables, producing a summary
128
116
  of their differences, and using such a summary as a patch file. It is optimized
129
117
  for comparing tables that share a common origin, in other words multiple versions
130
- of the "same" table. For a live demo, see: > http://paulfitz.github.com/daff/ Download
131
- the code for your preferred language here: > https://github.com/paulfitz/daff/releases For
132
- certain languages you can use the command-line: ````sh npm install daff -g # node/javascript
118
+ of the "same" table. For a live demo, see: > http://paulfitz.github.com/daff/ Install
119
+ the library for your favorite language: ````sh npm install daff -g # node/javascript
133
120
  pip3 install daff # python3 gem install daff # ruby composer require paulfitz/daff-php #
134
- php ```` Or use the library to view csv diffs on github via a chrome extension:
135
- > https://github.com/theodi/csvhub The diff format used by `daff` is specified
136
- here: > http://dataprotocols.org/tabular-diff-format/ This library is a stripped
137
- down version of the coopy toolbox (see http://share.find.coop). To compare tables
138
- from different origins, or with automatically generated IDs, or other complications,
139
- check out the coopy toolbox. The program ----------- You can run `daff`/`daff.py`/`daff.rb`
140
- as a utility program: ```` $ daff daff can produce and apply tabular diffs. Call
141
- as: daff [--output OUTPUT.csv] a.csv b.csv daff [--output OUTPUT.csv] parent.csv
142
- a.csv b.csv daff [--output OUTPUT.jsonbook] a.jsonbook b.jsonbook daff patch [--inplace]
143
- [--output OUTPUT.csv] a.csv patch.csv daff merge [--inplace] [--output OUTPUT.csv]
144
- parent.csv a.csv b.csv daff trim [--output OUTPUT.csv] source.csv daff render [--output
145
- OUTPUT.html] diff.csv daff git daff version The --inplace option to patch and merge
146
- will result in modification of a.csv. If you need more control, here is the full
147
- list of flags: daff diff [--output OUTPUT.csv] [--context NUM] [--all] [--act ACT]
148
- a.csv b.csv --context NUM: show NUM rows of context --all: do not prune
149
- unchanged rows --act ACT: show only a certain kind of change (update, insert,
150
- delete) daff diff --git path old-file old-hex old-mode new-file new-hex new-mode
151
- --git: process arguments provided by git to diff drivers daff render [--output
152
- OUTPUT.html] [--css CSS.css] [--fragment] [--plain] diff.csv --css CSS.css: generate
153
- a suitable css file to go with the html --fragment: generate just a html fragment
154
- rather than a page --plain: do not use fancy utf8 characters to make arrows
155
- prettier ```` Using with git -------------- Run `daff git csv` to install daff
156
- as a diff and merge handler for `*.csv` files in your repository. Run `daff git`
157
- for instructions on doing this manually. The library ----------- You can use `daff`
158
- as a library from any supported language. We take here the example of Javascript. To
159
- use `daff` on a webpage, first include `daff.js`: ```html <script src="daff.js"></script>
160
- ``` Or if using node outside the browser: ```js var daff = require(''daff''); ``` For
161
- concreteness, assume we have two versions of a table, `data1` and `data2`: ```js
162
- var data1 = [ [''Country'',''Capital''], [''Ireland'',''Dublin''], [''France'',''Paris''],
163
- [''Spain'',''Barcelona''] ]; var data2 = [ [''Country'',''Code'',''Capital''], [''Ireland'',''ie'',''Dublin''],
164
- [''France'',''fr'',''Paris''], [''Spain'',''es'',''Madrid''], [''Germany'',''de'',''Berlin'']
165
- ]; ``` To make those tables accessible to the library, we wrap them in `daff.TableView`:
166
- ```js var table1 = new daff.TableView(data1); var table2 = new daff.TableView(data2);
167
- ``` We can now compute the alignment between the rows and columns in the two tables:
168
- ```js var alignment = daff.compareTables(table1,table2).align(); ``` To produce
169
- a diff from the alignment, we first need a table for the output: ```js var data_diff
170
- = []; var table_diff = new daff.TableView(data_diff); ``` Using default options
171
- for the diff: ```js var flags = new daff.CompareFlags(); var highlighter = new daff.TableDiff(alignment,flags);
172
- highlighter.hilite(table_diff); ``` The diff is now in `data_diff` in highlighter
173
- format, see specification here: > http://share.find.coop/doc/spec_hilite.html ```js
121
+ php ```` Other translations are available here: > https://github.com/paulfitz/daff/releases Or
122
+ use the library to view csv diffs on github via a chrome extension: > https://github.com/theodi/csvhub The
123
+ diff format used by `daff` is specified here: > http://dataprotocols.org/tabular-diff-format/ This
124
+ library is a stripped down version of the coopy toolbox (see http://share.find.coop). To
125
+ compare tables from different origins, or with automatically generated IDs, or
126
+ other complications, check out the coopy toolbox. The program ----------- You
127
+ can run `daff`/`daff.py`/`daff.rb` as a utility program: ```` $ daff daff can produce
128
+ and apply tabular diffs. Call as: daff [--output OUTPUT.csv] a.csv b.csv daff [--output
129
+ OUTPUT.csv] parent.csv a.csv b.csv daff [--output OUTPUT.jsonbook] a.jsonbook b.jsonbook
130
+ daff patch [--inplace] [--output OUTPUT.csv] a.csv patch.csv daff merge [--inplace]
131
+ [--output OUTPUT.csv] parent.csv a.csv b.csv daff trim [--output OUTPUT.csv] source.csv
132
+ daff render [--output OUTPUT.html] diff.csv daff git daff version The --inplace
133
+ option to patch and merge will result in modification of a.csv. If you need more
134
+ control, here is the full list of flags: daff diff [--output OUTPUT.csv] [--context
135
+ NUM] [--all] [--act ACT] a.csv b.csv --context NUM: show NUM rows of context --all: do
136
+ not prune unchanged rows --act ACT: show only a certain kind of change (update,
137
+ insert, delete) daff diff --git path old-file old-hex old-mode new-file new-hex
138
+ new-mode --git: process arguments provided by git to diff drivers daff
139
+ render [--output OUTPUT.html] [--css CSS.css] [--fragment] [--plain] diff.csv --css
140
+ CSS.css: generate a suitable css file to go with the html --fragment: generate
141
+ just a html fragment rather than a page --plain: do not use fancy utf8 characters
142
+ to make arrows prettier ```` Using with git -------------- Run `daff git csv`
143
+ to install daff as a diff and merge handler for `*.csv` files in your repository. Run
144
+ `daff git` for instructions on doing this manually. Your CSV diffs and merges will
145
+ get smarter, since git will suddenly understand about rows and columns, not just
146
+ lines: ![Example CSV diff](scripts/diff.png) The library ----------- You can
147
+ use `daff` as a library from any supported language. We take here the example
148
+ of Javascript. To use `daff` on a webpage, first include `daff.js`: ```html <script
149
+ src="daff.js"></script> ``` Or if using node outside the browser: ```js var daff
150
+ = require(''daff''); ``` For concreteness, assume we have two versions of a table,
151
+ `data1` and `data2`: ```js var data1 = [ [''Country'',''Capital''], [''Ireland'',''Dublin''],
152
+ [''France'',''Paris''], [''Spain'',''Barcelona''] ]; var data2 = [ [''Country'',''Code'',''Capital''],
153
+ [''Ireland'',''ie'',''Dublin''], [''France'',''fr'',''Paris''], [''Spain'',''es'',''Madrid''],
154
+ [''Germany'',''de'',''Berlin''] ]; ``` To make those tables accessible to the library,
155
+ we wrap them in `daff.TableView`: ```js var table1 = new daff.TableView(data1);
156
+ var table2 = new daff.TableView(data2); ``` We can now compute the alignment between
157
+ the rows and columns in the two tables: ```js var alignment = daff.compareTables(table1,table2).align();
158
+ ``` To produce a diff from the alignment, we first need a table for the output:
159
+ ```js var data_diff = []; var table_diff = new daff.TableView(data_diff); ``` Using
160
+ default options for the diff: ```js var flags = new daff.CompareFlags(); var highlighter
161
+ = new daff.TableDiff(alignment,flags); highlighter.hilite(table_diff); ``` The
162
+ diff is now in `data_diff` in highlighter format, see specification here: > http://share.find.coop/doc/spec_hilite.html ```js
174
163
  [ [ ''!'', '''', ''+++'', '''' ], [ ''@@'', ''Country'', ''Code'', ''Capital'' ],
175
164
  [ ''+'', ''Ireland'', ''ie'', ''Dublin'' ], [ ''+'', ''France'', ''fr'', ''Paris''
176
165
  ], [ ''->'', ''Spain'', ''es'', ''Barcelona->Madrid'' ], [ ''+++'', ''Germany'',
@@ -185,18 +174,18 @@ summary: ! '[![Build Status](https://travis-ci.org/paulfitz/daff.svg?branch=mast
185
174
  should find sample code in the packages on the [Releases](https://github.com/paulfitz/daff/releases)
186
175
  page. Supported languages ------------------- The `daff` library is written in
187
176
  [Haxe](http://haxe.org/), which can be translated reasonably well into at least
188
- the following languages: * Javascript * PHP * Python * Java * C# * C++ * (via a
189
- hack, just for `daff`) Ruby Some translations are done for you on the [Releases](https://github.com/paulfitz/daff/releases)
177
+ the following languages: * Javascript * Python * Java * C# * C++ * Ruby (using
178
+ an [unofficial haxe target](https://github.com/paulfitz/haxe) developed for `daff`) *
179
+ PHP Some translations are done for you on the [Releases](https://github.com/paulfitz/daff/releases)
190
180
  page. To make another translation, follow the [Haxe getting started tutorial](http://haxe.org/doc/start)
191
181
  for the language you care about, then do one of: ``` make js make php make py make
192
- java make cs make cpp ``` [@Floppy](https://github.com/Floppy) has made a lovingly-hand-written
193
- [native Ruby port](https://github.com/theodi/coopy-ruby) that covers core functionality. I''ve
194
- made a brutally-machine-converted port that is a full translation but less idiomatic. For
195
- each language, the `daff` library expects to be handed an interface to tables you
196
- create, rather than creating them itself. This is to avoid inefficient copies from
197
- one format to another. You''ll find a `SimpleTable` class you can use if you find
198
- this awkward. Reading material ---------------- * http://dataprotocols.org/tabular-diff-format/
199
- : a specification of the diff format we use. * http://theodi.org/blog/csvhub-github-diffs-for-csv-files
182
+ java make cs make cpp ``` For each language, the `daff` library expects to be handed
183
+ an interface to tables you create, rather than creating them itself. This is to
184
+ avoid inefficient copies from one format to another. You''ll find a `SimpleTable`
185
+ class you can use if you find this awkward. API documentation ----------------- *
186
+ You can browse the `daff` classes at http://paulfitz.github.io/daff-doc/ Reading
187
+ material ---------------- * http://dataprotocols.org/tabular-diff-format/ : a specification
188
+ of the diff format we use. * http://theodi.org/blog/csvhub-github-diffs-for-csv-files
200
189
  : using this library with github. * http://theodi.org/blog/adapting-git-simple-data
201
190
  : using this library with gitlab. * http://okfnlabs.org/blog/2013/08/08/diffing-and-patching-data.html
202
191
  : a summary of where the library came from. * http://blog.okfn.org/2013/07/02/git-and-github-for-data/