From 24c7e4e209cf1926e5ea2dff4a14c5fccecb5822 Mon Sep 17 00:00:00 2001 From: Markus Lehtonen Date: Fri, 6 Sep 2013 17:15:52 +0300 Subject: [PATCH] rpm.SpecFile: support parsing spec as raw text data Instead of reading from a file. Signed-off-by: Markus Lehtonen --- gbp/rpm/__init__.py | 33 +++++++++++++++++++++++---------- 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 6815b0c..8bbab70 100644 --- a/gbp/rpm/__init__.py +++ b/gbp/rpm/__init__.py @@ -118,18 +118,31 @@ class SpecFile(object): 'files', 'changelog', 'triggerin', 'triggerpostin', 'triggerun', 'triggerpostun') - 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 b37007b..47aaf7f 100644 --- a/tests/test_rpm.py +++ b/tests/test_rpm.py @@ -150,6 +150,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 -- 2.7.4