diff --git a/.travis.yml b/.travis.yml index 17bffbd05c..6ea039b20d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,8 +25,6 @@ before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo mkdir -p $SWBASE && sudo chown $USER $SWBASE; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then curl https://download.calibre-ebook.com/travis/sw-osx.tar.bz2 | tar xj -C $SWBASE; fi - npm install --no-optional rapydscript-ng && echo $PATH && which rapydscript && rapydscript --version - - python $SW/bin/easy_install --user "pip==9.0.1" - - pip install --user -r requirements.txt - python setup.py bootstrap --ephemeral script: python setup.py test diff --git a/appveyor.yml b/appveyor.yml index 4d8531fd7f..9efa153e3a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,8 +20,6 @@ platform: before_build: - C:\Python35-x64\python.exe setup/win-ci.py sw - - C:\sw\private\python\easy_install.exe --user "pip==9.0.1" - - C:\sw\private\python\pip install --user -r requirements.txt build_script: - C:\sw\private\python\python.exe setup/win-ci.py build diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index ade8b82800..0000000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Note, this file is work-in-progress, and is partial only. -mock==2.0.0 diff --git a/src/calibre/library/cli.py b/src/calibre/library/cli.py index e80766b775..5f62690e34 100644 --- a/src/calibre/library/cli.py +++ b/src/calibre/library/cli.py @@ -267,6 +267,8 @@ class DevNull(object): def write(self, msg): pass + + NULL = DevNull() @@ -1362,7 +1364,6 @@ def command_check_library(args, dbpath): else: exts = [f.strip() for f in opts.exts.split(',') if f.strip()] - if not LibraryDatabase.exists_at(dbpath): prints('No library found at', dbpath, file=sys.stderr) raise SystemExit(1) @@ -1371,25 +1372,25 @@ def command_check_library(args, dbpath): checker = CheckLibrary(dbpath, db) checker.scan_library(names, exts) for check in checks: - _print_check_library_results(checker, check, opts) + _print_check_library_results(checker, check, as_csv=opts.csv) -def _print_check_library_results(checker, check, opts): +def _print_check_library_results(checker, check, as_csv=False, out=sys.stdout): attr = check[0] list = getattr(checker, attr, None) if list is None: return - if opts.csv: + if as_csv: to_output = [(check[1], i[0], i[1]) for i in list] - csv_print = csv.writer(sys.stdout) + csv_print = csv.writer(out) for line in to_output: csv_print.writerow(line) else: - print check[1] + print >>out, check[1] for i in list: - print ' %-40.40s - %-40.40s'%(i[0], i[1]) + print >>out, ' %-40.40s - %-40.40s'%(i[0], i[1]) def restore_database_option_parser(): @@ -1648,6 +1649,7 @@ language, for example: {0} help=_('The maximum number of results to return. Default is all results.')) return parser + COMMANDS = ('list', 'add', 'remove', 'add_format', 'remove_format', 'show_metadata', 'set_metadata', 'export', 'catalog', 'saved_searches', 'add_custom_column', 'custom_columns', @@ -1706,5 +1708,6 @@ def main(args=sys.argv): return command(args[2:], dbpath) + if __name__ == '__main__': sys.exit(main()) diff --git a/src/calibre/library/test_cli.py b/src/calibre/library/test_cli.py index 40db50fd97..3118c2ffca 100644 --- a/src/calibre/library/test_cli.py +++ b/src/calibre/library/test_cli.py @@ -11,53 +11,49 @@ Test the CLI of the calibre database management tool ''' import csv import unittest -from StringIO import StringIO +from cStringIO import StringIO -from mock import Mock, patch -from calibre.library.check_library import CheckLibrary from calibre.library.cli import _print_check_library_results +class Checker(object): + + def __init__(self, kw): + for k, v in kw.iteritems(): + setattr(self, k, v) + + class PrintCheckLibraryResultsTest(unittest.TestCase): """ Asserts the format of the output to the CLI to avoid regressions """ - check_machine_name = 'dummy_check' - check_human_name = 'Dummy Check' - check = (check_machine_name, check_human_name, True, False) - @patch('sys.stdout', new_callable=StringIO) - def test_prints_nothing_if_no_errors(self, mock_stdout): - checker = Mock(name='checker', spec=CheckLibrary) - setattr(checker, self.check_machine_name, None) - opts = Mock() + check = ('dummy_check', 'Dummy Check') - opts.csv = False - _print_check_library_results(checker, self.check, opts) - self.assertEqual(mock_stdout.getvalue(), '') + def test_prints_nothing_if_no_errors(self): + stdout = StringIO() + checker = Checker(dict.fromkeys(self.check)) + _print_check_library_results(checker, self.check, as_csv=False, out=stdout) + self.assertEqual(stdout.getvalue(), '') + _print_check_library_results(checker, self.check, as_csv=True, out=stdout) + self.assertEqual(stdout.getvalue(), '') - opts.csv = True - _print_check_library_results(checker, self.check, opts) - self.assertEqual(mock_stdout.getvalue(), '') - - @patch('sys.stdout', new_callable=StringIO) - def test_human_readable_output(self, mock_stdout): + def test_human_readable_output(self): """ Basic check of the human-readable output. Does not test: the full line format, truncation """ - checker = Mock(name='checker', speck=CheckLibrary) data = [['first', 'second']] - opts = Mock() - opts.csv = False - setattr(checker, self.check_machine_name, data) - _print_check_library_results(checker, self.check, opts) + checker = Checker(dict.fromkeys(self.check)) + setattr(checker, self.check[0], data) + stdout = StringIO() + _print_check_library_results(checker, self.check, out=stdout, as_csv=False) - result = mock_stdout.getvalue().split('\n') + result = stdout.getvalue().split('\n') self.assertEqual(len(result), len(data)+2) - self.assertEqual(result[0], self.check_human_name) + self.assertEqual(result[0], self.check[1]) result_first = result[1].split('-')[0].strip() result_second = result[1].split('-')[1].strip() @@ -67,37 +63,33 @@ class PrintCheckLibraryResultsTest(unittest.TestCase): self.assertEqual(result[-1], '') - @patch('sys.stdout', new_callable=StringIO) - def test_basic_csv_output(self, mock_stdout): + def test_basic_csv_output(self): """ Test simple csv output """ - checker = Mock(name='checker', speck=CheckLibrary) data = [['first', 'second']] - opts = Mock() - opts.csv = True - setattr(checker, self.check_machine_name, data) - _print_check_library_results(checker, self.check, opts) + checker = Checker(dict.fromkeys(self.check)) + setattr(checker, self.check[0], data) + stdout = StringIO() + _print_check_library_results(checker, self.check, as_csv=True, out=stdout) - result = mock_stdout.getvalue().split('\n') + result = stdout.getvalue().split('\n') parsed_result = [l for l in csv.reader(result) if l] - self.assertEqual(parsed_result, [[self.check_human_name, data[0][0], data[0][1]]]) + self.assertEqual(parsed_result, [[self.check[1], data[0][0], data[0][1]]]) - @patch('sys.stdout', new_callable=StringIO) - def test_escaped_csv_output(self, mock_stdout): + def test_escaped_csv_output(self): """ Test more complex csv output """ - checker = Mock(name='checker', speck=CheckLibrary) data = [['I, Caesar', 'second']] - opts = Mock() - opts.csv = True - setattr(checker, self.check_machine_name, data) - _print_check_library_results(checker, self.check, opts) + checker = Checker(dict.fromkeys(self.check)) + setattr(checker, self.check[0], data) + stdout = StringIO() + _print_check_library_results(checker, self.check, as_csv=True, out=stdout) - result = mock_stdout.getvalue().split('\n') + result = stdout.getvalue().split('\n') parsed_result = [l for l in csv.reader(result) if l] - self.assertEqual(parsed_result, [[self.check_human_name, data[0][0], data[0][1]]]) + self.assertEqual(parsed_result, [[self.check[1], data[0][0], data[0][1]]]) def find_tests():