rpm.SpecFile: support parsing spec as raw text data
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Fri, 6 Sep 2013 14:15:52 +0000 (17:15 +0300)
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 7 Jan 2014 14:21:31 +0000 (16:21 +0200)
Instead of reading from a file.

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
gbp/rpm/__init__.py
tests/test_rpm.py

index d3078867e98d6b79456e9bb09c15b69eb9c077e4..19cf1fa527e48e8cc029934a51399528ef432b5c 100644 (file)
@@ -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",
index 63c9e8c386cb243012ca414a4fbcf8bb182de47d..c4174665958429b7e984e6c2dd3346df447c1def 100644 (file)
@@ -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