gpt-pr 0.1.0__py3-none-any.whl → 0.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,49 @@
1
+ Metadata-Version: 2.1
2
+ Name: gpt-pr
3
+ Version: 0.2.1
4
+ Summary: Automate your GitHub workflow with GPT-PR: an OpenAI powered library for streamlined PR generation.
5
+ Home-page: http://github.com/alissonperez/gpt-pr
6
+ Author: Alisson R. Perez
7
+ Author-email: alissonperez@outlook.com
8
+ License: MIT
9
+ Requires-Python: >=3.7
10
+ Requires-Dist: cffi ==1.15.1
11
+ Requires-Dist: cryptography ==42.0.5
12
+ Requires-Dist: fire ==0.6.0
13
+ Requires-Dist: pycparser ==2.21
14
+ Requires-Dist: wcwidth ==0.2.13
15
+ Requires-Dist: charset-normalizer ==3.3.2 ; python_full_version >= "3.7.0"
16
+ Requires-Dist: prompt-toolkit ==3.0.43 ; python_full_version >= "3.7.0"
17
+ Requires-Dist: openai ==1.14.0 ; python_full_version >= "3.7.1"
18
+ Requires-Dist: exceptiongroup ==1.2.0 ; python_version < "3.11"
19
+ Requires-Dist: cached-property ==1.5.2 ; python_version < "3.8"
20
+ Requires-Dist: typing-extensions ==4.7.1 ; python_version < "3.8"
21
+ Requires-Dist: importlib-metadata ==6.7.0 ; python_version == "3.7"
22
+ Requires-Dist: six ==1.16.0 ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2"
23
+ Requires-Dist: deprecated ==1.2.14 ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
24
+ Requires-Dist: idna ==3.6 ; python_version >= "3.5"
25
+ Requires-Dist: certifi ==2024.2.2 ; python_version >= "3.6"
26
+ Requires-Dist: distro ==1.9.0 ; python_version >= "3.6"
27
+ Requires-Dist: pynacl ==1.5.0 ; python_version >= "3.6"
28
+ Requires-Dist: wrapt ==1.16.0 ; python_version >= "3.6"
29
+ Requires-Dist: annotated-types ==0.5.0 ; python_version >= "3.7"
30
+ Requires-Dist: anyio ==3.7.1 ; python_version >= "3.7"
31
+ Requires-Dist: gitdb ==4.0.11 ; python_version >= "3.7"
32
+ Requires-Dist: gitpython ==3.1.42 ; python_version >= "3.7"
33
+ Requires-Dist: h11 ==0.14.0 ; python_version >= "3.7"
34
+ Requires-Dist: httpcore ==0.17.3 ; python_version >= "3.7"
35
+ Requires-Dist: httpx ==0.24.1 ; python_version >= "3.7"
36
+ Requires-Dist: pydantic ==2.5.3 ; python_version >= "3.7"
37
+ Requires-Dist: pydantic-core ==2.14.6 ; python_version >= "3.7"
38
+ Requires-Dist: pygithub ==2.2.0 ; python_version >= "3.7"
39
+ Requires-Dist: pyjwt[crypto] ==2.8.0 ; python_version >= "3.7"
40
+ Requires-Dist: requests ==2.31.0 ; python_version >= "3.7"
41
+ Requires-Dist: smmap ==5.0.1 ; python_version >= "3.7"
42
+ Requires-Dist: sniffio ==1.3.1 ; python_version >= "3.7"
43
+ Requires-Dist: termcolor ==2.3.0 ; python_version >= "3.7"
44
+ Requires-Dist: tqdm ==4.66.2 ; python_version >= "3.7"
45
+ Requires-Dist: urllib3 ==2.0.7 ; python_version >= "3.7"
46
+ Requires-Dist: zipp ==3.15.0 ; python_version >= "3.7"
47
+ Requires-Dist: inquirerpy ==0.3.4 ; python_version >= "3.7" and python_version < "4.0"
48
+ Requires-Dist: pfzy ==0.3.4 ; python_version >= "3.7" and python_version < "4.0"
49
+
@@ -0,0 +1,13 @@
1
+ gptpr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ gptpr/consolecolor.py,sha256=_JmBMNjIflWMlgP2VkCWu6uQLR9oHBy52uV3TRJJgF4,800
3
+ gptpr/gh.py,sha256=aunn_8wi4pGoGkjdqyA2MZVAAxfItpnnmDCp20-i-WA,786
4
+ gptpr/gitutil.py,sha256=NBD3iRnbFEPRU47w7c5TowwtZieDYkU4zybvv0PoOU0,5783
5
+ gptpr/main.py,sha256=rkalqLcc1Nh5WH51w7ayEMIYNoScrRBNVYl3KLuZFdY,1270
6
+ gptpr/prdata.py,sha256=y4VodgCiSaARPXzJHsg32-cqrR_nZqyyGSLij6ee-oo,5846
7
+ gptpr/test_prdata.py,sha256=rSJ-yqOdw-iYdBWyqnA2SXbdrhT8KgIkRTTf9SY1S1g,474
8
+ gptpr/version.py,sha256=HfjVOrpTnmZ-xVFCYSVmX50EXaBQeJteUHG-PD6iQs8,22
9
+ gpt_pr-0.2.1.dist-info/METADATA,sha256=rJ-4clCl3pJh99vscyuuVQsLt4XQzqpgf4K67YYMZJY,2637
10
+ gpt_pr-0.2.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
11
+ gpt_pr-0.2.1.dist-info/entry_points.txt,sha256=aXCkyNdoUHfSJXVhRKHj8m09twDfcDmY7xC66u5N3hE,43
12
+ gpt_pr-0.2.1.dist-info/top_level.txt,sha256=DZcbzlsjh4BD8njGcvhOeCZ83U_oYWgCn0w8qx5--04,6
13
+ gpt_pr-0.2.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.2)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
gptpr/gh.py CHANGED
@@ -11,16 +11,17 @@ if not GH_TOKEN:
11
11
  gh = Github(GH_TOKEN)
12
12
 
13
13
 
14
- def create_pr(pr_data):
14
+ def create_pr(pr_data, yield_confirmation):
15
15
  repo = gh.get_repo(
16
16
  f'{pr_data.branch_info.owner}/{pr_data.branch_info.repo}')
17
17
 
18
- pr_confirmation = inquirer.confirm(message="Create GitHub PR?",
19
- default=True).execute()
18
+ pr_confirmation = yield_confirmation or inquirer.confirm(
19
+ message="Create GitHub PR?",
20
+ default=True).execute()
20
21
 
21
22
  if pr_confirmation:
22
23
  pr = repo.create_pull(title=pr_data.title, body=pr_data.body,
23
- head=pr_data.branch_info.branch, base='main')
24
+ head=pr_data.branch_info.branch, base=pr_data.branch_info.base_branch)
24
25
  print("Pull request created successfully: ", pr.html_url)
25
26
  else:
26
27
  print('cancelling...')
gptpr/gitutil.py CHANGED
@@ -10,9 +10,10 @@ from InquirerPy.base.control import Choice
10
10
  class BranchInfo:
11
11
  owner: str
12
12
  repo: str
13
+ base_branch: str
13
14
  branch: str
14
15
  commits: list
15
- main_commits: list
16
+ highlight_commits: list
16
17
  diff: str
17
18
 
18
19
 
@@ -31,7 +32,7 @@ class FileChange:
31
32
  return f'{self.file_path} (+{(self.lines_added)} -{self.lines_removed})'
32
33
 
33
34
 
34
- def get_branch_info():
35
+ def get_branch_info(base_branch, yield_confirmation):
35
36
  # Get current directory
36
37
  current_dir = os.getcwd()
37
38
 
@@ -53,60 +54,75 @@ def get_branch_info():
53
54
  else:
54
55
  raise Exception('Not currently on any branch.')
55
56
 
57
+ if not _branch_exists(repo, base_branch):
58
+ raise Exception(f'Base branch {base_branch} does not exist.')
59
+
56
60
  owner, repo_name = _get_remote_info(repo)
57
61
 
58
- commits = _get_diff_messages_against_main_branch(repo, current_branch.name)
59
- commits = _get_valid_commits(commits)
62
+ commits = _get_diff_messages_against_base_branch(repo, current_branch.name, base_branch)
63
+ commits = _get_valid_commits(commits, yield_confirmation)
60
64
 
61
65
  if not commits:
62
66
  print('No commit changes detected.')
63
67
  return None
64
68
 
65
- main_commits = _get_main_commits(commits)
69
+ highlight_commits = _get_highlight_commits(commits, yield_confirmation)
66
70
 
67
71
  return BranchInfo(
68
72
  owner=owner,
69
73
  repo=repo_name,
74
+ base_branch=base_branch,
70
75
  branch=current_branch.name,
71
76
  commits=commits,
72
- main_commits=main_commits,
73
- diff=_get_diff_changes(repo, current_branch.name)
77
+ highlight_commits=highlight_commits,
78
+ diff=_get_diff_changes(repo, base_branch, current_branch.name, yield_confirmation)
74
79
  )
75
80
 
76
81
 
77
- def _get_diff_messages_against_main_branch(repo, branch):
78
- # Get commit messages that are in the current branch but not in the main branch
79
- commits_diff = list(repo.iter_commits(f'main..{branch}'))
82
+ def _branch_exists(repo, branch_name):
83
+ if branch_name in repo.branches:
84
+ return True
85
+
86
+ return False
87
+
88
+
89
+ def _get_diff_messages_against_base_branch(repo, branch, base_branch):
90
+ # Get commit messages that are in the current branch but not in the base branch
91
+ commits_diff = list(repo.iter_commits(f'{base_branch}..{branch}'))
80
92
 
81
93
  return [commit.message.strip('\n') for commit in commits_diff]
82
94
 
83
95
 
84
- def _get_valid_commits(commits):
96
+ def _get_valid_commits(commits, yield_confirmation):
85
97
  if not commits:
86
98
  return commits
87
99
 
88
100
  options = [Choice(value=commit, name=commit) for commit in commits]
89
101
 
90
- commits_to_ignore = inquirer.checkbox(
91
- message='Pick commits that should be IGNORED (optional)\':',
92
- choices=options,
93
- instruction="(Press <space> to select, <enter> to confirm)",
94
- ).execute()
102
+ commits_to_ignore = []
103
+ if not yield_confirmation:
104
+ commits_to_ignore = inquirer.checkbox(
105
+ message='Pick commits that should be IGNORED (optional)\':',
106
+ choices=options,
107
+ instruction="(Press <space> to select, <enter> to confirm)",
108
+ ).execute()
95
109
 
96
110
  return [commit for commit in commits if commit not in commits_to_ignore]
97
111
 
98
112
 
99
- # use inquirer to select main commits
100
- def _get_main_commits(commits):
113
+ def _get_highlight_commits(commits, yield_confirmation):
114
+ if yield_confirmation or len(commits) <= 1:
115
+ return []
116
+
101
117
  options = [Choice(value=commit, name=commit) for commit in commits]
102
118
 
103
- main_commits = inquirer.checkbox(
119
+ highlight_commits = inquirer.checkbox(
104
120
  message='Pick commits to highlight in description (optional)\':',
105
121
  choices=options,
106
122
  instruction="(Press <space> to select, <enter> to confirm)",
107
123
  ).execute()
108
124
 
109
- return main_commits
125
+ return highlight_commits
110
126
 
111
127
 
112
128
  def _get_remote_info(repo):
@@ -133,33 +149,33 @@ def _extract_owner_and_repo(repo_url):
133
149
  return owner, '.'.join(repo_info.split('.')[:-1])
134
150
 
135
151
 
136
- def _get_diff_changes(repo, branch):
152
+ def _get_diff_changes(repo, base_branch, branch, yield_confirmation):
137
153
  diff_changes = []
138
154
 
139
- stats = _get_stats(repo, branch)
140
- files_to_ignore = _get_files_to_ignore(stats)
155
+ stats = _get_stats(repo, base_branch, branch)
156
+ files_to_ignore = _get_files_to_ignore(stats, yield_confirmation)
141
157
 
142
158
  for file_change in stats:
143
159
  if file_change.file_path in files_to_ignore:
144
160
  continue
145
161
 
146
- file_diff = repo.git.diff('main', branch, '--', file_change.file_path)
162
+ file_diff = repo.git.diff(base_branch, branch, '--', file_change.file_path)
147
163
 
148
164
  diff_changes.append(file_diff)
149
165
 
150
166
  return '\n'.join(diff_changes)
151
167
 
152
168
 
153
- def _get_stats(repo, branch):
169
+ def _get_stats(repo, base_branch, branch):
154
170
  '''
155
- Get the stats of the difference between the current branch and the main branch
171
+ Get the stats of the difference between the current branch and the base branch
156
172
  '''
157
173
 
158
174
  # returns:
159
175
  # 4 0 README.md
160
176
  # 2 0 application/aggregator/aggregator.go
161
177
  # 0 257 go.sum
162
- diff_index = repo.git.diff('main', branch, '--numstat')
178
+ diff_index = repo.git.diff(base_branch, branch, '--numstat')
163
179
 
164
180
  files_changed = []
165
181
  for line in diff_index.split('\n'):
@@ -176,11 +192,14 @@ def _get_stats(repo, branch):
176
192
  return files_changed
177
193
 
178
194
 
179
- def _get_files_to_ignore(stats):
195
+ def _get_files_to_ignore(stats, yield_confirmation):
180
196
  '''
181
197
  Get the files that should be ignored from the stats
182
198
  '''
183
199
 
200
+ if yield_confirmation:
201
+ return []
202
+
184
203
  options = [Choice(stats.file_path, name=stats.desc) for stats in stats]
185
204
 
186
205
  files_to_ignore = inquirer.checkbox(
gptpr/main.py CHANGED
@@ -1,12 +1,22 @@
1
+ import fire
1
2
  from InquirerPy import inquirer
2
3
 
3
4
  from gptpr.gitutil import get_branch_info
4
5
  from gptpr.gh import create_pr
5
6
  from gptpr.prdata import get_pr_data
7
+ from gptpr.version import __version__
6
8
 
7
9
 
8
- def main():
9
- branch_info = get_branch_info()
10
+ def run(base_branch='main', yield_confirmation=False, version=False):
11
+ '''
12
+ Create Pull Requests from current branch with base branch (default 'main' branch)
13
+ '''
14
+
15
+ if version:
16
+ print('Current version:', __version__)
17
+ return
18
+
19
+ branch_info = get_branch_info(base_branch, yield_confirmation)
10
20
 
11
21
  if not branch_info:
12
22
  exit(0)
@@ -20,13 +30,22 @@ def main():
20
30
  print(pr_data.to_display())
21
31
  print('#########################################')
22
32
  print('')
33
+
34
+ if yield_confirmation:
35
+ break
36
+
23
37
  generate_pr_data = not inquirer.confirm(
24
38
  message="Create PR with this? If 'no', let's try again...",
25
39
  default=True).execute()
40
+
26
41
  if generate_pr_data:
27
42
  print('Generating another PR data...')
28
43
 
29
- create_pr(pr_data)
44
+ create_pr(pr_data, yield_confirmation)
45
+
46
+
47
+ def main():
48
+ fire.Fire(run)
30
49
 
31
50
 
32
51
  if __name__ == '__main__':
gptpr/prdata.py CHANGED
@@ -1,8 +1,7 @@
1
1
  from dataclasses import dataclass
2
- import pprint
3
2
  import json
4
3
  import os
5
- import openai
4
+ from openai import OpenAI
6
5
 
7
6
  from gptpr.gitutil import BranchInfo
8
7
  import gptpr.consolecolor as cc
@@ -10,20 +9,12 @@ import gptpr.consolecolor as cc
10
9
  TOKENIZER_RATIO = 4
11
10
  MAX_TOKENS = 6000
12
11
 
13
- OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY')
14
-
15
- if not OPENAI_API_KEY:
16
- print("Please set OPENAI_API_KEY environment variable.")
17
- exit(1)
18
-
19
- openai.api_key = OPENAI_API_KEY
20
-
21
12
  DEFAULT_PR_TEMPLATE = ('### Ref. [Link]\n\n## What was done?\n[Fill here]\n\n'
22
13
  '## How was it done?\n[Fill here]\n\n'
23
14
  '## How was it tested?\n[Fill here with test information from diff content or commits]')
24
15
 
25
16
 
26
- def get_pr_template():
17
+ def _get_pr_template():
27
18
  pr_template = DEFAULT_PR_TEMPLATE
28
19
 
29
20
  try:
@@ -57,7 +48,7 @@ class PrData():
57
48
  f'{cc.bold("Repository")}: {cc.yellow(self.branch_info.owner)}/{cc.yellow(self.branch_info.repo)}',
58
49
  f'{cc.bold("Title")}: {cc.yellow(self.title)}',
59
50
  f'{cc.bold("Branch name")}: {cc.yellow(self.branch_info.branch)}',
60
- f'{cc.bold("Base branch")}: {cc.yellow("main")}',
51
+ f'{cc.bold("Base branch")}: {cc.yellow(self.branch_info.base_branch)}',
61
52
  f'{cc.bold("PR Description")}:\n{self.body}',
62
53
  ])
63
54
 
@@ -85,25 +76,26 @@ functions = [
85
76
 
86
77
 
87
78
  def get_pr_data(branch_info):
88
- system_content = '''
89
- You are a helpful assistant that helps a developer getting git diff changes, main commit,
90
- secondary commits and a Github PR template and returns the template filled with all required description
91
- and a PR title.
92
- In PR description, explain what was done, how it was done, tested, etc.
93
- If there are too many changes, you can list them in bullet points.
94
- '''
79
+ system_content = ('You are a development assistant designed to craft Git pull requests '
80
+ 'by incorporating information from main and secondary commits, diff changes, '
81
+ 'and adhering to a provided PR template. Your output includes a complete PR '
82
+ 'template with all necessary details and a suitable PR title. In the '
83
+ 'PR description, detail the work accomplished, the methodology employed, '
84
+ 'including testing procedures, and list significant changes in bullet points '
85
+ 'if they are extensive. Avoid incorporating diff content directly into '
86
+ 'the PR description.')
95
87
 
96
88
  messages = [
97
89
  {'role': 'system', 'content': system_content},
98
90
  ]
99
91
 
100
- if len(branch_info.main_commits) > 0:
101
- messages.append({'role': 'user', 'content': 'main commits: ' + '\n'.join(branch_info.main_commits)})
92
+ if len(branch_info.highlight_commits) > 0:
93
+ messages.append({'role': 'user', 'content': 'main commits: ' + '\n'.join(branch_info.highlight_commits)})
102
94
  messages.append({'role': 'user', 'content': 'secondary commits: ' + '\n'.join(branch_info.commits)})
103
95
  else:
104
96
  messages.append({'role': 'user', 'content': 'git commits: ' + '\n'.join(branch_info.commits)})
105
97
 
106
- messages.append({'role': 'user', 'content': 'PR template:\n' + get_pr_template()})
98
+ messages.append({'role': 'user', 'content': 'PR template:\n' + _get_pr_template()})
107
99
 
108
100
  current_total_length = sum([len(m['content']) for m in messages])
109
101
 
@@ -116,9 +108,17 @@ def get_pr_data(branch_info):
116
108
  else:
117
109
  messages.append({'role': 'user', 'content': 'Diff changes:\n' + branch_info.diff})
118
110
 
119
- response = openai.ChatCompletion.create(
120
- model='gpt-4-0613',
111
+ openai_api_key = os.environ.get('OPENAI_API_KEY')
112
+
113
+ if not openai_api_key:
114
+ print("Please set OPENAI_API_KEY environment variable.")
115
+ exit(1)
116
+
117
+ client = OpenAI(api_key=openai_api_key)
118
+
119
+ chat_completion = client.chat.completions.create(
121
120
  messages=messages,
121
+ model='gpt-4-0613',
122
122
  functions=functions,
123
123
  function_call={'name': 'create_pr'},
124
124
  temperature=0,
@@ -128,16 +128,34 @@ def get_pr_data(branch_info):
128
128
  presence_penalty=0
129
129
  )
130
130
 
131
- try:
132
- arguments = json.loads(response.choices[0].message.function_call.arguments)
133
- except Exception as e:
134
- print('Error to decode message:', e)
135
- print('Response message')
136
- pprint.pprint(response.choices[0].message)
137
- raise e
131
+ arguments = _parse_json(chat_completion.choices[0].message.function_call.arguments)
138
132
 
139
133
  return PrData(
140
134
  branch_info=branch_info,
141
135
  title=arguments['title'],
142
136
  body=arguments['description']
143
137
  )
138
+
139
+
140
+ def _parse_json(content):
141
+ '''
142
+ A bit of a hack to parse the json content from the chat completion
143
+ Sometimes it returns a string with invalid json content (line breaks) that
144
+ makes it hard to parse.
145
+ example:
146
+
147
+ content = '{\n"title": "feat(dependencies): pin dependencies versions",\n"description":
148
+ "### Ref. [Link]\n\n## What was done? ..."\n}'
149
+ '''
150
+
151
+ try:
152
+ content = content.replace('{\n"title":', '{"title":')
153
+ content = content.replace(',\n"description":', ',"description":')
154
+ content = content.replace('\n}', '}')
155
+ content = content.replace('\n', '\\n')
156
+
157
+ return json.loads(content)
158
+ except Exception as e:
159
+ print('Error to decode message:', e)
160
+ print('Content:', content)
161
+ raise e
gptpr/test_prdata.py ADDED
@@ -0,0 +1,13 @@
1
+ from gptpr.prdata import _parse_json
2
+
3
+
4
+ def test_parse_json():
5
+ content = ('{\n"title": "feat(dependencies): pin dependencies '
6
+ 'versions",\n"description": "### Ref. [Link]\n\n## What was done? ..."\n}')
7
+
8
+ expected = {
9
+ 'title': 'feat(dependencies): pin dependencies versions',
10
+ 'description': '### Ref. [Link]\n\n## What was done? ...'
11
+ }
12
+
13
+ assert _parse_json(content) == expected, "The function did not return the expected output."
gptpr/version.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "0.2.1"
@@ -1,43 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: gpt-pr
3
- Version: 0.1.0
4
- Summary: Automate your GitHub workflow with GPT-PR: an OpenAI powered library for streamlined PR generation.
5
- Home-page: http://github.com/alissonperez/gpt-pr
6
- Author: Alisson R. Perez
7
- Author-email: alissonperez@outlook.com
8
- License: MIT
9
- Requires-Python: >=3.7
10
- Requires-Dist: cffi ==1.15.1
11
- Requires-Dist: cryptography ==41.0.3
12
- Requires-Dist: pycparser ==2.21
13
- Requires-Dist: wcwidth ==0.2.6
14
- Requires-Dist: charset-normalizer ==3.2.0 ; python_full_version >= "3.7.0"
15
- Requires-Dist: prompt-toolkit ==3.0.39 ; python_full_version >= "3.7.0"
16
- Requires-Dist: openai ==0.28.0 ; python_full_version >= "3.7.1"
17
- Requires-Dist: asynctest ==0.13.0 ; python_version < "3.8"
18
- Requires-Dist: importlib-metadata ==6.7.0 ; python_version < "3.8"
19
- Requires-Dist: typing-extensions ==4.7.1 ; python_version < "3.8"
20
- Requires-Dist: deprecated ==1.2.14 ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
21
- Requires-Dist: wrapt ==1.15.0 ; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3, 3.4"
22
- Requires-Dist: idna ==3.4 ; python_version >= "3.5"
23
- Requires-Dist: aiohttp ==3.8.5 ; python_version >= "3.6"
24
- Requires-Dist: certifi ==2023.7.22 ; python_version >= "3.6"
25
- Requires-Dist: pynacl ==1.5.0 ; python_version >= "3.6"
26
- Requires-Dist: smmap ==5.0.0 ; python_version >= "3.6"
27
- Requires-Dist: aiosignal ==1.3.1 ; python_version >= "3.7"
28
- Requires-Dist: async-timeout ==4.0.3 ; python_version >= "3.7"
29
- Requires-Dist: attrs ==23.1.0 ; python_version >= "3.7"
30
- Requires-Dist: frozenlist ==1.3.3 ; python_version >= "3.7"
31
- Requires-Dist: gitdb ==4.0.10 ; python_version >= "3.7"
32
- Requires-Dist: gitpython ==3.1.35 ; python_version >= "3.7"
33
- Requires-Dist: multidict ==6.0.4 ; python_version >= "3.7"
34
- Requires-Dist: pygithub ==1.59.1 ; python_version >= "3.7"
35
- Requires-Dist: pyjwt[crypto] ==2.8.0 ; python_version >= "3.7"
36
- Requires-Dist: requests ==2.31.0 ; python_version >= "3.7"
37
- Requires-Dist: tqdm ==4.66.1 ; python_version >= "3.7"
38
- Requires-Dist: urllib3 ==2.0.4 ; python_version >= "3.7"
39
- Requires-Dist: yarl ==1.9.2 ; python_version >= "3.7"
40
- Requires-Dist: zipp ==3.15.0 ; python_version >= "3.7"
41
- Requires-Dist: inquirerpy ==0.3.4 ; python_version >= "3.7" and python_version < "4.0"
42
- Requires-Dist: pfzy ==0.3.4 ; python_version >= "3.7" and python_version < "4.0"
43
-
@@ -1,12 +0,0 @@
1
- gptpr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- gptpr/__version__.py,sha256=IMjkMO3twhQzluVTo8Z6rE7Eg-9U79_LGKMcsWLKBkY,22
3
- gptpr/consolecolor.py,sha256=_JmBMNjIflWMlgP2VkCWu6uQLR9oHBy52uV3TRJJgF4,800
4
- gptpr/gh.py,sha256=kpxvUTCQDCYRYO03EJAHNxLe7M5iRzkqH5bUDVaKObs,741
5
- gptpr/gitutil.py,sha256=pX8WdJxb4uWGKNgLvuzJIHxK3-2g14FCiQvk6qx7cXw,5015
6
- gptpr/main.py,sha256=qUJcc9cDpFiCn6whJasHf-_1_xPz8n7UKsMIMVPLuHQ,844
7
- gptpr/prdata.py,sha256=HA1e-Xj-cWn0HHMzpaZxgJcCfZ3_OEosp3rBfWVQvTk,4844
8
- gpt_pr-0.1.0.dist-info/METADATA,sha256=f7GhQLRaIcENibhCEteBj5gycEVArdneLmRSNIxAWcw,2321
9
- gpt_pr-0.1.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
10
- gpt_pr-0.1.0.dist-info/entry_points.txt,sha256=aXCkyNdoUHfSJXVhRKHj8m09twDfcDmY7xC66u5N3hE,43
11
- gpt_pr-0.1.0.dist-info/top_level.txt,sha256=DZcbzlsjh4BD8njGcvhOeCZ83U_oYWgCn0w8qx5--04,6
12
- gpt_pr-0.1.0.dist-info/RECORD,,
gptpr/__version__.py DELETED
@@ -1 +0,0 @@
1
- __version__ = '0.1.0'