public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Jauhien Piatlicki" <piatlicki@gmail.com>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/g-sorcery:master commit in: g_sorcery/, tests/
Date: Sat, 29 Jun 2013 12:13:37 +0000 (UTC)	[thread overview]
Message-ID: <1372507748.f56eb9904accf9ab6f9d02ee6c30f2811020c97f.jauhien@gentoo> (raw)

commit:     f56eb9904accf9ab6f9d02ee6c30f2811020c97f
Author:     Jauhien Piatlicki (jauhien) <piatlicki <AT> gmail <DOT> com>
AuthorDate: Sat Jun 29 12:09:08 2013 +0000
Commit:     Jauhien Piatlicki <piatlicki <AT> gmail <DOT> com>
CommitDate: Sat Jun 29 12:09:08 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/g-sorcery.git;a=commit;h=f56eb990

g_sorcery/package_db: exceptions hierarchy, g_sorcery/exceptions: initial commit

---
 g_sorcery/exceptions.py  | 33 +++++++++++++++++++++++++++++++++
 g_sorcery/package_db.py  | 37 ++++++++++++++++++++-----------------
 tests/test_package_db.py | 15 ++++++++-------
 3 files changed, 61 insertions(+), 24 deletions(-)

diff --git a/g_sorcery/exceptions.py b/g_sorcery/exceptions.py
new file mode 100644
index 0000000..857e4ea
--- /dev/null
+++ b/g_sorcery/exceptions.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+    exceptions.py
+    ~~~~~~~~~~~~~
+    
+    Exceptions hierarchy
+    
+    :copyright: (c) 2013 by Jauhien Piatlicki
+    :license: GPL-2, see LICENSE for more details.
+"""
+
+class GSorceryError(Exception):
+    pass
+
+class DBError(GSorceryError):
+    pass
+
+class InvalidKeyError(DBError):
+    pass
+
+class SyncError(DBError):
+    pass
+
+class IntegrityError(DBError):
+    pass
+
+class DBStructureError(DBError):
+    pass
+
+class FileJSONError(Exception):
+    pass

diff --git a/g_sorcery/package_db.py b/g_sorcery/package_db.py
index 1fe4b38..e2cd40d 100644
--- a/g_sorcery/package_db.py
+++ b/g_sorcery/package_db.py
@@ -11,6 +11,9 @@
     :license: GPL-2, see LICENSE for more details.
 """
 
+from .exceptions import DBStructureError, FileJSONError, IntegrityError, \
+     InvalidKeyError, SyncError
+
 import collections, glob, hashlib, json, os, shutil, tarfile, tempfile
 
 Package = collections.namedtuple("Package", "category name version")
@@ -41,13 +44,13 @@ class FileJSON:
                 content = json.load(f)
             for key in self.mandatories:
                 if not key in content:
-                    raise KeyError
+                    raise FileJSONError('lack of mandatory key: ' + key)
         return content
 
     def write(self, content):
         for key in self.mandatories:
             if not key in content:
-                raise KeyError
+                raise FileJSONError('lack of mandatory key: ' + key)
         if not os.path.exists(self.directory):
             os.makedirs(self.directory)
         with open(self.path, 'w') as f:
@@ -131,7 +134,7 @@ class PackageDB:
         real_db_uri = self.get_real_db_uri()
         download_dir = tempfile.TemporaryDirectory()
         if os.system('wget -P ' + download_dir.name + ' ' + real_db_uri):
-            raise Exception('sync failed: ' + real_db_uri)
+            raise SyncError('sync failed: ' + real_db_uri)
         
         temp_dir = tempfile.TemporaryDirectory()
         for f_name in glob.iglob(os.path.join(download_dir.name, '*.tar.gz')):
@@ -148,13 +151,13 @@ class PackageDB:
             copy_all(current_dir, tempdb_dir.name)
 
         if not tempdb.check_manifest():
-            raise Exception('Manifest check failed.')
+            raise IntegrityError('Manifest check failed.')
 
         self.clean()
         copy_all(tempdb_dir.name, self.directory)
         
         if not self.check_manifest():
-            raise Exception('Manifest check failed, db inconsistent.')
+            raise IntegrityError('Manifest check failed, db inconsistent.')
                 
         del download_dir
         del temp_dir
@@ -176,7 +179,7 @@ class PackageDB:
         for category in categories:
             category_path = os.path.join(self.directory, category)
             if not os.path.isdir(category_path):
-                raise Exception('Empty category: ' + category)
+                raise DBStructureError('Empty category: ' + category)
             for root, dirs, files in os.walk(category_path):
                 for f in files:
                     manifest[os.path.join(root[len(self.directory)+1:], f)] = \
@@ -194,7 +197,7 @@ class PackageDB:
         names = [self.INFO_NAME, self.CATEGORIES_NAME, self.URI_NAME]
         for name in names:
             if not name in manifest:
-                raise Exception('Bad manifest: no ' + name + ' entry')
+                raise DBStructureError('Bad manifest: no ' + name + ' entry')
 
         for name, value in manifest.items():
             if hash_file(os.path.join(self.directory, name), hashlib.md5()) != \
@@ -216,7 +219,7 @@ class PackageDB:
         categories_f.write(self.db['categories'])
         for category in self.db['categories']:
             if not category in self.db['packages']:
-                raise Exception('Empty category: ' + category)
+                raise DBStructureError('Empty category: ' + category)
             for package, versions in self.db['packages'][category].items():
                 for version, content in versions.items():
                     f = FileJSON(os.path.join(self.directory, category, package),
@@ -248,7 +251,7 @@ class PackageDB:
     def read(self):
         sane, errors = self.check_manifest()
         if not sane:
-            raise Exception('Manifest error: ' + str(errors))
+            raise IntegrityError('Manifest error: ' + str(errors))
         info_f = FileJSON(self.directory, self.INFO_NAME, [])
         categories_f = FileJSON(self.directory, self.CATEGORIES_NAME, [])
         self.db['info'] = info_f.read()
@@ -256,23 +259,23 @@ class PackageDB:
         for category in self.db['categories']:
             category_path = os.path.join(self.directory, category)
             if not os.path.isdir(category_path):
-                raise Exception('Empty category: ' + category)
+                raise DBStructureError('Empty category: ' + category)
             
             f = FileJSON(category_path, self.PACKAGES_NAME, [])
             packages = f.read()
             if not packages:
-                raise Exception('Empty category: ' + category)
+                raise DBStructureError('Empty category: ' + category)
             
             self.db['packages'][category] = {}
             for name in packages:
                 package_path = os.path.join(category_path, name)
                 if not os.path.isdir(category_path):
-                    raise Exception('Empty package: ' + category + '/' + name)
+                    raise DBStructureError('Empty package: ' + category + '/' + name)
                 
                 f = FileJSON(package_path, self.VERSIONS_NAME, [])
                 versions = f.read()
                 if not versions:
-                    raise Exception('Empty package: ' + category + '/' + name)
+                    raise DBStructureError('Empty package: ' + category + '/' + name)
                 
                 self.db['packages'][category][name] = {}
                 for version in versions:
@@ -309,7 +312,7 @@ class PackageDB:
         name = package.name
         version = package.version
         if category and not category in self.db['packages']:
-            raise Exception('Non-existent category: ' + category)
+            raise InvalidKeyError('Non-existent category: ' + category)
         if name and not name in self.db['packages'][category]:
             self.db['packages'][category][name] = {}
         self.db['packages'][category][name][version] = description
@@ -319,14 +322,14 @@ class PackageDB:
 
     def list_package_names(self, category):
         if category and not category in self.db['packages']:
-            raise Exception('No such category: ' + category)
+            raise InvalidKeyError('No such category: ' + category)
         return list(self.db['packages'][category])
 
     def list_package_versions(self, category, name):
         if category and not category in self.db['packages']:
-            raise Exception('No such category: ' + category)
+            raise InvalidKeyError('No such category: ' + category)
         if name and not name in self.db['packages'][category]:
-            raise Exception('No such package: ' + name)
+            raise InvalidKeyError('No such package: ' + name)
         return list(self.db['packages'][category][name])
 
     def list_all_packages(self):

diff --git a/tests/test_package_db.py b/tests/test_package_db.py
index 94693d8..2b8c482 100644
--- a/tests/test_package_db.py
+++ b/tests/test_package_db.py
@@ -14,7 +14,7 @@
 import json, http.server, os, shutil, tempfile, threading, \
   unittest
 
-from g_sorcery import package_db
+from g_sorcery import package_db, exceptions
 
 
 class Server(threading.Thread):
@@ -84,7 +84,7 @@ class TestFileJSON(unittest.TestCase):
             json.dump(content, f)
         f = package_db.FileJSON(self.path, self.name, mandatories)
         mandatories.append("tst4")
-        self.assertRaises(KeyError, f.read)
+        self.assertRaises(exceptions.FileJSONError, f.read)
 
     def do_test_write_ok(self):
         mandatories = ['tst1', 'tst2', 'tst3']
@@ -102,7 +102,7 @@ class TestFileJSON(unittest.TestCase):
         content = {'tst1' : '', 'tst2' : ''}
         mandatories = ['tst1', 'tst2', 'tst3']
         f = package_db.FileJSON(self.path, self.name, mandatories)
-        self.assertRaises(KeyError, f.write, content)
+        self.assertRaises(exceptions.FileJSONError, f.write, content)
 
     def test_write_dir_does_not_exist(self):
         self.do_test_write_ok()
@@ -179,7 +179,7 @@ class TestDummyDB(unittest.TestCase):
         for category in categories:
             package_names = list(set([x.name for x in self.packages if x.category == category]))
             self.assertEqual(package_names, db.list_package_names(category))
-        self.assertRaises(Exception, db.list_package_names, 'no_such_category')
+        self.assertRaises(exceptions.InvalidKeyError, db.list_package_names, 'no_such_category')
 
     def test_list_package_versions(self):
         db = DummyDB(self.tempdir.name, self.packages)
@@ -190,8 +190,9 @@ class TestDummyDB(unittest.TestCase):
             for name in package_names:
                 versions = [x.version for x in self.packages if x.category == category and x.name == name]
                 self.assertEqual(versions, db.list_package_versions(category, name))
-        self.assertRaises(Exception, db.list_package_names, 'no_such_category', 'a')
-        self.assertRaises(Exception, db.list_package_names, categories[0], 'no_such_package')
+        self.assertRaises(exceptions.InvalidKeyError, db.list_package_versions, 'no_such_category', 'a')
+        self.assertRaises(exceptions.InvalidKeyError, db.list_package_versions,
+                          categories[0], 'no_such_package')
 
     def test_sync(self):
         src_db = DummyDB(os.path.join(self.tempdir.name, 'src_testdb'), self.packages)
@@ -216,7 +217,7 @@ class TestDummyDB(unittest.TestCase):
 
     def test_sync_fail(self):
         db = DummyDB(os.path.join(self.tempdir.name, 'testdb'), self.packages)
-        self.assertRaises(Exception, db.sync, db_uri='127.0.0.1:8080')
+        self.assertRaises(exceptions.SyncError, db.sync, db_uri='127.0.0.1:8080')
 
             
 def suite():


             reply	other threads:[~2013-06-29 12:13 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-29 12:13 Jauhien Piatlicki [this message]
  -- strict thread matches above, loose matches on Subject: below --
2015-04-22  7:35 [gentoo-commits] proj/g-sorcery:master commit in: g_sorcery/, tests/ Jauhien Piatlicki
2013-07-04 20:24 Jauhien Piatlicki
2013-07-03 22:54 Jauhien Piatlicki
2013-07-02 14:48 Jauhien Piatlicki
2013-07-02 12:25 Jauhien Piatlicki
2013-07-01 20:51 Jauhien Piatlicki
2013-07-01 20:51 Jauhien Piatlicki
2013-07-01  0:05 Jauhien Piatlicki
2013-06-30 23:29 Jauhien Piatlicki
2013-06-30 23:29 Jauhien Piatlicki
2013-06-30 23:29 Jauhien Piatlicki
2013-06-30 19:55 Jauhien Piatlicki
2013-06-23 21:39 Jauhien Piatlicki
2013-06-23  0:44 Jauhien Piatlicki
2013-06-23  0:44 Jauhien Piatlicki
2013-06-23  0:44 Jauhien Piatlicki
2013-06-20 23:21 Jauhien Piatlicki
2013-06-20 23:21 Jauhien Piatlicki
2013-06-20 22:53 Jauhien Piatlicki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1372507748.f56eb9904accf9ab6f9d02ee6c30f2811020c97f.jauhien@gentoo \
    --to=piatlicki@gmail.com \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox