newsman 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: bbdbadb8ae1727aa56b52deae928ceb16d0068d9b0190ac2672a75a98c669231
4
+ data.tar.gz: 5b0487e709dd265cfcfe39ffadab3ac1bff14fd0e94ad547fb49aa56567e317d
5
+ SHA512:
6
+ metadata.gz: 749af2c2ce1a20006ad4ba4373c2d53f0f52c604c8f9801acb87f6f2cd6bd421d79690e643e46b5c97fad09a80a7ea75e41db8e6e4523da689c07025d0e0b059
7
+ data.tar.gz: 68e39b6efe454c926b8164e4c3c7e7fe6682c6086f80b0a579a84cc3116df2f424c2bad1f8572d2466bf07f8fc6c3b703c9325fa295eba028b229935c53535b9
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2024 Volodya Lombrozo
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
13
+ in all 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 NON-INFRINGEMENT. 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,53 @@
1
+ # Newsman
2
+
3
+ Newsman is a simple script that collects information about a developer's weekly activity on GitHub and creates a human-readable summary of the work done. To create the summary, Newsman asks ChatGPT to handle all the information about a developer's activity, including their pull requests and created issues.
4
+
5
+ ## How to Use
6
+
7
+ To use newsman, you need to perfom several actions.
8
+
9
+ ### Retrieve `GITHUB_TOKEN`
10
+
11
+ First of all, you need to [retrieve your GitHub token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens).
12
+
13
+ ### Retrieve `OPENAI_TOKEN`
14
+
15
+ Then, you need to [set up your OpenAI key](https://platform.openai.com/docs/quickstart?context=curl).
16
+
17
+ ## Run the script
18
+
19
+ To run the newsman script you should pass `GITHUB_TOKEN` and `OPENAI_TOKEN` environment variables together with `name`, `username` and `repository` parameters.
20
+ If you have some problems you can use `--help` option to get more info about newsman usage:
21
+ ```shell
22
+ Usage: newsman [options]
23
+ -n, --name NAME Reporter name. Human readable name that will be used in a report
24
+ -u, --username USERNAME GitHub username. For example, 'volodya-lombrozo'
25
+ -r, --repository REPOSITORIES Specify which repositories to include in a report. You can specify several repositories using a comma separator, for example: '-r objectionary/jeo-maven-plugin,objectionary/opeo-maven-plugin'
26
+ -p, --position Reporter position in a company. Default value is a 'Software Developer'.
27
+ ```
28
+
29
+ ### Example
30
+
31
+ You can download this repository and run the newsman script directly using the following command:
32
+ ```shell
33
+ ./bin/newsman --name "Vladimir Zakharov" --username "volodya-lombrozo" --repository objectionary/jeo-maven-plugin,objectionary/opeo-maven-plugin
34
+ ```
35
+
36
+ Don't forget to set your own values for `name`, `username` and `repository` parameters.
37
+
38
+ ## How to build a gem from sources
39
+
40
+ To create a newsman gem from sources first of all you need to build it:
41
+ ```shell
42
+ gem build newsman.gemspec
43
+ ```
44
+ Then, in the folder you might find a newly created gem file, e.g `newsman-0.1.0.gem`.
45
+ To use it in any place of your system you need to install it:
46
+ ```shell
47
+ gem install newsman-0.1.0.gem
48
+ ```
49
+ To check that everythis is fine, just run the following command:
50
+ ```
51
+ newsman --help
52
+ ```
53
+ Annd you should see a welcome message from newsman.
data/bin/newsman ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/newsman.rb"
4
+
5
+ generate
@@ -0,0 +1,13 @@
1
+ class PullRequest
2
+ attr_accessor :repository, :title, :description
3
+
4
+ def initialize(repository, title, description)
5
+ @repository = repository
6
+ @title = title
7
+ @description = description
8
+ end
9
+
10
+ def to_s
11
+ "title: ```#{@title}```\n, description: ```#{@description}```\n, repo: ```#{@repository}```\n"
12
+ end
13
+ end
data/lib/newsman.rb ADDED
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'octokit'
4
+ require 'openai'
5
+ require 'dotenv'
6
+ require 'optparse'
7
+ require_relative 'newsman/pull_request.rb'
8
+
9
+ def generate
10
+ # Load all options required
11
+ # Pay attention that some of them have default values.
12
+ options = {}
13
+ OptionParser.new do |opts|
14
+ opts.banner = "Usage: newsman [options]"
15
+ opts.on("-n", "--name NAME", "Reporter name. Human readable name that will be used in a report") do |n|
16
+ options[:name] = n
17
+ end
18
+ opts.on("-u", "--username USERNAME", "GitHub username. For example, 'volodya-lombrozo'") do |u|
19
+ options[:username] = u
20
+ end
21
+ opts.on("-r", "--repository REPOSITORIES", "Specify which repositories to include in a report. You can specify several repositories using a comma separator, for example: '-r objectionary/jeo-maven-plugin,objectionary/opeo-maven-plugin'") do |r|
22
+ options[:repositories] = r
23
+ end
24
+ opts.on("-p", "--position", "Reporter position in a company. Default value is a 'Software Developer'.") do |p|
25
+ options[:position] = p
26
+ end
27
+ end.parse!
28
+ # Custom method to raise exception with a human-readable message
29
+ def options.require_option(key, message)
30
+ raise OptionParser::MissingArgument, message if self[key].nil?
31
+ end
32
+
33
+ # Check for required options
34
+ options.require_option(:name, "Reporter name is required. Please specify using -n or --name.")
35
+ options.require_option(:username, "GitHub username is required. Please specify using -u or --username.")
36
+ options.require_option(:repositories, "GitHub repository is required. Please specify one or several repositories using -r or --repositories.")
37
+ options[:position] ||= "Software Developer"
38
+ all_params = options.map { |key, value| "#{key}: #{value}" }.join(", ")
39
+ puts "Parsed parameters: #{all_params}"
40
+
41
+ # Load all required environment variables
42
+ Dotenv.load
43
+ Dotenv.require_keys("GITHUB_TOKEN", "OPENAI_TOKEN")
44
+
45
+ # Init all required parameters
46
+ # Reporter Info
47
+ reporter = options[:name]
48
+ reporter_position = options[:position]
49
+ # GitHub
50
+ github_username = options[:username]
51
+ github_repositories = options[:repositories].split(",").map { |repo| "repo:" + repo }.join(" ")
52
+
53
+ # Your GitHub personal access token
54
+ # Make sure it has the 'repo'
55
+ github_token = ENV['GITHUB_TOKEN']
56
+ # Your OpenAI personal access token
57
+ openai_token = ENV['OPENAI_TOKEN']
58
+ # Create a GitHub client instance with your access token
59
+ client = Octokit::Client.new(github_token: github_token)
60
+ # Calculate the date one week ago
61
+ report_date = Date.today
62
+ one_week_ago = date_one_week_ago(Date.today)
63
+ # Display pull request
64
+ query = "is:pr author:#{github_username} created:>=#{one_week_ago} #{github_repositories}"
65
+ puts "Searching pull requests for #{github_username}."
66
+ puts "Newsman uses the following request to GitHub to gather the required information about user activity: '#{query}'"
67
+ prs = []
68
+ pull_requests = client.search_issues(query)
69
+ pull_requests.items.each do |pr|
70
+ title = "#{pr.title}"
71
+ description = "#{pr.body}"
72
+ repository = pr.repository_url.split('/').last
73
+ puts "Found PR in #{repository}: #{title}"
74
+ # Create a new PullRequest object and add it to the list
75
+ pr = PullRequest.new(repository, title, description)
76
+ prs << pr
77
+ end
78
+ puts "\nNow lets test some aggregation using OpenAI\n\n"
79
+ openai_client = OpenAI::Client.new(access_token: openai_token)
80
+ example = "Last week achievements.
81
+ jeo-meven-plugin:
82
+ - Added 100 new files to the Dataset [#168]
83
+ - Fixed the deployment of XYZ [#169]
84
+ - Refined the requirements [#177]
85
+ opeo-maven-plugin
86
+ - Removed XYZ class [#57]
87
+ - Refactored http module [#69]
88
+
89
+ Next week plans:
90
+ jeo-maven-plugin:
91
+ - <leave empty>
92
+ opeo-maven-plugin:
93
+ - <leave empty>
94
+
95
+ Risks:
96
+ jeo-maven-plugin:
97
+ - <leave-empty>
98
+ opeo-maven-plugin:
99
+ - <leave-empty>
100
+
101
+ Best regards,
102
+ #{reporter}
103
+ #{reporter_position}
104
+ #{report_date}
105
+ "
106
+
107
+ response = openai_client.chat(
108
+ parameters: {
109
+ model: "gpt-3.5-turbo",
110
+ messages: [
111
+ { role: "system", content: "You are a developer tasked with composing a concise report detailing your activities and progress for the previous week, intended for submission to your supervisor."},
112
+ { role: "user", content: "Please compile a summary of the work completed in the following Pull Requests (PRs). Each PR should be summarized in a single sentence, focusing more on the PR title and less on implementation details. Group the sentences by repositories, each identified by its name mentioned in the 'repository:[name]' attribute of the PR. The grouping is important an should be precise. Ensure that each sentence includes the corresponding issue number as an integer value. If a PR doesn't mention an issue number, just print [#chore]. Combine all the information from each PR into a concise and fluent sentence, as if you were a developer reporting on your work. Please strictly adhere to the example template provided. Example of a report: #{example}. List of Pull Requests: [#{prs}]"}
113
+ ],
114
+ temperature: 0.3,
115
+ })
116
+ puts response.dig("choices", 0, "message", "content")
117
+ end
118
+
119
+
120
+ def date_one_week_ago(today)
121
+ # Convert today to a Date object if it's not already
122
+ today = Date.parse(today) unless today.is_a?(Date)
123
+ # Subtract 7 days to get the date one week ago
124
+ one_week_ago = today - 7
125
+ # Format the date as "YYYY-MM-DD"
126
+ formatted_date = one_week_ago.strftime("%Y-%m-%d")
127
+ # Return the formatted date
128
+ return formatted_date
129
+ end
130
+
131
+
132
+ # Execute the function only if this script is run directly like `./newsman.rb`
133
+ if __FILE__ == $0
134
+ generate()
135
+ end
136
+
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright (c) 2024 Volodya Lombrozo
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the 'Software'), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in all
12
+ # copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ # SOFTWARE.
21
+
22
+ require 'minitest/autorun'
23
+ require_relative '../../lib/newsman/newsman.rb'
24
+
25
+ class TestDateOneWeekAgo < Minitest::Test
26
+ def test_date_one_week_ago
27
+ assert_equal "2024-03-07", date_one_week_ago(Date.new(2024, 3, 14))
28
+ assert_equal "2024-02-29", date_one_week_ago(Date.new(2024, 3, 7))
29
+ end
30
+ end
31
+
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: newsman
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Volodya Lombrozo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-03-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ description: A simple gem that gathers GitHub statistics and creates human-readable
28
+ report
29
+ email:
30
+ - volodya.lombrozo@gmail.com
31
+ executables:
32
+ - newsman
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - LICENSE.txt
37
+ - README.md
38
+ - bin/newsman
39
+ - lib/newsman.rb
40
+ - lib/newsman/pull_request.rb
41
+ - test/newsman/test_week_before.rb
42
+ homepage: https://github.com/volodya-lombrozo/newsman
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ - bin
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubygems_version: 3.5.6
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: GitHub user weekly news
66
+ test_files: []