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():
next 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