... | ... |
@@ -33,9 +33,9 @@ class MyDotWindow(xdot.DotWindow): |
33 | 33 |
|
34 | 34 |
def on_url_clicked(self, widget, url, event): |
35 | 35 |
dialog = Gtk.MessageDialog( |
36 |
- parent = self, |
|
37 |
- buttons = Gtk.ButtonsType.OK, |
|
38 |
- message_format="%s clicked" % url) |
|
36 |
+ parent=self, |
|
37 |
+ buttons=Gtk.ButtonsType.OK, |
|
38 |
+ message_format="%s clicked" % url) |
|
39 | 39 |
dialog.connect('response', lambda dialog, response: dialog.destroy()) |
40 | 40 |
dialog.run() |
41 | 41 |
return True |
... | ... |
@@ -68,7 +68,7 @@ Shortcuts: |
68 | 68 |
width = height = 512 |
69 | 69 |
if options.geometry: |
70 | 70 |
try: |
71 |
- width,height = (int(i) for i in options.geometry.split('x')) |
|
71 |
+ width, height = (int(i) for i in options.geometry.split('x')) |
|
72 | 72 |
except ValueError: |
73 | 73 |
parser.error('invalid window geometry') |
74 | 74 |
|
... | ... |
@@ -44,7 +44,9 @@ class ParseError(Exception): |
44 | 44 |
self.col = col |
45 | 45 |
|
46 | 46 |
def __str__(self): |
47 |
- return ':'.join([str(part) for part in (self.filename, self.line, self.col, self.msg) if part != None]) |
|
47 |
+ return ':'.join([str(part) for part in |
|
48 |
+ (self.filename, self.line, self.col, self.msg) |
|
49 |
+ if part is not None]) |
|
48 | 50 |
|
49 | 51 |
|
50 | 52 |
class Lexer: |
... | ... |
@@ -55,7 +57,7 @@ class Lexer: |
55 | 57 |
|
56 | 58 |
newline_re = re.compile(br'\r\n?|\n') |
57 | 59 |
|
58 |
- def __init__(self, buf = None, pos = 0, filename = None, fp = None): |
|
60 |
+ def __init__(self, buf=None, pos=0, filename=None, fp=None): |
|
59 | 61 |
if fp is not None: |
60 | 62 |
try: |
61 | 63 |
fileno = fp.fileno() |
... | ... |
@@ -69,7 +71,7 @@ class Lexer: |
69 | 71 |
# map the whole file into memory |
70 | 72 |
if length: |
71 | 73 |
# length must not be zero |
72 |
- buf = mmap.mmap(fileno, length, access = mmap.ACCESS_READ) |
|
74 |
+ buf = mmap.mmap(fileno, length, access=mmap.ACCESS_READ) |
|
73 | 75 |
pos = os.lseek(fileno, 0, 1) |
74 | 76 |
else: |
75 | 77 |
buf = b'' |
... | ... |
@@ -108,7 +110,7 @@ class Lexer: |
108 | 110 |
raise ParseError(msg, self.filename, line, col) |
109 | 111 |
else: |
110 | 112 |
break |
111 |
- return Token(type = type, text = text, line = line, col = col) |
|
113 |
+ return Token(type=type, text=text, line=line, col=col) |
|
112 | 114 |
|
113 | 115 |
def consume(self, text): |
114 | 116 |
# update line number |
... | ... |
@@ -124,7 +126,7 @@ class Lexer: |
124 | 126 |
if tabpos == -1: |
125 | 127 |
break |
126 | 128 |
self.col += tabpos - pos |
127 |
- self.col = ((self.col - 1)//self.tabsize + 1)*self.tabsize + 1 |
|
129 |
+ self.col = ((self.col - 1) // self.tabsize + 1) * self.tabsize + 1 |
|
128 | 130 |
pos = tabpos + 1 |
129 | 131 |
self.col += len(text) - pos |
130 | 132 |
|
... | ... |
@@ -68,19 +68,19 @@ class Parser: |
68 | 68 |
def match(self, type): |
69 | 69 |
if self.lookahead.type != type: |
70 | 70 |
raise ParseError( |
71 |
- msg = 'unexpected token %r' % self.lookahead.text, |
|
72 |
- filename = self.lexer.filename, |
|
73 |
- line = self.lookahead.line, |
|
74 |
- col = self.lookahead.col) |
|
71 |
+ msg='unexpected token {}'.format(self.lookahead.text), |
|
72 |
+ filename=self.lexer.filename, |
|
73 |
+ line=self.lookahead.line, |
|
74 |
+ col=self.lookahead.col) |
|
75 | 75 |
|
76 | 76 |
def skip(self, type): |
77 | 77 |
while self.lookahead.type != type: |
78 | 78 |
if self.lookahead.type == EOF: |
79 | 79 |
raise ParseError( |
80 |
- msg = 'unexpected end of file', |
|
81 |
- filename = self.lexer.filename, |
|
82 |
- line = self.lookahead.line, |
|
83 |
- col = self.lookahead.col) |
|
80 |
+ msg='unexpected end of file', |
|
81 |
+ filename=self.lexer.filename, |
|
82 |
+ line=self.lookahead.line, |
|
83 |
+ col=self.lookahead.col) |
|
84 | 84 |
self.consume() |
85 | 85 |
|
86 | 86 |
def consume(self): |
... | ... |
@@ -115,7 +115,7 @@ class XDotAttrParser: |
115 | 115 |
return res |
116 | 116 |
|
117 | 117 |
def skip_space(self): |
118 |
- while self.pos < len(self.buf) and self.buf[self.pos : self.pos + 1].isspace(): |
|
118 |
+ while self.pos < len(self.buf) and self.buf[self.pos:self.pos+1].isspace(): |
|
119 | 119 |
self.pos += 1 |
120 | 120 |
|
121 | 121 |
def read_int(self): |
... | ... |
@@ -439,7 +439,8 @@ class DotParser(Parser): |
439 | 439 |
else: |
440 | 440 |
port = None |
441 | 441 |
compass_pt = None |
442 |
- # XXX: we don't really care about port and compass point values when parsing xdot |
|
442 |
+ # XXX: we don't really care about port and compass point |
|
443 |
+ # values when parsing xdot |
|
443 | 444 |
return node_id |
444 | 445 |
|
445 | 446 |
def parse_id(self): |
... | ... |
@@ -463,7 +464,7 @@ class XDotParser(DotParser): |
463 | 464 |
XDOTVERSION = '1.7' |
464 | 465 |
|
465 | 466 |
def __init__(self, xdotcode): |
466 |
- lexer = DotLexer(buf = xdotcode) |
|
467 |
+ lexer = DotLexer(buf=xdotcode) |
|
467 | 468 |
DotParser.__init__(self, lexer) |
468 | 469 |
|
469 | 470 |
self.nodes = [] |
... | ... |
@@ -483,7 +484,8 @@ class XDotParser(DotParser): |
483 | 484 |
pass |
484 | 485 |
else: |
485 | 486 |
if float(xdotversion) > float(self.XDOTVERSION): |
486 |
- sys.stderr.write('warning: xdot version %s, but supported is %s\n' % (xdotversion, self.XDOTVERSION)) |
|
487 |
+ sys.stderr.write('warning: xdot version %s, but supported is %s\n' % |
|
488 |
+ (xdotversion, self.XDOTVERSION)) |
|
487 | 489 |
|
488 | 490 |
# Parse bounding box |
489 | 491 |
try: |
... | ... |
@@ -500,7 +502,7 @@ class XDotParser(DotParser): |
500 | 502 |
self.yscale = -1.0 |
501 | 503 |
# FIXME: scale from points to pixels |
502 | 504 |
|
503 |
- self.width = max(xmax - xmin, 1) |
|
505 |
+ self.width = max(xmax - xmin, 1) |
|
504 | 506 |
self.height = max(ymax - ymin, 1) |
505 | 507 |
|
506 | 508 |
self.top_graph = False |
... | ... |
@@ -54,10 +54,11 @@ class Scanner: |
54 | 54 |
flags = re.DOTALL |
55 | 55 |
if self.ignorecase: |
56 | 56 |
flags |= re.IGNORECASE |
57 |
- self.tokens_re = re.compile( |
|
58 |
- b'|'.join([b'(' + regexp + b')' for type, regexp, test_lit in self.tokens]), |
|
59 |
- flags |
|
60 |
- ) |
|
57 |
+ self.tokens_re = re.compile( |
|
58 |
+ b'|'.join([b'(' + regexp + b')' |
|
59 |
+ for type, regexp, test_lit in self.tokens]), |
|
60 |
+ flags |
|
61 |
+ ) |
|
61 | 62 |
|
62 | 63 |
def next(self, buf, pos): |
63 | 64 |
if pos >= len(buf): |
... | ... |
@@ -71,7 +72,7 @@ class Scanner: |
71 | 72 |
type = self.literals.get(text, type) |
72 | 73 |
return type, text, pos |
73 | 74 |
else: |
74 |
- c = buf[pos : pos + 1] |
|
75 |
+ c = buf[pos:pos+1] |
|
75 | 76 |
return self.symbols.get(c, None), c, pos + 1 |
76 | 77 |
|
77 | 78 |
|
... | ... |
@@ -81,11 +82,11 @@ class DotScanner(Scanner): |
81 | 82 |
tokens = [ |
82 | 83 |
# whitespace and comments |
83 | 84 |
(SKIP, |
84 |
- br'[ \t\f\r\n\v]+|' |
|
85 |
- br'//[^\r\n]*|' |
|
86 |
- br'/\*.*?\*/|' |
|
87 |
- br'#[^\r\n]*', |
|
88 |
- False), |
|
85 |
+ br'[ \t\f\r\n\v]+|' |
|
86 |
+ br'//[^\r\n]*|' |
|
87 |
+ br'/\*.*?\*/|' |
|
88 |
+ br'#[^\r\n]*', |
|
89 |
+ False), |
|
89 | 90 |
|
90 | 91 |
# Alphanumeric IDs |
91 | 92 |
(ID, br'[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*', True), |
... | ... |
@@ -25,7 +25,7 @@ from gi.repository import GLib |
25 | 25 |
|
26 | 26 |
class Animation(object): |
27 | 27 |
|
28 |
- step = 0.03 # seconds |
|
28 |
+ step = 0.03 # seconds |
|
29 | 29 |
|
30 | 30 |
def __init__(self, dot_widget): |
31 | 31 |
self.dot_widget = dot_widget |
... | ... |
@@ -45,7 +45,7 @@ class Animation(object): |
45 | 45 |
if not self.tick(): |
46 | 46 |
self.stop() |
47 | 47 |
return False |
48 |
- except e: |
|
48 |
+ except AttributeError as e: |
|
49 | 49 |
self.stop() |
50 | 50 |
raise e |
51 | 51 |
return True |
... | ... |
@@ -92,8 +92,8 @@ class MoveToAnimation(LinearAnimation): |
92 | 92 |
def animate(self, t): |
93 | 93 |
sx, sy = self.source_x, self.source_y |
94 | 94 |
tx, ty = self.target_x, self.target_y |
95 |
- self.dot_widget.x = tx * t + sx * (1-t) |
|
96 |
- self.dot_widget.y = ty * t + sy * (1-t) |
|
95 |
+ self.dot_widget.x = tx * t + sx * (1 - t) |
|
96 |
+ self.dot_widget.y = ty * t + sy * (1 - t) |
|
97 | 97 |
self.dot_widget.queue_draw() |
98 | 98 |
|
99 | 99 |
|
... | ... |
@@ -118,6 +118,6 @@ class ZoomToAnimation(MoveToAnimation): |
118 | 118 |
|
119 | 119 |
def animate(self, t): |
120 | 120 |
a, b, c = self.source_zoom, self.extra_zoom, self.target_zoom |
121 |
- self.dot_widget.zoom_ratio = c*t + b*t*(1-t) + a*(1-t) |
|
121 |
+ self.dot_widget.zoom_ratio = c*t + b*t*(1 - t) + a*(1 - t) |
|
122 | 122 |
self.dot_widget.zoom_to_fit_on_resize = False |
123 | 123 |
MoveToAnimation.animate(self, t) |
... | ... |
@@ -83,7 +83,8 @@ class TextShape(Shape): |
83 | 83 |
# 'TypeError: font_options must be a cairo.FontOptions or None' |
84 | 84 |
pass |
85 | 85 |
except KeyError: |
86 |
- # cairo.FontOptions is not registered as a foreign struct in older PyGObject versions. |
|
86 |
+ # cairo.FontOptions is not registered as a foreign |
|
87 |
+ # struct in older PyGObject versions. |
|
87 | 88 |
# https://git.gnome.org/browse/pygobject/commit/?id=b21f66d2a399b8c9a36a1758107b7bdff0ec8eaa |
88 | 89 |
pass |
89 | 90 |
|
... | ... |
@@ -121,7 +122,7 @@ class TextShape(Shape): |
121 | 122 |
else: |
122 | 123 |
PangoCairo.update_layout(cr, layout) |
123 | 124 |
|
124 |
- descent = 2 # XXX get descender from font metrics |
|
125 |
+ descent = 2 # XXX get descender from font metrics |
|
125 | 126 |
|
126 | 127 |
width, height = layout.get_size() |
127 | 128 |
width = float(width)/Pango.SCALE |
... | ... |
@@ -132,7 +133,7 @@ class TextShape(Shape): |
132 | 133 |
# scale it so that the text fits inside its box |
133 | 134 |
if width > self.w: |
134 | 135 |
f = self.w / width |
135 |
- width = self.w # equivalent to width *= f |
|
136 |
+ width = self.w # equivalent to width *= f |
|
136 | 137 |
height *= f |
137 | 138 |
descent *= f |
138 | 139 |
else: |
... | ... |
@@ -157,7 +158,7 @@ class TextShape(Shape): |
157 | 158 |
PangoCairo.show_layout(cr, layout) |
158 | 159 |
cr.restore() |
159 | 160 |
|
160 |
- if 0: # DEBUG |
|
161 |
+ if 0: # DEBUG |
|
161 | 162 |
# show where dot thinks the text should appear |
162 | 163 |
cr.set_source_rgba(1, 0, 0, .9) |
163 | 164 |
if self.j == self.LEFT: |
... | ... |
@@ -47,10 +47,10 @@ from .elements import Graph |
47 | 47 |
class DotWidget(Gtk.DrawingArea): |
48 | 48 |
"""GTK widget that draws dot graphs.""" |
49 | 49 |
|
50 |
- #TODO GTK3: Second argument has to be of type Gdk.EventButton instead of object. |
|
50 |
+ # TODO GTK3: Second argument has to be of type Gdk.EventButton instead of object. |
|
51 | 51 |
__gsignals__ = { |
52 |
- 'clicked' : (GObject.SIGNAL_RUN_LAST, None, (str, object)), |
|
53 |
- 'error' : (GObject.SIGNAL_RUN_LAST, None, (str,)) |
|
52 |
+ 'clicked': (GObject.SIGNAL_RUN_LAST, None, (str, object)), |
|
53 |
+ 'error': (GObject.SIGNAL_RUN_LAST, None, (str,)) |
|
54 | 54 |
} |
55 | 55 |
|
56 | 56 |
filter = 'dot' |
... | ... |
@@ -64,7 +64,8 @@ class DotWidget(Gtk.DrawingArea): |
64 | 64 |
self.set_can_focus(True) |
65 | 65 |
|
66 | 66 |
self.connect("draw", self.on_draw) |
67 |
- self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK) |
|
67 |
+ self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | |
|
68 |
+ Gdk.EventMask.BUTTON_RELEASE_MASK) |
|
68 | 69 |
self.connect("button-press-event", self.on_area_button_press) |
69 | 70 |
self.connect("button-release-event", self.on_area_button_release) |
70 | 71 |
self.add_events(Gdk.EventMask.POINTER_MOTION_MASK | |
... | ... |
@@ -317,10 +318,11 @@ class DotWidget(Gtk.DrawingArea): |
317 | 318 |
return False |
318 | 319 |
|
319 | 320 |
print_settings = None |
321 |
+ |
|
320 | 322 |
def on_print(self, action=None): |
321 | 323 |
print_op = Gtk.PrintOperation() |
322 | 324 |
|
323 |
- if self.print_settings != None: |
|
325 |
+ if self.print_settings is not None: |
|
324 | 326 |
print_op.set_print_settings(self.print_settings) |
325 | 327 |
|
326 | 328 |
print_op.connect("begin_print", self.begin_print) |
... | ... |
@@ -346,7 +348,7 @@ class DotWidget(Gtk.DrawingArea): |
346 | 348 |
|
347 | 349 |
def get_drag_action(self, event): |
348 | 350 |
state = event.state |
349 |
- if event.button in (1, 2): # left or middle button |
|
351 |
+ if event.button in (1, 2): # left or middle button |
|
350 | 352 |
modifiers = Gtk.accelerator_get_default_mod_mask() |
351 | 353 |
if state & modifiers == Gdk.ModifierType.CONTROL_MASK: |
352 | 354 |
return ZoomAction |
... | ... |
@@ -376,8 +378,8 @@ class DotWidget(Gtk.DrawingArea): |
376 | 378 |
# for gtk's clicked event instead? |
377 | 379 |
deltax = self.pressx - event.x |
378 | 380 |
deltay = self.pressy - event.y |
379 |
- return (time.time() < self.presstime + click_timeout |
|
380 |
- and math.hypot(deltax, deltay) < click_fuzz) |
|
381 |
+ return (time.time() < self.presstime + click_timeout and |
|
382 |
+ math.hypot(deltax, deltay) < click_fuzz) |
|
381 | 383 |
|
382 | 384 |
def on_click(self, element, event): |
383 | 385 |
"""Override this method in subclass to process |
... | ... |
@@ -513,7 +515,8 @@ class DotWindow(Gtk.Window): |
513 | 515 |
actiongroup.add_actions(( |
514 | 516 |
('Open', Gtk.STOCK_OPEN, None, None, None, self.on_open), |
515 | 517 |
('Reload', Gtk.STOCK_REFRESH, None, None, None, self.on_reload), |
516 |
- ('Print', Gtk.STOCK_PRINT, None, None, "Prints the currently visible part of the graph", self.dotwidget.on_print), |
|
518 |
+ ('Print', Gtk.STOCK_PRINT, None, None, |
|
519 |
+ "Prints the currently visible part of the graph", self.dotwidget.on_print), |
|
517 | 520 |
('ZoomIn', Gtk.STOCK_ZOOM_IN, None, None, None, self.dotwidget.on_zoom_in), |
518 | 521 |
('ZoomOut', Gtk.STOCK_ZOOM_OUT, None, None, None, self.dotwidget.on_zoom_out), |
519 | 522 |
('ZoomFit', Gtk.STOCK_ZOOM_FIT, None, None, None, self.dotwidget.on_zoom_fit), |
... | ... |
@@ -521,7 +524,7 @@ class DotWindow(Gtk.Window): |
521 | 524 |
)) |
522 | 525 |
|
523 | 526 |
find_action = FindMenuToolAction("Find", None, |
524 |
- "Find a node by name", None) |
|
527 |
+ "Find a node by name", None) |
|
525 | 528 |
actiongroup.add_action(find_action) |
526 | 529 |
|
527 | 530 |
# Add the actiongroup to the uimanager |
... | ... |
@@ -547,8 +550,8 @@ class DotWindow(Gtk.Window): |
547 | 550 |
find_toolitem.add(self.textentry) |
548 | 551 |
|
549 | 552 |
self.textentry.set_activates_default(True) |
550 |
- self.textentry.connect ("activate", self.textentry_activate, self.textentry); |
|
551 |
- self.textentry.connect ("changed", self.textentry_changed, self.textentry); |
|
553 |
+ self.textentry.connect("activate", self.textentry_activate, self.textentry); |
|
554 |
+ self.textentry.connect("changed", self.textentry_changed, self.textentry); |
|
552 | 555 |
|
553 | 556 |
self.show_all() |
554 | 557 |
|
... | ... |
@@ -576,7 +579,7 @@ class DotWindow(Gtk.Window): |
576 | 579 |
dot_widget = self.dotwidget |
577 | 580 |
if not entry_text: |
578 | 581 |
dot_widget.set_highlight(None, search=True) |
579 |
- return; |
|
582 |
+ return |
|
580 | 583 |
|
581 | 584 |
found_items = self.find_text(entry_text) |
582 | 585 |
dot_widget.set_highlight(found_items, search=True) |