From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 7D11E1381F3 for ; Tue, 2 Jul 2013 11:29:46 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id F0487E0AA2; Tue, 2 Jul 2013 11:29:44 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 76BAAE0AA2 for ; Tue, 2 Jul 2013 11:29:44 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 4A58133E82C for ; Tue, 2 Jul 2013 11:29:43 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id D991EE468F for ; Tue, 2 Jul 2013 11:29:41 +0000 (UTC) From: "Jauhien Piatlicki" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Jauhien Piatlicki" Message-ID: <1372764658.127764e5bca1197fa6e4fabcf0b63990ee964126.jauhien@gentoo> Subject: [gentoo-commits] proj/g-sorcery:master commit in: g_elpa/, tests/ X-VCS-Repository: proj/g-sorcery X-VCS-Files: g_elpa/elpa_db.py tests/test_elpa_db.py X-VCS-Directories: g_elpa/ tests/ X-VCS-Committer: jauhien X-VCS-Committer-Name: Jauhien Piatlicki X-VCS-Revision: 127764e5bca1197fa6e4fabcf0b63990ee964126 X-VCS-Branch: master Date: Tue, 2 Jul 2013 11:29:41 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: cdbfd164-1bc2-4542-8dc5-6abc090fffdf X-Archives-Hash: b207945051f088e4fbea4bb633901cf1 commit: 127764e5bca1197fa6e4fabcf0b63990ee964126 Author: Jauhien Piatlicki (jauhien) gmail com> AuthorDate: Tue Jul 2 11:30:58 2013 +0000 Commit: Jauhien Piatlicki gmail com> CommitDate: Tue Jul 2 11:30:58 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/g-sorcery.git;a=commit;h=127764e5 g_elpa/elpa_db: generate_tree --- g_elpa/elpa_db.py | 46 ++++++++++++++++++++---- tests/test_elpa_db.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 135 insertions(+), 10 deletions(-) diff --git a/g_elpa/elpa_db.py b/g_elpa/elpa_db.py index e25ac60..f4d838d 100644 --- a/g_elpa/elpa_db.py +++ b/g_elpa/elpa_db.py @@ -13,8 +13,11 @@ import os, tempfile, urllib.parse -from g_sorcery.package_db import PackageDB +import sexpdata + +from g_sorcery.package_db import Package, PackageDB from g_sorcery.fileutils import wget +from g_sorcery.exceptions import SyncError class ElpaDB(PackageDB): def __init__(self, directory, repo_uri="", db_uri=""): @@ -24,12 +27,41 @@ class ElpaDB(PackageDB): tempdir = tempfile.TemporaryDirectory() ac_uri = urllib.parse.urljoin(self.repo_uri, 'archive-contents') - wget(ac_uri, tempdir.name) + if wget(ac_uri, tempdir.name): + raise SyncError('sync failed: ' + self.repo_uri) + + try: + with open(os.path.join(tempdir.name, 'archive-contents')) as f: + archive_contents = sexpdata.load(f) + except Exception as e: + raise SyncError('sync failed: ' + self.repo_uri + ': ' + str(e)) - os.system('ls -l ' + tempdir.name) - os.system('less ' + tempdir.name + '/archive-contents') - del tempdir + + if sexpdata.car(archive_contents) != 1: + raise SyncError('sync failed: ' + self.repo_uri + ' bad archive contents format') - def get_parser(self): - pass + for entry in sexpdata.cdr(archive_contents): + desc = entry[2].value() + pkg = self._s_get_package(entry[0], desc[0]) + source_type = desc[3].value() + description = desc[2] + deps = desc[1] + dependencies = [] + for dep in deps: + dep_pkg = self._s_get_package(dep[0], dep[1]) + dependencies.append(dep_pkg) + + properties = {'source_type' : source_type, + 'description' : description, + 'depend' : dependencies, + 'rdepend' : dependencies, + } + self.add_category('app-emacs') + self.add_package(pkg, properties) + + + def _s_get_package(self, name, version): + category = 'app-emacs' + version = '.'.join(map(str, version)) + return Package(category, name.value(), version) diff --git a/tests/test_elpa_db.py b/tests/test_elpa_db.py index dfbe34a..97ce4e2 100644 --- a/tests/test_elpa_db.py +++ b/tests/test_elpa_db.py @@ -11,10 +11,14 @@ :license: GPL-2, see LICENSE for more details. """ -import http.server, tempfile, threading, unittest +import http.server, os, tempfile, threading, unittest from g_elpa import elpa_db +from g_sorcery import exceptions, package_db + +from tests.server import Server + class TestElpaDB(unittest.TestCase): def setUp(self): self.tempdir = tempfile.TemporaryDirectory() @@ -23,8 +27,97 @@ class TestElpaDB(unittest.TestCase): del self.tempdir def test_generate(self): - edb = elpa_db.ElpaDB(self.tempdir.name, repo_uri = 'http://elpa.gnu.org/packages/') - edb.generate_tree() + prev = os.getcwd() + os.chdir(self.tempdir.name) + edb = elpa_db.ElpaDB(os.path.join(self.tempdir.name, 'db'), + repo_uri = 'http://127.0.0.1:8080') + self.assertRaises(exceptions.SyncError, edb.generate) + + packages = [['ack', [1, 2], + "Interface to ack-like source code search tools", + "tar", + [] + ], + ['dict-tree', [0, 12, 8], + "Dictionary data structure", + "tar", + [['trie', [0, 2, 5]], + ['tNFA', [0, 1, 1]], + ['heap', [0, 3]]] + ], + ['tNFA', [0, 1, 1], + "Tagged non-deterministic finite-state automata", + "single", + [['queue', [0, 1]]] + ], + ['trie', [0, 2, 6], + "Trie data structure", + "single", + [['tNFA', [0, 1, 1]], + ['queue', [0, 1]]] + ], + ['heap', [0, 3], + "Heap (a.k.a. priority queue) data structure", + "single", + [] + ], + ['queue', [0, 1], + "Queue data structure", + "single", + [] + ] + ] + + archive_contents = "(1" + for pkg in packages: + archive_contents += "\n(" + pkg[0] + ' . [(' + for v in pkg[1]: + archive_contents += ' ' + str(v) + archive_contents += ')\n' + if pkg[4]: + archive_contents += '(' + for p in pkg[4]: + archive_contents += '(' + p[0] + ' (' + for v in p[1]: + archive_contents += ' ' + str(v) + archive_contents += '))\n' + archive_contents += ')' + else: + archive_contents += 'nil' + archive_contents += '\n "' + pkg[2] + '" ' + pkg[3] + '])' + archive_contents += ')' + + with open(os.path.join(self.tempdir.name, 'archive-contents'), 'w') as f: + f.write(archive_contents) + + server = Server() + server.start() + + edb.generate() + + for pkg in packages: + package = package_db.Package('app-emacs', + pkg[0], + '.'.join(map(str, pkg[1]))) + description = edb.get_package_description(package) + self.assertEqual(description['source_type'], pkg[3]) + self.assertEqual(description['description'], pkg[2]) + deps = [] + for d in pkg[4]: + deps.append(package_db.Package('app-emacs', + d[0], + '.'.join(map(str, d[1])))) + + for ds in (description['depend'], description['rdepend']): + for d in ds: + self.assertTrue(d in deps) + for d in deps: + self.assertTrue(d in ds) + + server.shutdown() + server.join() + + os.chdir(prev) def suite(): suite = unittest.TestSuite()