Solve all flake8 warnings (#163)

Whipper is now fully PEP8 compliant.
Revised version which includes all the changes suggested by Freso.
This commit is contained in:
JoeLametta
2017-05-31 23:09:36 +02:00
committed by GitHub
parent b331f53b47
commit b6fb7e8a86
49 changed files with 614 additions and 539 deletions

View File

@@ -30,6 +30,7 @@ from whipper.common import directory
import logging
logger = logging.getLogger(__name__)
class Persister:
"""
I wrap an optional pickle to persist an object to disk.
@@ -125,7 +126,7 @@ class PersistedCache:
try:
os.makedirs(self.path)
except OSError, e:
if e.errno != 17: # FIXME
if e.errno != 17: # FIXME
raise
def _getPath(self, key):
@@ -176,7 +177,7 @@ class ResultCache:
presult.persist(presult.object)
else:
logger.debug('result for cddbdiscid %r found in cache, reusing',
cddbdiscid)
cddbdiscid)
return presult
@@ -218,7 +219,7 @@ class TableCache:
ptable.object = None
else:
logger.debug('no valid cached table found for %r' %
cddbdiscid)
cddbdiscid)
if not ptable.object:
# get an empty persistable from the writable location

View File

@@ -67,8 +67,9 @@ class FastAccurateRipChecksumTask(etask.Task):
self.schedule(0.0, self._arc)
def _arc(self):
arc = accuraterip_checksum(self.path, self.trackNumber, self.trackCount,
self._wave, self._v2)
arc = accuraterip_checksum(self.path, self.trackNumber,
self.trackCount,
self._wave, self._v2)
self.checksum = arc
self.stop()

View File

@@ -21,7 +21,6 @@
import os
import os.path
import commands
import math
import subprocess
@@ -32,7 +31,7 @@ logger = logging.getLogger(__name__)
FRAMES_PER_SECOND = 75
SAMPLES_PER_FRAME = 588 # a sample is 2 16-bit values, left and right channel
SAMPLES_PER_FRAME = 588 # a sample is 2 16-bit values, left and right channel
WORDS_PER_FRAME = SAMPLES_PER_FRAME * 2
BYTES_PER_FRAME = SAMPLES_PER_FRAME * 4
@@ -41,6 +40,7 @@ class EjectError(SystemError):
"""
Possibly ejects the drive in command.main.
"""
def __init__(self, device, *args):
"""
args is a tuple used by BaseException.__str__
@@ -60,7 +60,7 @@ def msfToFrames(msf):
@rtype: int
@returns: number of frames
"""
if not ':' in msf:
if ':' not in msf:
return int(msf)
m, s, f = msf.split(':')
@@ -133,6 +133,7 @@ def formatTime(seconds, fractional=3):
return " ".join(chunks)
class MissingDependencyException(Exception):
dependency = None
@@ -144,6 +145,7 @@ class MissingDependencyException(Exception):
class EmptyError(Exception):
pass
class MissingFrames(Exception):
"""
Less frames decoded than expected.
@@ -289,8 +291,8 @@ class VersionGetter(object):
try:
p = asyncsub.Popen(self._args,
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, close_fds=True)
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, close_fds=True)
p.wait()
output = asyncsub.recv_some(p, e=0, stderr=1)
vre = self._regexp.search(output)

View File

@@ -30,6 +30,7 @@ from whipper.common import directory
import logging
logger = logging.getLogger(__name__)
class Config:
def __init__(self, path=None):
@@ -46,7 +47,7 @@ class Config:
self._parser.readfp(f)
logger.info('Loaded %d sections from config file' %
len(self._parser.sections()))
len(self._parser.sections()))
def write(self):
fd, path = tempfile.mkstemp(suffix=u'.whipperrc')
@@ -55,8 +56,7 @@ class Config:
handle.close()
shutil.move(path, self._path)
### any section
# any section
def _getter(self, suffix, section, option):
methodName = 'get' + suffix
@@ -72,7 +72,7 @@ class Config:
def getboolean(self, section, option):
return self._getter('boolean', section, option)
### drive sections
# drive sections
def setReadOffset(self, vendor, model, release, offset):
"""
@@ -96,7 +96,6 @@ class Config:
raise KeyError("Could not find read_offset for %s/%s/%s" % (
vendor, model, release))
def setDefeatsCache(self, vendor, model, release, defeat):
"""
Set whether the drive defeats the cache.
@@ -139,7 +138,7 @@ class Config:
return name
raise KeyError("Could not find configuration section for %s/%s/%s" % (
vendor, model, release))
vendor, model, release))
def _findOrCreateDriveSection(self, vendor, model, release):
try:

View File

@@ -21,6 +21,7 @@
from os import getenv, makedirs
from os.path import join, expanduser, exists
def config_path():
path = join(getenv('XDG_CONFIG_HOME') or join(expanduser('~'), u'.config'),
u'whipper')
@@ -28,6 +29,7 @@ def config_path():
makedirs(path)
return join(path, u'whipper.conf')
def cache_path(name=None):
path = join(getenv('XDG_CACHE_HOME') or join(expanduser('~'), u'.cache'),
u'whipper')
@@ -37,9 +39,10 @@ def cache_path(name=None):
makedirs(path)
return path
def data_path(name=None):
path = join(getenv('XDG_DATA_HOME')
or join(expanduser('~'), u'.local/share'),
path = join(getenv('XDG_DATA_HOME') or
join(expanduser('~'), u'.local/share'),
u'whipper')
if name:
path = join(path, name)

View File

@@ -23,6 +23,7 @@ import os
import logging
logger = logging.getLogger(__name__)
def _listify(listOrString):
if type(listOrString) == str:
return [listOrString, ]
@@ -64,7 +65,6 @@ def getDeviceInfo(path):
import cdio
except ImportError:
return None
device = cdio.Device(path)
ok, vendor, model, release = device.get_hwinfo()

View File

@@ -29,6 +29,7 @@ from whipper.program import flac
import logging
logger = logging.getLogger(__name__)
class SoxPeakTask(task.Task):
description = 'Calculating peak level'
@@ -44,6 +45,7 @@ class SoxPeakTask(task.Task):
self.peak = sox.peak_level(self.track_path)
self.stop()
class FlacEncodeTask(task.Task):
description = 'Encoding to FLAC'
@@ -61,11 +63,13 @@ class FlacEncodeTask(task.Task):
self.new_path = flac.encode(self.track_path, self.track_out_path)
self.stop()
# TODO: Wizzup: Do we really want this as 'Task'...?
# I only made it a task for now because that it's easier to integrate in
# program/cdparanoia.py - where whipper currently does the tagging.
# We should just move the tagging to a more sensible place.
class TaggingTask(task.Task):
# TODO: Wizzup: Do we really want this as 'Task'...?
# I only made it a task for now because that it's easier to integrate in
# program/cdparanoia.py - where whipper currently does the tagging.
# We should just move the tagging to a more sensible place.
description = 'Writing tags to FLAC'
def __init__(self, track_path, tags):

View File

@@ -28,7 +28,7 @@ import logging
logger = logging.getLogger(__name__)
VA_ID = "89ad4ac3-39f7-470e-963a-56509c546377" # Various Artists
VA_ID = "89ad4ac3-39f7-470e-963a-56509c546377" # Various Artists
class MusicBrainzException(Exception):
@@ -47,7 +47,7 @@ class NotFoundException(MusicBrainzException):
class TrackMetadata(object):
artist = None
title = None
duration = None # in ms
duration = None # in ms
mbid = None
sortName = None
mbidArtist = None
@@ -131,7 +131,6 @@ class _Credit(list):
return "".join(res)
def getSortName(self):
return self.joiner(lambda i: i.get('artist').get('sort-name', None))
@@ -140,7 +139,7 @@ class _Credit(list):
def getIds(self):
return self.joiner(lambda i: i.get('artist').get('id', None),
joinString=";")
joinString=";")
def _getMetadata(releaseShort, release, discid, country=None):
@@ -152,7 +151,7 @@ def _getMetadata(releaseShort, release, discid, country=None):
@rtype: L{DiscMetadata} or None
"""
logger.debug('getMetadata for release id %r',
release['id'])
release['id'])
if not release['id']:
logger.warning('No id for release %r', release)
return None
@@ -173,7 +172,6 @@ def _getMetadata(releaseShort, release, discid, country=None):
if discCredit[0]['artist']['id'] == VA_ID:
discMD.various = True
if len(discCredit) > 1:
logger.debug('artist-credit more than 1: %r', discCredit)
@@ -233,8 +231,9 @@ def _getMetadata(releaseShort, release, discid, country=None):
# FIXME: unit of duration ?
track.duration = int(t['recording'].get('length', 0))
if not track.duration:
logger.warning('track %r (%r) does not have duration' % (
track.title, track.mbid))
logger.warning(
'track %r (%r) does not have duration' %
(track.title, track.mbid))
tainted = True
else:
duration += track.duration
@@ -270,8 +269,8 @@ def musicbrainz(discid, country=None, record=False):
ret = []
try:
result = musicbrainzngs.get_releases_by_discid(discid,
includes=["artists", "recordings", "release-groups"])
result = musicbrainzngs.get_releases_by_discid(
discid, includes=["artists", "recordings", "release-groups"])
except musicbrainzngs.ResponseError, e:
if isinstance(e.cause, urllib2.HTTPError):
if e.cause.code == 404:
@@ -284,7 +283,7 @@ def musicbrainz(discid, country=None, record=False):
# The result can either be a "disc" or a "cdstub"
if result.get('disc'):
logger.debug('found %d releases for discid %r',
len(result['disc']['release-list']), discid)
len(result['disc']['release-list']), discid)
_record(record, 'releases', discid, result)
# Display the returned results to the user.

View File

@@ -51,12 +51,13 @@ class PathFilter(object):
# change all fancy single/double quotes to normal quotes
if self._quotes:
path = re.sub(ur'[\xc2\xb4\u2018\u2019\u201b]', "'", path,
re.UNICODE)
re.UNICODE)
path = re.sub(ur'[\u201c\u201d\u201f]', '"', path, re.UNICODE)
if self._special:
path = separators(path)
path = re.sub(r'[\*\?&!\'\"\$\(\)`{}\[\]<>]', '_', path, re.UNICODE)
path = re.sub(r'[\*\?&!\'\"\$\(\)`{}\[\]<>]',
'_', path, re.UNICODE)
if self._fat:
path = separators(path)

View File

@@ -76,7 +76,7 @@ class Program:
'special': False
}.items():
value = None
value = self._config.getboolean('main', 'path_filter_'+ key)
value = self._config.getboolean('main', 'path_filter_' + key)
if value is None:
value = default
@@ -105,9 +105,8 @@ class Program:
version = cdrdao.getCDRDAOVersion()
if V(version) < V('1.2.3rc2'):
sys.stdout.write('Warning: cdrdao older than 1.2.3 has a '
'pre-gap length bug.\n'
'See http://sourceforge.net/tracker/?func=detail'
'&aid=604751&group_id=2171&atid=102171\n')
'pre-gap length bug.\n'
'See http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=102171\n') # noqa: E501
t = cdrdao.ReadTOCTask(device)
ptoc.persist(t.table)
toc = ptoc.object
@@ -133,17 +132,17 @@ class Program:
itable = tdict[offset]
if not itable:
logger.debug('getTable: cddbdiscid %s, mbdiscid %s not in cache for offset %s, '
'reading table' % (
cddbdiscid, mbdiscid, offset))
logger.debug('getTable: cddbdiscid %s, mbdiscid %s not '
'in cache for offset %s, reading table' % (
cddbdiscid, mbdiscid, offset))
t = cdrdao.ReadTableTask(device)
itable = t.table
tdict[offset] = itable
ptable.persist(tdict)
logger.debug('getTable: read table %r' % itable)
else:
logger.debug('getTable: cddbdiscid %s, mbdiscid %s in cache for offset %s' % (
cddbdiscid, mbdiscid, offset))
logger.debug('getTable: cddbdiscid %s, mbdiscid %s in cache '
'for offset %s' % (cddbdiscid, mbdiscid, offset))
logger.debug('getTable: loaded table %r' % itable)
assert itable.hasTOC()
@@ -151,7 +150,7 @@ class Program:
self.result.table = itable
logger.debug('getTable: returning table with mb id %s' %
itable.getMusicBrainzDiscId())
itable.getMusicBrainzDiscId())
return itable
def getRipResult(self, cddbdiscid):
@@ -200,11 +199,11 @@ class Program:
# default values
v['A'] = 'Unknown Artist'
v['d'] = mbdiscid # fallback for title
v['d'] = mbdiscid # fallback for title
v['r'] = 'unknown'
v['R'] = 'Unknown'
v['B'] = '' # barcode
v['C'] = '' # catalog number
v['B'] = '' # barcode
v['C'] = '' # catalog number
v['x'] = 'flac'
v['X'] = v['x'].upper()
v['y'] = '0000'
@@ -215,7 +214,6 @@ class Program:
else:
v['n'] = 'Unknown Track %d' % i
if self.metadata:
release = self.metadata.release or '0000'
v['y'] = release[:4]
@@ -229,10 +227,12 @@ class Program:
v['r'] = self.metadata.releaseType.lower()
if i > 0:
try:
v['a'] = self._filter.filter(self.metadata.tracks[i - 1].artist)
v['a'] = self._filter.filter(
self.metadata.tracks[i - 1].artist)
v['s'] = self._filter.filter(
self.metadata.tracks[i - 1].sortName)
v['n'] = self._filter.filter(self.metadata.tracks[i - 1].title)
v['n'] = self._filter.filter(
self.metadata.tracks[i - 1].title)
except IndexError, e:
print 'ERROR: no track %d found, %r' % (i, e)
raise
@@ -255,8 +255,6 @@ class Program:
ret = os.path.join(outdir, template % v)
return ret
def getCDDB(self, cddbdiscid):
@@ -282,7 +280,8 @@ class Program:
return None
def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None, prompt=False):
def getMusicBrainz(self, ittoc, mbdiscid, release=None, country=None,
prompt=False):
"""
@type ittoc: L{whipper.image.table.Table}
"""
@@ -291,7 +290,7 @@ class Program:
common.formatTime(ittoc.duration() / 1000.0),
ittoc.getAudioTracks()))
logger.debug('MusicBrainz submit url: %r',
ittoc.getMusicBrainzSubmitURL())
ittoc.getMusicBrainzSubmitURL())
ret = None
metadatas = None
@@ -300,8 +299,8 @@ class Program:
for _ in range(0, 4):
try:
metadatas = mbngs.musicbrainz(mbdiscid,
country=country,
record=self._record)
country=country,
record=self._record)
break
except mbngs.NotFoundException, e:
break
@@ -326,21 +325,23 @@ class Program:
for metadata in metadatas:
self._stdout.write('\n')
self._stdout.write('Artist : %s\n' %
metadata.artist.encode('utf-8'))
metadata.artist.encode('utf-8'))
self._stdout.write('Title : %s\n' %
metadata.title.encode('utf-8'))
metadata.title.encode('utf-8'))
self._stdout.write('Duration: %s\n' %
common.formatTime(metadata.duration / 1000.0))
common.formatTime(metadata.duration /
1000.0))
self._stdout.write('URL : %s\n' % metadata.url)
self._stdout.write('Release : %s\n' % metadata.mbid)
self._stdout.write('Type : %s\n' % metadata.releaseType)
if metadata.barcode:
self._stdout.write("Barcode : %s\n" % metadata.barcode)
if metadata.catalogNumber:
self._stdout.write("Cat no : %s\n" % metadata.catalogNumber)
self._stdout.write("Cat no : %s\n" %
metadata.catalogNumber)
delta = abs(metadata.duration - ittoc.duration())
if not delta in deltas:
if delta not in deltas:
deltas[delta] = []
deltas[delta].append(metadata)
@@ -352,7 +353,8 @@ class Program:
if prompt:
guess = (deltas[lowest])[0].mbid
release = raw_input("\nPlease select a release [%s]: " % guess)
release = raw_input(
"\nPlease select a release [%s]: " % guess)
if not release:
release = guess
@@ -360,15 +362,15 @@ class Program:
if release:
metadatas = [m for m in metadatas if m.url.endswith(release)]
logger.debug('Asked for release %r, only kept %r',
release, metadatas)
release, metadatas)
if len(metadatas) == 1:
self._stdout.write('\n')
self._stdout.write('Picked requested release id %s\n' %
release)
release)
self._stdout.write('Artist : %s\n' %
metadatas[0].artist.encode('utf-8'))
metadatas[0].artist.encode('utf-8'))
self._stdout.write('Title : %s\n' %
metadatas[0].title.encode('utf-8'))
metadatas[0].title.encode('utf-8'))
elif not metadatas:
self._stdout.write(
"Requested release id '%s', "
@@ -385,22 +387,23 @@ class Program:
for i, metadata in enumerate(metadatas):
if not artist == metadata.artist:
logger.warning("artist 0: %r and artist %d: %r "
"are not the same" % (
artist, i, metadata.artist))
"are not the same" % (
artist, i, metadata.artist))
if not releaseTitle == metadata.releaseTitle:
logger.warning("title 0: %r and title %d: %r "
"are not the same" % (
releaseTitle, i, metadata.releaseTitle))
"are not the same" % (
releaseTitle, i,
metadata.releaseTitle))
if (not release and len(deltas.keys()) > 1):
self._stdout.write('\n')
self._stdout.write('Picked closest match in duration.\n')
self._stdout.write('Others may be wrong in MusicBrainz, '
'please correct.\n')
'please correct.\n')
self._stdout.write('Artist : %s\n' %
artist.encode('utf-8'))
artist.encode('utf-8'))
self._stdout.write('Title : %s\n' %
metadatas[0].title.encode('utf-8'))
metadatas[0].title.encode('utf-8'))
# Select one of the returned releases. We just pick the first one.
ret = metadatas[0]
@@ -503,12 +506,13 @@ class Program:
raise
ret = trackResult.testcrc == t.checksum
logger.debug('verifyTrack: track result crc %r, file crc %r, result %r',
logger.debug('verifyTrack: track result crc %r, '
'file crc %r, result %r',
trackResult.testcrc, t.checksum, ret)
return ret
def ripTrack(self, runner, trackResult, offset, device, taglist,
overread, what=None):
overread, what=None):
"""
Ripping the track may change the track's filename as stored in
trackResult.
@@ -527,14 +531,15 @@ class Program:
os.makedirs(dirname)
if not what:
what='track %d' % (trackResult.number, )
what = 'track %d' % (trackResult.number, )
t = cdparanoia.ReadVerifyTrackTask(trackResult.filename,
self.result.table, start, stop, overread,
offset=offset,
device=device,
taglist=taglist,
what=what)
self.result.table, start,
stop, overread,
offset=offset,
device=device,
taglist=taglist,
what=what)
runner.run(t)
@@ -571,7 +576,7 @@ class Program:
"""
logger.debug('verifying Image against %d AccurateRip responses',
len(responses or []))
len(responses or []))
cueImage = image.Image(self.cuePath)
verifytask = image.ImageVerifyTask(cueImage)
@@ -587,7 +592,6 @@ class Program:
trackResult = self.result.getTrackResult(i + 1)
trackResult.ARCRC = csum
if not responses:
logger.warning('No AccurateRip responses, cannot verify.')
return
@@ -615,8 +619,8 @@ class Program:
trackResult.ARDBConfidence = confidence
if not trackResult.accurip:
logger.warning("Track %02d: not matched in AccurateRip database",
i + 1)
logger.warning("Track %02d: not matched in "
"AccurateRip database", i + 1)
# I have seen AccurateRip responses with 0 as confidence
# for example, Best of Luke Haines, disc 1, track 1
@@ -632,7 +636,7 @@ class Program:
trackResult.ARDBMaxConfidence = maxConfidence
if not response:
logger.warning('Track %02d: none of the responses matched.',
i + 1)
i + 1)
trackResult.ARDBCRC = int(
maxResponse.checksums[i], 16)
else:
@@ -650,7 +654,7 @@ class Program:
status = 'rip NOT accurate'
if trackResult.accurip:
status = 'rip accurate '
status = 'rip accurate '
c = "(not found) "
ar = ", DB [notfound]"
@@ -668,7 +672,7 @@ class Program:
if trackResult.ARCRC is None:
assert trackResult.number == 0, \
'no trackResult.ARCRC on non-HTOA track %d' % \
trackResult.number
trackResult.number
res.append("Track 0: unknown (not tracked)")
else:
res.append("Track %2d: %s %s [%08x]%s" % (

View File

@@ -56,7 +56,6 @@ class Operator(object):
operation = cls.deserialize(data)
self._todo.append(operation)
done = os.path.join(self._statePath, self._key + '.done')
if os.path.exists(done):
with open(done, 'r') as handle:

View File

@@ -39,9 +39,11 @@ class PopenTask(task.Task):
try:
self._popen = asyncsub.Popen(self.command,
bufsize=self.bufsize,
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, close_fds=True, cwd=self.cwd)
bufsize=self.bufsize,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
close_fds=True, cwd=self.cwd)
except OSError, e:
import errno
if e.errno == errno.ENOENT:
@@ -50,7 +52,7 @@ class PopenTask(task.Task):
raise
logger.debug('Started %r with pid %d', self.command,
self._popen.pid)
self._popen.pid)
self.schedule(1.0, self._read, runner)
@@ -92,23 +94,23 @@ class PopenTask(task.Task):
self.stop()
def _done(self):
assert self._popen.returncode is not None, "No returncode"
assert self._popen.returncode is not None, "No returncode"
if self._popen.returncode >= 0:
logger.debug('Return code was %d', self._popen.returncode)
else:
logger.debug('Terminated with signal %d',
-self._popen.returncode)
if self._popen.returncode >= 0:
logger.debug('Return code was %d', self._popen.returncode)
else:
logger.debug('Terminated with signal %d',
-self._popen.returncode)
self.setProgress(1.0)
self.setProgress(1.0)
if self._popen.returncode != 0:
self.failed()
else:
self.done()
if self._popen.returncode != 0:
self.failed()
else:
self.done()
self.stop()
return
self.stop()
return
def abort(self):
logger.debug('Aborting, sending SIGTERM to %d', self._popen.pid)
@@ -139,7 +141,6 @@ class PopenTask(task.Task):
"""
pass
def commandMissing(self):
"""
Called when the command is missing.