Quality Indexes

将 Podspec 提交到 Trunk 后,文档服务 CocoaDocs 将为 Pod 创建一组度量标准。 您可以在 metrics.cocoapods.org/api/v1/pods/[Pod] 上查看任何 Pod 的这些指标。 这些指标用于生成各种质量修饰符,最终形成一个称为质量指标的单一数字。

本文档是 CocoaDocs-API 中的一种 literate programming。 因此,它包含为了生成单个分数而运行的实际 Ruby 代码。 另外, Swift 各个方面看起来像都Ruby-- 所以你可以读懂 ;)。

质量指数的目标是突出正面指标,淡化负面因素。 非常有可能有一个没有实际应用修饰符的Pod。 这意味着指数停留在默认的50位。这是一个非常合理的分数。 ( ??? )

我们对修饰符的一个很好的例子就是在Swift中想到一个带有大部分代码的Pod。 它得到了提升,而Objective-C不会被修改。 这不是关于减少Objective-C的要点,而是强调目前Swift库代表了具有前瞻性的最佳实践。

最后,在我们开始之前。 这些指标并非一成不变,它们自推出以来一直在发展,并将在未来继续这样做。
反馈可以提升价值,所以这些可以在 issues 讨论。

人气指标

这是一个非常安全的赌注,一个非常受欢迎的 Library 将得到很好的照顾,并维持 Library。 我们根据单个指标的价值多少来衡量不同指标,而不是仅仅使用星标作为核心指标。

 Modifier.new("Very Popular", "The popularity of a project is a useful way of discovering if it is useful, and well maintained.", 30, { |...|
   value = stats[:contributors].to_i * 90 + stats[:subscribers].to_i * 20 +  stats[:forks].to_i * 10 + stats[:stargazers].to_i
   value > 9000
 }),

然而,并不是每个想法都需要足够大才能保证如此高的指标。 大量的参与其中是非常有用的。

 Modifier.new("Popular", "A popular library means there can be a community to help improve and maintain a project.", 10, { |...|
   value = stats[:contributors].to_i * 90 + stats[:subscribers].to_i * 20 +  stats[:forks].to_i * 10 + stats[:stargazers].to_i
   value > 1500
 }),

Swift软件包管理器 (Swift package manager)

我们希望鼓励对Apple的Swift Package Manager的支持,这对社区是统一的。 欲了解更多信息,请参阅我们的FAQ 目前,它正在检查Package.swift的存在,一旦SPM开发速度放慢,我们可能会转向测试它是否支持最新版本。

自述文件评分 (README Scoring)

README分数基于一种算法,该算法查看捆绑README的种类。 您可以针对clayallsopp.github.io/readme-score上的任何URL运行算法。 自述文件是 Library的头版,它可以提供API概览或显示图书馆可以做什么。

听起来很奇怪,如果你提供了一个二进制CocoaPod,值得将你的README.md嵌入到zip中。 这意味着CocoaPods可以使用它来生成Pod页面。 我们为您的项目根目录中的两个目录查找README {,。md,.markdown}

注意:由于我们想要考虑Podspec的documentation_url,所以这些修改器仍然存在一些问题。

 Modifier.new("Great README", "A well written README gives a lot of context for the library, providing enough information to get started. ", 5, { |...|
   cd_stats[:readme_complexity].to_i > 75
 }),

 Modifier.new("Minimal README", "The README is an overview for a library's API. Providing a minimal README means that it can be hard to understand what the library does.", -5, { |...|
   cd_stats[:readme_complexity].to_i < 40
 }),

 Modifier.new("Empty README", "The README is the front page of a library. To have this applied you may have a very empty README.", -8, { |...|
   cd_stats[:readme_complexity].to_i < 25 && spec.documentation_url == nil
 }),

CHANGELOG

拥有CHANGELOG意味着人们更容易比较旧版本,作为质量指标,这通常表明维护人员需要谨慎地展示更成熟的库以显示更改。 我们为您的项目根目录中的两个目录寻找CHANGELOG {,。md,.markdown}。

 Modifier.new("Has a CHANGELOG", "CHANGELOGs make it easy to see the differences between versions of your library.", 8, { |...|
   cd_stats[:rendered_changelog_url] != nil
 }),

Language Choices

我们想积极地区分在Swift中编写 Library 的人员。

 Modifier.new("Built in Swift", "Swift is where things are heading.", 5, { |...|
   cd_stats[:dominant_language] == "Swift"
 }),

Objective-C ++库很难与Swift集成,并且可能需要与大多数项目所用的编程不同的范例。

 Modifier.new("Built in Objective-C++", "Usage of Objective-C++ makes it difficult for others to contribute.", -5, { |...|
   cd_stats[:dominant_language] == "Objective-C++"
 }),

Licensing Issues

GPL是用于您的代码的合法许可。 但它与App Store上的应用程序不兼容,大多数人最终都会这样做。 为了防止这种情况,我们从GPL库中减去了一些分数。

 Modifier.new("Uses GPL", "There are legal issues around distributing GPL'd code in App Store environments.", -20, { |...|
   cd_stats[:license_short_name] =~ /GPL/i || false
 }),

也有相当多的 library 使用WTFPL,这是一个旨在不成为许可证的许可证。 它被OSI(一个开放源代码许可机构)拒绝,因为它与不包括许可证不同。 如果您想这样做,请使用公共领域的许可证。

Modifier.new("Uses WTFPL", "WTFPL was denied as an OSI approved license. Thus it is not classed as code license.", -5, { |...|
   cd_stats[:license_short_name] == "WTFPL"
 }),

Code Calls

测试库很重要。 当你有一个人们依赖的libiary时,能够验证你所期望的工作是否会提高质量。

 Modifier.new("Has Tests", "Testing a library shows that the developers care about long term quality on a project as internalized logic is made explicit via testing.", 4, { |...|
   cd_stats[:total_test_expectations].to_i > 10
 }),

 Modifier.new("Test Expectations / Line of Code", "Having more code covered by tests is great.", 10, { |...|
   lines = cd_stats[:total_lines_of_code].to_f
   expectations = cd_stats[:total_test_expectations].to_f
   if lines != 0
     0.045 < (expectations / lines)
   else
     false
   end
 }),

CocoaPods可以很容易地创建一个包含多个文件的库,我们希望鼓励采用更小的可组合库。

 Modifier.new("Lines of Code / File", "Smaller, more composeable classes tend to be easier to understand.", -8, { |...|
   files = cd_stats[:total_files].to_i
   if files != 0
     (cd_stats[:total_lines_of_code].to_f / cd_stats[:total_files].to_f) > 250
   else
     false
   end
 }),

所有权(Ownership)

CocoaPods Specs Repo 不是策划的,对于较大的SDK,人们将创建非官方的Pods。 我们需要一种方式来说明这个Pod是为Library的作者而来的,所以我们已经验证了帐户。 这些对于公司很有用; 谷歌,Facebook,亚马逊和Dropbox。 我们非常谨慎地应用这一点,并且一直在向公司单独提供帮助。

 Modifier.new("Verified Owner", "When a pod comes from a large company with an official account.", 20, { |...|
   owners.find { |owner| owner.owner.is_verified } != nil
 }),

Maintainance

我们希望鼓励人们用他们的库来发布语义版本。 由于在那里没有社会契约,很难知道对于尚未达到1.0.0的图书馆应该期待什么。 这是因为在v1.0.0之前,库作者没有向后兼容性的承诺。

 Modifier.new("Post-1.0.0", "Has a Semantic Version that is above 1.0.0", 5, { |...|
   Pod::Version.new("1.0.0") <= Pod::Version.new(spec.version)
 }),

当需要废弃图书馆时,我们应该在搜索结果中反映这一点。

 Modifier.new("Is Deprecated", "Latest Podspec is declared to be deprecated", -20, { |...|
   spec.deprecated || spec.deprecated_in_favor_of || false
 }),

Misc - GitHub specific

这是一个在计算项目是否被放弃的实验。 问题可以用作TODO列表,但是让50+未开启会感觉有点不合适。 这个项目更有可能落到实处。

Modifier.new("Lots of open issues", "A project with a lot of open issues is generally abandoned. If it is a popular library, then it is usually offset by the popularity modifiers.", -8, { |...|
   stats[:open_issues].to_i > 50
 })
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容