[pitivi] Fix pylint attribute-defined-outside-init



commit 3761fdbf3a158f35bb87fb168153ccd94747cc43
Author: Alexandru Băluț <alexandru balut gmail com>
Date:   Mon Oct 28 00:55:46 2019 +0100

    Fix pylint attribute-defined-outside-init

 pitivi/application.py        |  7 +++++--
 pitivi/dialogs/prefs.py      |  4 ++++
 pitivi/editorperspective.py  | 11 +++++++----
 pitivi/greeterperspective.py |  4 ++--
 pitivi/mainwindow.py         |  8 ++++----
 pitivi/medialibrary.py       |  3 +++
 pitivi/preset.py             |  1 +
 pitivi/project.py            | 20 ++++++++++----------
 pitivi/render.py             | 15 +++++++++------
 pitivi/timeline/elements.py  |  6 ++++++
 pitivi/timeline/ruler.py     |  2 +-
 pitivi/timeline/timeline.py  | 33 +++++++++++++++------------------
 pitivi/utils/timeline.py     |  3 ++-
 pitivi/viewer/viewer.py      | 10 ++++++----
 tests/common.py              |  1 +
 tests/test_medialibrary.py   |  2 ++
 tests/test_undo_timeline.py  |  1 +
 17 files changed, 79 insertions(+), 52 deletions(-)
---
diff --git a/pitivi/application.py b/pitivi/application.py
index b26f5f0f..47beea41 100644
--- a/pitivi/application.py
+++ b/pitivi/application.py
@@ -143,6 +143,7 @@ class Pitivi(Gtk.Application, Loggable):
         self._checkVersion()
 
     def _setup(self):
+        # pylint: disable=attribute-defined-outside-init
         self.settings = GlobalSettings()
         self.threads = ThreadMaster()
         self.effects = EffectsManager()
@@ -154,11 +155,13 @@ class Pitivi(Gtk.Application, Loggable):
         self.project_manager.connect_after("project-closed", self._project_closed_cb)
         self.project_manager.connect("project-saved", self.__project_saved_cb)
 
-        self._createActions()
+        self._create_actions()
         self._syncDoUndo()
 
-    def _createActions(self):
+    def _create_actions(self):
         self.shortcuts.register_group("app", _("General"), position=10)
+
+        # pylint: disable=attribute-defined-outside-init
         self.undo_action = Gio.SimpleAction.new("undo", None)
         self.undo_action.connect("activate", self._undoCb)
         self.add_action(self.undo_action)
diff --git a/pitivi/dialogs/prefs.py b/pitivi/dialogs/prefs.py
index a05532e3..3b285719 100644
--- a/pitivi/dialogs/prefs.py
+++ b/pitivi/dialogs/prefs.py
@@ -609,6 +609,9 @@ class CustomShortcutDialog(Gtk.Dialog):
         self.preferences = pref_dialog
         self.customised_item = customised_item
 
+        # The keyboard shortcut typed by the user.
+        self.accelerator = None
+
         self.set_title(_("Set Shortcut"))
         # Set a minimum size.
         self.set_size_request(500, 300)
@@ -697,6 +700,7 @@ class CustomShortcutDialog(Gtk.Dialog):
     def do_response(self, response):
         """Handles the user's response."""
         if response == Gtk.ResponseType.OK:
+            assert self.accelerator
             if self.conflicting_action:
                 # Disable the accelerator in its previous use, set for this action.
                 accels = self.app.get_accels_for_action(self.conflicting_action)
diff --git a/pitivi/editorperspective.py b/pitivi/editorperspective.py
index be1c2a99..74d85f5f 100644
--- a/pitivi/editorperspective.py
+++ b/pitivi/editorperspective.py
@@ -100,7 +100,7 @@ class EditorPerspective(Perspective, Loggable):
     def setup_ui(self):
         """Sets up the UI."""
         self.__setup_css()
-        self._createUi()
+        self._create_ui()
         self.app.gui.connect("focus-in-event", self.__focus_in_event_cb)
         self.app.gui.connect("destroy", self._destroyedCb)
 
@@ -164,7 +164,7 @@ class EditorPerspective(Perspective, Loggable):
         dialog = RenderDialog(self.app, project)
         dialog.window.show()
 
-    def _createUi(self):
+    def _create_ui(self):
         """Creates the graphical interface.
 
         The rough hierarchy is:
@@ -175,6 +175,7 @@ class EditorPerspective(Perspective, Loggable):
         The full hierarchy can be admired by starting the GTK+ Inspector
         with Ctrl+Shift+I.
         """
+        # pylint: disable=attribute-defined-outside-init
         # Main "toolbar" (using client-side window decorations with HeaderBar)
         self.headerbar = self.__create_headerbar()
 
@@ -234,7 +235,7 @@ class EditorPerspective(Perspective, Loggable):
         self.toplevel_widget.pack2(self.timeline_ui, resize=True, shrink=False)
 
         # Setup shortcuts for HeaderBar buttons and menu items.
-        self.__set_keyboard_shortcuts()
+        self._create_actions()
 
         # Identify widgets for AT-SPI, making our test suite easier to develop
         # These will show up in sniff, accerciser, etc.
@@ -312,6 +313,7 @@ class EditorPerspective(Perspective, Loggable):
         redo_button.set_action_name("app.redo")
         redo_button.set_use_underline(True)
 
+        # pylint: disable=attribute-defined-outside-init
         self.save_button = Gtk.Button.new_with_label(_("Save"))
         self.save_button.set_focus_on_click(False)
 
@@ -342,11 +344,12 @@ class EditorPerspective(Perspective, Loggable):
 
         return headerbar
 
-    def __set_keyboard_shortcuts(self):
+    def _create_actions(self):
         group = Gio.SimpleActionGroup()
         self.toplevel_widget.insert_action_group("editor", group)
         self.headerbar.insert_action_group("editor", group)
 
+        # pylint: disable=attribute-defined-outside-init
         self.save_action = Gio.SimpleAction.new("save", None)
         self.save_action.connect("activate", self.__save_project_cb)
         group.add_action(self.save_action)
diff --git a/pitivi/greeterperspective.py b/pitivi/greeterperspective.py
index d18d9835..fa47d39b 100644
--- a/pitivi/greeterperspective.py
+++ b/pitivi/greeterperspective.py
@@ -159,7 +159,7 @@ class GreeterPerspective(Perspective):
 
         self.__setup_css()
         self.headerbar = self.__create_headerbar()
-        self.__set_keyboard_shortcuts()
+        self._create_actions()
 
     def refresh(self):
         """Refreshes the perspective."""
@@ -269,7 +269,7 @@ class GreeterPerspective(Perspective):
             else:
                 self.headerbar.set_title(_("Pitivi"))
 
-    def __set_keyboard_shortcuts(self):
+    def _create_actions(self):
         group = Gio.SimpleActionGroup()
         self.toplevel_widget.insert_action_group("greeter", group)
         self.headerbar.insert_action_group("greeter", group)
diff --git a/pitivi/mainwindow.py b/pitivi/mainwindow.py
index aafe08a7..caf15b12 100644
--- a/pitivi/mainwindow.py
+++ b/pitivi/mainwindow.py
@@ -67,7 +67,7 @@ GlobalSettings.addConfigOption('lastCurrentVersion',
                                default='')
 
 
-# pylint: disable=attribute-defined-outside-init,too-many-instance-attributes
+# pylint: disable=too-many-instance-attributes
 class MainWindow(Gtk.ApplicationWindow, Loggable):
     """Pitivi's main window.
 
@@ -112,7 +112,7 @@ class MainWindow(Gtk.ApplicationWindow, Loggable):
         self.log("Setting up the perspectives.")
 
         self.set_icon_name("pitivi")
-        self.__set_keyboard_shortcuts()
+        self._create_actions()
 
         self.greeter.setup_ui()
         self.editor.setup_ui()
@@ -163,10 +163,10 @@ class MainWindow(Gtk.ApplicationWindow, Loggable):
         self.debug("Screen size is %sx%s", screen_width, screen_height)
         return min_size.width >= 0.9 * screen_width
 
-    # pylint: disable=attribute-defined-outside-init
-    def __set_keyboard_shortcuts(self):
+    def _create_actions(self):
         self.app.shortcuts.register_group("win", _("Project"), position=20)
 
+        # pylint: disable=attribute-defined-outside-init
         self.help_action = Gio.SimpleAction.new("help", None)
         self.help_action.connect("activate", self.__user_manual_cb)
         self.add_action(self.help_action)
diff --git a/pitivi/medialibrary.py b/pitivi/medialibrary.py
index 5640cf60..92a139fc 100644
--- a/pitivi/medialibrary.py
+++ b/pitivi/medialibrary.py
@@ -270,6 +270,8 @@ class AssetThumbnail(GObject.Object, Loggable):
         self.__asset = asset
         self.proxy_manager = proxy_manager
         self.__previewer = None
+        self.small_thumb = None
+        self.large_thumb = None
         self.refresh()
 
     def refresh(self):
@@ -415,6 +417,7 @@ class AssetThumbnail(GObject.Object, Loggable):
         return icon
 
     def _set_state(self):
+        # pylint: disable=attribute-defined-outside-init
         asset = self.__asset
         target = asset.get_proxy_target()
         target_is_valid = target and not target.get_error()
diff --git a/pitivi/preset.py b/pitivi/preset.py
index 9e058e47..b75303c8 100644
--- a/pitivi/preset.py
+++ b/pitivi/preset.py
@@ -83,6 +83,7 @@ class PresetManager(GObject.Object, Loggable):
         self.system = system
 
     def setupUi(self, combo, button):
+        # pylint: disable=attribute-defined-outside-init
         self.combo = combo
         self.button = button
 
diff --git a/pitivi/project.py b/pitivi/project.py
index 89d2e20d..bbbca375 100644
--- a/pitivi/project.py
+++ b/pitivi/project.py
@@ -132,6 +132,7 @@ class ProjectManager(GObject.Object, Loggable):
         self._backup_lock = 0
         self.exitcode = 0
         self.__start_loading_time = 0
+        self.time_loaded = 0
 
     def _tryUsingBackupFile(self, uri):
         backup_path = self._makeBackupURI(path_from_uri(uri))
@@ -963,6 +964,7 @@ class Project(Loggable, GES.Project):
         video_restrictions = self.video_profile.get_restriction().copy_nth(0)
 
         if self._has_rendering_values != rendering:
+            # pylint: disable=attribute-defined-outside-init
             if rendering:
                 video_restrictions_struct = video_restrictions[0]
                 self.__width = video_restrictions_struct["width"]
@@ -2021,15 +2023,16 @@ class ProjectSettingsDialog:
         self.project = project
         self.audio_presets = AudioPresetManager(app.system)
         self.video_presets = VideoPresetManager(app.system)
-        self._createUi()
+
+        self.sar = 0
+        self.proxy_aspect_ratio = Gst.Fraction(1, 0)
+
+        self._create_ui()
         self.window.set_transient_for(parent_window)
         self._setupUiConstraints()
         self.updateUI()
 
-    def __del__(self):
-        self.video_presets.disconnect_by_func(self.__videoPresetLoadedCb)
-
-    def _createUi(self):
+    def _create_ui(self):
         """Initializes the static parts of the UI."""
         self.builder = Gtk.Builder()
         self.builder.add_from_file(
@@ -2099,7 +2102,7 @@ class ProjectSettingsDialog:
         self.wg.addVertex(self.scaled_proxy_width_spin, signal="value-changed")
         self.wg.addVertex(self.scaled_proxy_height_spin, signal="value-changed")
 
-        # Constrain width and height IFF the Link checkbox is checked.
+        # Constrain width and height IFF the Constrain checkbox is checked.
         # Video
         self.wg.addEdge(self.width_spinbutton, self.height_spinbutton,
                         predicate=self.widthHeightLinked,
@@ -2171,7 +2174,7 @@ class ProjectSettingsDialog:
         set_combo_value(combo, fraction.getWidgetValue())
 
     def __videoPresetLoadedCb(self, unused_mgr):
-        self._updateSar()
+        self.sar = self.getSAR()
 
     def getSAR(self):
         width = int(self.width_spinbutton.get_value())
@@ -2179,9 +2182,6 @@ class ProjectSettingsDialog:
         return Gst.Fraction(width, height)
 
     def _constrainSarButtonToggledCb(self, unused_button):
-        self._updateSar()
-
-    def _updateSar(self):
         self.sar = self.getSAR()
 
     def _updatePresetMenuButton(self, unused_source, unused_target, mgr):
diff --git a/pitivi/render.py b/pitivi/render.py
index 44a63ae3..bac3510b 100644
--- a/pitivi/render.py
+++ b/pitivi/render.py
@@ -125,6 +125,7 @@ class Encoders(Loggable):
         return cls._instance
 
     def _load_encoders(self):
+        # pylint: disable=attribute-defined-outside-init
         self.aencoders = []
         self.vencoders = []
         self.muxers = Gst.ElementFactory.list_get_elements(
@@ -140,6 +141,7 @@ class Encoders(Loggable):
                 self.aencoders.append(fact)
 
     def _load_combinations(self):
+        # pylint: disable=attribute-defined-outside-init
         self.compatible_audio_encoders = {}
         self.compatible_video_encoders = {}
         useless_muxers = set()
@@ -410,6 +412,7 @@ class RenderDialog(Loggable):
         self._filesizeEstimateTimer = self._timeEstimateTimer = None
         self._is_rendering = False
         self._rendering_is_paused = False
+        self._last_timestamp_when_pausing = 0
         self.current_position = None
         self._time_started = 0
         self._time_spent_paused = 0  # Avoids the ETA being wrong on resume
@@ -424,7 +427,9 @@ class RenderDialog(Loggable):
 
         # Whether encoders changing are a result of changing the muxer.
         self.muxer_combo_changing = False
-        self._createUi()
+        self._create_ui()
+        self.progress = None
+        self.dialog = None
 
         # Directory and Filename
         self.filebutton.set_current_folder(self.app.settings.lastExportFolder)
@@ -564,7 +569,7 @@ class RenderDialog(Loggable):
         set_combo_value(widget, value)
         self.project.videorate = value
 
-    def _createUi(self):
+    def _create_ui(self):
         builder = Gtk.Builder()
         builder.add_from_file(
             os.path.join(configure.get_ui_dir(), "renderingdialog.ui"))
@@ -944,13 +949,11 @@ class RenderDialog(Loggable):
         self._pipeline.set_state(Gst.State.PAUSED)
 
     def _pauseRender(self, unused_progress):
-        self._rendering_is_paused = self.progress.play_pause_button.get_active(
-        )
+        self._rendering_is_paused = self.progress.play_pause_button.get_active()
         if self._rendering_is_paused:
             self._last_timestamp_when_pausing = time.time()
         else:
-            self._time_spent_paused += time.time(
-            ) - self._last_timestamp_when_pausing
+            self._time_spent_paused += time.time() - self._last_timestamp_when_pausing
             self.debug(
                 "Resuming render after %d seconds in pause", self._time_spent_paused)
         self.project.pipeline.togglePlayback()
diff --git a/pitivi/timeline/elements.py b/pitivi/timeline/elements.py
index 921509a3..c9e5b686 100644
--- a/pitivi/timeline/elements.py
+++ b/pitivi/timeline/elements.py
@@ -105,6 +105,7 @@ class KeyframeCurve(FigureCanvas, Loggable):
 
         self.__ylim_min, self.__ylim_max = KeyframeCurve.YLIM_OVERRIDES.get(
             binding.pspec, (0.0, 1.0))
+        self.__ydata_drag_start = self.__ylim_min
 
         # Curve values, basically separating source.get_values() timestamps
         # and values.
@@ -630,6 +631,7 @@ class TimelineElement(Gtk.Layout, Zoomable, Loggable):
             self.add(self.__background)
 
         self.keyframe_curve = None
+        self.__controlledProperty = None
         self.show_all()
 
         # We set up the default mixing property right here, if a binding was
@@ -1083,6 +1085,9 @@ class Clip(Gtk.EventBox, Zoomable, Loggable):
         self.set_name(name)
         self.get_accessible().set_name(name)
 
+        self._elements_container = None
+        self.leftHandle = None
+        self.rightHandle = None
         self.handles = []
         self.z_order = -1
         self.timeline = layer.timeline
@@ -1214,6 +1219,7 @@ class Clip(Gtk.EventBox, Zoomable, Loggable):
                 child.setSize(width, height / len(elements))
 
             self.__force_position_update = False
+            # pylint: disable=attribute-defined-outside-init
             self._current_x = x
             self._current_y = y
             self._current_width = width
diff --git a/pitivi/timeline/ruler.py b/pitivi/timeline/ruler.py
index 1a3d2da1..f7ff9bce 100644
--- a/pitivi/timeline/ruler.py
+++ b/pitivi/timeline/ruler.py
@@ -155,8 +155,8 @@ class ScaleRuler(Gtk.DrawingArea, Zoomable, Loggable):
         # Create a new buffer
         self.pixbuf = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
 
+        # pylint: disable=attribute-defined-outside-init
         context = self.app.gui.get_style_context()
-
         color_normal = gtk_style_context_get_color(context, Gtk.StateFlags.NORMAL)
         color_insensitive = gtk_style_context_get_color(context, Gtk.StateFlags.BACKDROP)
         self._color_normal = color_normal
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index f59b62be..9c40fb36 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -128,16 +128,14 @@ class Marquee(Gtk.Box, Loggable):
         Loggable.__init__(self)
 
         self._timeline = timeline
+        self.start_x, self.start_y = 0, 0
+        self.end_x, self.end_y = self.start_x, self.start_y
         self.hide()
 
         self.get_style_context().add_class("Marquee")
 
     def hide(self):
         """Hides and resets the widget."""
-        self.start_x = None
-        self.start_y = None
-        self.end_x = None
-        self.end_y = None
         self.props.height_request = -1
         self.props.width_request = -1
         self.set_visible(False)
@@ -152,6 +150,7 @@ class Marquee(Gtk.Box, Loggable):
         event_widget = Gtk.get_event_widget(event)
         self.start_x, self.start_y = event_widget.translate_coordinates(
             self._timeline.layout.layers_vbox, event.x, event.y)
+        self.end_x, self.end_y = self.start_x, self.start_y
 
     def move(self, event):
         """Sets the second corner of the marquee.
@@ -185,8 +184,8 @@ class Marquee(Gtk.Box, Loggable):
         start_pos = max(0, self._timeline.pixelToNs(self.start_x))
         end_pos = max(0, self._timeline.pixelToNs(self.end_x))
 
-        return self._timeline.get_clips_in_between(start_layer,
-                                                   end_layer, start_pos, end_pos)
+        return self._timeline.get_clips_in_between(start_layer, end_layer,
+                                                   start_pos, end_pos)
 
 
 class LayersLayout(Gtk.Layout, Zoomable, Loggable):
@@ -736,6 +735,7 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
 
         self._scrolling = res and button == 2
         if self._scrolling:
+            # pylint: disable=attribute-defined-outside-init
             self._scroll_start_x = event.x
             self._scroll_start_y = event.y
 
@@ -1420,8 +1420,8 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
         self.ges_timeline = None
         self.__copied_group = None
 
-        self._createUi()
-        self._createActions()
+        self._create_ui()
+        self._create_actions()
 
         self.timeline.connect("size-allocate", self.__timeline_size_allocate_cb)
 
@@ -1555,7 +1555,7 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
         if project:
             self.ruler.setPipeline(project.pipeline)
             self.ruler.zoomChanged()
-            self._update_ruler(project.videorate)
+            self.ruler.setProjectFrameRate(project.videorate)
 
             self.timeline.set_best_zoom_ratio(allow_zoom_in=True)
             self.timeline.update_snapping_distance()
@@ -1580,7 +1580,7 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
 
     # Internal API
 
-    def _createUi(self):
+    def _create_ui(self):
         left_size_group = Gtk.SizeGroup.new(Gtk.SizeGroupMode.HORIZONTAL)
         zoom_box = ZoomBox(self)
         left_size_group.add_widget(zoom_box)
@@ -1641,7 +1641,7 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
         unused_longest_time, longest_layer = max(layer_lengths)
         return longest_layer
 
-    def _createActions(self):
+    def _create_actions(self):
         # The actions below are added to this action group and thus
         # are accessible only to the self.timeline.layout and self.toolbar
         # widgets (and their children) using the "timeline" prefix.
@@ -2081,11 +2081,12 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
         self.timeline.scrollToPlayhead(align=Gtk.Align.CENTER, when_not_in_view=True)
 
     def _seek_backward_one_frame_cb(self, unused_action, unused_parameter):
-        self._project.pipeline.stepFrame(self._framerate, -1)
+        self._project.pipeline.stepFrame(self._project.videorate, -1)
         self.timeline.scrollToPlayhead(align=Gtk.Align.CENTER, when_not_in_view=True)
 
     def _seek_forward_one_frame_cb(self, unused_action, unused_parameter):
-        self._project.pipeline.stepFrame(self._framerate, 1)
+
+        self._project.pipeline.stepFrame(self._project.videorate, 1)
         self.timeline.scrollToPlayhead(align=Gtk.Align.CENTER, when_not_in_view=True)
 
     def do_focus_in_event(self, unused_event):
@@ -2099,11 +2100,7 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
     def _rendering_settings_changed_cb(self, project, item):
         """Handles Project metadata changes."""
         if item == "videorate" or item is None:
-            self._update_ruler(project.videorate)
-
-    def _update_ruler(self, videorate):
-        self._framerate = videorate
-        self.ruler.setProjectFrameRate(self._framerate)
+            self.ruler.setProjectFrameRate(project.videorate)
 
     def __timeline_size_allocate_cb(self, unused_widget, allocation):
         fits = self.timeline.layout.props.height <= allocation.height
diff --git a/pitivi/utils/timeline.py b/pitivi/utils/timeline.py
index cd3bf525..8e033ce6 100644
--- a/pitivi/utils/timeline.py
+++ b/pitivi/utils/timeline.py
@@ -272,9 +272,10 @@ class EditingContext(GObject.Object, Loggable):
         self.old_position = self.focus.get_start()
         if edge == GES.Edge.EDGE_END and mode == GES.EditMode.EDIT_TRIM:
             self.old_position += self.focus.get_duration()
-
         self.old_priority = self.focus.get_priority()
+
         self.new_position = None
+        self.new_priority = None
 
         self.timeline = timeline
         self.app = app
diff --git a/pitivi/viewer/viewer.py b/pitivi/viewer/viewer.py
index ac8e74b8..71e11f6f 100644
--- a/pitivi/viewer/viewer.py
+++ b/pitivi/viewer/viewer.py
@@ -91,8 +91,8 @@ class ViewerContainer(Gtk.Box, Loggable):
         self._compactMode = False
 
         self._haveUI = False
-
-        self._createUi()
+        self.overlay_stack = None
+        self._create_ui()
 
         if not self.settings.viewerDocked:
             self.undock()
@@ -198,7 +198,7 @@ class ViewerContainer(Gtk.Box, Loggable):
         self.settings.viewerX = event.x
         self.settings.viewerY = event.y
 
-    def _createUi(self):
+    def _create_ui(self):
         """Creates the Viewer GUI."""
         self.set_orientation(Gtk.Orientation.VERTICAL)
 
@@ -547,7 +547,6 @@ class ViewerContainer(Gtk.Box, Loggable):
             sink_widget.show()
             self.trim_pipeline.connect("state-change", self._state_change_cb)
             self.trim_pipeline.setState(Gst.State.PAUSED)
-            self._last_trim_ns = 0
 
         self.trim_pipeline.simple_seek(position)
 
@@ -627,6 +626,9 @@ class ViewerWidget(Gtk.AspectFrame, Loggable):
         # The width and height used when snapping the child widget size.
         self.videowidth = 0
         self.videoheight = 0
+        # Sequence of floats representing sizes where the viewer size snaps.
+        # The project natural video size is 1, double size is 2, etc.
+        self.snaps = []
 
         # Set the shadow to None, otherwise it will take space and the
         # child widget size snapping will be a bit off.
diff --git a/tests/common.py b/tests/common.py
index 67dc7361..13620a29 100644
--- a/tests/common.py
+++ b/tests/common.py
@@ -227,6 +227,7 @@ class TestCase(unittest.TestCase, Loggable):
         from pitivi.utils.timeline import Zoomable
         del Zoomable._instances[:]
 
+        self._result = None
         self._num_failures = len(getattr(self._result, 'failures', []))
         self._num_errors = len(getattr(self._result, 'errors', []))
         if detect_leaks:
diff --git a/tests/test_medialibrary.py b/tests/test_medialibrary.py
index c0523fe0..932f2d4e 100644
--- a/tests/test_medialibrary.py
+++ b/tests/test_medialibrary.py
@@ -16,6 +16,8 @@
 # License along with this program; if not, write to the
 # Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 # Boston, MA 02110-1301, USA.
+"""Tests for the pitivi.medialibrary module."""
+# pylint: disable=attribute-defined-outside-init
 import os
 import tempfile
 from unittest import mock
diff --git a/tests/test_undo_timeline.py b/tests/test_undo_timeline.py
index 33dc6a6e..785b60bf 100644
--- a/tests/test_undo_timeline.py
+++ b/tests/test_undo_timeline.py
@@ -47,6 +47,7 @@ class BaseTestUndoTimeline(common.TestCase):
         self.timeline = self.project.ges_timeline
         self.layer = self.timeline.append_layer()
         self.action_log = self.app.action_log
+        self.timeline_container = None
 
     def setup_timeline_container(self):
         project = self.app.project_manager.current_project


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]