|
1
|
|
|
import os |
|
2
|
|
|
import tempfile |
|
3
|
|
|
|
|
4
|
|
|
def exec(x): |
|
5
|
|
|
if os.system(x)!=0: |
|
6
|
|
|
raise NameError('Look at above errors to understand why the execution failed!!') |
|
7
|
|
|
|
|
8
|
|
|
def check_(prompt_,yes_="yes",no_="no"): |
|
9
|
|
|
yes1_=yes_.lower().strip() |
|
10
|
|
|
no1_=no_.lower().strip() |
|
11
|
|
|
while(True): |
|
12
|
|
|
i_=input(prompt_).lower().strip() |
|
13
|
|
|
if(i_==yes1_): |
|
14
|
|
|
return(True) |
|
15
|
|
|
elif(i_==no1_): |
|
16
|
|
|
return(False) |
|
17
|
|
|
else: |
|
18
|
|
|
print(f"Your input is neither {yes_} nor {no_}. TRY again carefully..") |
|
19
|
|
|
|
|
20
|
|
|
def format_readme(rep_u): |
|
21
|
|
|
#https://github.com/{user_name_}/{repo_or_package_name_}.git |
|
22
|
|
|
user_name_=rep_u.split("/")[-2] |
|
23
|
|
|
repo_or_package_name_=rep_u.split("/")[-1][:-4] |
|
24
|
|
|
with open("./package_creator/README.MD","r") as f: |
|
25
|
|
|
readme=f.read() |
|
26
|
|
|
readme=readme.format(user_name_=user_name_,repo_or_package_name_=repo_or_package_name_) |
|
27
|
|
|
with open("./package_creator/README.MD","w") as f: |
|
28
|
|
|
f.write(readme) |
|
29
|
|
|
|
|
30
|
|
|
def create_package(): |
|
31
|
|
|
file_path=os.path.abspath(os.path.expanduser(input("Give python file location where all functions and import statements are written please: ").strip())) |
|
32
|
|
|
if(check_("Will you like to add more python files which are imported by the main file? yes/no: ")): |
|
33
|
|
|
extra_file_paths=set([os.path.abspath(os.path.expanduser(i)) for i in input("Give the location of extra_files seperated by space : ").split() if(i!="")]) |
|
34
|
|
|
else: |
|
35
|
|
|
extra_file_paths=[] |
|
36
|
|
|
with tempfile.TemporaryDirectory() as tmpdirname: |
|
37
|
|
|
os.chdir(tmpdirname) |
|
38
|
|
|
exec("git clone -q https://github.com/Souvic/package_creator.git") |
|
39
|
|
|
exec("rm -rf ./package_creator/.git") |
|
40
|
|
|
|
|
41
|
|
|
package_name=input("Choose name of this package please: ") |
|
42
|
|
|
author_name=input("Author's name please: ") |
|
43
|
|
|
author_email=input("Author's EmailId please: ") |
|
44
|
|
|
|
|
45
|
|
|
python_requires=input("Required minimum Python version to run this package please(e.g. 3.6): ") |
|
46
|
|
|
|
|
47
|
|
|
rep_url=input("Go to github.com, create an empty repository(without any file) with project name, copy-paste the link here please: ") |
|
48
|
|
|
if(not rep_url.lower().endswith(".git")): |
|
49
|
|
|
rep_url=rep_url+".git" |
|
50
|
|
|
format_readme(rep_url) |
|
51
|
|
|
with open("./package_creator/src/package_name/__init__.py","w") as f: |
|
52
|
|
|
f.write(open(file_path,"r").read()) |
|
53
|
|
|
exec("pipreqs ./package_creator/") |
|
54
|
|
|
print("install_requires in setup.cfg is filled up with minimum requirements from pipreqs package") |
|
55
|
|
|
print("Feel free to change setup.cfg after this in your github repo directly in case of different versions to be used") |
|
56
|
|
|
with open("./package_creator/requirements.txt") as f: |
|
57
|
|
|
install_requires="".join(["\n\t"+i for i in f.read().replace("==",">=").split("\n")]) |
|
58
|
|
|
|
|
59
|
|
|
with open("./package_creator/setup.cfg","r") as f: |
|
60
|
|
|
su=f.read() |
|
61
|
|
|
su=su.format(package_name=package_name,author_name=author_name,author_email=author_email,python_requires=python_requires,install_requires=install_requires,rep_url=rep_url) |
|
62
|
|
|
with open("./package_creator/setup.cfg","w") as f: |
|
63
|
|
|
f.write(su) |
|
64
|
|
|
for ii in extra_file_paths: |
|
65
|
|
|
exec(f"cp {ii} ./package_creator/src/package_name/") |
|
66
|
|
|
os.rename("./package_creator/src/package_name","./package_creator/src/"+package_name) |
|
67
|
|
|
|
|
68
|
|
|
#exec("python3 -m twine upload --repository testpypi") |
|
69
|
|
|
os.chdir("./package_creator/") |
|
70
|
|
|
exec("python3 -m build") |
|
71
|
|
|
exec("git init") |
|
72
|
|
|
exec("git add -A") |
|
73
|
|
|
#exec("git add .") |
|
74
|
|
|
exec("git commit -m 'First commit in the new package'") |
|
75
|
|
|
print("Uploading to github") |
|
76
|
|
|
print("Get ready with your github username and passtoken") |
|
77
|
|
|
exec("git branch -M main") |
|
78
|
|
|
exec(f"git remote add origin {rep_url}") |
|
79
|
|
|
exec("git push -u origin main") |
|
80
|
|
|
print("Done!!") |
|
81
|
|
|
print("All set up!!") |
|
82
|
|
|
print(f"\n\n\n__________________________\nYou may now go to {rep_url[:-4]} and change atleast README.MD and description in setup.cfg") |
|
83
|
|
|
print("You may require to also change requirements.txt and install_requires,python_requires on setup.cfg if you feel so") |
|
84
|
|
|
print("To upload to PyPI and reflect the new changes, run this command(cmpp) once again! This time you already have a github repo.") |
|
85
|
|
|
|
|
86
|
|
|
|
|
87
|
|
|
def uploadpackage(): |
|
88
|
|
|
with tempfile.TemporaryDirectory() as tmpdirname: |
|
89
|
|
|
os.chdir(tmpdirname) |
|
90
|
|
|
rep_url=input("Copy-paste the link of the github repo of the project please: ") |
|
91
|
|
|
if(not rep_url.lower().endswith(".git")): |
|
92
|
|
|
rep_url=rep_url+".git" |
|
93
|
|
|
exec(f"git clone -q {rep_url}") |
|
94
|
|
|
dir_ = [i for i in os.listdir() if os.path.isdir(i)][0] |
|
95
|
|
|
os.chdir(dir_) |
|
96
|
|
|
exec(f"rm -rf ./dist") |
|
97
|
|
|
|
|
98
|
|
|
print("\n\n\n_____________________________IMPORTANT________________________________\n\nYour package requires atleast these packages listed in requirements.txt and install_requires part of setup.cfg file.") |
|
99
|
|
|
print("These are listed by pipreqs") |
|
100
|
|
|
exec("pipreqs --print ./") |
|
101
|
|
|
print("\n\nThese are the packages listed in requirements.txt : ") |
|
102
|
|
|
exec("cat requirements.txt") |
|
103
|
|
|
tempprint="" |
|
104
|
|
|
print("\n\nThese are the packages listed in install_requires part of setup.cfg file : ") |
|
105
|
|
|
with open("setup.cfg","r") as f: |
|
106
|
|
|
flag=False |
|
107
|
|
|
for j in f: |
|
108
|
|
|
if(not j[0].isspace()): |
|
109
|
|
|
flag=False |
|
110
|
|
|
if(flag): |
|
111
|
|
|
tempprint+=j.strip()+"\n" |
|
112
|
|
|
if(j.startswith("install_requires")): |
|
113
|
|
|
flag=True |
|
114
|
|
|
|
|
115
|
|
|
|
|
116
|
|
|
print(tempprint) |
|
117
|
|
|
print("If you notice any discrepency, abort now and update requirements.txt setup.cfg file(install_requires and python_requires).\n") |
|
118
|
|
|
if(check_("Abort/continue? (see above why..) Write 'abort' to stop exeution or 'continue' to go ahead uploading with current settings : ","abort","continue")): |
|
119
|
|
|
raise NameError('Aborted as you wished!! \nMake necessary changes on the repo now.') |
|
120
|
|
|
nft_=check_("Are you uploading this package to PyPi for the first time? yes/no: ","no","yes") |
|
121
|
|
|
if(nft_): |
|
122
|
|
|
with open("./setup.cfg","r") as f: |
|
123
|
|
|
zz=f.read().split("\n") |
|
124
|
|
|
if(zz[2].startswith("version")): |
|
125
|
|
|
kindex=2 |
|
126
|
|
|
else: |
|
127
|
|
|
for jkl in range(len(zz)): |
|
128
|
|
|
if(zz[jkl].startswith("version")): |
|
129
|
|
|
kindex=jkl |
|
130
|
|
|
break; |
|
131
|
|
|
|
|
132
|
|
|
|
|
133
|
|
|
print(f"The old {zz[kindex]}") |
|
134
|
|
|
new_version_number=input("Choose a new version number: ") |
|
135
|
|
|
zz[kindex]="version = "+new_version_number |
|
136
|
|
|
with open("./setup.cfg","w") as f: |
|
137
|
|
|
f.write("\n".join(zz)) |
|
138
|
|
|
exec("python3 -m build") |
|
139
|
|
|
exec("git add -A") |
|
140
|
|
|
exec("git commit -m 'New version is released now'") |
|
141
|
|
|
if(nft_): |
|
142
|
|
|
exec(f"git tag v{new_version_number}") |
|
143
|
|
|
exec(f"git push origin v{new_version_number}") |
|
144
|
|
|
else: |
|
145
|
|
|
exec("git tag v0.0.1") |
|
146
|
|
|
exec("git push origin v0.0.1") |
|
147
|
|
|
exec("git push -u origin main") |
|
148
|
|
|
print("Updated github repo!") |
|
149
|
|
|
exec("twine upload dist/*") |
|
150
|
|
|
print("Updated to PyPi! New version has been released!") |
|
151
|
|
|
|
|
152
|
|
|
|
|
153
|
|
|
def main(): |
|
154
|
|
|
if(check_("Have you already uploaded the project once to github repo ? yes/no: ")): |
|
155
|
|
|
uploadpackage() |
|
156
|
|
|
else: |
|
157
|
|
|
create_package() |
|
158
|
|
|
|
|
159
|
|
|
|
|
160
|
|
|
|
|
161
|
|
|
|