github_contributions 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c0d33817df8b9fe32cc09fc6ec8d9a390d976ddaceb4a6aaca9c2697f1a9ba59
4
+ data.tar.gz: a4f89cd9967862b119a203d2e92e7c779a99d4eee96b82de6854d0b706b41359
5
+ SHA512:
6
+ metadata.gz: 700395833c364f7c5e721f86793f7c9db4e64d31f41e9b374435a25a22686b005150dfb776161a958946db60aaeb1a84b7e0042ad9849cc243223424b9c84311
7
+ data.tar.gz: 0b615dfae4dbe0868e18f21c3aabd694e8ce52a51e6e1e56750c895099f9afae1ffee994ad7f119053c2f07206baa72b3cfe0ae7e618bfb453db7a47626a159f
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Kevin Jalbert
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # GitHub Contributions
2
+
3
+ > Ever wanted to know where you (or someone else) are making contributions on GitHub?
4
+
5
+ Your GitHub profile shows you the [Contributions Calendar](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-graphs-on-your-profile/viewing-contributions-on-your-profile#contributions-calendar) and [Contribution activity](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-graphs-on-your-profile/viewing-contributions-on-your-profile#contribution-activity), which both provide great visualizations and details covering contributions of the following:
6
+
7
+ - creating/closing issues
8
+ - creating/closing/merging/reviewing pull requests
9
+ - creating repositories
10
+ - authoring commits on the main branch of repositories
11
+ - starting/answering discussions
12
+
13
+ I personally wanted to track comments on issues and pull requests as I felt they were a good indication of contributions. It sometimes isn't uncommon for a lot of discussions to happen on issues or even a pull request.
14
+
15
+ I am a fan of [Obsidian](https://obsidian.md/) right now to track my day at work. Recording these contributions in GitHub makes it simple to recall what I did in previous days/weeks. This is even more important if you have a [_BragDoc_](https://jvns.ca/blog/brag-documents/). As Obsidian uses Markdown, that is the primary format that this tool is built for.
16
+
17
+ ## Install
18
+
19
+ ```bash
20
+ gem install github_contributions
21
+ ```
22
+
23
+ You need a GitHub Personal Access Token in your ENVs as `GITHUB_ACCESS_TOKEN` for this gem to work.
24
+
25
+ ## Usage
26
+
27
+ ```bash
28
+ # Show me contributions for 'kevinjalbert' for today
29
+ github_contributions -a "kevinjalbert"
30
+
31
+ # Show me contributions for 'kevinjalbert' for today only in the 'shopify' org
32
+ github_contributions -a "kevinjalbert" -o "shopify"
33
+
34
+ # Show me contributions for 'kevinjalbert' in the last week
35
+ github_contributions -a "kevinjalbert" -s "last week"
36
+
37
+ # Show me contributions for 'kevinjalbert' for the week before last
38
+ github_contributions -a "kevinjalbert" -s "two weeks ago" -e "one week ago"
39
+
40
+ # Show me contributions for 'kevinjalbert' for only yesterday
41
+ github_contributions -a "kevinjalbert" -s "yesterday" -e "yesterday"
42
+
43
+ # Help
44
+ github_contributions -h
45
+ ```
46
+
47
+ Contributions are grouped by their pull request or issue in order of creation time. This ends up producing a rather detailed list of where contributions were made in the specified time frame. Links are present to easily allow you to jump directly to the contribution. Everything is displayed in Markdown, ready to be copy/pasted where desired. The following is an example of what the output looks like:
48
+
49
+ - [Support function in `message` expectation in `t.throws` / `t.throwsAsync`](https://github.com/avajs/ava/issues/2978) by [sindresorhus](https://github.com/sindresorhus)
50
+ - [Issue Opened at 2022-02-26 08:42:19 UTC](https://github.com/avajs/ava/issues/2978)
51
+ - [IssueComment Created at 2022-02-26 08:43:12 UTC](https://github.com/avajs/ava/issues/2978#issuecomment-1051842838)
52
+ - [Use `for..of` loop](https://github.com/sindresorhus/string-width/pull/40) by [fisker](https://github.com/fisker)
53
+ - [PullRequestReviewComment Created at 2022-02-28 08:18:52 UTC](https://github.com/sindresorhus/string-width/pull/40#discussion_r815662489)
54
+ - [PullRequestReview Created at 2022-02-28 08:18:52 UTC](https://github.com/sindresorhus/string-width/pull/40#pullrequestreview-894766255)
55
+ - [PullRequest Closed at 2022-02-28 08:20:12 UTC](https://github.com/sindresorhus/string-width/pull/40)
56
+ - [IssueComment Created at 2022-02-28 08:20:16 UTC](https://github.com/sindresorhus/string-width/pull/40#issuecomment-1054001902)
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ desc <<~TEXT
4
+ Task to run the gem during developing.
5
+
6
+ This doesn't require the gem to be installed.
7
+
8
+ rake dev [options]
9
+ rake dev -a "kevinjalbert" -s "last week"
10
+ TEXT
11
+ task :dev do
12
+ require "pry"
13
+ require "./lib/github_contributions"
14
+
15
+ GithubContributions.run(ARGV[1..-1])
16
+
17
+ # Needed, or rake will try to continue and 'parse' tasks from the args
18
+ exit
19
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "github_contributions"
4
+
5
+ GithubContributions.run(ARGV)
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "github_contributions/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "github_contributions"
8
+ spec.version = GithubContributions::VERSION
9
+ spec.authors = ["Kevin Jalbert"]
10
+ spec.email = ["kevin.j.jalbert@gmail.com"]
11
+ spec.summary = "Gem that provides can fetch your GitHub contributions and output them"
12
+ spec.description = "Gem that provides can fetch your GitHub contributions and output them"
13
+ spec.homepage = "https://github.com/kevinjalbert/github_contributions"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = Dir["**/*"]
17
+ spec.test_files = Dir["{test,spec,features}/**/*"]
18
+ spec.executables = Dir["bin/*"].map { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "bundler", ">= 2.3"
22
+ spec.add_dependency "chronic", ">= 0.10"
23
+ spec.add_dependency "octokit", ">= 4.22"
24
+ spec.add_dependency "hashie", ">= 5.0"
25
+ spec.add_dependency "activesupport", ">= 7.0"
26
+
27
+ spec.add_development_dependency "rake", ">= 13.0"
28
+
29
+ spec.required_ruby_version = ">= 2.7"
30
+ end
@@ -0,0 +1,24 @@
1
+ module GithubContributions
2
+ module ContributionGrouper
3
+ class << self
4
+ # @param events [Event]
5
+ # @return Hash<GithubObject, [Event]>
6
+ def by_issue_or_pull_request(events)
7
+ grouped_events = {}
8
+
9
+ events.each do |event|
10
+ if event.respond_to?(:pull_request)
11
+ grouped_events[event.pull_request] = [] unless grouped_events.key?(event.pull_request)
12
+ grouped_events[event.pull_request] << event
13
+ end
14
+ if event.respond_to?(:issue)
15
+ grouped_events[event.issue] = [] unless grouped_events.key?(event.issue)
16
+ grouped_events[event.issue] << event
17
+ end
18
+ end
19
+
20
+ grouped_events
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ module GithubContributions
2
+ class Exception < StandardError; end
3
+ class MissingAuthor < GithubContributions::Exception; end
4
+ class MissingGithubAcessToken < GithubContributions::Exception; end
5
+ class TimeParseError < GithubContributions::Exception; end
6
+ class StartDateOutOfRange < GithubContributions::Exception; end
7
+ end
@@ -0,0 +1,32 @@
1
+ module GithubContributions
2
+ class Event
3
+ attr_reader :data
4
+
5
+ def initialize(data)
6
+ @data = data
7
+ end
8
+
9
+ def payload
10
+ end
11
+
12
+ def org
13
+ data.org&.login
14
+ end
15
+
16
+ def actor
17
+ GithubObjects::User.new(data.actor)
18
+ end
19
+
20
+ def created_at
21
+ data.created_at
22
+ end
23
+
24
+ def action
25
+ data.payload.action.titleize
26
+ end
27
+
28
+ def name
29
+ self.class.name.demodulize.sub("Event", "").singularize
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ module GithubContributions
2
+ module Events
3
+ class IssueCommentEvent < Event
4
+ def payload
5
+ comment
6
+ end
7
+
8
+ def comment
9
+ @comment ||= GithubObjects::Comment.new(data.payload.comment)
10
+ end
11
+
12
+ # Note a pull request comment is classifed as an 'issue' although there is
13
+ # a `pull_request` attribute in the payload that could be used to id one
14
+ def issue
15
+ @issue ||= GithubObjects::Issue.new(data.payload.issue)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module GithubContributions
2
+ module Events
3
+ class IssuesEvent < Event
4
+ def payload
5
+ issue
6
+ end
7
+
8
+ def issue
9
+ @issue ||= GithubObjects::Issue.new(data.payload.issue)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module GithubContributions
2
+ module Events
3
+ class PullRequestEvent < Event
4
+ def payload
5
+ pull_request
6
+ end
7
+
8
+ def pull_request
9
+ @pull_request ||= GithubObjects::PullRequest.new(data.payload.pull_request)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module GithubContributions
2
+ module Events
3
+ class PullRequestReviewCommentEvent < Event
4
+ def payload
5
+ comment
6
+ end
7
+
8
+ def comment
9
+ @comment ||= GithubObjects::Comment.new(data.payload.comment)
10
+ end
11
+
12
+ def pull_request
13
+ @pull_request ||= GithubObjects::PullRequest.new(data.payload.pull_request)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module GithubContributions
2
+ module Events
3
+ class PullRequestReviewEvent < Event
4
+ def payload
5
+ review
6
+ end
7
+
8
+ def review
9
+ @review ||= GithubObjects::Review.new(data.payload.review)
10
+ end
11
+
12
+ def pull_request
13
+ @pull_request ||= GithubObjects::PullRequest.new(data.payload.pull_request)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ module GithubContributions
2
+ # call these payloads?
3
+ class GithubObject
4
+ attr_reader :data
5
+
6
+ def initialize(data)
7
+ @data = data
8
+ end
9
+
10
+ def user
11
+ GithubObjects::User.new(data.user)
12
+ end
13
+
14
+ # ContributionGrouper uses these objects as keys in a hash
15
+ # We need to define the `hash` and `eql?` so they work correctly
16
+ def eql?(other)
17
+ hash == other.hash
18
+ end
19
+
20
+ def hash
21
+ data.html_url.hash
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,6 @@
1
+ module GithubContributions
2
+ module GithubObjects
3
+ class Comment < GithubObject
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GithubContributions
2
+ module GithubObjects
3
+ class Issue < GithubObject
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GithubContributions
2
+ module GithubObjects
3
+ class PullRequest < GithubObject
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GithubContributions
2
+ module GithubObjects
3
+ class Review < GithubObject
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ module GithubContributions
2
+ module GithubObjects
3
+ class User < GithubObject
4
+ def initialize(data)
5
+ super(data)
6
+ @data[:html_url] = "https://github.com/#{data.login}" if @data.html_url.nil?
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,30 @@
1
+ module GithubContributions
2
+ module MarkdownPresenter
3
+ class << self
4
+ # @param grouped_events Hash<GithubObject, [Event]>
5
+ def output(grouped_events)
6
+ puts title
7
+ grouped_events.each_pair do |issue, events|
8
+ puts issue_or_pull_request(issue)
9
+ events.each do |event|
10
+ puts event(event)
11
+ end
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def title
18
+ "# GitHub Contributions"
19
+ end
20
+
21
+ def issue_or_pull_request(issue)
22
+ "- [#{issue.data.title.strip}](#{issue.data.html_url}) by [#{issue.user.data.login}](#{issue.user.data.html_url})"
23
+ end
24
+
25
+ def event(event)
26
+ " - [#{event.name} #{event.action} at #{event.created_at}](#{event.payload.data.html_url})"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,45 @@
1
+ module GithubContributions
2
+ module OptionHandler
3
+ def self.parse_options(args)
4
+ options = OpenStruct.new(
5
+ author: nil,
6
+ org: nil,
7
+ start_date: Time.current.at_beginning_of_day,
8
+ end_date: Time.current.at_end_of_day
9
+ )
10
+
11
+ OptionParser.new do |opts|
12
+ opts.banner = <<~TEXT
13
+ Usage: github_contributions [options]
14
+ You need a GitHub Personal Access Token in your ENVs as GITHUB_ACCESS_TOKEN for this to work.
15
+ Dates are specified using natual language (via chronic gem).
16
+ The GitHub's Events API only returns the last 300 events, and the filtering is client-side.
17
+ TEXT
18
+ opts.version = VERSION
19
+ opts.on "-a", "--author STRING", String, "The author of the contributions" do |value|
20
+ options.author = value
21
+ end
22
+ opts.on "-o", "--org STRING", String, "Filter contributions by the organization they belong in (optional)" do |value|
23
+ options.org = value
24
+ end
25
+ opts.on "-s", "--start_date STRING", String, "Filter contributions to be after the beginning of the specified day (defaults to today)" do |value|
26
+ options.start_date = Chronic.parse(value)&.at_beginning_of_day
27
+ end
28
+ opts.on "-e", "--end_date STRING", String, "Filter contributions to be before the end of the specified day (defaults to today)" do |value|
29
+ options.end_date = Chronic.parse(value)&.at_end_of_day
30
+ end
31
+ end.parse!
32
+
33
+ raise(TimeParseError, "The end date could not be properly parsed") if options.end_date.nil?
34
+ raise(TimeParseError, "The start date could not be properly parsed") if options.start_date.nil?
35
+ raise(StartDateOutOfRange, "The start date must be within 90 day from today") unless options.start_date.between?(90.days.ago, Time.current.at_end_of_day)
36
+ raise(MissingAuthor, "No author was supplied in arguments (use -a <author>)") if options.author.blank?
37
+ raise(MissingGithubAcessToken, "GitHub Personal Access Token was not found (should be an ENV as GITHUB_ACCESS_TOKEN") if ENV["GITHUB_ACCESS_TOKEN"].nil?
38
+
39
+ options
40
+ rescue GithubContributions::Exception => e
41
+ puts e.message
42
+ exit
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ module GithubContributions
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,53 @@
1
+ require "active_support/all"
2
+ require "chronic"
3
+ require "ostruct"
4
+ require "optparse"
5
+ require "octokit"
6
+ require "hashie"
7
+ require "digest"
8
+
9
+ Dir.glob(File.dirname(__FILE__) + '/github_contributions/**/*.rb') { |file| require file }
10
+
11
+ module GithubContributions
12
+ class << self
13
+ def run(args)
14
+ options = OptionHandler.parse_options(args)
15
+
16
+ puts "Searching between #{options.start_date.to_formatted_s(:long_ordinal)} and #{options.end_date.to_formatted_s(:long_ordinal)}..."
17
+
18
+ client = Octokit::Client.new(access_token: ENV["GITHUB_ACCESS_TOKEN"])
19
+ client.auto_paginate = true
20
+
21
+ results = client.user_events(options.author)
22
+
23
+ contribution_count = results.size
24
+ filtered_contribution_count = 0
25
+ events = results.map do |result|
26
+ result.include(Hashie::Mash)
27
+
28
+ begin
29
+ event = "GithubContributions::Events::#{result.type}".constantize.new(result)
30
+ rescue
31
+ # TODO: I'd want this one, just don't have an example of it yet
32
+ # binding.pry if result.type == "CommitCommentEvent"
33
+ next
34
+ end
35
+
36
+ next unless event.created_at.between?(options.start_date, options.end_date)
37
+
38
+ if options.org
39
+ next unless event.org == options.org
40
+ end
41
+
42
+ filtered_contribution_count += 1
43
+ event
44
+ end.compact.reverse
45
+
46
+ puts "Found #{filtered_contribution_count}/#{contribution_count} contributions using search filters"
47
+ puts ""
48
+
49
+ grouped_events = ContributionGrouper.by_issue_or_pull_request(events)
50
+ MarkdownPresenter.output(grouped_events)
51
+ end
52
+ end
53
+ end
Binary file
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: github_contributions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kevin Jalbert
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-03-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: chronic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0.10'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: octokit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '4.22'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '4.22'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hashie
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '7.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '7.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '13.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '13.0'
97
+ description: Gem that provides can fetch your GitHub contributions and output them
98
+ email:
99
+ - kevin.j.jalbert@gmail.com
100
+ executables:
101
+ - github_contributions
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - LICENSE
106
+ - README.md
107
+ - Rakefile
108
+ - bin/github_contributions
109
+ - github_contributions.gemspec
110
+ - lib/github_contributions.rb
111
+ - lib/github_contributions/contribution_grouper.rb
112
+ - lib/github_contributions/errors.rb
113
+ - lib/github_contributions/event.rb
114
+ - lib/github_contributions/events/issue_comment_event.rb
115
+ - lib/github_contributions/events/issues_event.rb
116
+ - lib/github_contributions/events/pull_request_event.rb
117
+ - lib/github_contributions/events/pull_request_review_comment_event.rb
118
+ - lib/github_contributions/events/pull_request_review_event.rb
119
+ - lib/github_contributions/github_object.rb
120
+ - lib/github_contributions/github_objects/comment.rb
121
+ - lib/github_contributions/github_objects/issue.rb
122
+ - lib/github_contributions/github_objects/pull_request.rb
123
+ - lib/github_contributions/github_objects/review.rb
124
+ - lib/github_contributions/github_objects/user.rb
125
+ - lib/github_contributions/markdown_presenter.rb
126
+ - lib/github_contributions/option_handler.rb
127
+ - lib/github_contributions/version.rb
128
+ - pkg/github_contributions-0.1.0.gem
129
+ homepage: https://github.com/kevinjalbert/github_contributions
130
+ licenses:
131
+ - MIT
132
+ metadata: {}
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '2.7'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubygems_version: 3.3.3
149
+ signing_key:
150
+ specification_version: 4
151
+ summary: Gem that provides can fetch your GitHub contributions and output them
152
+ test_files: []