Index: /trunk/README.html =================================================================== --- /trunk/README.html (revision 5) +++ /trunk/README.html (revision 5) @@ -0,0 +1,380 @@ + + + +
+ + +The idea of the Cheesecake project is to rank Python packages based on various +empirical "kwalitee" factors, such as:
++++
+- whether the package can be downloaded from PyPI given its name
+- whether the package can be downloaded from a full URL
+- whether the package can be unpacked
+- whether the unpack directory is the same as the package name
+- whether the package can be installed into an alternate directory
+- existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+- existence of certain directories such as doc, test, demo, examples
+- percentage of modules/functions/classes/methods with docstrings
+- percentage of functions/methods that are unit tested (not currently +implemented)
+- average pylint score for all non-test and non-demo modules
+
Currently, the Cheesecake index is computed for invidual packages obtained +through a variety of methods (detailed below). One of the goals of the +Cheesecake project is to automatically compute the Cheesecake index for +all packages uploaded to the PyPI Cheese Shop (possibly at upload time) and +to maintain a collection of Web pages with statistics related to the +various indexes of the packages.
+Cheesecake currently computes 3 types of indexes:
++++
+- installability index
+- documentation index
+- code kwalitee index
+
The algorithms for computing each index type are detailed below.
+The concept of "kwalitee" originated in the Perl community. Here's a relevant +quote:
++It looks like quality, it sounds like quality, but it's not quite quality.+
Kwalitee is an empiric measure of how good a specific body of code is. It +defines quality indicators and measures the code along them. It is currently +used by the CPANTS Testing Service +to evaluate the 'goodness' of CPAN packages.
+Since the Python package repository (aka PyPI) +is hosted at the Cheese Shop, +it stands to reason that the quality indicator of a PyPI package should be +called the Cheesecake index!
+To compute the Cheesecake index for a given project, run the cheesecake.py +module from the command line and indicate either:
++++
+- the package short name (e.g. twill) or
+- the package URL (e.g. http://darcs.idyll.org/~t/projects/twill-0.7.4.tar.gz) or
+- the package path on the file system (e.g. /tmp/twill-latest.tar.gz)
+
In all cases, the cheesecake module will attempt to download the package +if necessary, then to unpack it in a sandbox directory (/tmp/cheesecake_sandbox +by default). If either of these operations fails, the Cheesecake index for +the package will be 0. If the package can be successfully unpacked, the +cheesecake module will compute the values for a variety of indexes detailed +in the algorithm given at the end of this file.
+If the package can be successfully downloaded and unpacked, a log file is +created in the sandbox directory and named <package>.log (e.g. the log file +for twill-0.7.4.tar.gz is /tmp/cheesecake_sandbox/twill-0.7.4.tar.gz.log). +The log file is not automatically deleted after the Cheesecake index is +computed, since its purpose is to be inspected for debug information.
+Command-line examples:
++++
+- +
Compute the Cheesecake index for the Durus package by using setuptools +utilities to download the package from PyPI:
++python cheesecake.py --name=Durus ++- +
Compute the Cheesecake index for the Durus package by indicating its URL:
++python cheesecake.py --url=http://www.mems-exchange.org/software/durus/Durus-3.1.tar.gz ++- +
Compute the Cheesecake index for the twill package by indicating its path +on the local file system:
++python cheesecake.py --path=/tmp/twill-latest.tar.gz ++- +
To increase the verbosity of the output, use the -v or --verbose option. +For more options, run cheesecake.py with -h or --help.
+
The Cheesecake project has not yet been released as a tarball or +a Python egg. You can obtain the source code from SourceForge via CVS:
++cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/cheesecake co -P cheesecake ++
Developer mailing list: http://lists.sourceforge.net/lists/listinfo/cheesecake-devel
+Cheesecake is licensed under the Python Software Foundation license, +the same license that governs Python itself. The text of the license is +available in the LICENSE file in the source code distribution and +can also be downloaded from +http://www.opensource.org/licenses/PythonSoftFoundation.php.
+Grig Gheorghiu
+Email: <grig at gheorghiu dot net>
+Web site: http://agiletesting.blogspot.com
+The cheesecake.py module uses the following constants:
++INDEX_PYPI_DOWNLOAD = 50 +INDEX_PYPI_DISTANCE = 5 +INDEX_URL_DOWNLOAD = 25 +INDEX_UNPACK = 25 +INDEX_UNPACK_DIR = 15 +INDEX_INSTALL = 50 +INDEX_FILE_CRITICAL = 15 +INDEX_FILE = 10 +INDEX_FILE_PYC = 20 +INDEX_DIR_CRITICAL = 25 +INDEX_DIR = 20 +INDEX_DIR_EMPTY = 5 + +MAX_INDEX_DOCSTRINGS = 100 # max. percentage of modules/classes/methods/functions with docstrings +MAX_INDEX_PYLINT = 100 # max. pylint score ++
Step 0
+Initialize the Cheesecake index to 0. Also initialize to 0 +the partial Cheesecake indexes for installability, documentation +and code kwalitee.
+Compute the maximum overall Cheesecake index that can be reached by +any given package, which is the sum:
++INDEX_PYPI_DOWNLOAD + +INDEX_UNPACK + INDEX_UNPACK_DIR + +INDEX_INSTALL + +MAX_INDEX_DOCSTRINGS + MAX_INDEX_PYLINT + +(INDEX_FILE * number_of_expected_files) + +(INDEX_FILE_CRITICAL * number_of_expected_critical_files) + +(INDEX_DIR * number_of_expected_dirs) + +(INDEX_DIR_CRITICAL * number_of_expected_critical_dirs) ++
Compute the maximum Cheesecake index for installability, which is the sum:
++INDEX_PYPI_DOWNLOAD + +INDEX_UNPACK + INDEX_UNPACK_DIR + +INDEX_INSTALL ++
Compute the maximum Cheesecake index for documentation, which is the sum:
++(INDEX_FILE * number_of_expected_files) + +(INDEX_FILE_CRITICAL * number_of_expected_critical_files) + +(INDEX_DIR * number_of_expected_dirs) + +(INDEX_DIR_CRITICAL * number_of_expected_critical_dirs) + +MAX_INDEX_DOCSTRINGS ++
Compute the maximum Cheesecake index for code kwalitee, which is currently:
++MAX_INDEX_PYLINT ++
Step 1a
+If short name of the package was specified with -n or --name, +try to download the package from the PyPI index page by following the links to +the package home page and the package download URL (this is accomplished +using setuptools utilities).
+If not successful, exit with a Cheesecake index of 0. If successful and +package was found at the Cheese Shop, add INDEX_PYPI_DOWNLOAD to +the overall Cheesecake index and to the installability Cheesecake index.
+If successful but package was not found at the Cheese Shop, add +INDEX_PYPI_DOWNLOAD - (INDEX_PYPI_DISTANCE * number_of_links_to_package) +to the overall Cheesecake index and to the installability Cheesecake index.
+Step 1b
+If full URL of the package was specified with -u or --url, +try to download the package from the specified URL.
+If not successful, exit with a Cheesecake index of 0. If successful, +add INDEX_URL_DOWNLOAD to the overall Cheesecake index and to +the installability Cheesecake index.
+Step 1c
+If path to package on local file system was specified with -p or +--path, copy the package to the sandbox directory.
+Step 2
+Unpack the package (currently supported archive types are zip and +tar.gz/tgz; in the near future we will support Python Eggs.)
+If not successful, exit with a Cheesecake index of 0. If successful, add +INDEX_UNPACK to the overall Cheesecake index and to the installability +Cheesecake index.
+Step 3
+Check that the unpack directory has the same name as the package name +(i.e. when unpacking twill-0.7.4.tar.gz, we expect the unpack directory +to be twill-0.7.4.)
+If the unpack directory name is the same as the package name, add +INDEX_UNPACK_DIR +to the overall Cheesecake index and to the installability Cheesecake index.
+Step 4
+Install the package to a temporary directory in a non-default location. +If successful, add INDEX_INSTALL to the overall Cheesecake index and to the +installability Cheesecake index.
+Step 5
+Check for existence of specific files. +For each file found, add INDEX_FILE to the overall +Cheesecake index and to the documentation Cheesecake index. +If the file is deemed critical, add INDEX_FILE_CRITICAL instead.
+The following special files ("cheese_files") are currently checked:
++cheese_files = ["install", "changelog", + "news", "faq", + "todo", "thanks", "announce", + "ez_setup.py", + ] ++
The following files are currently deemed critical:
++critical_cheese_files = ["readme", "license", "setup.py"] ++
To check if a file FILE is among the cheese files, the following regular +expression is used:
++re.search(r"^%s(\.txt)*" % cheese_file, file, re.IGNORECASE) ++
Step 6
+Check for existence of specific directories. +For each directory found, add INDEX_DIR to the overall Cheesecake +index and to the documentation Cheesecake index. +If the directory is deemed critical, add INDEX_DIR_CRITICAL instead. +If the directory is found empty, add INDEX_DIR_EMPTY instead.
+The following directories ("cheese_dirs") are currently checked:
++cheese_dirs = ["example", "demo"] ++
The following directories are currently deemed critical:
++critical_cheese_dirs = ["doc", "test"] ++
To check if a directory DIR is among the cheese directories, +the following regular expression is used:
++re.search(r"^%s" % cheese_dir, DIR, re.ignorecase) ++
Step 7
+Check for existence of .pyc files. If found, decrease the score +by subtracting INDEX_FILE_PYC from the overall Cheesecake index +and from the documentation Cheesecake index.
+Step 8
+Compute the percentage of modules/classes/methods/functions that have +docstrings associated with them. Only Python modules that are not in test, +doc, demo and example directories are checked. +Round up the percentage and add it to the overall Cheesecake index and to the +documentation Cheesecake index.
+Step 9
+If pylint is present on the system, run pylint against all Python files +that are not in the test, docs or demo directories. +Average the non-negative pylint scores, multiply the average by 10 and +add it to the overall Cheesecake index and to the code kwalitee +Cheesecake index.
+Step 10
+For each of the partial Cheesecake index types (installability, +documentation and code kwalitee), display the absolute Cheesecake +index for that type as the sum of all indexes of that type computed in +the previous steps. +Also display the relative Cheesecake index for that type as the percentage +of (absolute_index / maximum_index).
+Display the absolute Cheesecake index for the package as the sum of all +indexes computed in the previous steps. Also display the relative Cheesecake +index for the package as the percentage of (absolute_index / maximum_index).
++$ python cheesecake.py -n Durus +[cheesecake:console] Trying to download package durus from PyPI using setuptools utilities +[cheesecake:console] Downloaded package Durus-3.1.tar.gz from http://www.mems-exchange.org/software/durus/Durus-3.1.tar.gz +[cheesecake:console] Detailed info available in log file /tmp/cheesecake_sandbox/durus.log +[cheesecake:console] A given package can currently reach a MAXIMUM number of 555 points +[cheesecake:console] Starting computation of Cheesecake index for package 'Durus-3.1.tar.gz' + +[cheesecake:console] Starting computation of INSTALLABILITY index (max. points = 140) +index_pypi_download ..................... 45 (downloaded package Durus-3.1.tar.gz following 1 link from PyPI) +index_unpack ............................ 25 (package untar-ed successfully) +index_unpack_dir ........................ 15 (unpack directory is Durus-3.1 as expected) +index_install ........................... 50 (package installed in /tmp/cheesecake_sandbox/tmp_install_Durus-3.1) +--------------------------------------------- +INSTALLABILITY INDEX (ABSOLUTE) ......... 135 +INSTALLABILITY INDEX (RELATIVE) ......... 96 (135 out of a maximum of 140 points is 96%) + +[cheesecake:console] Starting computation of DOCUMENTATION index (max. points = 415) +index_file_announce ..................... 0 (file not found) +index_file_changelog .................... 0 (file not found) +index_file_ez_setup.py .................. 0 (file not found) +index_file_faq .......................... 10 (file found) +index_file_install ...................... 10 (file found) +index_file_license ...................... 15 (critical file found) +index_file_news ......................... 0 (file not found) +index_file_readme ....................... 15 (critical file found) +index_file_setup.py ..................... 15 (critical file found) +index_file_thanks ....................... 0 (file not found) +index_file_todo ......................... 0 (file not found) +index_dir_demo .......................... 0 (directory not found) +index_dir_doc ........................... 25 (critical directory found) +index_dir_example ....................... 0 (directory not found) +index_dir_test .......................... 25 (critical directory found) +index_docstrings ........................ 42 (found 104/249=41.77% modules/classes/methods/functions with docstrings) +--------------------------------------------- +DOCUMENTATION INDEX (ABSOLUTE) .......... 157 +DOCUMENTATION INDEX (RELATIVE) .......... 37 (157 out of a maximum of 415 points is 37%) + +[cheesecake:console] Starting computation of CODE KWALITEE index (max. points = 100) +index_pylint ............................ 64 (average score is 6.30 out of 10) +--------------------------------------------- +CODE KWALITEE INDEX (ABSOLUTE) .......... 64 +CODE KWALITEE INDEX (RELATIVE) .......... 64 (64 out of a maximum of 100 points is 64%) + +============================================= +OVERALL CHEESECAKE INDEX (ABSOLUTE) ..... 356 +OVERALL CHEESECAKE INDEX (RELATIVE) ..... 64 (356 out of a maximum of 555 points is 64%) ++
Cheesecake is under very active development. The immediate goal is to add the unit test +index measurement, followed by other metrics inspired from the +kwalitee indicators. +Please edit the IndexMeasurementIdeas +Wiki page to add things that you would like to see covered +by the Cheesecake metrics.
+| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class CheesecakeError + + | +
|
+
+Exception --+
+ |
+ CheesecakeError
+Custom exception class for Cheesecake-specific errors
+| Method Summary | |
|---|---|
| Inherited from Exception | |
| + |
+ |
| + |
+ |
| + |
+ |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class CompositeIndex + + | +
|
+
+object --+
+ |
+ CompositeIndex
+Collection of indexes of same type (e.g. files, dirs)
+| Method Summary | |
|---|---|
| + |
++Indexes is a dict mapping names to Index objects |
| + |
++Return sum of individual index values |
| + |
++Print index info for all indexes sorted alphanumerically by name |
| + |
++Create new index or update existing index with specified attributes |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Property Summary | |
|---|---|
| + | value |
| Method Details |
|---|
+ __init__(self,
+ type)
+
+ |
+ get_value(self) ++Return sum of individual index values +
|
+ print_info(self) ++Print index info for all indexes sorted alphanumerically by name +
|
+ set_index(self, + name, + value=0, + details='') ++Create new index or update existing index with specified attributes +
|
| Property Details |
|---|
+
+
+value+
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class Path + + | +
|
+
+object--+ + | +File--+ + | + Path +
| Method Summary | |
|---|---|
| + | __init__(self,
+ filename,
+ append)
+ |
| Inherited from File | |
| + |
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + | +
|
+
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class CodeParser + + | +
|
+
+object --+
+ |
+ CodeParser
+Information about the structure of a Python module
+* Collects classes, methods, functions and any associated docstrings * +Does some dumb grep-style parsing, but in the future may do some real +smart parsing +| Method Summary | |
|---|---|
| + | __init__(self,
+ pyfile,
+ log)
+ |
| + |
++Return number of docstrings found in this module |
| + |
++Return number of objects found in this module |
| + |
++Parse module text and retrieve classes, methods, functions and +associated docstrings |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ docstring_count(self) ++ Return number of docstrings found in this module +
|
+ object_count(self) ++Return number of objects found in this module + * module * classes * methods * functions +
|
+ parse_file(self) ++ Parse module text and retrieve classes, methods, functions and + associated docstrings +
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class MultipleProducer + + | +
|
+
+object--+ + | +Producer--+ + | + MultipleProducer +
| Method Summary | |
|---|---|
| + | __call__(self,
+ *args,
+ **kwargs)
+ |
| + | _getconsumer(self,
+ keywords)
+ |
| Inherited from Producer | |
| + |
+ |
| + |
+ |
| + |
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Class Variable Summary | |
|---|---|
| Inherited from Producer | |
dict |
+keywords2consumer = {'default': <function default_consum...
+ |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Module exceptions :: + Class Exception + + | +
|
+
CheesecakeError| Method Summary | |
|---|---|
| + | __init__(...)
+ |
| + | __getitem__(...)
+ |
| + | __str__(...)
+ |
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Module __builtin__ :: + Class type + + | +
|
+
+object --+
+ |
+ type
+| Method Summary | |
|---|---|
| + |
++x.__call__(...) <==> x(...) |
| + |
++x.__cmp__(y) <==> cmp(x,y) |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| list of immediate subclasses | +
++__subclasses__() -> list of immediate subclasses |
| list | +
++return a type's method resolution order |
| Inherited from object | |
| + |
++x.__init__(...) initializes x; see x.__class__.__doc__ for +signature |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__str__() <==> str(x) |
| Class Variable Summary | |
|---|---|
type |
+ __base__ = __builtin__.object |
tuple |
+__bases__ = (<type 'object'>,)
+ |
int |
+__basicsize__ = 420 |
int |
+__dictoffset__ = 132 |
int |
+__flags__ = 21995 |
int |
+__itemsize__ = 20 |
tuple |
+__mro__ = (<type 'type'>, <type 'object'>)
+ |
str |
+__name__ = 'type'
+ |
int |
+__weakrefoffset__ = 184 |
| Method Details |
|---|
+ __call__(x,
+ ...)
+
+ x.__call__(...) <==> x(...)
+ |
+ __cmp__(x,
+ y)
+
+ x.__cmp__(y) <==> cmp(x,y)
+ |
+ __delattr__(...) ++ x.__delattr__('name') <==> del x.name +
|
+ __getattribute__(...) ++ x.__getattribute__('name') <==> x.name +
|
+ __hash__(x)
+
+ x.__hash__() <==> hash(x)
+ |
+ __new__(T, + S, + ...) ++ T.__new__(S, ...) -> a new object with type S, a subtype of T +
|
+ __repr__(x)
+
+ x.__repr__() <==> repr(x)
+ |
+ __setattr__(...) ++ x.__setattr__('name', value) <==> x.name = value +
|
+ __subclasses__() ++ __subclasses__() -> list of immediate subclasses +
|
+ mro() ++ return a type's method resolution order +
|
| Class Variable Details |
|---|
+
+__bases__+
|
+
+__basicsize__+
|
+
+__dictoffset__+
|
+
+__flags__+
|
+
+__itemsize__+
|
+
+__mro__+
|
+
+__name__+
|
+
+__weakrefoffset__+
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class StdoutRedirector + + | +
|
+
+object --+
+ |
+ StdoutRedirector
+Redirect stdout to a temp file
+| Method Summary | |
|---|---|
| + | __init__(self,
+ filename)
+ |
| + | flush(self)
+ |
| + |
++Return contents of the temp file |
| + | write(self,
+ buf)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ read_buffer(self) ++Return contents of the temp file +
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + | +
|
+
This document contains the API (Application Programming Interface) +documentation for cheesecake. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.
+ +Each Package Documentation page contains: +
Each Module Documentation page contains: +
Each Class Documentation page contains: +
The Trees page contains the module and class hierarchies: +
The Index page contains indices of terms and + identifiers: +
The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:
+ +|
+ Project Contents ... |
+
+ API Documentation Frame + |
+
|
+ Module Contents ... + |
+
The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.
+ +The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.
+ +The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.
+ +A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.
+ +| Label | +Highlighted when... | +Links to... | +
|---|---|---|
| [Parent] | +(never highlighted) | +the parent of the current package |
| [Package] | +viewing a package | +the package containing the current object + |
| [Module] | +viewing a module | +the module containing the current object + |
| [Class] | +viewing a class | +the class containing the current object |
| [Trees] | +viewing the trees page | +the trees page |
| [Index] | +viewing the index page | +the index page |
| [Help] | +viewing the help page | +the help page |
The "show private" and "hide private" buttons below
+the top navigation bar can be used to control whether documentation
+for private objects is displayed. Private objects are usually defined
+as objects whose (short) names begin with a single underscore, but do
+not end with an underscore. For example, "_x",
+"__pprint", and "epydoc.epytext._tokenize"
+are private objects; but "re.sub",
+"__init__", and "type_" are not. However,
+if a module defines the "__all__" variable, then its
+contents are used to decide which objects are private.
A timestamp below the bottom navigation bar indicates when each +page was last updated.
+ + +| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class Index + + | +
|
+
+object --+
+ |
+ Index
+| Method Summary | |
|---|---|
| + | __init__(self,
+ type,
+ name,
+ value,
+ details)
+ |
| + |
++Print index name padded with dots, followed by value and details |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ print_info(self) ++ Print index name padded with dots, followed by value and details +
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class File + + | +
|
+
+object --+
+ |
+ File
+Path| Method Summary | |
|---|---|
| + | __init__(self,
+ f)
+ |
| + | __call__(self,
+ msg)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class Cheesecake + + | +
|
+
+object --+
+ |
+ Cheesecake
+Computes 'goodness' of Python packages
+Generates "cheesecake index" that takes into account things like:
++++
+- whether the package can be downloaded
+- whether the package can be unpacked
+- whether the package can be installed into an alternate directory
+- existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+- existence of certain directories such as doc, test, demo, examples
+- percentage of modules/functions/classes/methods with docstrings
+- percentage of functions/methods that are unit tested
+- average pylint score for all non-test and non-demo modules
+
| Method Summary | |
|---|---|
| + |
++Initialize critical variables, download and unpack package, walk package tree |
| + |
++Delete temporary directories and files that were +created in the sandbox |
| + |
++Compute overall Cheesecake index for the package by adding up +specific indexes |
| + |
++Default settings for logging |
| + |
++Copy package file to sandbox directory |
| + | determine_pkg_name(self)
+ |
| + |
++Use urllib.urlretrieve to download package to file in sandbox dir |
| + |
++Get package name as file portion of path |
| + |
++Use urlparse to obtain package path from URL |
| + |
++Download package using setuptools utilities |
| + |
++Return CompositeIndex object of type "dir" |
| + |
++Compute docstring index as percentage of modules/classes/methods/functions +that have docstrings associated with them |
| + |
++Verify that package can be downloaded from an URL |
| + |
++Return CompositeIndex object of type "file" |
| + |
++Verify that package can be installed in alternate directory |
| + |
++Compute pylint index as average of positive pylint scores obtained for +the Python files identified in the package |
| + |
++Verify that package can be downloaded from PyPI |
| + |
++Verify that package can be unpacked |
| + |
++Verify that unpack directory has same name as package |
| + |
++Initialize variables used in index computation |
| + |
++Return True if file ends with .py and it is not a special file and it is not +in special directory |
| + |
++Return True is file is in directory rooted at "test" or "tests" |
| + |
++Pad message with dots and pad value with spaces |
| + |
++Print line of text, unless quiet flag was given |
| + |
++Compute and print index of specified type |
| + |
++Cleanup, print error message and raise CheesecakeError |
| + | retrieve_pkg(self)
+ |
| + |
++Unpack the package in the sandbox directory |
| + |
++Untar the package in the sandbox directory |
| + |
++Unzip the package in the sandbox directory |
| + |
++Traverse the file system tree rooted at sandbox/package_name |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ __init__(self,
+ name='',
+ url='',
+ path='',
+ sandbox=None,
+ verbose=False,
+ quiet=False)
+
+ |
+ cleanup(self) ++Delete temporary directories and files that were +created in the sandbox +
|
+ compute_cheesecake_index(self) ++Compute overall Cheesecake index for the package by adding up +specific indexes +
|
+ configure_logging(self) ++Default settings for logging +if verbose, log goes to console, else it goes to logfile +log.debug goes to logfile +log.info goes to console +log.warn and log.error go to both logfile and stdout +
|
+ copy_pkg(self) ++Copy package file to sandbox directory +
|
+ download_pkg(self) ++Use urllib.urlretrieve to download package to file in sandbox dir +
|
+ get_package_from_path(self, + path) ++Get package name as file portion of path +
|
+ get_package_from_url(self) ++Use urlparse to obtain package path from URL +
|
+ get_pkg_from_pypi(self) ++Download package using setuptools utilities +
|
+ index_dir(self) ++Return CompositeIndex object of type "dir" +
|
+ index_docstrings(self) ++Compute docstring index as percentage of modules/classes/methods/functions +that have docstrings associated with them +Return Index object of type "docstrings" +
|
+ index_download(self) ++Verify that package can be downloaded from an URL +Return Index object of type "download" +
|
+ index_file(self) ++Return CompositeIndex object of type "file" +
|
+ index_install(self) ++Verify that package can be installed in alternate directory +Return Index object of type "install" +
|
+ index_pylint(self) ++Compute pylint index as average of positive pylint scores obtained for +the Python files identified in the package +Return Index object of type "pylint" +
|
+ index_pypi_download(self) ++Verify that package can be downloaded from PyPI +Return Index object of type "pypi_download" +
|
+ index_unpack(self) ++Verify that package can be unpacked +Return Index object of type "unpack" +
|
+ index_unpack_dir(self) ++Verify that unpack directory has same name as package +Return Index object of type "unpack_dir" +
|
+ init_indexes(self) ++Initialize variables used in index computation +
|
+ is_py_file(self, + file, + dirs) ++Return True if file ends with .py and it is not a special file and it is not +in special directory +
|
+ is_test_file(self, + file, + dirs) ++Return True is file is in directory rooted at "test" or "tests" +
|
+ pad_msg(self, + msg, + value) ++Pad message with dots and pad value with spaces +
|
+ print_line(self, + line) ++Print line of text, unless quiet flag was given +
|
+ process_index(self, + index_type) ++Compute and print index of specified type +
|
+ raise_exception(self, + msg) ++Cleanup, print error message and raise CheesecakeError +Don't use logging, since it can be called before logging has been setup +
|
+ unpack_pkg(self) ++Unpack the package in the sandbox directory +Currently supported archive types: +
|
+ untar_pkg(self) ++Untar the package in the sandbox directory +Uses tarfile module +
|
+ unzip_pkg(self) ++Unzip the package in the sandbox directory +Uses zipfile module +
|
+ walk_pkg(self) ++Traverse the file system tree rooted at sandbox/package_name +
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake + + | +
|
+
Cheesecake: How tasty is your code?
+The idea of the Cheesecake project is to rank Python packages +based on various empiric "kwalitee" factors, such as:
++++
+- whether the package can be downloaded
+- whether the package can be unpacked
+- whether the package can be installed into an alternate directory
+- existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+- existence of certain directories such as doc, test, demo, examples
+- percentage of modules/functions/classes/methods with docstrings
+- percentage of functions/methods that are unit tested
+- average pylint score for all non-test and non-demo modules
+- whether the package can be unpacked
+- whether the package can be installed into an alternate directory
+
| Classes | |
|---|---|
+ Cheesecake |
+ Computes 'goodness' of Python packages |
+ CodeParser |
+ Information about the structure of a Python module |
+ CompositeIndex |
+ Collection of indexes of same type (e.g. |
+ Index |
+ Encapsulates index attributes such as name, value, details |
+ StdoutRedirector |
+ Redirect stdout to a temp file |
| Exceptions | |
|---|---|
+ CheesecakeError |
+ Custom exception class for Cheesecake-specific errors |
| Function Summary | |
|---|---|
| + |
++Display Cheesecake index for package specified via command-line options |
| + |
++Pad value with spaces at left up to given length |
| + |
++Pad text with dots up to given length |
| + |
++Parse command-line options |
| Variable Summary | |
|---|---|
int |
+INDEX_DIR = 20 |
int |
+INDEX_DIR_CRITICAL = 25 |
int |
+INDEX_DIR_EMPTY = 5 |
int |
+INDEX_FILE = 10 |
int |
+INDEX_FILE_CRITICAL = 15 |
int |
+INDEX_FILE_PYC = -20 |
int |
+INDEX_INSTALL = 50 |
int |
+INDEX_PYPI_DISTANCE = 5 |
int |
+INDEX_PYPI_DOWNLOAD = 50 |
int |
+INDEX_UNPACK = 25 |
int |
+INDEX_UNPACK_DIR = 15 |
int |
+INDEX_URL_DOWNLOAD = 25 |
int |
+PAD_TEXT = 25 |
int |
+PAD_VALUE = 4 |
| Function Details |
|---|
+ main() ++Display Cheesecake index for package specified via command-line options +
|
+ pad_left_spaces(value, + length=4) ++Pad value with spaces at left up to given length +
|
+ pad_with_dots(msg, + length=25) ++Pad text with dots up to given length +
|
+ process_cmdline_args() ++Parse command-line options +
|
| Variable Details |
|---|
+
+INDEX_DIR+
|
+
+INDEX_DIR_CRITICAL+
|
+
+INDEX_DIR_EMPTY+
|
+
+INDEX_FILE+
|
+
+INDEX_FILE_CRITICAL+
|
+
+INDEX_FILE_PYC+
|
+
+INDEX_INSTALL+
|
+
+INDEX_PYPI_DISTANCE+
|
+
+INDEX_PYPI_DOWNLOAD+
|
+
+INDEX_UNPACK+
|
+
+INDEX_UNPACK_DIR+
|
+
+INDEX_URL_DOWNLOAD+
|
+
+PAD_TEXT+
|
+
+PAD_VALUE+
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class Message + + | +
|
+
+object --+
+ |
+ Message
+| Method Summary | |
|---|---|
| + | __init__(self,
+ keywords,
+ args)
+ |
| + | __str__(self)
+ |
| + | content(self)
+ |
| + | prefix(self)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class CodeParser + + | +
|
+
+object --+
+ |
+ CodeParser
+Information about the structure of a Python module
+| Method Summary | |
|---|---|
| + | __init__(self,
+ pyfile,
+ log)
+ |
| + |
++Return number of docstrings found in this module |
| + |
++Return number of objects found in this module |
| + |
++Parse module text and retrieve classes, methods, functions +and associated docstrings |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ docstring_count(self) ++Return number of docstrings found in this module +
|
+ object_count(self) ++Return number of objects found in this module +
|
+ parse_file(self) ++Parse module text and retrieve classes, methods, functions +and associated docstrings +
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Module __builtin__ :: + Class object + + | +
|
+
Cheesecake,
+ CodeParser,
+ CompositeIndex,
+ Index,
+ StdoutRedirector,
+ type| Method Summary | |
|---|---|
| + |
++x.__init__(...) initializes x; see x.__class__.__doc__ for +signature |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Class Variable Summary | |
|---|---|
type |
+ __class__ = __builtin__.type |
| Method Details |
|---|
+ __init__(...)
+
+ x.__init__(...) initializes x; see x.__class__.__doc__ for
+ signature
+ |
+ __delattr__(...) ++ x.__delattr__('name') <==> del x.name +
|
+ __getattribute__(...) ++ x.__getattribute__('name') <==> x.name +
|
+ __hash__(x)
+
+ x.__hash__() <==> hash(x)
+ |
+ __new__(T, + S, + ...) ++ T.__new__(S, ...) -> a new object with type S, a subtype of T +
|
+ __reduce__(...) ++ helper for pickle +
|
+ __reduce_ex__(...) ++ helper for pickle +
|
+ __repr__(x)
+
+ x.__repr__() <==> repr(x)
+ |
+ __setattr__(...) ++ x.__setattr__('name', value) <==> x.name = value +
|
+ __str__(x)
+
+ x.__str__() <==> str(x)
+ |
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class CheesecakeError + + | +
|
+
+Exception --+
+ |
+ CheesecakeError
+| Method Summary | |
|---|---|
| Inherited from Exception | |
| + |
+ |
| + |
+ |
| + |
+ |
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class CompositeIndex + + | +
|
+
+object --+
+ |
+ CompositeIndex
+| Method Summary | |
|---|---|
| + |
++Indexes is a dict mapping names to Index objects |
| + |
++Return sum of individual index values |
| + |
++Print index info for all indexes sorted alphanumerically by name |
| + |
++Create new index or update existing index with specified +attributes |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Property Summary | |
|---|---|
| + | value |
| Method Details |
|---|
+ __init__(self,
+ type)
+
+ Indexes is a dict mapping names to Index objects
+ |
+ get_value(self) ++ Return sum of individual index values +
|
+ print_info(self) ++ Print index info for all indexes sorted alphanumerically by name +
|
+ set_index(self, + name, + value=0, + details='') ++ Create new index or update existing index with specified + attributes +
|
| Property Details |
|---|
+
+
+value+
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + | +
|
+
cheesecake_index: Cheesecake: How tasty is your code?
+
+The idea of the Cheesecake project is to rank Python packages
+based on various empiric "kwalitee" factors, such as:
+
+ * whether the package can be downloaded
+ * whether the package can be unpacked
+ * whether the package can be installed into an alternate directory
+ * existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+__builtin__.object:
+The most base type
+ cheesecake.cheesecake_index.Cheesecake:
+Computes 'goodness' of Python packages
+
+Generates "cheesecake index" that takes into account things like:
+
+ * whether the package can be downloaded
+ * whether the package can be unpacked
+ * whether the package can be installed into an alternate directory
+ * existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+ cheesecake.cheesecake_index.CodeParser:
+Information about the structure of a Python module
+ cheesecake.cheesecake_index.CompositeIndex:
+Collection of indexes of same type (e.g.
+ cheesecake.cheesecake_index.Index:
+Encapsulates index attributes such as name, value, details
+ cheesecake.cheesecake_index.StdoutRedirector:
+Redirect stdout to a temp file
+ __builtin__.type:
+type(object) -> the object's type type(name, bases, dict) -> a
+new type
+ exceptions.Exception:
+Common base class for all exceptions.
+ cheesecake.cheesecake_index.CheesecakeError:
+Custom exception class for Cheesecake-specific errors
+ | Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class Index + + | +
|
+
+object --+
+ |
+ Index
+Encapsulates index attributes such as name, value, details
+| Method Summary | |
|---|---|
| + | __init__(self,
+ type,
+ name,
+ value,
+ details)
+ |
| + |
++Print index name padded with dots, followed by value and details |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ print_info(self) ++Print index name padded with dots, followed by value and details +
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class StdoutRedirector + + | +
|
+
+object --+
+ |
+ StdoutRedirector
+| Method Summary | |
|---|---|
| + | __init__(self,
+ filename)
+ |
| + | flush(self)
+ |
| + |
++Return contents of the temp file |
| + | write(self,
+ buf)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ read_buffer(self) ++ Return contents of the temp file +
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger + + | +
|
+
| Classes | |
|---|---|
+ File |
+ |
+ Message |
+ |
+ MultipleProducer |
+ |
+ Path |
+ |
+ Producer |
+ Log producer API which sends messages to be logged +to a 'consumer' object, which then prints them to stdout, +stderr, files, etc. |
| Function Summary | |
|---|---|
| + | default_consumer(msg)
+ |
| + | setconsumer(keywords,
+ consumer)
+ |
| + | STDERR(msg)
+ |
| + | STDOUT(msg)
+ |
| Variable Summary | |
|---|---|
Producer |
+default = <Producer default>
+ |
| Variable Details |
|---|
+
+default+
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class Producer + + | +
|
+
+object --+
+ |
+ Producer
+MultipleProducerLog producer API which sends messages to be logged +to a 'consumer' object, which then prints them to stdout, +stderr, files, etc.
+| Method Summary | |
|---|---|
| + | __init__(self,
+ keywords)
+ |
| + | __call__(self,
+ *args)
+ |
| + | __getattr__(self,
+ name)
+ |
| + | __repr__(self)
+ |
| + | _getconsumer(self,
+ keywords)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Class Variable Summary | |
|---|---|
dict |
+keywords2consumer = {'default': <function default_consum...
+ |
type |
+ Message = logger.Message |
| Class Variable Details |
|---|
+
+keywords2consumer+
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class Cheesecake + + | +
|
+
+object --+
+ |
+ Cheesecake
++Computes 'goodness' of Python packages + +Generates "cheesecake index" that takes into account things like: + + * whether the package can be downloaded + * whether the package can be unpacked + * whether the package can be installed into an alternate directory + * existence of certain files such as README, INSTALL, LICENSE, setup.py etc. + * existence of certain directories such as doc, test, demo, examples + * percentage of modules/functions/classes/methods with docstrings + * percentage of functions/methods that are unit tested + * average pylint score for all non-test and non-demo modules ++
| Method Summary | |
|---|---|
| + |
++Initialize critical variables, download and unpack package, walk +package tree |
| + |
++Delete temporary directories and files that were created in the +sandbox |
| + |
++Compute overall Cheesecake index for the package by adding up specific +indexes |
| + |
++Default settings for logging |
| + |
++Copy package file to sandbox directory |
| + | determine_pkg_name(self)
+ |
| + |
++Use ``urllib.urlretrieve`` to download package to file in sandbox +dir |
| + |
++Get package name as file portion of path |
| + |
++Use ``urlparse`` to obtain package path from URL |
| + |
++Download package using setuptools utilities |
| + |
++Return CompositeIndex object of type "dir" |
| + |
++Compute docstring index as percentage of +modules/classes/methods/functions that have docstrings associated with +them |
| + |
++Return CompositeIndex object of type "file" |
| + |
++Verify that package can be installed in alternate directory |
| + |
++Compute pylint index as average of positive pylint scores obtained for +the Python files identified in the package |
| + |
++Verify that package can be downloaded from PyPI |
| + |
++Verify that package can be unpacked |
| + |
++Verify that unpack directory has same name as package |
| + |
++Verify that package can be downloaded from an URL |
| + |
++Initialize variables used in index computation |
| + |
++Return True if file ends with .py and it is not a special file and it +is not in special directory |
| + |
++Return True is file is in directory rooted at "test" or +"tests" |
| + |
++Print line of text, unless quiet flag was given |
| + |
++Compute and print index of specified type |
| + | process_partial_index(self,
+ partial_index_name,
+ index_types,
+ max_value)
+ |
| + |
++Cleanup, print error message and raise CheesecakeError |
| + | retrieve_pkg(self)
+ |
| + |
++Unpack the package in the sandbox directory |
| + |
++Untar the package in the sandbox directory |
| + |
++Unzip the package in the sandbox directory |
| + |
++Traverse the file system tree rooted at sandbox/package_name |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ __init__(self,
+ name='',
+ url='',
+ path='',
+ sandbox=None,
+ verbose=False,
+ quiet=False)
+
+ Initialize critical variables, download and unpack package, walk
+ package tree
+ |
+ cleanup(self) ++ Delete temporary directories and files that were created in the + sandbox +
|
+ compute_cheesecake_index(self) ++ Compute overall Cheesecake index for the package by adding up + specific indexes +
|
+ configure_logging(self) ++Default settings for logging + if verbose, log goes to console, else it goes to logfile log.debug + goes to logfile log.info goes to console log.warn and log.error go to + both logfile and stdout +
|
+ copy_pkg(self) ++ Copy package file to sandbox directory +
|
+ download_pkg(self) ++ Use ``urllib.urlretrieve`` to download package to file in sandbox + dir +
|
+ get_package_from_path(self, + path) ++ Get package name as file portion of path +
|
+ get_package_from_url(self) ++ Use ``urlparse`` to obtain package path from URL +
|
+ get_pkg_from_pypi(self) ++ Download package using setuptools utilities +
|
+ index_dir(self) ++ Return CompositeIndex object of type "dir" +
|
+ index_docstrings(self) ++Compute docstring index as percentage of + modules/classes/methods/functions that have docstrings associated with + them + Return Index object of type "docstrings" +
|
+ index_file(self) ++ Return CompositeIndex object of type "file" +
|
+ index_install(self) ++Verify that package can be installed in alternate directory + Return Index object of type "install" +
|
+ index_pylint(self) ++Compute pylint index as average of positive pylint scores obtained + for the Python files identified in the package + Return Index object of type "pylint" +
|
+ index_pypi_download(self) ++Verify that package can be downloaded from PyPI + Return Index object of type "pypi_download" +
|
+ index_unpack(self) ++Verify that package can be unpacked + Return Index object of type "unpack" +
|
+ index_unpack_dir(self) ++Verify that unpack directory has same name as package + Return Index object of type "unpack_dir" +
|
+ index_url_download(self) ++Verify that package can be downloaded from an URL + Return Index object of type "download" +
|
+ init_indexes(self) ++Initialize variables used in index computation + * cheesecake_index: overall index for the package * index: dict + holding Index or CompositeIndex objects of various types +
|
+ is_py_file(self, + file, + dirs) ++ Return True if file ends with .py and it is not a special file and + it is not in special directory +
|
+ is_test_file(self, + file, + dirs) ++ Return True is file is in directory rooted at "test" or + "tests" +
|
+ print_line(self, + line) ++ Print line of text, unless quiet flag was given +
|
+ process_index(self, + index_type) ++ Compute and print index of specified type +
|
+ raise_exception(self, + msg) ++Cleanup, print error message and raise CheesecakeError + Don't use logging, since it can be called before logging has been + setup +
|
+ unpack_pkg(self) ++Unpack the package in the sandbox directory +Currently supported archive types: + * .tar.gz (handled with ``tarfile`` module) * .zip (handled with + ``zipfile`` module) +
|
+ untar_pkg(self) ++Untar the package in the sandbox directory + Uses tarfile module +
|
+ unzip_pkg(self) ++Unzip the package in the sandbox directory + Uses zipfile module +
|
+ walk_pkg(self) ++Traverse the file system tree rooted at sandbox/package_name + * Compute indexes for special files and directories * Identify + Python files, test files, etc. +
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index + + | +
|
+
+Cheesecake: How tasty is your code? + +The idea of the Cheesecake project is to rank Python packages +based on various empiric "kwalitee" factors, such as: + + * whether the package can be downloaded + * whether the package can be unpacked + * whether the package can be installed into an alternate directory + * existence of certain files such as README, INSTALL, LICENSE, setup.py etc. + * existence of certain directories such as doc, test, demo, examples + * percentage of modules/functions/classes/methods with docstrings + * percentage of functions/methods that are unit tested + * average pylint score for all non-test and non-demo modules + * whether the package can be unpacked + * whether the package can be installed into an alternate directory ++
| Classes | |
|---|---|
+ Cheesecake |
+ Computes 'goodness' of Python packages + +Generates "cheesecake index" that takes into account things like: + + * whether the package can be downloaded + * whether the package can be unpacked + * whether the package can be installed into an alternate directory + * existence of certain files such as README, INSTALL, LICENSE, setup.py etc. |
+ CodeParser |
+ Information about the structure of a Python module |
+ CompositeIndex |
+ Collection of indexes of same type (e.g. |
+ Index |
+ Encapsulates index attributes such as name, value, details |
+ StdoutRedirector |
+ Redirect stdout to a temp file |
| Exceptions | |
|---|---|
+ CheesecakeError |
+ Custom exception class for Cheesecake-specific errors |
| Function Summary | |
|---|---|
| + |
++Display Cheesecake index for package specified via command-line +options |
| + |
++Pad value with spaces at left up to given length |
| + |
++Pad message with dots and pad value with spaces |
| + |
++Pad text with dots up to given length |
| + |
++Parse command-line options |
| Variable Summary | |
|---|---|
int |
+INDEX_DIR = 20 |
int |
+INDEX_DIR_CRITICAL = 25 |
int |
+INDEX_DIR_EMPTY = 5 |
int |
+INDEX_FILE = 10 |
int |
+INDEX_FILE_CRITICAL = 15 |
int |
+INDEX_FILE_PYC = -20 |
int |
+INDEX_INSTALL = 50 |
int |
+INDEX_PYPI_DISTANCE = 5 |
int |
+INDEX_PYPI_DOWNLOAD = 50 |
int |
+INDEX_REQUIRED_FILES = 100 |
int |
+INDEX_UNPACK = 25 |
int |
+INDEX_UNPACK_DIR = 15 |
int |
+INDEX_URL_DOWNLOAD = 25 |
int |
+PAD_TEXT = 40 |
int |
+PAD_VALUE = 4 |
| Function Details |
|---|
+ main() ++ Display Cheesecake index for package specified via command-line + options +
|
+ pad_left_spaces(value, + length=4) ++ Pad value with spaces at left up to given length +
|
+ pad_msg(msg, + value) ++ Pad message with dots and pad value with spaces +
|
+ pad_with_dots(msg, + length=40) ++ Pad text with dots up to given length +
|
+ process_cmdline_args() ++ Parse command-line options +
|
| Variable Details |
|---|
+
+INDEX_DIR+
|
+
+INDEX_DIR_CRITICAL+
|
+
+INDEX_DIR_EMPTY+
|
+
+INDEX_FILE+
|
+
+INDEX_FILE_CRITICAL+
|
+
+INDEX_FILE_PYC+
|
+
+INDEX_INSTALL+
|
+
+INDEX_PYPI_DISTANCE+
|
+
+INDEX_PYPI_DOWNLOAD+
|
+
+INDEX_REQUIRED_FILES+
|
+
+INDEX_UNPACK+
|
+
+INDEX_UNPACK_DIR+
|
+
+INDEX_URL_DOWNLOAD+
|
+
+PAD_TEXT+
|
+
+PAD_VALUE+
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class CheesecakeError + + | +
|
+
+Exception --+
+ |
+ CheesecakeError
+Custom exception class for Cheesecake-specific errors
+| Method Summary | |
|---|---|
| Inherited from Exception | |
| + |
+ |
| + |
+ |
| + |
+ |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class CompositeIndex + + | +
|
+
+object --+
+ |
+ CompositeIndex
+Collection of indexes of same type (e.g. files, dirs)
+| Method Summary | |
|---|---|
| + |
++Indexes is a dict mapping names to Index objects |
| + |
++Return sum of individual index values |
| + |
++Print index info for all indexes sorted alphanumerically by name |
| + |
++Create new index or update existing index with specified attributes |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Property Summary | |
|---|---|
| + | value |
| Method Details |
|---|
+ __init__(self,
+ type)
+
+ |
+ get_value(self) ++Return sum of individual index values +
|
+ print_info(self) ++Print index info for all indexes sorted alphanumerically by name +
|
+ set_index(self, + name, + value=0, + details='') ++Create new index or update existing index with specified attributes +
|
| Property Details |
|---|
+
+
+value+
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class Path + + | +
|
+
+object--+ + | +File--+ + | + Path +
| Method Summary | |
|---|---|
| + | __init__(self,
+ filename,
+ append)
+ |
| Inherited from File | |
| + |
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + | +
|
+
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class CodeParser + + | +
|
+
+object --+
+ |
+ CodeParser
+Information about the structure of a Python module
+* Collects classes, methods, functions and any associated docstrings * +Does some dumb grep-style parsing, but in the future may do some real +smart parsing +| Method Summary | |
|---|---|
| + | __init__(self,
+ pyfile,
+ log)
+ |
| + |
++Return number of docstrings found in this module |
| + |
++Return number of objects found in this module |
| + |
++Parse module text and retrieve classes, methods, functions and +associated docstrings |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ docstring_count(self) ++ Return number of docstrings found in this module +
|
+ object_count(self) ++Return number of objects found in this module + * module * classes * methods * functions +
|
+ parse_file(self) ++ Parse module text and retrieve classes, methods, functions and + associated docstrings +
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class MultipleProducer + + | +
|
+
+object--+ + | +Producer--+ + | + MultipleProducer +
| Method Summary | |
|---|---|
| + | __call__(self,
+ *args,
+ **kwargs)
+ |
| Inherited from Producer | |
| + |
+ |
| + |
+ |
| + |
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Class Variable Summary | |
|---|---|
| Inherited from Producer | |
dict |
+keywords2consumer = {'default': <function default_consum...
+ |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Module exceptions :: + Class Exception + + | +
|
+
CheesecakeError| Method Summary | |
|---|---|
| + | __init__(...)
+ |
| + | __getitem__(...)
+ |
| + | __str__(...)
+ |
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Module __builtin__ :: + Class type + + | +
|
+
+object --+
+ |
+ type
+| Method Summary | |
|---|---|
| + |
++x.__call__(...) <==> x(...) |
| + |
++x.__cmp__(y) <==> cmp(x,y) |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| list of immediate subclasses | +
++__subclasses__() -> list of immediate subclasses |
| list | +
++return a type's method resolution order |
| Inherited from object | |
| + |
++x.__init__(...) initializes x; see x.__class__.__doc__ for +signature |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__str__() <==> str(x) |
| Class Variable Summary | |
|---|---|
type |
+ __base__ = __builtin__.object |
tuple |
+__bases__ = (<type 'object'>,)
+ |
int |
+__basicsize__ = 420 |
int |
+__dictoffset__ = 132 |
int |
+__flags__ = 21995 |
int |
+__itemsize__ = 20 |
tuple |
+__mro__ = (<type 'type'>, <type 'object'>)
+ |
str |
+__name__ = 'type'
+ |
int |
+__weakrefoffset__ = 184 |
| Method Details |
|---|
+ __call__(x,
+ ...)
+
+ x.__call__(...) <==> x(...)
+ |
+ __cmp__(x,
+ y)
+
+ x.__cmp__(y) <==> cmp(x,y)
+ |
+ __delattr__(...) ++ x.__delattr__('name') <==> del x.name +
|
+ __getattribute__(...) ++ x.__getattribute__('name') <==> x.name +
|
+ __hash__(x)
+
+ x.__hash__() <==> hash(x)
+ |
+ __new__(T, + S, + ...) ++ T.__new__(S, ...) -> a new object with type S, a subtype of T +
|
+ __repr__(x)
+
+ x.__repr__() <==> repr(x)
+ |
+ __setattr__(...) ++ x.__setattr__('name', value) <==> x.name = value +
|
+ __subclasses__() ++ __subclasses__() -> list of immediate subclasses +
|
+ mro() ++ return a type's method resolution order +
|
| Class Variable Details |
|---|
+
+__bases__+
|
+
+__basicsize__+
|
+
+__dictoffset__+
|
+
+__flags__+
|
+
+__itemsize__+
|
+
+__mro__+
|
+
+__name__+
|
+
+__weakrefoffset__+
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class StdoutRedirector + + | +
|
+
+object --+
+ |
+ StdoutRedirector
+Redirect stdout to a temp file
+| Method Summary | |
|---|---|
| + | __init__(self,
+ filename)
+ |
| + | flush(self)
+ |
| + |
++Return contents of the temp file |
| + | write(self,
+ buf)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ read_buffer(self) ++Return contents of the temp file +
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + | +
|
+
This document contains the API (Application Programming Interface) +documentation for cheesecake. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.
+ +Each Package Documentation page contains: +
Each Module Documentation page contains: +
Each Class Documentation page contains: +
The Trees page contains the module and class hierarchies: +
The Index page contains indices of terms and + identifiers: +
The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:
+ +|
+ Project Contents ... |
+
+ API Documentation Frame + |
+
|
+ Module Contents ... + |
+
The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.
+ +The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.
+ +The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.
+ +A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.
+ +| Label | +Highlighted when... | +Links to... | +
|---|---|---|
| [Parent] | +(never highlighted) | +the parent of the current package |
| [Package] | +viewing a package | +the package containing the current object + |
| [Module] | +viewing a module | +the module containing the current object + |
| [Class] | +viewing a class | +the class containing the current object |
| [Trees] | +viewing the trees page | +the trees page |
| [Index] | +viewing the index page | +the index page |
| [Help] | +viewing the help page | +the help page |
The "show private" and "hide private" buttons below
+the top navigation bar can be used to control whether documentation
+for private objects is displayed. Private objects are usually defined
+as objects whose (short) names begin with a single underscore, but do
+not end with an underscore. For example, "_x",
+"__pprint", and "epydoc.epytext._tokenize"
+are private objects; but "re.sub",
+"__init__", and "type_" are not. However,
+if a module defines the "__all__" variable, then its
+contents are used to decide which objects are private.
A timestamp below the bottom navigation bar indicates when each +page was last updated.
+ + +| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class Index + + | +
|
+
+object --+
+ |
+ Index
+| Method Summary | |
|---|---|
| + | __init__(self,
+ type,
+ name,
+ value,
+ details)
+ |
| + |
++Print index name padded with dots, followed by value and details |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ print_info(self) ++ Print index name padded with dots, followed by value and details +
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class File + + | +
|
+
+object --+
+ |
+ File
+Path| Method Summary | |
|---|---|
| + | __init__(self,
+ f)
+ |
| + | __call__(self,
+ msg)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class Cheesecake + + | +
|
+
+object --+
+ |
+ Cheesecake
+Computes 'goodness' of Python packages
+Generates "cheesecake index" that takes into account things like:
++++
+- whether the package can be downloaded
+- whether the package can be unpacked
+- whether the package can be installed into an alternate directory
+- existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+- existence of certain directories such as doc, test, demo, examples
+- percentage of modules/functions/classes/methods with docstrings
+- percentage of functions/methods that are unit tested
+- average pylint score for all non-test and non-demo modules
+
| Method Summary | |
|---|---|
| + |
++Initialize critical variables, download and unpack package, walk package tree |
| + |
++Delete temporary directories and files that were +created in the sandbox |
| + |
++Compute overall Cheesecake index for the package by adding up +specific indexes |
| + |
++Default settings for logging |
| + |
++Copy package file to sandbox directory |
| + | determine_pkg_name(self)
+ |
| + |
++Use urllib.urlretrieve to download package to file in sandbox dir |
| + |
++Get package name as file portion of path |
| + |
++Use urlparse to obtain package path from URL |
| + |
++Download package using setuptools utilities |
| + |
++Return CompositeIndex object of type "dir" |
| + |
++Compute docstring index as percentage of modules/classes/methods/functions +that have docstrings associated with them |
| + |
++Verify that package can be downloaded from an URL |
| + |
++Return CompositeIndex object of type "file" |
| + |
++Verify that package can be installed in alternate directory |
| + |
++Compute pylint index as average of positive pylint scores obtained for +the Python files identified in the package |
| + |
++Verify that package can be downloaded from PyPI |
| + |
++Verify that package can be unpacked |
| + |
++Verify that unpack directory has same name as package |
| + |
++Initialize variables used in index computation |
| + |
++Return True if file ends with .py and it is not a special file and it is not +in special directory |
| + |
++Return True is file is in directory rooted at "test" or "tests" |
| + |
++Pad message with dots and pad value with spaces |
| + |
++Print line of text, unless quiet flag was given |
| + |
++Compute and print index of specified type |
| + |
++Cleanup, print error message and raise CheesecakeError |
| + | retrieve_pkg(self)
+ |
| + |
++Unpack the package in the sandbox directory |
| + |
++Untar the package in the sandbox directory |
| + |
++Unzip the package in the sandbox directory |
| + |
++Traverse the file system tree rooted at sandbox/package_name |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ __init__(self,
+ name='',
+ url='',
+ path='',
+ sandbox=None,
+ verbose=False,
+ quiet=False)
+
+ |
+ cleanup(self) ++Delete temporary directories and files that were +created in the sandbox +
|
+ compute_cheesecake_index(self) ++Compute overall Cheesecake index for the package by adding up +specific indexes +
|
+ configure_logging(self) ++Default settings for logging +if verbose, log goes to console, else it goes to logfile +log.debug goes to logfile +log.info goes to console +log.warn and log.error go to both logfile and stdout +
|
+ copy_pkg(self) ++Copy package file to sandbox directory +
|
+ download_pkg(self) ++Use urllib.urlretrieve to download package to file in sandbox dir +
|
+ get_package_from_path(self, + path) ++Get package name as file portion of path +
|
+ get_package_from_url(self) ++Use urlparse to obtain package path from URL +
|
+ get_pkg_from_pypi(self) ++Download package using setuptools utilities +
|
+ index_dir(self) ++Return CompositeIndex object of type "dir" +
|
+ index_docstrings(self) ++Compute docstring index as percentage of modules/classes/methods/functions +that have docstrings associated with them +Return Index object of type "docstrings" +
|
+ index_download(self) ++Verify that package can be downloaded from an URL +Return Index object of type "download" +
|
+ index_file(self) ++Return CompositeIndex object of type "file" +
|
+ index_install(self) ++Verify that package can be installed in alternate directory +Return Index object of type "install" +
|
+ index_pylint(self) ++Compute pylint index as average of positive pylint scores obtained for +the Python files identified in the package +Return Index object of type "pylint" +
|
+ index_pypi_download(self) ++Verify that package can be downloaded from PyPI +Return Index object of type "pypi_download" +
|
+ index_unpack(self) ++Verify that package can be unpacked +Return Index object of type "unpack" +
|
+ index_unpack_dir(self) ++Verify that unpack directory has same name as package +Return Index object of type "unpack_dir" +
|
+ init_indexes(self) ++Initialize variables used in index computation +
|
+ is_py_file(self, + file, + dirs) ++Return True if file ends with .py and it is not a special file and it is not +in special directory +
|
+ is_test_file(self, + file, + dirs) ++Return True is file is in directory rooted at "test" or "tests" +
|
+ pad_msg(self, + msg, + value) ++Pad message with dots and pad value with spaces +
|
+ print_line(self, + line) ++Print line of text, unless quiet flag was given +
|
+ process_index(self, + index_type) ++Compute and print index of specified type +
|
+ raise_exception(self, + msg) ++Cleanup, print error message and raise CheesecakeError +Don't use logging, since it can be called before logging has been setup +
|
+ unpack_pkg(self) ++Unpack the package in the sandbox directory +Currently supported archive types: +
|
+ untar_pkg(self) ++Untar the package in the sandbox directory +Uses tarfile module +
|
+ unzip_pkg(self) ++Unzip the package in the sandbox directory +Uses zipfile module +
|
+ walk_pkg(self) ++Traverse the file system tree rooted at sandbox/package_name +
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake + + | +
|
+
Cheesecake: How tasty is your code?
+The idea of the Cheesecake project is to rank Python packages +based on various empiric "kwalitee" factors, such as:
++++
+- whether the package can be downloaded
+- whether the package can be unpacked
+- whether the package can be installed into an alternate directory
+- existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+- existence of certain directories such as doc, test, demo, examples
+- percentage of modules/functions/classes/methods with docstrings
+- percentage of functions/methods that are unit tested
+- average pylint score for all non-test and non-demo modules
+- whether the package can be unpacked
+- whether the package can be installed into an alternate directory
+
| Classes | |
|---|---|
+ Cheesecake |
+ Computes 'goodness' of Python packages |
+ CodeParser |
+ Information about the structure of a Python module |
+ CompositeIndex |
+ Collection of indexes of same type (e.g. |
+ Index |
+ Encapsulates index attributes such as name, value, details |
+ StdoutRedirector |
+ Redirect stdout to a temp file |
| Exceptions | |
|---|---|
+ CheesecakeError |
+ Custom exception class for Cheesecake-specific errors |
| Function Summary | |
|---|---|
| + |
++Display Cheesecake index for package specified via command-line options |
| + |
++Pad value with spaces at left up to given length |
| + |
++Pad text with dots up to given length |
| + |
++Parse command-line options |
| Variable Summary | |
|---|---|
int |
+INDEX_DIR = 20 |
int |
+INDEX_DIR_CRITICAL = 25 |
int |
+INDEX_DIR_EMPTY = 5 |
int |
+INDEX_FILE = 10 |
int |
+INDEX_FILE_CRITICAL = 15 |
int |
+INDEX_FILE_PYC = -20 |
int |
+INDEX_INSTALL = 50 |
int |
+INDEX_PYPI_DISTANCE = 5 |
int |
+INDEX_PYPI_DOWNLOAD = 50 |
int |
+INDEX_UNPACK = 25 |
int |
+INDEX_UNPACK_DIR = 15 |
int |
+INDEX_URL_DOWNLOAD = 25 |
int |
+PAD_TEXT = 25 |
int |
+PAD_VALUE = 4 |
| Function Details |
|---|
+ main() ++Display Cheesecake index for package specified via command-line options +
|
+ pad_left_spaces(value, + length=4) ++Pad value with spaces at left up to given length +
|
+ pad_with_dots(msg, + length=25) ++Pad text with dots up to given length +
|
+ process_cmdline_args() ++Parse command-line options +
|
| Variable Details |
|---|
+
+INDEX_DIR+
|
+
+INDEX_DIR_CRITICAL+
|
+
+INDEX_DIR_EMPTY+
|
+
+INDEX_FILE+
|
+
+INDEX_FILE_CRITICAL+
|
+
+INDEX_FILE_PYC+
|
+
+INDEX_INSTALL+
|
+
+INDEX_PYPI_DISTANCE+
|
+
+INDEX_PYPI_DOWNLOAD+
|
+
+INDEX_UNPACK+
|
+
+INDEX_UNPACK_DIR+
|
+
+INDEX_URL_DOWNLOAD+
|
+
+PAD_TEXT+
|
+
+PAD_VALUE+
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class Message + + | +
|
+
+object --+
+ |
+ Message
+| Method Summary | |
|---|---|
| + | __init__(self,
+ keywords,
+ args)
+ |
| + | __str__(self)
+ |
| + | content(self)
+ |
| + | prefix(self)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class CodeParser + + | +
|
+
+object --+
+ |
+ CodeParser
+Information about the structure of a Python module
+| Method Summary | |
|---|---|
| + | __init__(self,
+ pyfile,
+ log)
+ |
| + |
++Return number of docstrings found in this module |
| + |
++Return number of objects found in this module |
| + |
++Parse module text and retrieve classes, methods, functions +and associated docstrings |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ docstring_count(self) ++Return number of docstrings found in this module +
|
+ object_count(self) ++Return number of objects found in this module +
|
+ parse_file(self) ++Parse module text and retrieve classes, methods, functions +and associated docstrings +
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Module __builtin__ :: + Class object + + | +
|
+
Cheesecake,
+ CodeParser,
+ CompositeIndex,
+ Index,
+ StdoutRedirector,
+ type| Method Summary | |
|---|---|
| + |
++x.__init__(...) initializes x; see x.__class__.__doc__ for +signature |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Class Variable Summary | |
|---|---|
type |
+ __class__ = __builtin__.type |
| Method Details |
|---|
+ __init__(...)
+
+ x.__init__(...) initializes x; see x.__class__.__doc__ for
+ signature
+ |
+ __delattr__(...) ++ x.__delattr__('name') <==> del x.name +
|
+ __getattribute__(...) ++ x.__getattribute__('name') <==> x.name +
|
+ __hash__(x)
+
+ x.__hash__() <==> hash(x)
+ |
+ __new__(T, + S, + ...) ++ T.__new__(S, ...) -> a new object with type S, a subtype of T +
|
+ __reduce__(...) ++ helper for pickle +
|
+ __reduce_ex__(...) ++ helper for pickle +
|
+ __repr__(x)
+
+ x.__repr__() <==> repr(x)
+ |
+ __setattr__(...) ++ x.__setattr__('name', value) <==> x.name = value +
|
+ __str__(x)
+
+ x.__str__() <==> str(x)
+ |
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class CheesecakeError + + | +
|
+
+Exception --+
+ |
+ CheesecakeError
+| Method Summary | |
|---|---|
| Inherited from Exception | |
| + |
+ |
| + |
+ |
| + |
+ |
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class CompositeIndex + + | +
|
+
+object --+
+ |
+ CompositeIndex
+| Method Summary | |
|---|---|
| + |
++Indexes is a dict mapping names to Index objects |
| + |
++Return sum of individual index values |
| + |
++Print index info for all indexes sorted alphanumerically by name |
| + |
++Create new index or update existing index with specified +attributes |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Property Summary | |
|---|---|
| + | value |
| Method Details |
|---|
+ __init__(self,
+ type)
+
+ Indexes is a dict mapping names to Index objects
+ |
+ get_value(self) ++ Return sum of individual index values +
|
+ print_info(self) ++ Print index info for all indexes sorted alphanumerically by name +
|
+ set_index(self, + name, + value=0, + details='') ++ Create new index or update existing index with specified + attributes +
|
| Property Details |
|---|
+
+
+value+
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + | +
|
+
cheesecake_index: Cheesecake: How tasty is your code?
+
+The idea of the Cheesecake project is to rank Python packages
+based on various empiric "kwalitee" factors, such as:
+
+ * whether the package can be downloaded
+ * whether the package can be unpacked
+ * whether the package can be installed into an alternate directory
+ * existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+__builtin__.object:
+The most base type
+ cheesecake.cheesecake_index.Cheesecake:
+Computes 'goodness' of Python packages
+
+Generates "cheesecake index" that takes into account things like:
+
+ * whether the package can be downloaded
+ * whether the package can be unpacked
+ * whether the package can be installed into an alternate directory
+ * existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
+ cheesecake.cheesecake_index.CodeParser:
+Information about the structure of a Python module
+ cheesecake.cheesecake_index.CompositeIndex:
+Collection of indexes of same type (e.g.
+ cheesecake.cheesecake_index.Index:
+Encapsulates index attributes such as name, value, details
+ cheesecake.cheesecake_index.StdoutRedirector:
+Redirect stdout to a temp file
+ __builtin__.type:
+type(object) -> the object's type type(name, bases, dict) -> a
+new type
+ exceptions.Exception:
+Common base class for all exceptions.
+ cheesecake.cheesecake_index.CheesecakeError:
+Custom exception class for Cheesecake-specific errors
+ | Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module cheesecake :: + Class Index + + | +
|
+
+object --+
+ |
+ Index
+Encapsulates index attributes such as name, value, details
+| Method Summary | |
|---|---|
| + | __init__(self,
+ type,
+ name,
+ value,
+ details)
+ |
| + |
++Print index name padded with dots, followed by value and details |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ print_info(self) ++Print index name padded with dots, followed by value and details +
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class StdoutRedirector + + | +
|
+
+object --+
+ |
+ StdoutRedirector
+| Method Summary | |
|---|---|
| + | __init__(self,
+ filename)
+ |
| + | flush(self)
+ |
| + |
++Return contents of the temp file |
| + | write(self,
+ buf)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ read_buffer(self) ++ Return contents of the temp file +
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger + + | +
|
+
| Classes | |
|---|---|
+ File |
+ |
+ Message |
+ |
+ MultipleProducer |
+ |
+ Path |
+ |
+ Producer |
+ Log producer API which sends messages to be logged +to a 'consumer' object, which then prints them to stdout, +stderr, files, etc. |
| Function Summary | |
|---|---|
| + | default_consumer(msg)
+ |
| + | setconsumer(keywords,
+ consumer)
+ |
| + | STDERR(msg)
+ |
| + | STDOUT(msg)
+ |
| Variable Summary | |
|---|---|
Producer |
+default = <Producer default>
+ |
| Variable Details |
|---|
+
+default+
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Trees | +Index | +Help | +
+
|
+
|---|
| + + Module logger :: + Class Producer + + | +
|
+
+object --+
+ |
+ Producer
+MultipleProducerLog producer API which sends messages to be logged +to a 'consumer' object, which then prints them to stdout, +stderr, files, etc.
+| Method Summary | |
|---|---|
| + | __init__(self,
+ keywords)
+ |
| + | __call__(self,
+ *args)
+ |
| + | __getattr__(self,
+ name)
+ |
| + | __repr__(self)
+ |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Class Variable Summary | |
|---|---|
dict |
+keywords2consumer = {'default': <function default_consum...
+ |
type |
+ Message = logger.Message |
| Class Variable Details |
|---|
+
+keywords2consumer+
|
| Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Nov 16 09:59:23 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index :: + Class Cheesecake + + | +
|
+
+object --+
+ |
+ Cheesecake
++Computes 'goodness' of Python packages + +Generates "cheesecake index" that takes into account things like: + + * whether the package can be downloaded + * whether the package can be unpacked + * whether the package can be installed into an alternate directory + * existence of certain files such as README, INSTALL, LICENSE, setup.py etc. + * existence of certain directories such as doc, test, demo, examples + * percentage of modules/functions/classes/methods with docstrings + * percentage of functions/methods that are unit tested + * average pylint score for all non-test and non-demo modules ++
| Method Summary | |
|---|---|
| + |
++Initialize critical variables, download and unpack package, walk +package tree |
| + |
++Delete temporary directories and files that were created in the +sandbox |
| + |
++Compute overall Cheesecake index for the package by adding up specific +indexes |
| + |
++Default settings for logging |
| + |
++Copy package file to sandbox directory |
| + | determine_pkg_name(self)
+ |
| + |
++Use ``urllib.urlretrieve`` to download package to file in sandbox +dir |
| + |
++Get package name as file portion of path |
| + |
++Use ``urlparse`` to obtain package path from URL |
| + |
++Download package using setuptools utilities |
| + |
++Return CompositeIndex object of type "dir" |
| + |
++Compute docstring index as percentage of +modules/classes/methods/functions that have docstrings associated with +them |
| + |
++Return CompositeIndex object of type "file" |
| + |
++Verify that package can be installed in alternate directory |
| + |
++Compute pylint index as average of positive pylint scores obtained for +the Python files identified in the package |
| + |
++Verify that package can be downloaded from PyPI |
| + |
++Verify that package can be unpacked |
| + |
++Verify that unpack directory has same name as package |
| + |
++Verify that package can be downloaded from an URL |
| + |
++Initialize variables used in index computation |
| + |
++Return True if file ends with .py and it is not a special file and it +is not in special directory |
| + |
++Return True is file is in directory rooted at "test" or +"tests" |
| + |
++Print line of text, unless quiet flag was given |
| + |
++Compute and print index of specified type |
| + | process_partial_index(self,
+ partial_index_name,
+ index_types,
+ max_value)
+ |
| + |
++Cleanup, print error message and raise CheesecakeError |
| + | retrieve_pkg(self)
+ |
| + |
++Unpack the package in the sandbox directory |
| + |
++Untar the package in the sandbox directory |
| + |
++Unzip the package in the sandbox directory |
| + |
++Traverse the file system tree rooted at sandbox/package_name |
| Inherited from object | |
| + |
++x.__delattr__('name') <==> del x.name |
| + |
++x.__getattribute__('name') <==> x.name |
| + |
++x.__hash__() <==> hash(x) |
| + |
++T.__new__(S, ...) -> a new object with type S, a subtype of T |
| + |
++helper for pickle |
| + |
++helper for pickle |
| + |
++x.__repr__() <==> repr(x) |
| + |
++x.__setattr__('name', value) <==> x.name = value |
| + |
++x.__str__() <==> str(x) |
| Method Details |
|---|
+ __init__(self,
+ name='',
+ url='',
+ path='',
+ sandbox=None,
+ verbose=False,
+ quiet=False)
+
+ Initialize critical variables, download and unpack package, walk
+ package tree
+ |
+ cleanup(self) ++ Delete temporary directories and files that were created in the + sandbox +
|
+ compute_cheesecake_index(self) ++ Compute overall Cheesecake index for the package by adding up + specific indexes +
|
+ configure_logging(self) ++Default settings for logging + if verbose, log goes to console, else it goes to logfile log.debug + goes to logfile log.info goes to console log.warn and log.error go to + both logfile and stdout +
|
+ copy_pkg(self) ++ Copy package file to sandbox directory +
|
+ download_pkg(self) ++ Use ``urllib.urlretrieve`` to download package to file in sandbox + dir +
|
+ get_package_from_path(self, + path) ++ Get package name as file portion of path +
|
+ get_package_from_url(self) ++ Use ``urlparse`` to obtain package path from URL +
|
+ get_pkg_from_pypi(self) ++ Download package using setuptools utilities +
|
+ index_dir(self) ++ Return CompositeIndex object of type "dir" +
|
+ index_docstrings(self) ++Compute docstring index as percentage of + modules/classes/methods/functions that have docstrings associated with + them + Return Index object of type "docstrings" +
|
+ index_file(self) ++ Return CompositeIndex object of type "file" +
|
+ index_install(self) ++Verify that package can be installed in alternate directory + Return Index object of type "install" +
|
+ index_pylint(self) ++Compute pylint index as average of positive pylint scores obtained + for the Python files identified in the package + Return Index object of type "pylint" +
|
+ index_pypi_download(self) ++Verify that package can be downloaded from PyPI + Return Index object of type "pypi_download" +
|
+ index_unpack(self) ++Verify that package can be unpacked + Return Index object of type "unpack" +
|
+ index_unpack_dir(self) ++Verify that unpack directory has same name as package + Return Index object of type "unpack_dir" +
|
+ index_url_download(self) ++Verify that package can be downloaded from an URL + Return Index object of type "download" +
|
+ init_indexes(self) ++Initialize variables used in index computation + * cheesecake_index: overall index for the package * index: dict + holding Index or CompositeIndex objects of various types +
|
+ is_py_file(self, + file, + dirs) ++ Return True if file ends with .py and it is not a special file and + it is not in special directory +
|
+ is_test_file(self, + file, + dirs) ++ Return True is file is in directory rooted at "test" or + "tests" +
|
+ print_line(self, + line) ++ Print line of text, unless quiet flag was given +
|
+ process_index(self, + index_type) ++ Compute and print index of specified type +
|
+ raise_exception(self, + msg) ++Cleanup, print error message and raise CheesecakeError + Don't use logging, since it can be called before logging has been + setup +
|
+ unpack_pkg(self) ++Unpack the package in the sandbox directory +Currently supported archive types: + * .tar.gz (handled with ``tarfile`` module) * .zip (handled with + ``zipfile`` module) +
|
+ untar_pkg(self) ++Untar the package in the sandbox directory + Uses tarfile module +
|
+ unzip_pkg(self) ++Unzip the package in the sandbox directory + Uses zipfile module +
|
+ walk_pkg(self) ++Traverse the file system tree rooted at sandbox/package_name + * Compute indexes for special files and directories * Identify + Python files, test files, etc. +
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| + + Package cheesecake :: + Module cheesecake_index + + | +
|
+
+Cheesecake: How tasty is your code? + +The idea of the Cheesecake project is to rank Python packages +based on various empiric "kwalitee" factors, such as: + + * whether the package can be downloaded + * whether the package can be unpacked + * whether the package can be installed into an alternate directory + * existence of certain files such as README, INSTALL, LICENSE, setup.py etc. + * existence of certain directories such as doc, test, demo, examples + * percentage of modules/functions/classes/methods with docstrings + * percentage of functions/methods that are unit tested + * average pylint score for all non-test and non-demo modules + * whether the package can be unpacked + * whether the package can be installed into an alternate directory ++
| Classes | |
|---|---|
+ Cheesecake |
+ Computes 'goodness' of Python packages + +Generates "cheesecake index" that takes into account things like: + + * whether the package can be downloaded + * whether the package can be unpacked + * whether the package can be installed into an alternate directory + * existence of certain files such as README, INSTALL, LICENSE, setup.py etc. |
+ CodeParser |
+ Information about the structure of a Python module |
+ CompositeIndex |
+ Collection of indexes of same type (e.g. |
+ Index |
+ Encapsulates index attributes such as name, value, details |
+ StdoutRedirector |
+ Redirect stdout to a temp file |
| Exceptions | |
|---|---|
+ CheesecakeError |
+ Custom exception class for Cheesecake-specific errors |
| Function Summary | |
|---|---|
| + |
++Display Cheesecake index for package specified via command-line +options |
| + |
++Pad value with spaces at left up to given length |
| + |
++Pad message with dots and pad value with spaces |
| + |
++Pad text with dots up to given length |
| + |
++Parse command-line options |
| Variable Summary | |
|---|---|
int |
+INDEX_DIR = 20 |
int |
+INDEX_DIR_CRITICAL = 25 |
int |
+INDEX_DIR_EMPTY = 5 |
int |
+INDEX_FILE = 10 |
int |
+INDEX_FILE_CRITICAL = 15 |
int |
+INDEX_FILE_PYC = -20 |
int |
+INDEX_INSTALL = 50 |
int |
+INDEX_PYPI_DISTANCE = 5 |
int |
+INDEX_PYPI_DOWNLOAD = 50 |
int |
+INDEX_REQUIRED_FILES = 100 |
int |
+INDEX_UNPACK = 25 |
int |
+INDEX_UNPACK_DIR = 15 |
int |
+INDEX_URL_DOWNLOAD = 25 |
int |
+PAD_TEXT = 40 |
int |
+PAD_VALUE = 4 |
| Function Details |
|---|
+ main() ++ Display Cheesecake index for package specified via command-line + options +
|
+ pad_left_spaces(value, + length=4) ++ Pad value with spaces at left up to given length +
|
+ pad_msg(msg, + value) ++ Pad message with dots and pad value with spaces +
|
+ pad_with_dots(msg, + length=40) ++ Pad text with dots up to given length +
|
+ process_cmdline_args() ++ Parse command-line options +
|
| Variable Details |
|---|
+
+INDEX_DIR+
|
+
+INDEX_DIR_CRITICAL+
|
+
+INDEX_DIR_EMPTY+
|
+
+INDEX_FILE+
|
+
+INDEX_FILE_CRITICAL+
|
+
+INDEX_FILE_PYC+
|
+
+INDEX_INSTALL+
|
+
+INDEX_PYPI_DISTANCE+
|
+
+INDEX_PYPI_DOWNLOAD+
|
+
+INDEX_REQUIRED_FILES+
|
+
+INDEX_UNPACK+
|
+
+INDEX_UNPACK_DIR+
|
+
+INDEX_URL_DOWNLOAD+
|
+
+PAD_TEXT+
|
+
+PAD_VALUE+
|
| Home | +Trees | +Index | +Help | +
+
|
+
|---|
| Generated by Epydoc 2.1 on Wed Dec 21 17:21:41 2005 | +http://epydoc.sf.net | +
The idea of the Cheesecake project is to rank Python packages based on various -empirical "kwalitee" factors, such as:
----
-- whether the package can be downloaded from PyPI given its name
-- whether the package can be downloaded from a full URL
-- whether the package can be unpacked
-- whether the unpack directory is the same as the package name
-- whether the package can be installed into an alternate directory
-- existence of certain files such as README, INSTALL, LICENSE, setup.py etc.
-- existence of certain directories such as doc, test, demo, examples
-- percentage of modules/functions/classes/methods with docstrings
-- percentage of functions/methods that are unit tested (not currently -implemented)
-- average pylint score for all non-test and non-demo modules
-
Currently, the Cheesecake index is computed for invidual packages obtained -through a variety of methods (detailed below). One of the goals of the -Cheesecake project is to automatically compute the Cheesecake index for -all packages uploaded to the PyPI Cheese Shop (possibly at upload time) and -to maintain a collection of Web pages with statistics related to the -various indexes of the packages.
-Cheesecake currently computes 3 types of indexes:
----
-- installability index
-- documentation index
-- code kwalitee index
-
The algorithms for computing each index type are detailed below.
-The concept of "kwalitee" originated in the Perl community. Here's a relevant -quote:
--It looks like quality, it sounds like quality, but it's not quite quality.-
Kwalitee is an empiric measure of how good a specific body of code is. It -defines quality indicators and measures the code along them. It is currently -used by the CPANTS Testing Service -to evaluate the 'goodness' of CPAN packages.
-Since the Python package repository (aka PyPI) -is hosted at the Cheese Shop, -it stands to reason that the quality indicator of a PyPI package should be -called the Cheesecake index!
-To compute the Cheesecake index for a given project, run the cheesecake.py -module from the command line and indicate either:
----
-- the package short name (e.g. twill) or
-- the package URL (e.g. http://darcs.idyll.org/~t/projects/twill-0.7.4.tar.gz) or
-- the package path on the file system (e.g. /tmp/twill-latest.tar.gz)
-
In all cases, the cheesecake module will attempt to download the package -if necessary, then to unpack it in a sandbox directory (/tmp/cheesecake_sandbox -by default). If either of these operations fails, the Cheesecake index for -the package will be 0. If the package can be successfully unpacked, the -cheesecake module will compute the values for a variety of indexes detailed -in the algorithm given at the end of this file.
-If the package can be successfully downloaded and unpacked, a log file is -created in the sandbox directory and named <package>.log (e.g. the log file -for twill-0.7.4.tar.gz is /tmp/cheesecake_sandbox/twill-0.7.4.tar.gz.log). -The log file is not automatically deleted after the Cheesecake index is -computed, since its purpose is to be inspected for debug information.
-Command-line examples:
----
-- -
Compute the Cheesecake index for the Durus package by using setuptools -utilities to download the package from PyPI:
--python cheesecake.py --name=Durus --- -
Compute the Cheesecake index for the Durus package by indicating its URL:
--python cheesecake.py --url=http://www.mems-exchange.org/software/durus/Durus-3.1.tar.gz --- -
Compute the Cheesecake index for the twill package by indicating its path -on the local file system:
--python cheesecake.py --path=/tmp/twill-latest.tar.gz --- -
To increase the verbosity of the output, use the -v or --verbose option. -For more options, run cheesecake.py with -h or --help.
-
The Cheesecake project has not yet been released as a tarball or -a Python egg. You can obtain the source code from SourceForge via CVS:
--cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/cheesecake co -P cheesecake --
Developer mailing list: http://lists.sourceforge.net/lists/listinfo/cheesecake-devel
-Cheesecake is licensed under the Python Software Foundation license, -the same license that governs Python itself. The text of the license is -available in the LICENSE file in the source code distribution and -can also be downloaded from -http://www.opensource.org/licenses/PythonSoftFoundation.php.
-Grig Gheorghiu
-Email: <grig at gheorghiu dot net>
-Web site: http://agiletesting.blogspot.com
-The cheesecake.py module uses the following constants:
--INDEX_PYPI_DOWNLOAD = 50 -INDEX_PYPI_DISTANCE = 5 -INDEX_URL_DOWNLOAD = 25 -INDEX_UNPACK = 25 -INDEX_UNPACK_DIR = 15 -INDEX_INSTALL = 50 -INDEX_FILE_CRITICAL = 15 -INDEX_FILE = 10 -INDEX_FILE_PYC = 20 -INDEX_DIR_CRITICAL = 25 -INDEX_DIR = 20 -INDEX_DIR_EMPTY = 5 - -MAX_INDEX_DOCSTRINGS = 100 # max. percentage of modules/classes/methods/functions with docstrings -MAX_INDEX_PYLINT = 100 # max. pylint score --
Step 0
-Initialize the Cheesecake index to 0. Also initialize to 0 -the partial Cheesecake indexes for installability, documentation -and code kwalitee.
-Compute the maximum overall Cheesecake index that can be reached by -any given package, which is the sum:
--INDEX_PYPI_DOWNLOAD + -INDEX_UNPACK + INDEX_UNPACK_DIR + -INDEX_INSTALL + -MAX_INDEX_DOCSTRINGS + MAX_INDEX_PYLINT + -(INDEX_FILE * number_of_expected_files) + -(INDEX_FILE_CRITICAL * number_of_expected_critical_files) + -(INDEX_DIR * number_of_expected_dirs) + -(INDEX_DIR_CRITICAL * number_of_expected_critical_dirs) --
Compute the maximum Cheesecake index for installability, which is the sum:
--INDEX_PYPI_DOWNLOAD + -INDEX_UNPACK + INDEX_UNPACK_DIR + -INDEX_INSTALL --
Compute the maximum Cheesecake index for documentation, which is the sum:
--(INDEX_FILE * number_of_expected_files) + -(INDEX_FILE_CRITICAL * number_of_expected_critical_files) + -(INDEX_DIR * number_of_expected_dirs) + -(INDEX_DIR_CRITICAL * number_of_expected_critical_dirs) + -MAX_INDEX_DOCSTRINGS --
Compute the maximum Cheesecake index for code kwalitee, which is currently:
--MAX_INDEX_PYLINT --
Step 1a
-If short name of the package was specified with -n or --name, -try to download the package from the PyPI index page by following the links to -the package home page and the package download URL (this is accomplished -using setuptools utilities).
-If not successful, exit with a Cheesecake index of 0. If successful and -package was found at the Cheese Shop, add INDEX_PYPI_DOWNLOAD to -the overall Cheesecake index and to the installability Cheesecake index.
-If successful but package was not found at the Cheese Shop, add -INDEX_PYPI_DOWNLOAD - (INDEX_PYPI_DISTANCE * number_of_links_to_package) -to the overall Cheesecake index and to the installability Cheesecake index.
-Step 1b
-If full URL of the package was specified with -u or --url, -try to download the package from the specified URL.
-If not successful, exit with a Cheesecake index of 0. If successful, -add INDEX_URL_DOWNLOAD to the overall Cheesecake index and to -the installability Cheesecake index.
-Step 1c
-If path to package on local file system was specified with -p or ---path, copy the package to the sandbox directory.
-Step 2
-Unpack the package (currently supported archive types are zip and -tar.gz/tgz; in the near future we will support Python Eggs.)
-If not successful, exit with a Cheesecake index of 0. If successful, add -INDEX_UNPACK to the overall Cheesecake index and to the installability -Cheesecake index.
-Step 3
-Check that the unpack directory has the same name as the package name -(i.e. when unpacking twill-0.7.4.tar.gz, we expect the unpack directory -to be twill-0.7.4.)
-If the unpack directory name is the same as the package name, add -INDEX_UNPACK_DIR -to the overall Cheesecake index and to the installability Cheesecake index.
-Step 4
-Install the package to a temporary directory in a non-default location. -If successful, add INDEX_INSTALL to the overall Cheesecake index and to the -installability Cheesecake index.
-Step 5
-Check for existence of specific files. -For each file found, add INDEX_FILE to the overall -Cheesecake index and to the documentation Cheesecake index. -If the file is deemed critical, add INDEX_FILE_CRITICAL instead.
-The following special files ("cheese_files") are currently checked:
--cheese_files = ["install", "changelog", - "news", "faq", - "todo", "thanks", "announce", - "ez_setup.py", - ] --
The following files are currently deemed critical:
--critical_cheese_files = ["readme", "license", "setup.py"] --
To check if a file FILE is among the cheese files, the following regular -expression is used:
--re.search(r"^%s(\.txt)*" % cheese_file, file, re.IGNORECASE) --
Step 6
-Check for existence of specific directories. -For each directory found, add INDEX_DIR to the overall Cheesecake -index and to the documentation Cheesecake index. -If the directory is deemed critical, add INDEX_DIR_CRITICAL instead. -If the directory is found empty, add INDEX_DIR_EMPTY instead.
-The following directories ("cheese_dirs") are currently checked:
--cheese_dirs = ["example", "demo"] --
The following directories are currently deemed critical:
--critical_cheese_dirs = ["doc", "test"] --
To check if a directory DIR is among the cheese directories, -the following regular expression is used:
--re.search(r"^%s" % cheese_dir, DIR, re.ignorecase) --
Step 7
-Check for existence of .pyc files. If found, decrease the score -by subtracting INDEX_FILE_PYC from the overall Cheesecake index -and from the documentation Cheesecake index.
-Step 8
-Compute the percentage of modules/classes/methods/functions that have -docstrings associated with them. Only Python modules that are not in test, -doc, demo and example directories are checked. -Round up the percentage and add it to the overall Cheesecake index and to the -documentation Cheesecake index.
-Step 9
-If pylint is present on the system, run pylint against all Python files -that are not in the test, docs or demo directories. -Average the non-negative pylint scores, multiply the average by 10 and -add it to the overall Cheesecake index and to the code kwalitee -Cheesecake index.
-Step 10
-For each of the partial Cheesecake index types (installability, -documentation and code kwalitee), display the absolute Cheesecake -index for that type as the sum of all indexes of that type computed in -the previous steps. -Also display the relative Cheesecake index for that type as the percentage -of (absolute_index / maximum_index).
-Display the absolute Cheesecake index for the package as the sum of all -indexes computed in the previous steps. Also display the relative Cheesecake -index for the package as the percentage of (absolute_index / maximum_index).
--$ python cheesecake.py -n Durus -[cheesecake:console] Trying to download package durus from PyPI using setuptools utilities -[cheesecake:console] Downloaded package Durus-3.1.tar.gz from http://www.mems-exchange.org/software/durus/Durus-3.1.tar.gz -[cheesecake:console] Detailed info available in log file /tmp/cheesecake_sandbox/durus.log -[cheesecake:console] A given package can currently reach a MAXIMUM number of 555 points -[cheesecake:console] Starting computation of Cheesecake index for package 'Durus-3.1.tar.gz' - -[cheesecake:console] Starting computation of INSTALLABILITY index (max. points = 140) -index_pypi_download ..................... 45 (downloaded package Durus-3.1.tar.gz following 1 link from PyPI) -index_unpack ............................ 25 (package untar-ed successfully) -index_unpack_dir ........................ 15 (unpack directory is Durus-3.1 as expected) -index_install ........................... 50 (package installed in /tmp/cheesecake_sandbox/tmp_install_Durus-3.1) ---------------------------------------------- -INSTALLABILITY INDEX (ABSOLUTE) ......... 135 -INSTALLABILITY INDEX (RELATIVE) ......... 96 (135 out of a maximum of 140 points is 96%) - -[cheesecake:console] Starting computation of DOCUMENTATION index (max. points = 415) -index_file_announce ..................... 0 (file not found) -index_file_changelog .................... 0 (file not found) -index_file_ez_setup.py .................. 0 (file not found) -index_file_faq .......................... 10 (file found) -index_file_install ...................... 10 (file found) -index_file_license ...................... 15 (critical file found) -index_file_news ......................... 0 (file not found) -index_file_readme ....................... 15 (critical file found) -index_file_setup.py ..................... 15 (critical file found) -index_file_thanks ....................... 0 (file not found) -index_file_todo ......................... 0 (file not found) -index_dir_demo .......................... 0 (directory not found) -index_dir_doc ........................... 25 (critical directory found) -index_dir_example ....................... 0 (directory not found) -index_dir_test .......................... 25 (critical directory found) -index_docstrings ........................ 42 (found 104/249=41.77% modules/classes/methods/functions with docstrings) ---------------------------------------------- -DOCUMENTATION INDEX (ABSOLUTE) .......... 157 -DOCUMENTATION INDEX (RELATIVE) .......... 37 (157 out of a maximum of 415 points is 37%) - -[cheesecake:console] Starting computation of CODE KWALITEE index (max. points = 100) -index_pylint ............................ 64 (average score is 6.30 out of 10) ---------------------------------------------- -CODE KWALITEE INDEX (ABSOLUTE) .......... 64 -CODE KWALITEE INDEX (RELATIVE) .......... 64 (64 out of a maximum of 100 points is 64%) - -============================================= -OVERALL CHEESECAKE INDEX (ABSOLUTE) ..... 356 -OVERALL CHEESECAKE INDEX (RELATIVE) ..... 64 (356 out of a maximum of 555 points is 64%) --
Cheesecake is under very active development. The immediate goal is to add the unit test -index measurement, followed by other metrics inspired from the -kwalitee indicators. -Please edit the IndexMeasurementIdeas -Wiki page to add things that you would like to see covered -by the Cheesecake metrics.
-