diff options
-rw-r--r-- | gbp/rpm/__init__.py | 33 | ||||
-rw-r--r-- | tests/test_rpm.py | 17 |
2 files changed, 40 insertions, 10 deletions
diff --git a/gbp/rpm/__init__.py b/gbp/rpm/__init__.py index d3078867..19cf1fa5 100644 --- a/gbp/rpm/__init__.py +++ b/gbp/rpm/__init__.py @@ -112,18 +112,31 @@ class SpecFile(object): gbptag_re = re.compile(r'^\s*#\s*gbp-(?P<name>[a-z-]+)' '(\s*:\s*(?P<args>\S.*))?$', flags=re.I) - def __init__(self, specfile): + def __init__(self, filename=None, filedata=None): - # Load spec file into our special data structure - self.specfile = os.path.basename(specfile) - self.specdir = os.path.dirname(os.path.abspath(specfile)) self._content = LinkedList() - try: - with open(specfile) as spec_file: - for line in spec_file.readlines(): - self._content.append(line) - except IOError as err: - raise NoSpecError("Unable to read spec file: %s" % err) + + # Check args: only filename or filedata can be given, not both + if filename is None and filedata is None: + raise NoSpecError("No filename or raw data given for parsing!") + elif filename and filedata: + raise NoSpecError("Both filename and raw data given, don't know " + "which one to parse!") + elif filename: + # Load spec file into our special data structure + self.specfile = os.path.basename(filename) + self.specdir = os.path.dirname(os.path.abspath(filename)) + try: + with open(filename) as spec_file: + for line in spec_file.readlines(): + self._content.append(line) + except IOError as err: + raise NoSpecError("Unable to read spec file: %s" % err) + else: + self.specfile = None + self.specdir = None + for line in filedata.splitlines(): + self._content.append(line + '\n') # Use rpm-python to parse the spec file content self._filtertags = ("excludearch", "excludeos", "exclusivearch", diff --git a/tests/test_rpm.py b/tests/test_rpm.py index 63c9e8c3..c4174665 100644 --- a/tests/test_rpm.py +++ b/tests/test_rpm.py @@ -147,6 +147,23 @@ class TestSpecFile(object): assert spec.name == 'gbp-test-native2' assert spec.orig_src is None + def test_parse_raw(self): + """Test parsing of a valid spec file""" + with assert_raises(NoSpecError): + SpecFile(None, None) + with assert_raises(NoSpecError): + SpecFile('filename', 'filedata') + + spec_filepath = os.path.join(SPEC_DIR, 'gbp-test.spec') + with open(spec_filepath, 'r') as spec_fd: + spec_data = spec_fd.read() + spec = SpecFile(filedata=spec_data) + + # Test basic properties + assert spec.specfile == None + assert spec.specdir == None + assert spec.name == 'gbp-test' + def test_update_spec(self): """Test spec autoupdate functionality""" # Create temporary spec file |