Skip to content
This repository has been archived by the owner on Mar 8, 2022. It is now read-only.

Commit

Permalink
Merge branch 'release/1.3'
Browse files Browse the repository at this point in the history
  • Loading branch information
pmuller committed Apr 10, 2019
2 parents 9faa712 + 4d1e53b commit e916166
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 19 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.rst
Expand Up @@ -2,6 +2,13 @@ Changelog
=========


1.3.0 (2019-04-10)
------------------

* Allow passing multiple directories on the CLI
* Allow glob patterns of directories on the CLI


1.2.1
-----

Expand Down
5 changes: 3 additions & 2 deletions README.rst
Expand Up @@ -17,11 +17,12 @@ Usage
$ purge-old-files -h
usage: purge-old-files [-h] [--debug | --quiet] [--syslog] [--dry-run]
[--include PATTERN] [--exclude PATTERN]
MIN_AGE DIRECTORY
MIN_AGE [DIRECTORY [DIRECTORY ...]]
positional arguments:
MIN_AGE Minimum age of files
DIRECTORY Directory to be scanned
DIRECTORY Directory or glob pattern to be scanned (multiple
directories can be provided)
optional arguments:
-h, --help show this help message and exit
Expand Down
2 changes: 1 addition & 1 deletion purge_old_files/__init__.py
@@ -1 +1 @@
__version__ = '1.2.1'
__version__ = '1.3.0'
12 changes: 10 additions & 2 deletions purge_old_files/cli.py
@@ -1,4 +1,5 @@
from argparse import ArgumentParser, Namespace
from glob import glob
import logging
import logging.handlers
from os import unlink, getpid
Expand Down Expand Up @@ -46,7 +47,9 @@ def parse_arguments(argv=None):
type=lambda x: filters.age(age.parse(x)),
help='Minimum age of files')
parser.add_argument(
'directory', metavar='DIRECTORY', help='Directory to be scanned')
'directories', metavar='DIRECTORY', nargs='*',
help='Directory or glob pattern to be scanned '
'(multiple directories can be provided)')

# Create a namespace and set the default log_level
namespace = Namespace(log_level=logging.INFO)
Expand Down Expand Up @@ -81,7 +84,12 @@ def main(argv=None):
arguments = parse_arguments(argv)
configure_logging(arguments.log_level, arguments.syslog)

files = finder.find(arguments.directory, arguments.filters)
files = [
file_
for pattern in arguments.directories
for directory in glob(pattern)
for file_ in finder.find(directory, arguments.filters)
]

for file_ in files:
if arguments.dry_run:
Expand Down
5 changes: 5 additions & 0 deletions tests/helpers.py
Expand Up @@ -21,3 +21,8 @@ def make_test_files_hierarchy(tmpdir):
baz = foo.mkdir('bar').join('baz')
baz.write('baz')
utime(str(baz), (one_year_ago, one_year_ago))

foobar = tmpdir.mkdir('foobar')
foobar_1 = foobar.join('1')
foobar_1.write('1')
utime(str(foobar_1), (one_month_ago, one_month_ago))
75 changes: 61 additions & 14 deletions tests/test_cli.py
@@ -1,4 +1,5 @@
from os.path import join
from glob import glob
import logging
import logging.handlers

Expand All @@ -10,39 +11,85 @@


@pytest.mark.parametrize(
'arguments, remaining, log_level, log_handler_class',
'arguments, directories, expected_remaining, log_level, log_handler_class',
(
(
['--dry-run', '10s'], ['foo/1', 'foo/2', 'foo/bar/baz'],
logging.INFO, logging.StreamHandler,
['--dry-run', '10s'],
['foo'],
['foo/1', 'foo/2', 'foo/bar/baz'],
logging.INFO,
logging.StreamHandler,
),
(
['-Ds', '1d'],
['foo'],
[],
logging.DEBUG,
logging.handlers.SysLogHandler,
),
(
['3M'],
['foo'],
['foo/1', 'foo/2'],
logging.INFO,
logging.StreamHandler,
),
(['-Ds', '1d'], [], logging.DEBUG, logging.handlers.SysLogHandler),
(['3M'], ['foo/1', 'foo/2'], logging.INFO, logging.StreamHandler),
(
['--include', '[0-9]', '10d'], ['foo/1', 'foo/bar/baz'],
logging.INFO, logging.StreamHandler,
['--include', '[0-9]', '10d'],
['foo'],
['foo/1', 'foo/bar/baz'],
logging.INFO,
logging.StreamHandler,
),
(
['--exclude', '[0-9]', '10d'], ['foo/1', 'foo/2'],
logging.INFO, logging.StreamHandler,
['--exclude', '[0-9]', '10d'],
['foo'],
['foo/1', 'foo/2'],
logging.INFO,
logging.StreamHandler,
),
(
['--include', '[0-9]', '--exclude', '2', '-q', '10d'],
['foo'],
['foo/1', 'foo/2', 'foo/bar/baz'],
logging.WARNING, logging.StreamHandler
logging.WARNING,
logging.StreamHandler
),
(
['10d'],
['foo', 'foobar'],
['foo/1'],
logging.INFO,
logging.StreamHandler,
),
(
['10d'],
['foo*'],
['foo/1'],
logging.INFO,
logging.StreamHandler,
),
),
)
def test(arguments, remaining, log_level, log_handler_class, tmpdir):
def test( # pylint: disable=too-many-arguments
arguments, directories, expected_remaining, log_level,
log_handler_class, tmpdir):
# Prepare the environment
make_test_files_hierarchy(tmpdir)
str_tmpdir = str(tmpdir)
root_logger = logging.getLogger()
# Call the CLI
cli.main(arguments + [str_tmpdir])
absolute_directories = [
join(str_tmpdir, directory) for directory in directories]
cli.main(arguments + absolute_directories)
# Ensure results are consistent
assert sorted(finder.find(str_tmpdir)) == [
finder.File(join(str_tmpdir, path)) for path in remaining]
remaining_files = sorted(
file_
for pattern in absolute_directories
for directory in glob(pattern)
for file_ in finder.find(directory))
assert remaining_files == [
finder.File(join(str_tmpdir, path)) for path in expected_remaining]
# Ensure verbosity control works as expected
assert root_logger.level == log_level
# Ensure the request log handler is used
Expand Down
3 changes: 3 additions & 0 deletions tests/test_finder.py
Expand Up @@ -15,6 +15,7 @@ def test_find(tmpdir):
File('%s/foo/1' % tmpdir),
File('%s/foo/2' % tmpdir),
File('%s/foo/bar/baz' % tmpdir),
File('%s/foobar/1' % tmpdir),
]

# Test filtering based on time
Expand All @@ -26,11 +27,13 @@ def test_find(tmpdir):
assert sorted(find(str(tmpdir), [glob('[0-9]')])) == [
File('%s/foo/1' % tmpdir),
File('%s/foo/2' % tmpdir),
File('%s/foobar/1' % tmpdir),
]

# Test with a mix of filters
assert find(str(tmpdir), [glob('[0-9]'), age(timedelta(days=8))]) == [
File('%s/foo/2' % tmpdir),
File('%s/foobar/1' % tmpdir),
]


Expand Down

0 comments on commit e916166

Please sign in to comment.