12
12
name: <name>
13
13
expression: <expression>
14
14
comment: <comment>
15
+ labels: <labels>
15
16
```
16
17
17
18
The printed line information refers to the extracted content (can be dumped
18
19
with flag -d
19
20
20
21
"""
21
22
22
- import tmTable
23
-
24
23
import datetime
25
24
import difflib
26
- import logging
27
- import sys , os
25
+ import os
26
+ import sys
27
+
28
+ import tmTable
28
29
29
30
from . import __version__
30
31
@@ -37,7 +38,7 @@ class TTY:
37
38
blue = "\033 [34m"
38
39
magenta = "\033 [35m"
39
40
40
- class Diffable ( object ) :
41
+ class Diffable :
41
42
"""Implements a diffabel object. To be inherited by classes defining class
42
43
attribute `sorted_attribuites`.
43
44
"""
@@ -57,19 +58,18 @@ def fmt_attr(self, attr):
57
58
"""
58
59
return "{0}: {1}" .format (attr , getattr (self , attr ))
59
60
60
- def to_diff (self , skip = [] ):
61
+ def to_diff (self , skip = None ):
61
62
"""Returns diff-able list of attributes for unified diff.
62
63
>>> o.to_diff()
63
64
['foo: 42', 'bar: baz']
64
65
>>> o.to_diff(skip=['bar']) # skip attributes
65
66
['foo: 42']
66
67
"""
68
+ skip = skip or []
67
69
return [self .fmt_attr (attr ) for attr in self .sorted_attributes if attr not in skip ]
68
70
69
71
class Meta (Diffable ):
70
- """Simple menu metadata container.
71
- >>> meta = Meta(**row)
72
- """
72
+ """Diffable menu metadata container."""
73
73
74
74
sorted_attributes = (
75
75
'name' ,
@@ -83,9 +83,7 @@ class Meta(Diffable):
83
83
)
84
84
85
85
class Algorithm (Diffable ):
86
- """Simple algorithm container.
87
- >>> algorithm = Algorithm(**row)
88
- """
86
+ """Diffable algorithm container."""
89
87
90
88
sorted_attributes = (
91
89
'index' ,
@@ -94,15 +92,18 @@ class Algorithm(Diffable):
94
92
'name' ,
95
93
'expression' ,
96
94
'comment' ,
95
+ 'labels' ,
97
96
)
98
97
99
98
report_attributes = (
100
99
'index' ,
101
100
'name' ,
102
101
'expression' ,
102
+ 'labels' ,
103
103
)
104
104
105
105
class Cut (Diffable ):
106
+ """Diffable cut container."""
106
107
107
108
sorted_attributes = (
108
109
'name' ,
@@ -114,7 +115,7 @@ class Cut(Diffable):
114
115
'comment' ,
115
116
)
116
117
117
- class Menu ( object ) :
118
+ class Menu :
118
119
"""Simple menu container."""
119
120
120
121
def __init__ (self , filename ):
@@ -175,7 +176,7 @@ def dump_intermediate(self, outdir=None):
175
176
if not outdir :
176
177
outdir = os .getcwd ()
177
178
filename = "{0}.txt" .format (os .path .basename (self .filename ))
178
- with open (os .path .join (outdir , filename ), 'wb ' ) as fp :
179
+ with open (os .path .join (outdir , filename ), 'w ' ) as fp :
179
180
for line in self .to_diff ():
180
181
fp .write (line )
181
182
fp .write (os .linesep )
@@ -184,9 +185,6 @@ def report_diff(fromfile, tofile, verbose=False, ostream=sys.stdout):
184
185
"""Perform simple diff on two menus in TWiki format for reports.
185
186
>>> report_diff(fromfile, tofile)
186
187
"""
187
- fromlist = fromfile .to_diff ()
188
- tolist = tofile .to_diff ()
189
-
190
188
from_algorithms = {}
191
189
to_algorithms = {}
192
190
@@ -207,7 +205,7 @@ def added_algorithms(a, b):
207
205
removed = added_algorithms (fromfile , tofile )
208
206
updated = []
209
207
210
- for name , fromalgorithm in from_algorithms .iteritems ():
208
+ for name , fromalgorithm in from_algorithms .items ():
211
209
if name in to_algorithms :
212
210
toalgorithm = to_algorithms [name ]
213
211
differences = []
@@ -254,38 +252,51 @@ def unified_diff(fromfile, tofile, verbose=False, ostream=sys.stdout):
254
252
fromlines = fromfile .to_diff ()
255
253
tolines = tofile .to_diff ()
256
254
255
+ def write_added (line ):
256
+ if ostream .isatty ():
257
+ ostream .write (TTY .green )
258
+ ostream .write (line )
259
+ if ostream .isatty ():
260
+ ostream .write (TTY .clear )
261
+
262
+ def write_removed (line ):
263
+ if ostream .isatty ():
264
+ ostream .write (TTY .red )
265
+ ostream .write (line )
266
+ if ostream .isatty ():
267
+ ostream .write (TTY .clear )
268
+
269
+ def write_marker (line ):
270
+ if ostream .isatty ():
271
+ ostream .write (TTY .yellow )
272
+ ostream .write (line )
273
+ if ostream .isatty ():
274
+ ostream .write (TTY .clear )
275
+
276
+ def write_match (line ):
277
+ ostream .write (line )
278
+
279
+ count = 0
257
280
for line in difflib .unified_diff (fromlines , tolines , fromfile = fromfile .filename , tofile = tofile .filename , lineterm = "" ):
281
+ if count :
282
+ ostream .write (os .linesep )
258
283
# Print added lines
259
284
if line .startswith ('+' ):
260
- if ostream .isatty ():
261
- ostream .write (TTY .green )
262
- ostream .write (os .linesep )
263
- ostream .write (line )
264
- if ostream .isatty ():
265
- ostream .write (TTY .clear )
285
+ write_added (line )
266
286
# Print removed lines
267
287
elif line .startswith ('-' ):
268
- if ostream .isatty ():
269
- ostream .write (TTY .red )
270
- ostream .write (os .linesep )
271
- ostream .write (line )
272
- if ostream .isatty ():
273
- ostream .write (TTY .clear )
288
+ write_removed (line )
274
289
# Print diff markers
275
290
elif line .startswith ('@@' ):
276
- if ostream .isatty ():
277
- ostream .write (TTY .yellow )
278
- ostream .write (os .linesep )
279
- ostream .write (line )
280
- if ostream .isatty ():
281
- ostream .write (TTY .clear )
291
+ write_marker (line )
282
292
# Print matching lines
283
293
else :
284
- ostream .write (os .linesep )
285
- if ostream .isatty ():
286
- ostream .write (TTY .clear )
287
- ostream .write (line )
288
- ostream .write (os .linesep )
294
+ write_match (line )
295
+ count += 1
296
+
297
+ # Omit newline if nothing was written.
298
+ if count :
299
+ ostream .write (os .linesep )
289
300
290
301
def context_diff (fromfile , tofile , verbose = False , ostream = sys .stdout ):
291
302
"""Perform context diff on two menus.
@@ -294,46 +305,61 @@ def context_diff(fromfile, tofile, verbose=False, ostream=sys.stdout):
294
305
fromlines = fromfile .to_diff ()
295
306
tolines = tofile .to_diff ()
296
307
308
+ def write_added (line ):
309
+ if ostream .isatty ():
310
+ ostream .write (TTY .green )
311
+ ostream .write (line )
312
+ if ostream .isatty ():
313
+ ostream .write (TTY .clear )
314
+
315
+ def write_removed (line ):
316
+ if ostream .isatty ():
317
+ ostream .write (TTY .red )
318
+ ostream .write (line )
319
+ if ostream .isatty ():
320
+ ostream .write (TTY .clear )
321
+
322
+ def write_changed (line ):
323
+ if ostream .isatty ():
324
+ ostream .write (TTY .magenta )
325
+ ostream .write (line )
326
+ if ostream .isatty ():
327
+ ostream .write (TTY .clear )
328
+
329
+ def write_marker (line ):
330
+ if ostream .isatty ():
331
+ ostream .write (TTY .yellow )
332
+ ostream .write (line )
333
+ if ostream .isatty ():
334
+ ostream .write (TTY .clear )
335
+
336
+ def write_match (line ):
337
+ ostream .write (line )
338
+
339
+ count = 0
297
340
for line in difflib .context_diff (fromlines , tolines , fromfile = fromfile .filename , tofile = tofile .filename , lineterm = "" ):
341
+ if count :
342
+ ostream .write (os .linesep )
298
343
# Print added lines
299
344
if line .startswith ('+ ' ):
300
- if ostream .isatty ():
301
- ostream .write (TTY .green )
302
- ostream .write (os .linesep )
303
- ostream .write (line )
304
- if ostream .isatty ():
305
- ostream .write (TTY .clear )
345
+ write_added (line )
306
346
# Print removed lines
307
347
elif line .startswith ('- ' ):
308
- if ostream .isatty ():
309
- ostream .write (TTY .red )
310
- ostream .write (os .linesep )
311
- ostream .write (line )
312
- if ostream .isatty ():
313
- ostream .write (TTY .clear )
348
+ write_removed (line )
314
349
# Print changed lines
315
350
elif line .startswith ('! ' ):
316
- if ostream .isatty ():
317
- ostream .write (TTY .magenta )
318
- ostream .write (os .linesep )
319
- ostream .write (line )
320
- if ostream .isatty ():
321
- ostream .write (TTY .clear )
351
+ write_changed (line )
322
352
# Print diff markers
323
353
elif line .startswith ('---' ) or line .startswith ('***' ):
324
- if ostream .isatty ():
325
- ostream .write (TTY .yellow )
326
- ostream .write (os .linesep )
327
- ostream .write (line )
328
- if ostream .isatty ():
329
- ostream .write (TTY .clear )
354
+ write_marker (line )
330
355
# Print matching lines
331
356
else :
332
- ostream .write (os .linesep )
333
- if ostream .isatty ():
334
- ostream .write (TTY .clear )
335
- ostream .write (line )
336
- ostream .write (os .linesep )
357
+ write_match (line )
358
+ count += 1
359
+
360
+ # Omit newline if nothing was written.
361
+ if count :
362
+ ostream .write (os .linesep )
337
363
338
364
def html_diff (fromfile , tofile , verbose = False , ostream = sys .stdout ):
339
365
"""Perform diff on two menus and writes results to HTML table.
0 commit comments