# The score is loosely computed using other metrics
var score = new Counter[MPackage]
- # List of known people
+ # List of known people by their git string
var persons = new HashMap[String, Person]
+ # Map person short names to person objects
+ var name2person = new HashMap[String, Person]
+
+ # Package statistics cache
+ var mpackages_stats = new HashMap[MPackage, MPackageStats]
+
# Scan, register and add a contributor to a package
fun register_contrib(person: String, mpackage: MPackage): Person
do
projs.add mpackage
mpackage.metadata.contributors.add p
end
+ name2person[p.name] = p
return p
end
fun package_page(mpackage: MPackage)
do
mpackages[mpackage.full_name] = mpackage
+
var score = score[mpackage].to_f
var mdoc = mpackage.mdoc_or_fallback
for c in contributors.sort.reverse_iterator do
register_contrib(c, mpackage)
end
+ end
+
+ # Compose package stats
+ fun mpackage_stats(mpackage: MPackage): MPackageStats do
+ var stats = new MPackageStats
+ stats.mmodules = mmodules[mpackage]
+ stats.mclasses = mclasses[mpackage]
+ stats.mmethods = mmethods[mpackage]
+ stats.loc = loc[mpackage]
+ stats.errors = errors[mpackage]
+ stats.warnings = warnings[mpackage]
+ stats.warnings_per_kloc = warnings_per_kloc[mpackage]
+ stats.documentation_score = documentation_score[mpackage]
+ stats.commits = commits[mpackage]
+ stats.score = score[mpackage]
+
+ mpackages_stats[mpackage] = stats
+ return stats
+ end
+
+ # Compose catalog stats
+ var catalog_stats: CatalogStats is lazy do
+ var stats = new CatalogStats
+ stats.packages = mpackages.length
+ stats.maintainers = maint2proj.length
+ stats.contributors = contrib2proj.length
+ stats.tags = tag2proj.length
+ stats.modules = mmodules.sum
+ stats.classes = mclasses.sum
+ stats.methods = mmethods.sum
+ stats.loc = loc.sum
+ return stats
+ end
+end
+
+# Catalog statistics
+class CatalogStats
+
+ # Number of packages
+ var packages = 0
+
+ # Number of maintainers
+ var maintainers = 0
+
+ # Number of contributors
+ var contributors = 0
+
+ # Number of tags
+ var tags = 0
+
+ # Number of modules
+ var modules = 0
+
+ # Number of classes
+ var classes = 0
+
+ # Number of methods
+ var methods = 0
+
+ # Number of line of codes
+ var loc = 0
+end
+
+# MPackage statistics for the catalog
+class MPackageStats
+
+ # Number of modules
+ var mmodules = 0
+
+ # Number of classes
+ var mclasses = 0
+
+ # Number of methods
+ var mmethods = 0
+ # Number of lines of code
+ var loc = 0
+
+ # Number of errors
+ var errors = 0
+
+ # Number of warnings and advices
+ var warnings = 0
+
+ # Number of warnings per 1000 lines of code (w/kloc)
+ var warnings_per_kloc = 0
+
+ # Documentation score (between 0 and 100)
+ var documentation_score = 0
+
+ # Number of commits by package
+ var commits = 0
+
+ # Score by package
+ #
+ # The score is loosely computed using other metrics
+ var score = 0
+end
+
+# Sort the mpackages by their score
+class CatalogScoreSorter
+ super Comparator
+
+ # Catalog used to access scores
+ var catalog: Catalog
+
+ redef type COMPARED: MPackage
+
+ redef fun compare(a, b) do
+ if not catalog.mpackages_stats.has_key(a) then return 1
+ if not catalog.mpackages_stats.has_key(b) then return -1
+ var astats = catalog.mpackages_stats[a]
+ var bstats = catalog.mpackages_stats[b]
+ return bstats.score <=> astats.score
end
end
+# Sort tabs alphabetically
+class CatalogTagsSorter
+ super Comparator
+
+ redef type COMPARED: String
+
+ redef fun compare(a, b) do return a <=> b
+end
+
# Execute a git command and return the result
fun git_run(command: String...): String
do