diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..b46a2fa2 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +exclude: '^$' +fail_fast: false +repos: + #- repo: https://github.com/psf/black + # rev: 20.8b1 # Replace by any tag/version: https://github.com/psf/black/tags + # hooks: + # - id: black + # language_version: python3 # Should be a command that runs python3.6+ + - repo: https://gitlab.com/pycqa/flake8 + rev: 3.9.2 + hooks: + - id: flake8 + language_version: python3 + additional_dependencies: [flake8-docstrings, flake8-debugger, flake8-bugbear] + #- repo: https://github.com/pycqa/isort + # rev: 5.8.0 + # hooks: + # - id: isort + # language_version: python3 diff --git a/setup.cfg b/setup.cfg index abcfbeba..be63db21 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,7 +3,7 @@ universal=1 [flake8] max-line-length = 120 -ignore = E226,E241,E265,E266,W291,W293,W503,F999,E305,F405,W504 +ignore = D,D107,D202,E226,E241,E265,E266,W291,W293,W503,F999,E305,F405,W503,W504 exclude = uwsift/ui uwsift/tests/timeline.py @@ -18,4 +18,4 @@ exclude = ;[coverage:run] ;omit = ; uwsift/version.py -; versioneer.py \ No newline at end of file +; versioneer.py diff --git a/uwsift/control/__init__.py b/uwsift/control/__init__.py index 008039f7..aa5f6583 100644 --- a/uwsift/control/__init__.py +++ b/uwsift/control/__init__.py @@ -20,40 +20,6 @@ __author__ = 'rayg' __docformat__ = 'reStructuredText' -import argparse import logging -import sys -import unittest LOG = logging.getLogger(__name__) - - -def main(): - parser = argparse.ArgumentParser( - description="PURPOSE", - epilog="", - fromfile_prefix_chars='@') - parser.add_argument('-v', '--verbose', dest='verbosity', action="count", default=0, - help='each occurrence increases verbosity 1 level through ERROR-WARNING-Info-DEBUG') - # http://docs.python.org/2.7/library/argparse.html#nargs - # parser.add_argument('--stuff', nargs='5', dest='my_stuff', - # help="one or more random things") - parser.add_argument('pos_args', nargs='*', - help="positional arguments don't have the '-' prefix") - args = parser.parse_args() - - levels = [logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG] - logging.basicConfig(level=levels[min(3, args.verbosity)]) - - if not args.pos_args: - unittest.main() - return 0 - - for pn in args.pos_args: - pass - - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/uwsift/control/doc_ws_as_timeline_scene.py b/uwsift/control/doc_ws_as_timeline_scene.py index a7dcadd7..6f5004d4 100644 --- a/uwsift/control/doc_ws_as_timeline_scene.py +++ b/uwsift/control/doc_ws_as_timeline_scene.py @@ -88,7 +88,7 @@ def _purge_orphan_tracks_frames(self, tracks: Iterable[str], frames: Iterable[UU """Remove QTrackItem and QFrameItem instances that no longer correspond to document content """ LOG.debug("purging {} orphan tracks and {} orphan frames from timeline scene".format(len(tracks), len(frames))) - for frid in frames: + for _ in frames: self.removeItem() self._frame_items = dict((k, v) for (k, v) in self._frame_items.items() if k not in frames) self._track_items = dict((k, v) for (k, v) in self._track_items.items() if k not in tracks) diff --git a/uwsift/control/file_behaviors.py b/uwsift/control/file_behaviors.py index 0cca4bea..26839a0e 100644 --- a/uwsift/control/file_behaviors.py +++ b/uwsift/control/file_behaviors.py @@ -20,16 +20,13 @@ __author__ = 'rayg' __docformat__ = 'reStructuredText' -import argparse import logging -import sys -import unittest from PyQt5.QtCore import QObject # from PyQt4.QtGui import QAction - +LOG = logging.getLogger(__name__) FORMAT_GUIDEBOOK = {} @@ -68,37 +65,3 @@ def __call__(self, files_to_open): :return: """ pass - - -LOG = logging.getLogger(__name__) - - -def main(): - parser = argparse.ArgumentParser( - description="PURPOSE", - epilog="", - fromfile_prefix_chars='@') - parser.add_argument('-v', '--verbose', dest='verbosity', action="count", default=0, - help='each occurrence increases verbosity 1 level through ERROR-WARNING-Info-DEBUG') - # http://docs.python.org/2.7/library/argparse.html#nargs - # parser.add_argument('--stuff', nargs='5', dest='my_stuff', - # help="one or more random things") - parser.add_argument('pos_args', nargs='*', - help="positional arguments don't have the '-' prefix") - args = parser.parse_args() - - levels = [logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG] - logging.basicConfig(level=levels[min(3, args.verbosity)]) - - if not args.pos_args: - unittest.main() - return 0 - - for pn in args.pos_args: - pass - - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/uwsift/control/layer_tree.py b/uwsift/control/layer_tree.py index 82449af2..ea3f73f1 100644 --- a/uwsift/control/layer_tree.py +++ b/uwsift/control/layer_tree.py @@ -712,12 +712,14 @@ def setData(self, index: QModelIndex, data, role: int = None): return True elif role == Qt.DisplayRole: if index.isValid(): - LOG.debug("changing row {} name to {0!r:s}".format(index.row(), data)) + LOG.debug("changing row {0} name to {1!r:s}".format(index.row(), data)) self.doc.change_layer_name(index.row(), data) return True return False - def insertRows(self, row, count, parent=QModelIndex()): + def insertRows(self, row, count, parent=None): + if parent is None: + parent = QModelIndex() self.beginInsertRows(QModelIndex(), row, row + count - 1) LOG.debug(">>>> INSERT {} rows".format(count)) # TODO: insert 'count' empty rows into document diff --git a/uwsift/control/rgb_behaviors.py b/uwsift/control/rgb_behaviors.py index 1edd6875..edc93eac 100644 --- a/uwsift/control/rgb_behaviors.py +++ b/uwsift/control/rgb_behaviors.py @@ -66,8 +66,8 @@ def _create_rgb_from_uuids(self, recipe_dict): families.append(None) self.create_rgb(families=families) - def create_rgb(self, action=None, families=[]): - if len(families) == 0: + def create_rgb(self, action=None, families=None): + if families is None or len(families) == 0: # get the layers to composite from current selection uuids = [u for u in self.layer_list_model.current_selected_uuids() if self.doc[u][Info.KIND] in [Kind.IMAGE, Kind.COMPOSITE]] diff --git a/uwsift/model/document.py b/uwsift/model/document.py index f55522e3..284e1bf4 100644 --- a/uwsift/model/document.py +++ b/uwsift/model/document.py @@ -60,10 +60,7 @@ __author__ = 'rayg' __docformat__ = 'reStructuredText' -import sys import logging -import unittest -import argparse from collections import MutableSequence, OrderedDict, defaultdict from itertools import groupby, chain from uuid import UUID, uuid1 as uuidgen @@ -2149,8 +2146,8 @@ def change_rgb_recipe_components(self, recipe, update=True, **rgba): def _uuids_for_recipe(self, recipe, valid_only=True): prez_uuids = self.current_layer_uuid_order - for inst_key, time_layers in self._recipe_layers[recipe.name].items(): - for t, rgb_layer in time_layers.items(): + for time_layers in self._recipe_layers[recipe.name].values(): + for rgb_layer in time_layers.values(): u = rgb_layer[Info.UUID] if not valid_only: yield u @@ -2273,14 +2270,14 @@ def _component_generator(family, this_rgba): # return empty `None` layers since we don't know what is wanted right now # we look at all possible times inst_layers = { - k: {l[Info.SCHED_TIME]: None for l in g} + k: {layer[Info.SCHED_TIME]: None for layer in g} for k, g in groupby(sorted(layers, key=_key_func), _key_func)} return inst_layers else: family_uuids = self._families[family] family_layers = [self[u] for u in family_uuids] # (sat, inst) -> {time -> layer} - inst_layers = {k: {l[Info.SCHED_TIME]: l for l in g} for k, g in + inst_layers = {k: {layer[Info.SCHED_TIME]: layer for layer in g} for k, g in groupby(sorted(family_layers, key=_key_func), _key_func)} return inst_layers @@ -2318,7 +2315,7 @@ def sync_composite_layer_prereqs(self, new_times): # update the layer object with newly available layers if possible # add the layer object to the document if it should be included with # the rest of them - for recipe_name, inst_rgbs in self._recipe_layers.items(): + for recipe_name in self._recipe_layers.keys(): recipe = self.recipe_manager[recipe_name] self.update_rgb_composite_layers(recipe, times=new_times) @@ -2653,34 +2650,3 @@ def time_siblings_uuids(self, uuids, sibling_infos=None): # # def # - - -def main(): - parser = argparse.ArgumentParser( - description="PURPOSE", - epilog="", - fromfile_prefix_chars='@') - parser.add_argument('-v', '--verbose', dest='verbosity', action="count", default=0, - help='each occurrence increases verbosity 1 level through ERROR-WARNING-Info-DEBUG') - # http://docs.python.org/2.7/library/argparse.html#nargs - # parser.add_argument('--stuff', nargs='5', dest='my_stuff', - # help="one or more random things") - parser.add_argument('pos_args', nargs='*', - help="positional arguments don't have the '-' prefix") - args = parser.parse_args() - - levels = [logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG] - logging.basicConfig(level=levels[min(3, args.verbosity)]) - - if not args.pos_args: - unittest.main() - return 0 - - for pn in args.pos_args: - pass - - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/uwsift/model/layer.py b/uwsift/model/layer.py index 64c51900..324f258f 100644 --- a/uwsift/model/layer.py +++ b/uwsift/model/layer.py @@ -26,11 +26,8 @@ __author__ = 'rayg' __docformat__ = 'reStructuredText' -import sys import logging import numpy as np -import unittest -import argparse LOG = logging.getLogger(__name__) @@ -447,34 +444,3 @@ class DocAlgebraicLayer(DocCompositeLayer): # """ # FUTURE: A shape layer which feeds probe values to another UI element or helper. # """ - - -def main(): - parser = argparse.ArgumentParser( - description="PURPOSE", - epilog="", - fromfile_prefix_chars='@') - parser.add_argument('-v', '--verbose', dest='verbosity', action="count", default=0, - help='each occurrence increases verbosity 1 level through ERROR-WARNING-Info-DEBUG') - # http://docs.python.org/2.7/library/argparse.html#nargs - # parser.add_argument('--stuff', nargs='5', dest='my_stuff', - # help="one or more random things") - parser.add_argument('pos_args', nargs='*', - help="positional arguments don't have the '-' prefix") - args = parser.parse_args() - - levels = [logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG] - logging.basicConfig(level=levels[min(3, args.verbosity)]) - - if not args.pos_args: - unittest.main() - return 0 - - for pn in args.pos_args: - pass - - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/uwsift/project/geocat2merc.py b/uwsift/project/geocat2merc.py index 30627898..6d0ac003 100644 --- a/uwsift/project/geocat2merc.py +++ b/uwsift/project/geocat2merc.py @@ -166,8 +166,8 @@ def ahi_dataset_metadata(input_filename, dataset_name): metadata["valid_max"] = valid_max * scale_factor + add_offset # mimic satpy metadata - metadata["start_time"] = getattr(nc, "Image_Date_Time") - metadata["end_time"] = getattr(nc, "Image_Date_Time") + metadata["start_time"] = nc.Image_Date_Time + metadata["end_time"] = nc.Image_Date_Time if "standard_name" not in metadata: for k, v in VAR_NAME_STANDARD_NAME.items(): if dataset_name.endswith(k): diff --git a/uwsift/queue.py b/uwsift/queue.py index cc2f0a95..b766cdc7 100644 --- a/uwsift/queue.py +++ b/uwsift/queue.py @@ -22,10 +22,7 @@ __author__ = 'rayg' __docformat__ = 'reStructuredText' -import argparse import logging -import sys -import unittest from collections import OrderedDict from PyQt5.QtCore import QObject, pyqtSignal, QThread @@ -211,34 +208,3 @@ def test_task(): yield {TASK_DOING: 'test task', TASK_PROGRESS: float(dex) / 10.0} TheQueue.sleep(1) yield {TASK_DOING: 'test task', TASK_PROGRESS: 1.0} - - -def main(): - parser = argparse.ArgumentParser( - description="PURPOSE", - epilog="", - fromfile_prefix_chars='@') - parser.add_argument('-v', '--verbose', dest='verbosity', action="count", default=0, - help='each occurrence increases verbosity 1 level through ERROR-WARNING-Info-DEBUG') - # http://docs.python.org/2.7/library/argparse.html#nargs - # parser.add_argument('--stuff', nargs='5', dest='my_stuff', - # help="one or more random things") - parser.add_argument('pos_args', nargs='*', - help="positional arguments don't have the '-' prefix") - args = parser.parse_args() - - levels = [logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG] - logging.basicConfig(level=levels[min(3, args.verbosity)]) - - if not args.pos_args: - unittest.main() - return 0 - - for pn in args.pos_args: - pass - - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/uwsift/tests/view/test_open_file_wizard.py b/uwsift/tests/view/test_open_file_wizard.py index e6cf0ee4..c42d0651 100644 --- a/uwsift/tests/view/test_open_file_wizard.py +++ b/uwsift/tests/view/test_open_file_wizard.py @@ -86,7 +86,7 @@ def test_wizard_abi_l1b(qtbot, monkeypatch): # HACK: Bug in Windows, no enum's by name assert wiz.button(getattr(QWizard.WizardButton, 'NextButton', 1)).isEnabled() # Go to the next page - wiz.next() + wiz.next() # noqa: B305 ## Page 2 # One product should be listed from our mocking above @@ -98,7 +98,7 @@ def test_wizard_abi_l1b(qtbot, monkeypatch): # HACK: Bug in Windows, no enum's by name assert wiz.button(getattr(QWizard.WizardButton, 'FinishButton', 3)).isEnabled() # Go to the next page - wiz.next() + wiz.next() # noqa: B305 # Verify the wizard is left in a usable state for the MainWindow assert len(wiz.scenes) == 1 diff --git a/uwsift/tests/view/test_tile_calculator.py b/uwsift/tests/view/test_tile_calculator.py index 44e3e9d8..3d5800ca 100644 --- a/uwsift/tests/view/test_tile_calculator.py +++ b/uwsift/tests/view/test_tile_calculator.py @@ -75,7 +75,6 @@ def test_get_reference_points_bad_points(ic, iv): """Test that error is thrown if given invalid mesh points.""" with pytest.raises(ValueError): get_reference_points(np.array(ic), np.array(iv)) - assert False @pytest.mark.parametrize("cp,ip,num_p,mpp,exp", [ @@ -114,7 +113,6 @@ def test_calc_view_extents_bad_box(iebox, cp, ip, cs, dx, dy): """Test that error is thrown given zero-sized box.""" with pytest.raises(ValueError): calc_view_extents(iebox, np.array(cp), np.array(ip), cs, dx, dy) - assert False @pytest.mark.parametrize("ims,ts,s,exp", [ diff --git a/uwsift/view/colormap.py b/uwsift/view/colormap.py index 61f12b87..91b20b9c 100644 --- a/uwsift/view/colormap.py +++ b/uwsift/view/colormap.py @@ -787,7 +787,7 @@ def __init__(self, categories=None): super(ColormapManager, self).__setitem__(k, v) def __iter__(self): - for cat, cat_dict in self._category_dict.items(): + for cat_dict in self._category_dict.values(): for cmap_name in cat_dict: yield cmap_name @@ -797,7 +797,7 @@ def keys(self): def iter_colormaps(self, writeable_first=True): all_cmaps = [(self.is_writeable_colormap(name), name) for name in self] all_cmaps = sorted(all_cmaps, reverse=writeable_first) # writeable first - for editable, cmap in all_cmaps: + for _, cmap in all_cmaps: try: cmap_obj = self[cmap] except KeyError: @@ -809,7 +809,7 @@ def iter_colormaps(self, writeable_first=True): yield cmap def _files_for_dir(self, base_dir, recursive=True): - for subdir, dirs, files in os.walk(base_dir): + for subdir, _, files in os.walk(base_dir): for file_to_import in files: nfp = os.path.join(subdir, file_to_import) file_stem, file_ext = os.path.splitext(file_to_import) @@ -873,7 +873,7 @@ def get_colormap(self, cmap_name, category=None): if category is not None: return self[category][cmap_name] - for cat, cat_dict in self.items(): + for cat_dict in self.values(): if cmap_name in cat_dict: val = cat_dict[cmap_name] self._cmap_cache[cmap_name] = val @@ -906,7 +906,7 @@ def __setitem__(self, key, value): def __delitem__(self, key): super(ColormapManager, self).__delitem__(key) - for cat_name, cat_list in self._category_dict.items(): + for cat_list in self._category_dict.values(): try: cat_list.remove(key) except ValueError: diff --git a/uwsift/view/create_algebraic.py b/uwsift/view/create_algebraic.py index 12302564..0f996e55 100644 --- a/uwsift/view/create_algebraic.py +++ b/uwsift/view/create_algebraic.py @@ -31,7 +31,7 @@ def __init__(self, doc, selected_uuids=None, parent=None): available_short_names = [] selected_short_names = [] # use DATASET_NAME as unique group identifier - for idx, prez, layer in self.doc.current_layers_where(kinds=(Kind.IMAGE, Kind.COMPOSITE)): + for _, _, layer in self.doc.current_layers_where(kinds=(Kind.IMAGE, Kind.COMPOSITE)): # use the UUID as a representative when talking to the document available_info.setdefault(layer[Info.SHORT_NAME], layer[Info.UUID]) diff --git a/uwsift/view/export_image.py b/uwsift/view/export_image.py index badead04..6f34b6b8 100644 --- a/uwsift/view/export_image.py +++ b/uwsift/view/export_image.py @@ -419,7 +419,7 @@ def _save_screenshot(self): for filename, file_images in filenames: writer = imageio.get_writer(filename, format_name, **params) - for u, x in file_images: + for _, x in file_images: writer.append_data(numpy.array(x)) writer.close() diff --git a/uwsift/view/rgb_config.py b/uwsift/view/rgb_config.py index 9b6f8483..fd9d6461 100644 --- a/uwsift/view/rgb_config.py +++ b/uwsift/view/rgb_config.py @@ -396,6 +396,6 @@ def _set_gamma_boxes(self, recipe=None): sbox.setDisabled(recipe.input_ids[idx] is None) sbox.setValue(recipe.gammas[idx]) else: - for idx, sbox in enumerate(self.gamma_boxes): + for sbox in self.gamma_boxes: sbox.setDisabled(True) sbox.setValue(1.) diff --git a/uwsift/view/texture_atlas.py b/uwsift/view/texture_atlas.py index 5ce8f60f..b6634afb 100644 --- a/uwsift/view/texture_atlas.py +++ b/uwsift/view/texture_atlas.py @@ -169,7 +169,7 @@ def interpolation(self): @interpolation.setter def interpolation(self, value): - for tex in self._textures: + for _ in self._textures: self._texture.interpolation = value def check_data_format(self, data_arrays): diff --git a/uwsift/view/tile_calculator.py b/uwsift/view/tile_calculator.py index bdc7cd61..d1671604 100644 --- a/uwsift/view/tile_calculator.py +++ b/uwsift/view/tile_calculator.py @@ -539,7 +539,7 @@ def __init__(self, name, image_shape, ul_origin, pixel_rez, # maximum stride that we shouldn't lower resolution beyond self.overview_stride = self.calc_overview_stride() - def visible_tiles(self, visible_geom, stride=Point(1, 1), extra_tiles_box=Box(0, 0, 0, 0)) -> Box: + def visible_tiles(self, visible_geom, stride=None, extra_tiles_box=None) -> Box: """ given a visible world geometry and sampling, return (sampling-state, [Box-of-tiles-to-draw]) sampling state is WELLSAMPLED/OVERSAMPLED/UNDERSAMPLED @@ -547,6 +547,10 @@ def visible_tiles(self, visible_geom, stride=Point(1, 1), extra_tiles_box=Box(0, tiles are specified as (iy,ix) integer pairs extra_box value says how many extra tiles to include around each edge """ + if stride is None: + stride = Point(1, 1) + if extra_tiles_box is None: + extra_tiles_box = Box(0, 0, 0, 0) v = visible_geom e = extra_tiles_box return visible_tiles( diff --git a/uwsift/view/timeline/common.py b/uwsift/view/timeline/common.py index 1e1ec494..5f0f49ad 100644 --- a/uwsift/view/timeline/common.py +++ b/uwsift/view/timeline/common.py @@ -113,7 +113,7 @@ def settings(self, new_settings: ztdtup): self._time_base = new_settings.t self._time_unit = new_settings.d - def __init__(self, time_base: datetime = None, time_unit: timedelta = timedelta(seconds=1), track_height=None): + def __init__(self, time_base: datetime = None, time_unit: timedelta = None, track_height=None): """ Args: @@ -121,6 +121,8 @@ def __init__(self, time_base: datetime = None, time_unit: timedelta = timedelta( time_unit: time width corresponding to delta-X=1.0, defaults to 1.0s track_height: pixels high to display individual ttracks """ + if time_unit is None: + time_unit = timedelta(seconds=1) super(CoordTransform, self).__init__() self._time_base = time_base or datetime.utcnow() self._time_unit = time_unit diff --git a/uwsift/view/timeline/scene.py b/uwsift/view/timeline/scene.py index 9bc4e583..5a3340b8 100644 --- a/uwsift/view/timeline/scene.py +++ b/uwsift/view/timeline/scene.py @@ -622,7 +622,7 @@ def _debug(type, value, tb): sys.__excepthook__(type, value, tb) else: import traceback - import pdb + import pdb # noqa traceback.print_exception(type, value, tb) # …then start the debugger in post-mortem mode. pdb.post_mortem(tb) # more “modern” diff --git a/uwsift/view/visuals.py b/uwsift/view/visuals.py index 8dfac18f..6bd46732 100644 --- a/uwsift/view/visuals.py +++ b/uwsift/view/visuals.py @@ -882,12 +882,12 @@ def __init__(self, filepath, double=False, **kwargs): # Prepare the arrays total_points = 0 total_parts = 0 - for idx, one_shape in enumerate(self.sf.iterShapes()): + for one_shape in self.sf.iterShapes(): total_points += len(one_shape.points) total_parts += len(one_shape.parts) vertex_buffer = np.empty((total_points * 2 - total_parts * 2, 2), dtype=np.float32) prev_idx = 0 - for idx, one_shape in enumerate(self.sf.iterShapes()): + for one_shape in self.sf.iterShapes(): # end_idx = prev_idx + len(one_shape.points) * 2 - len(one_shape.parts) * 2 # vertex_buffer[prev_idx:end_idx:2] = one_shape.points[:-1] # for part_idx in one_shape.parts: diff --git a/uwsift/workspace/collector.py b/uwsift/workspace/collector.py index d2ef114c..516934cb 100644 --- a/uwsift/workspace/collector.py +++ b/uwsift/workspace/collector.py @@ -108,7 +108,7 @@ def _skim(self, last_checked: int = 0, dirs: Iterable[str] = None): if not os.path.isdir(path): LOG.warning("{} is not a directory".format(path)) continue - for dirpath, dirnames, filenames in os.walk(path): + for dirpath, _, filenames in os.walk(path): if self._is_posix and (os.stat(dirpath).st_mtime < last_checked): skipped_dirs += 1 continue @@ -173,7 +173,7 @@ def bgnd_merge_new_file_metadata_into_mdb(self): for reader_and_files in readers_and_files: for reader_name, filenames in reader_and_files.items(): product_infos = self._ws.collect_product_metadata_for_paths(filenames, reader=reader_name) - for num_prods, product_info in product_infos: + for _, product_info in product_infos: changed_uuids.add(product_info[Info.UUID]) num_seen += len(filenames) status = {TASK_DOING: 'collecting metadata {}/{}'.format(num_seen, ntodo), @@ -187,12 +187,12 @@ def bgnd_merge_new_file_metadata_into_mdb(self): def _debug(type, value, tb): - "enable with sys.excepthook = debug" + """Enable with sys.excepthook = debug.""" if not sys.stdin.isatty(): sys.__excepthook__(type, value, tb) else: import traceback - import pdb + import pdb # noqa traceback.print_exception(type, value, tb) # …then start the debugger in post-mortem mode. pdb.post_mortem(tb) # more “modern” diff --git a/uwsift/workspace/matrix.py b/uwsift/workspace/matrix.py index 19826ba5..9848d9f9 100644 --- a/uwsift/workspace/matrix.py +++ b/uwsift/workspace/matrix.py @@ -38,11 +38,7 @@ __author__ = 'rayg' __docformat__ = 'reStructuredText' -import argparse import logging -import os -import sys -import unittest from collections import namedtuple from datetime import timedelta from enum import Enum @@ -84,9 +80,6 @@ class DataAdjacencyMatrix(QObject): - allows re-ordering of products, resulting in z-order scenegraph changes """ - def __init__(self, initial_search_paths=[]): - super(DataAdjacencyMatrix, self).__init__() - def add_search_paths(self, *paths): pass @@ -130,61 +123,3 @@ def _rebuild(self, do_signal=True): :param do_signal: whether or not to propagate a Qt refresh signal :return: True if dimensionality changed """ - - -class tests(unittest.TestCase): - data_file = os.environ.get('TEST_DATA', os.path.expanduser("~/Data/test_files/thing.dat")) - - def setUp(self): - pass - - def test_something(self): - pass - - -def _debug(type, value, tb): - "enable with sys.excepthook = debug" - if not sys.stdin.isatty(): - sys.__excepthook__(type, value, tb) - else: - import traceback - import pdb - traceback.print_exception(type, value, tb) - # …then start the debugger in post-mortem mode. - pdb.post_mortem(tb) # more “modern” - - -def main(): - parser = argparse.ArgumentParser( - description="PURPOSE", - epilog="", - fromfile_prefix_chars='@') - parser.add_argument('-v', '--verbose', dest='verbosity', action="count", default=0, - help='each occurrence increases verbosity 1 level through ERROR-WARNING-Info-DEBUG') - parser.add_argument('-d', '--debug', dest='debug', action='store_true', - help="enable interactive PDB debugger on exception") - # http://docs.python.org/2.7/library/argparse.html#nargs - # parser.add_argument('--stuff', nargs='5', dest='my_stuff', - # help="one or more random things") - parser.add_argument('inputs', nargs='*', - help="input files to process") - args = parser.parse_args() - - levels = [logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG] - logging.basicConfig(level=levels[min(3, args.verbosity)]) - - if args.debug: - sys.excepthook = _debug - - if not args.inputs: - unittest.main() - return 0 - - for pn in args.inputs: - pass - - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/uwsift/workspace/metadatabase.py b/uwsift/workspace/metadatabase.py index c6cb0882..8af754be 100644 --- a/uwsift/workspace/metadatabase.py +++ b/uwsift/workspace/metadatabase.py @@ -886,7 +886,7 @@ def _debug(type, value, tb): sys.__excepthook__(type, value, tb) else: import traceback - import pdb + import pdb # noqa traceback.print_exception(type, value, tb) # …then start the debugger in post-mortem mode. pdb.post_mortem(tb) # more “modern” @@ -919,9 +919,6 @@ def main(): levels = [logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG] logging.basicConfig(level=levels[min(3, args.verbosity)]) - for pn in args.inputs: - pass - return 0 diff --git a/uwsift/workspace/workspace.py b/uwsift/workspace/workspace.py index 6ad7a9af..03276945 100644 --- a/uwsift/workspace/workspace.py +++ b/uwsift/workspace/workspace.py @@ -36,12 +36,10 @@ :license: GPLv3, see LICENSE for more details """ -import argparse + import logging import os import shutil -import sys -import unittest from collections import Mapping as ReadOnlyMapping, defaultdict, OrderedDict from datetime import datetime, timedelta from typing import Mapping, Generator, Tuple, Dict @@ -146,15 +144,15 @@ def _test_init(self): co[2:4] = 1 # and of that, only the bottom half of the image @staticmethod - def _rcls(r: int, c: int, l: int): + def _rcls(rows: int, columns: int, levels: int): """ - :param r: rows or None - :param c: columns or None - :param l: levels or None + :param rows: rows or None + :param columns: columns or None + :param levels: levels or None :return: condensed tuple(string with 'rcl', 'rc', 'rl', dimension tuple corresponding to string) """ rcl_shape = tuple( - (name, dimension) for (name, dimension) in zip('rcl', (r, c, l)) if dimension) + (name, dimension) for (name, dimension) in zip('rcl', (rows, columns, levels)) if dimension) rcl = tuple(x[0] for x in rcl_shape) shape = tuple(x[1] for x in rcl_shape) return rcl, shape @@ -454,19 +452,19 @@ def _migrate_metadata(self): def _bgnd_startup_purge(self): ntot = 5 n = 1 - yield {TASK_DOING: "DB pruning cache entries".format(n, ntot), TASK_PROGRESS: float(n) / float(ntot)} + yield {TASK_DOING: "DB pruning cache entries", TASK_PROGRESS: float(n) / float(ntot)} self._purge_missing_content() n += 1 - yield {TASK_DOING: "DB pruning stale resources".format(n, ntot), TASK_PROGRESS: float(n) / float(ntot)} + yield {TASK_DOING: "DB pruning stale resources", TASK_PROGRESS: float(n) / float(ntot)} self._purge_inaccessible_resources() n += 1 - yield {TASK_DOING: "DB pruning orphan products".format(n, ntot), TASK_PROGRESS: float(n) / float(ntot)} + yield {TASK_DOING: "DB pruning orphan products", TASK_PROGRESS: float(n) / float(ntot)} self._purge_orphan_products() n += 1 - yield {TASK_DOING: "DB migrating metadata".format(n, ntot), TASK_PROGRESS: float(n) / float(ntot)} + yield {TASK_DOING: "DB migrating metadata", TASK_PROGRESS: float(n) / float(ntot)} self._migrate_metadata() n += 1 - yield {TASK_DOING: "DB ready".format(n, ntot), TASK_PROGRESS: float(n) / float(ntot)} + yield {TASK_DOING: "DB ready", TASK_PROGRESS: float(n) / float(ntot)} def _then_refresh_mdb_customers(self, *args, **kwargs): self.didUpdateProductsMetadata.emit(set()) @@ -603,7 +601,7 @@ def _total_workspace_bytes(self): :return: """ total = 0 - for root, dirs, files in os.walk(self.cache_dir): + for root, _, files in os.walk(self.cache_dir): sz = sum(os.path.getsize(os.path.join(root, name)) for name in files) total += sz LOG.debug('%d bytes in %s' % (sz, root)) @@ -1358,34 +1356,3 @@ def __getitem__(self, datasetinfo_or_uuid): :return: sliceable object returning numpy arrays """ pass - - -def main(): - parser = argparse.ArgumentParser( - description="PURPOSE", - epilog="", - fromfile_prefix_chars='@') - parser.add_argument('-v', '--verbose', dest='verbosity', action="count", default=0, - help='each occurrence increases verbosity 1 level through ERROR-WARNING-Info-DEBUG') - # http://docs.python.org/2.7/library/argparse.html#nargs - # parser.add_argument('--stuff', nargs='5', dest='my_stuff', - # help="one or more random things") - parser.add_argument('pos_args', nargs='*', - help="positional arguments don't have the '-' prefix") - args = parser.parse_args() - - levels = [logging.ERROR, logging.WARN, logging.INFO, logging.DEBUG] - logging.basicConfig(level=levels[min(3, args.verbosity)]) - - if not args.pos_args: - unittest.main() - return 0 - - for pn in args.pos_args: - pass - - return 0 - - -if __name__ == '__main__': - sys.exit(main())