# Some homepage. Eg "http://example.com/~jdoe"
var page: nullable String is writable
+ # Gravatar id
+ var gravatar: nullable String is lazy do
+ var email = self.email
+ if email == null then return null
+ return email.md5.to_lower
+ end
+
# Return a full-featured link to a person
fun to_html: String
do
if page != null then
res += "<a href=\"{page.html_escape}\">"
end
- var email = self.email
- if email != null then
- var md5 = email.md5.to_lower
- res += "<img src=\"https://secure.gravatar.com/avatar/{md5}?size=20&default=retro\"> "
+ var gravatar = self.gravatar
+ if gravatar != null then
+ res += "<img src=\"https://secure.gravatar.com/avatar/{gravatar}?size=20&default=retro\"> "
end
res += e
if page != null then res += "</a>"
# used to access the files and count source lines of code
var modelbuilder: ModelBuilder
+ # List of all packages by their names
+ var mpackages = new HashMap[String, MPackage]
+
# Packages by tag
var tag2proj = new MultiHashMap[String, MPackage]
# 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
# Compute information for a package
fun package_page(mpackage: MPackage)
do
+ mpackages[mpackage.full_name] = mpackage
+
var score = score[mpackage].to_f
var mdoc = mpackage.mdoc_or_fallback
score += 100.0
score += mdoc.content.length.score
end
-
var metadata = mpackage.metadata
var tryit = metadata.tryit
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