diff options
author | Lars Wirzenius <liw@liw.fi> | 2013-12-23 00:02:41 +0000 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2013-12-23 00:02:41 +0000 |
commit | a0815fe2c0f90190a2ae97c93a669ec33b46763c (patch) | |
tree | 87720301fddf14db18a1290ac31561857bd62d99 | |
parent | 113c56cc0ccaff0022a318e4894744cf8fb44278 (diff) | |
download | copyright-statement-lint-a0815fe2c0f90190a2ae97c93a669ec33b46763c.tar.gz |
Add rough implementation, simple test suite
-rwxr-xr-x | copyright-statement-lint | 92 | ||||
-rw-r--r-- | yarns/010-tests.yarn | 70 |
2 files changed, 162 insertions, 0 deletions
diff --git a/copyright-statement-lint b/copyright-statement-lint new file mode 100755 index 0000000..f775ead --- /dev/null +++ b/copyright-statement-lint @@ -0,0 +1,92 @@ +#!/usr/bin/python +# Copyright 2013 Lars Wirzenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +# =*= License: GPL-3+ =*= + + +__version__ = '0.0' + + +import cliapp +import os +import re +import sys + + +copyright_pattern = re.compile( + r'Copyright\s+(?P<years>\d+((,|\s)|\d+)*)\s(?P<names>.*)') + + +class CopyrightStatementLint(cliapp.Application): + + def setup(self): + self.errors = False + + def cleanup(self): + if self.errors: + sys.exit(1) + + def process_input(self, filename): + self.statements = [] + cliapp.Application.process_input(self, filename) + if self.statements: + commit_year = self.get_commit_year(filename) + if not self.statements_contain_year(commit_year): + years = [m.group('years') for m in self.statements] + sys.stderr.write( + '%s: commit year %s not contained in ' + 'copyright statement years: %s\n' % + (filename, commit_year, ' '.join(years))) + self.errors = True + else: + sys.stderr.write('%s: no copyright statements\n' % filename) + self.errors = True + + def process_input_line(self, filename, line): + m = copyright_pattern.search(line) + if m: + self.statements.append(m) + + def get_commit_year(self, filename): + output = cliapp.runcmd(['git', 'log', '-n1', filename]) + for line in output.splitlines(): + + if line.startswith('Date:'): + words = line.split() + return int(words[5]) # return year + return 0 # dummy year + + def statements_contain_year(self, year): + for match in self.statements: + pairs = self.parse_years(match.group('years')) + for start, end in pairs: + if start <= year <= end: + return True + return False + + def parse_years(self, years): + pairs = [] + words = [s.strip() for s in years.split(',')] + for word in words: + if '-' in word: + start, end = word.split('-', 1) + else: + start = end = word + pairs.append((int(start), int(end))) + return pairs + + +CopyrightStatementLint(version=__version__).run() diff --git a/yarns/010-tests.yarn b/yarns/010-tests.yarn new file mode 100644 index 0000000..72020c0 --- /dev/null +++ b/yarns/010-tests.yarn @@ -0,0 +1,70 @@ +% copyright-statement-lint test suite + +Introduction +============ + +`copyright-statement-lint` checks source files for copyright +statements, and checks that their copyright year matches the +latest git commit. As such, this test suite needs to verify several +different cases: no copyright statement, wrong year, multiple +statements, etc. Also various forms of copyright statements. + +All of these are fairly simple, however. The test creates a file with +a suitable statement, runs the tool against the file, and checks that +the output of the tool is as expected. + +Scenarios +========= + +Simple case: no copyright file. + + SCENARIO no copyright file + GIVEN an empty file FOOBAR + WHEN copyright-statement-lint is run against FOOBAR + THEN exit code is 1 + AND stderr contains "FOOBAR.*no copyright statement" + +Implementations +=============== + +File creation +------------- + +These are all pretty straightforward. Any files are created +in `$DATADIR` using names given by the user. + + IMPLEMENTS GIVEN an empty file (\S+) + touch "$DATADIR/$MATCH_1" + +Running and checking the results of `copyright-statement-lint` +-------------------------------------------------------------- + +We only have this one way of running the tool. We capture stdout, +stderr, and the exit code. Note: we do not fail the step even if the +tool fails. + + IMPLEMENTS WHEN copyright-statement-lint is run against (\S+) + # Given set -e, we need to use an if to capture non-zero exit + # code. Don't want to turn set -e off, so we capture other errors. + if "$SRCDIR/copyright-statement-lint" \ + --no-default-config "$DATADIR/$MATCH_1" \ + > "$DATADIR/stdout" \ + 2> "$DATADIR/stderr" + then + exit=0 + else + exit=$? + fi + echo "$exit" > "$DATADIR/exit" + +Exit code checking. Since we don't fail the running of the tool, +every scenario is expected to check the exit code. + + IMPLEMENTS THEN exit code is (\d+) + cat "$DATADIR/exit" + grep -Fx "$MATCH_1" "$DATADIR/exit" + +Check stdout/stderr. + + IMPLEMENTS THEN (\S+) contains "(.*)" + grep "$MATCH_2" "$DATADIR/$MATCH_1" |