From e8c2be3274f4ba8cb011d661d9f7a78c399de91f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Sat, 18 Jun 2005 21:17:57 +0000 Subject: [PATCH] * dir'leri yeniden organize ediyoruz, bir sonraki adim python package'i yapmak tam olarak --- CODING | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ README | 1 + TODO | 23 +++++++++++++++ bin/pisi-build | 58 +++++++++++++++++++++++++++++++++++++ bin/pisi-install | 43 +++++++++++++++++++++++++++ 5 files changed, 200 insertions(+) create mode 100644 CODING create mode 100644 README create mode 100644 TODO create mode 100755 bin/pisi-build create mode 100755 bin/pisi-install diff --git a/CODING b/CODING new file mode 100644 index 00000000..cc6b0c25 --- /dev/null +++ b/CODING @@ -0,0 +1,75 @@ +Like every serious project, there are guidelines. +Oooooo. "Coding Standards". + +Guidelines +---------- + +1. When using dirnames, don't expect the dir to end + with a trailing slash, and please use the dirnames + in pisiconfig +2. Python indentation is usually 4 chars. +3. Follow python philosophy of 'batteries included' +4. Don't make the code have runtime dependencies on + a particular distribution (as much as possible) +5. Don't assume narrow use cases. +6. If you are changing something, check if that change + breaks anything and fix breakage. For instance a + name. Running the tests is not always enough! + +Unit testing +------------ + +Unit tests are located in unittests directory. Running the tests is +trivial. But you must synchronize your code and data with the test +code, which can be a tedious work if you lose discipline. + +Sample data files are located in samples/ directory. + +For running the entire test suite, use the following command: + +$ ./unittests/run.py + +If you know what you are doing, you can run the tests seperately. But +keep in your mind that tests can depend on each other. (?) The unit test +system doesn't know about that. The following command will run tests +in specfiletests and archivetests in unittests dir: + +$ ./unittests/run.py specfile archive + + +Misc. Suggestions +----------------- + +1. Demeter's Law + +In OO programming, try to invoke Demeter's law. +One of the "rules" there is not directly accessing any +objects that are further than, 2/3 refs, away. So the +following code is OK. + destroy_system(a.system().name()) +but the following isn't as robust + destroy_system(object_store.root().a.system.name()) +As you can tell, this introduces too many implementation +dependencies. The rule of thumb is that, in these cases +this statement must have been elsewhere.... It may be a +good idea to not count the object scope in this case, +so in Python self.a means only one level of reference, +not two. + +One quibble with this: it may be preferable not to insist +on this where it would be inefficient. So if everything +is neatly packed into one object contained in another +object, why replicate everything in the upper level? If +the semantics prevents dependency changes, then chains +of 3 or even 4 could be acceptable. + +OTOH, in Python and C++, it's not always good to implement +accessor/modifier pairs for every property of an object. +It would be much simpler if you are not doing any special +processing on the property (e.g. if what the type system +does is sufficient). + +The main rule of thumb in Demeter's Law is avoiding +putting more than, say, 10 methods in a class. That works +really well in practice, forcing refactoring every now +and then. diff --git a/README b/README new file mode 100644 index 00000000..3c05f619 --- /dev/null +++ b/README @@ -0,0 +1 @@ +PISI is a new package manager implemented in python. diff --git a/TODO b/TODO new file mode 100644 index 00000000..61a47d4b --- /dev/null +++ b/TODO @@ -0,0 +1,23 @@ + +PiSi ToDo List +============== + +A list of tasks to accomplish, organized into priority sections + +Legend: + +- Todo +? Not determined if/how we have to do +/ In progress ++ Accomplished + +1. Pre-Alpha + + + implement reading spec file + / implement install database + ? transaction/locking for database + +2. Alpha + +3. Beta + diff --git a/bin/pisi-build b/bin/pisi-build new file mode 100755 index 00000000..cc8cefa9 --- /dev/null +++ b/bin/pisi-build @@ -0,0 +1,58 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# python standard library +from os.path import basename + +import pisi.context +import pisi.util +import pisi.ui +from pisi.build import PisiBuild, PisiBuildError + +def usage(progname = "pisi-build"): + print """ +Usage: +%s [options] package-name.pspec +""" %(progname) + +def main(): + import sys + import getopt + + # wrapper for usage(progname) function + help = lambda: usage(sys.argv[0]) + + # getopt magic + try: + opts, args = getopt.getopt(sys.argv[1:],"h",["help"]) + except getopt.GetoptError: + help() + sys.exit(1) + + for opt, arg in opts: + if opt == "-h": + help() + sys.exit(1) + + # pspec(PISI Spec) to be used for package + pspec = "" + + # TODO: We accept only one pspec file (at a time) currently, + # but pisi-build may build many packages (pspecs given in order) + # sequentially. + if len(args) != 1: + help() + raise PisiBuildError, "pisi-build expects one (and only one) pspec file currently" + else: + pspec = args[0] + + # What we need to do first is create a context with our specfile + ctx = pisi.context.Context(pspec) + + # don't do the real job here. this is just a CLI! + pb = PisiBuild(ctx) + pb.build() + + +if __name__ == "__main__": + main() diff --git a/bin/pisi-install b/bin/pisi-install new file mode 100755 index 00000000..278a161e --- /dev/null +++ b/bin/pisi-install @@ -0,0 +1,43 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- + +# sys modules +import sys +from optparse import OptionParser + +import pisi.install +import pisi.util + +class ArgError(Exception): + pass + +def main(): + + usage = "usage: %prog [options] " + parser = OptionParser(usage=usage,version="%prog " + pisi.__version__) + parser.add_option("-D", "--destdir", action="store") + parser.add_option("-v", "--verbose", action="store_true", + dest="verbose", default=False, + help="detailed output") + parser.add_option("-d", "--debug", action="store_true", default=True) + parser.add_option("-n", "--dry-run", action="store_true", + default = "do not perform any action, just show what\ + would be done") + + (options, args) = parser.parse_args() + + # package filename + package_fn = "" + + # TODO: We accept only one package file arg ATM + if len(args) != 1: + print usage + raise ArgError, "pisi-install expects one (and only one) package file currently" + else: + package_fn = args[0] + + pisi.install.install_package_file(package_fn) + + +if __name__ == "__main__": + main()