统计 Github 2021 贡献过的开源项目

统计一下 2021 贡献过的开源项目

Intro

新的一年的开始了,有很多总结和回顾还没有做,今天就盘点一下贡献过的开源项目吧~

起初想着手动地通过 Github Dashboard 来统计

b010c2a84e205009dfe30347b434bd70.png

但是感觉有些麻烦,还得一个个地复制标题链接等,好麻烦,于是就想是不是可以写一个简单的小程序通过 Github 的 API 来统计呢,答案是肯定的,可以参考后面的示例代码

Contributions

过去一年的贡献如下,一共提了 81 个 PR 其中有 43 个是自己维护的开源项目的 PR,已从下面的 PR 中移除

统计结果来自 Github 的 API:https://api.github.com/search/issues?page=1&q=author%3Aweihanli+type%3Apr+is:merged+merged:%3E=2021-01-01

  • davidfowl/DotNetCodingPatterns

    • enhancement on Caching singletons sample code https://github.com/davidfowl/DotNetCodingPatterns/pull/11

  • domaindrivendev/Swashbuckle.AspNetCore

    • Enhancement for SwaggerUIMiddleware https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2214

  • dotnet/aspnetcore

    • Fix http logging log typo https://github.com/dotnet/aspnetcore/pull/36871

    • Update 10_bug_report.md https://github.com/dotnet/aspnetcore/pull/36922

  • dotnet/core

    • Update for .NET 6 release https://github.com/dotnet/core/pull/6892

  • dotnet/dotnet-monitor

    • update windows build script https://github.com/dotnet/dotnet-monitor/pull/40

  • dotnet/format

    • Remove unnecessary config https://github.com/dotnet/format/pull/1486

  • dotnet/issue-labeler

    • use generic host https://github.com/dotnet/issue-labeler/pull/15

  • dotnet/maui

    • Update MauiAppBuilder.cs https://github.com/dotnet/maui/pull/3445

  • dotnet/runtime

    • Update ConfigurationManager https://github.com/dotnet/runtime/pull/59600

  • dotnet/sdk

    • Add self contained short flag https://github.com/dotnet/sdk/pull/19681

    • Use null-coalescing assignment operator https://github.com/dotnet/sdk/pull/20678

  • dotnetcore/CAP

    • make OperateResult._errors readonly https://github.com/dotnetcore/CAP/pull/869

    • fix typo in comment https://github.com/dotnetcore/CAP/pull/870

    • Use KeyExistsAsync for exists check https://github.com/dotnetcore/CAP/pull/1004

  • dotnetcore/FastGithub

    • Fix build for .NET 6 with the latest SDK and some warning and typo https://github.com/dotnetcore/FastGithub/pull/26

    • Remove unnecessary config https://github.com/dotnetcore/FastGithub/pull/84

  • EdiWang/Moonglade

    • Common.props enhancement https://github.com/EdiWang/Moonglade/pull/566

  • IEvangelist/blazorators

    • Github CodeSpaces support https://github.com/IEvangelist/blazorators/pull/3

    • Refine the generator https://github.com/IEvangelist/blazorators/pull/6

    • Apply file-scoped namespace style and skip none partial classes https://github.com/IEvangelist/blazorators/pull/7

  • IEvangelist/pwned-client

    • Remove IsExternalInit https://github.com/IEvangelist/pwned-client/pull/6

  • kubernetes-client/csharp

    • Update TokenFileAuth https://github.com/kubernetes-client/csharp/pull/631

    • Expose kube config default location https://github.com/kubernetes-client/csharp/pull/635

    • Makes realFileSystem readonly https://github.com/kubernetes-client/csharp/pull/655

    • AddRange extension enhancement https://github.com/kubernetes-client/csharp/pull/771

  • LemonSharp/Admin.FrontEnd

    • Add Github CI support https://github.com/LemonSharp/Admin.FrontEnd/pull/2

    • Add dotnet-monitor https://github.com/LemonSharp/Admin.FrontEnd/pull/4

  • LemonSharp/User

    • Publish event when user register success https://github.com/LemonSharp/User/pull/1

  • LemonSharp/VaccinationCore

    • Implement AppointmentQueries/VaccinationQueries https://github.com/LemonSharp/VaccinationCore/pull/1

  • LemonSharp/VaccinationSite

    • Feat/add appointment api https://github.com/LemonSharp/VaccinationSite/pull/1

    • Add GetSiteInfoById API https://github.com/LemonSharp/VaccinationSite/pull/2

    • Add dotnet-monitor sidecar https://github.com/LemonSharp/VaccinationSite/pull/3

    • Enable swagger on production https://github.com/LemonSharp/VaccinationSite/pull/4

  • microsoft/reverse-proxy

    • Fix typo https://github.com/microsoft/reverse-proxy/pull/1245

    • Use WaitAsync https://github.com/microsoft/reverse-proxy/pull/1306

  • night-moon-studio/NatashaPad

    • Update to .NET 6 https://github.com/night-moon-studio/NatashaPad/pull/10

  • pengweiqhca/Xunit.DependencyInjection

    • Add Github Actions CI https://github.com/pengweiqhca/Xunit.DependencyInjection/pull/55

    • Update template https://github.com/pengweiqhca/Xunit.DependencyInjection/pull/59

  • StackExchange/StackExchange.Redis

    • Add support for GETDEL command https://github.com/StackExchange/StackExchange.Redis/pull/1840

    • Makes StreamEntry constructor public https://github.com/StackExchange/StackExchange.Redis/pull/1923

  • Tyrrrz/CliWrap

    • Remove unused dependencies https://github.com/Tyrrrz/CliWrap/pull/132

  • ua-parser/uap-csharp

    • Update target framework for netstandard2.0 https://github.com/ua-parser/uap-csharp/pull/65

希望接下来的一年能够有更多更高质量的开源贡献~

很多开源项目的贡献很简单并不会很复杂,大家也可以尽可能的贡献一些自己的力量来让 .NET 社区的开源项目越来越好~

Sample

上面的统计结果来自上面提到的 API

- author 用户名
- type=pr 返回 PR
- is:merged 过滤合并的 PR
- merged: 根据 PR 合并时间过滤
- page: 当前页码,默认是 1, 用来分页

0f6910014c31d491b28cebe9a0db71b3.png

Github API result

上面的返回结果中的 html_url 对应的就是对应 PR 的 HTML 页面地址, title/body 对应 PR 的标题和描述信息,created_atclosed_at 分别对应 PR 的创建和合并时间

写了一个简单的小程序来统计结果,示例代码如下:

using System.Net.Http.Json;
using System.Text.Json.Nodes;
using WeihanLi.Extensions;const int pageCount = 30;
const string userName = "weihanli";
const string urlFormat =$"search/issues?page={{0}}&q=author%3A{userName}+type%3Apr+is:merged+merged:%3E=2021-01-01";var prList = new List<GithubPRModel>();
var itemsCount = 0;
var pageNum = 1;using var httpClient = new HttpClient()
{BaseAddress = new Uri("https://api.github.com/")
};
// https://docs.github.com/en/rest/overview/resources-in-the-rest-api#user-agent-required
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36");do
{var url = urlFormat.FormatWith(pageNum.ToString());using var response = await httpClient.GetAsync(url);var responseText = await response.Content.ReadAsStringAsync();var responseObj = JsonNode.Parse(responseText);ArgumentNullException.ThrowIfNull(responseObj);var items = responseObj["items"]?.AsArray();ArgumentNullException.ThrowIfNull(items);itemsCount = items.Count;foreach (var item in items){prList.Add(new GithubPRModel(){Title = item["title"]?.GetValue<string>(),Body = item["body"]?.GetValue<string>(),Url = item["html_url"]?.GetValue<string>(),CreatedAt = item["created_at"]?.GetValue<DateTimeOffset>(),ClosedAt = item["closed_at"]?.GetValue<DateTimeOffset>()});}pageNum++;
} while (itemsCount == pageCount);var totalCount = prList.Count;
prList.RemoveAll(x => userName.Equals(x.UserName, StringComparison.OrdinalIgnoreCase));
var excludedCount = prList.Count;
Console.WriteLine($"Total:{totalCount}, excludedCount: {excludedCount}");Console.WriteLine("Completed");
Console.ReadLine();internal class GithubPRModel
{private string _url;public string Title { get; set; }public string Body { get; set; }public DateTimeOffset? CreatedAt { get; set; }public DateTimeOffset? ClosedAt { get; set; }public string Url{get => _url;set{_url = value;if (!string.IsNullOrEmpty(_url)){var index = _url.IndexOf("/pull/", StringComparison.OrdinalIgnoreCase);RepoUrl = _url[..index];RepoName = RepoUrl.Replace("https://github.com/", "");UserName = RepoName[..RepoName.IndexOf('/')];}}}public string UserName { get; private set; }public string RepoName { get; private set; }public string RepoUrl { get; private set; }
}

上面的结果就是用这个示例中的代码生成的,为了方便也可以改造一下上面的代码直接生成 Markdown 内容,上面的贡献内容就是下面这段生成 markdown 的代码生成出来的,你也可以根据自己需要进行一些定制

var mdContent = prList.GroupBy(g => new
{g.RepoName,g.RepoUrl
})
.OrderBy(g => g.Key.RepoName)
.Select(g => $@"- [{g.Key.RepoName}]({g.Key.RepoUrl})
{g.OrderBy(x => x.CreatedAt).Select(x => $"  - {x.Title} <{x.Url}>").StringJoin(Environment.NewLine)}
")
.StringJoin(Environment.NewLine);await File.WriteAllTextAsync("result.md", mdContent);

StringJoin 是一个基于 string.Join 的扩展方法

More

上面的示例中有一个需要注意的地方就是 UserAgent 请求头的配置,如果不配置,Github 就会返回一个 403 

40b4198db7a8317ffade435f45e32d81.png

可以参考 Github 文档 https://docs.github.com/en/rest/overview/resources-in-the-rest-api#user-agent-required

另外还有一些可以优化的地方,比如说可以使用 System.Text.JsonGetFromJsonAsync 方法来简化 http response JSON 反序列化

另外可以考虑使用 Github 提供的客户端,因为我的需求比较简单所以直接调了这个 API,也可以考虑使用 Github 客户端 octokit

References

  • https://api.github.com/search/issues?page=1&q=state%3Aclosed+author%3Aweihanli+type%3Apr+is:merged+merged:%3E=2021-01-01

  • https://docs.github.com/en/rest/overview/resources-in-the-rest-api#user-agent-required

  • https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests#search-based-on-the-state-of-an-issue-or-pull-request

  • https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests#search-by-author

  • https://stackoverflow.com/questions/17412809/how-to-get-my-pull-requests-from-github-api

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/GithubAPISample/Program.cs

  • https://github.com/octokit/octokit.net

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntentService使用

说实话&#xff0c;对于这个类在我实际工作中并没有用到过&#xff0c;通常也只是用了它的父类Service&#xff0c;通过官方文档可以看出类的层次结构: 而在今年的一次面试当中&#xff0c;有个面试官提起了它&#xff0c;所以虽说目前还没有真实在项目中用它&#xff0c;但是有…

如何使用 Barracuda 防火墙设置/保护 Azure 应用程序

&#xfeff;&#xfeff;如果某企业在 Windows Azure 上托管某个应用程序&#xff0c;该应用程序会在某个特定时间暴露到 Internet&#xff0c;以用于商业用途。公共 Internet 带来客户的同时也带来了攻击者。 Tim Omta 发表的新博客文章中介绍了如何使用 PaaS 应用程序之前的…

Git 简单命令行指令

为什么80%的码农都做不了架构师&#xff1f;>>> 这些git命令来自gitlab的简单提示&#xff0c;挺人性化&#xff0c;记录下。 Git 全局设置 git config --global user.name "yourname" git config --global user.email "yournamemail.com" 创…

第4章 字符串和格式化输入/输出

学习笔记——《C Primer Plus》 第4章 字符串和格式化输入/输出4.1 前导程序4.2 字符串简介4.2.1 char 类型数组和 null 字符4.2.2 使用字符串4.2.3 strlen() 函数4.3 常量和 C 预处理器4.3.1 符号常量1. 使用**符号常量**的好处:2. 创建符号常量4.3.2 const 限定符4.3.3 转换说…

ios之第一个程序Hello word, I am chenyu !

1、下载Xcode 个人建议网上下载Xcode&#xff0c;快些&#xff0c;特么再应用商店下载像日了狗一样&#xff0c;还要填写资料&#xff0c; 最后资料没有写好&#xff0c;无效字符。2、新建项目 下载好了Xcode&#xff0c;一步一步往下点就行&#xff0c;然后create 项目然后找m…

小博老师解析Java核心技术 ——JSwing绘图技术

2019独角兽企业重金招聘Python工程师标准>>> [引言] 我们在学习Java编程的时候&#xff0c;如果需要开发客户端窗体类型的程序&#xff0c;可以使用JDK中的awt和swing库。本文开始小博老师就继续为大家演示Java窗体编程中的绘图技术&#xff0c;今天主要讲解绘图技术…

.NET6之MiniAPI(十三):健康检查

程序员开发程序&#xff0c;是“生”的过程&#xff0c;运维人员负责日常运维&#xff0c;是“养”的过程&#xff0c;在养的过程&#xff0c;运维人员希望在第一时间了解程序的状况&#xff0c;健康检查&#xff0c;是最基础的手段。var builder WebApplication.CreateBuilde…

linux之用 grep -r 关键字 快速搜索在目录下面的含有关键字的文件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 1、快速搜索在目录下面的含有关键字的文件 我们采用下面命令cd directoriesgrep -r 关键字2、搜索结果

python 抓包基于pypcap

2019独角兽企业重金招聘Python工程师标准>>> 1、查询python和python-dev是否安装 dpkg-query -l python dpkg-query -l python-dev #没安装就先安装 sudo apt-get install python python-dev 2、安装flex和bison sudo apt-get install flex bison3、下载libpcap并安…

推荐一个基于Dapr的 Red Dog 的完整微服务应用程序

微服务尽管构建起来非常困难&#xff0c;但它们已成为一种越来越流行的架构模式。随着开发人员开始将他们现有的单体代码库迁移到微服务系统&#xff0c;他们花费大量时间来处理分布式应用程序带来的固有挑战&#xff0c;例如状态管理和服务调用。通过引入Dapr 通过以 http/gRP…

基于事件的 NIO 多线程服务器

2019独角兽企业重金招聘Python工程师标准>>> JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题&#xff0c;在 NIO 中使用多线程&#xff0c;主要目的已不是为了应对每个客户端请求而分配独立的服务线程&#xff0c;而是通过多线程充分使用用多个 CPU 的处…

第6章 C控制语句:循环

学习笔记——《C Prime Plus》 第6章 C控制语句&#xff1a;循环6.1 再探 while 循环6.1.1 程序注释6.1.2 C风格读取循环6.2 while 语句6.2.1 终止 while 循环6.2.2 何时终止循环6.2.3 while&#xff1a;入口循环条件6.2.4 语法要点6.3 _Bool 类型6.4 不确定循环和计数循环6.5 …

openresty 前端开发进阶一之http后端

2019独角兽企业重金招聘Python工程师标准>>> 做前端开发&#xff0c;大多数情况下&#xff0c;都需要跟后端打交道&#xff0c;而最常见的方式则是通过http请求&#xff0c;进行通信。 在openresty中&#xff0c;通过http跟后端整合通信的方式又很多种&#xff0c;各…

第7章 C控制语句:分支和跳转

学习笔记——《C Prime Plus》 第7章 C控制语句&#xff1a;分支和跳转7.1 if 语句7.2 if else 语句7.2.1 介绍 getchar() 和 putchar()7.4 一个统计单词的程序7.1 if 语句 下程序读取一列数据&#xff0c;每个数据都表示每日的最低温度&#xff08;℃&#xff09;&#xff0c…

【Blog.Core开源】网关统一集成下游服务文档

一般看到公众号更新&#xff0c;就是大概率要开始上班了&#x1f602;上回书咱们说到了《【Blog.Core开源】快速预览Admin界面效果》&#xff0c;这样我们就可以专注于后端开发&#xff0c;而且也能快速的实现效果的预览。那今天我们继续来往下走&#xff0c;说一说网关相关的内…

android4.3 截屏功能的尝试与失败分析

1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数&#xff08;同时按下电源键与音量减&#xff0c;详情http://blog.csdn.net/buptgshengod/article/details/19911909&#xff09;&#xff0c;经过一周的研究还是没有在手机上实现系统截屏功能&#xff0c;总结下尝试的…

numpy方法总结

2019独角兽企业重金招聘Python工程师标准>>> 一、数组方法 创建数组&#xff1a;arange()创建一维数组&#xff1b;array()创建一维或多维数组&#xff0c;其参数是类似于数组的对象&#xff0c;如列表等 反过来转换则可以使用numpy.ndarray.tolist()函数&#xff0…

阿里云离线数据仓库

阿里云离线数据仓库第1章 数据仓库概念第2章 项目需求及架构设计2.1 项目需求分析2.2 阿里云技术框架2.2.1 技术选型2.2.2 系统数据流程设计第3章 数据生成模块3.1 埋点数据基本格式3.2 事件日志数据3.2.1 商品列表页&#xff08;loading&#xff09;3.2.2 商品曝光&#xff08…

技术分享 | 混合云模式下SaaS端前端最佳实践

导读&#xff1a;集成开放平台采用的是混合云部署架构&#xff0c;包含两个大的组件&#xff0c;管理控制台和引擎。管理控制台是SaaS的&#xff0c;部署在公有云&#xff0c;按租户隔离。引擎部署在客户私有云。一套SaaS版的管理控制台如何适配不同客户的引擎&#xff0c;本文…

记一则Hadoop DataNode OOM故障,以及解决方案

一、故障症状最近公司一个集群跑大任务时&#xff0c;datanode日志报DataXceiveServer: Exiting due to:java.lang.OutOfMemoryError: unable to create new native thread异常&#xff0c;然后计算节点上的DataNode直接挂掉。DataNode异常日志截图如下&#xff1a;2014-03-06 …