1
- import click
2
-
3
- # Define a comprehensive list of valid licenses from GitHub
4
- VALID_LICENSES = [
5
- 'MIT' , 'Apache-2.0' , 'GPL-3.0' , 'LGPL-3.0' , 'BSD-2-Clause' , 'BSD-3-Clause' ,
6
- 'CC0-1.0' , 'MPL-2.0' , 'EPL-2.0' , 'AGPL-3.0' , 'MIT-0' , 'ISC' , 'Unlicense'
7
- ]
8
-
9
- # Define available classifiers for easier reference
10
- DEFAULT_CLASSIFIERS = [
11
- "Development Status :: 5 - Production/Stable" ,
12
- "Intended Audience :: Developers" ,
13
- "Programming Language :: Python :: 3" ,
14
- "License :: OSI Approved :: MIT" ,
15
- "Operating System :: OS Independent"
16
- ]
17
-
18
- @click .command ()
19
- @click .argument ("project_name" )
20
- def generate_setup (project_name ):
21
- """
22
- Generate a complete setup.py and README.md file for a new Python project, asking the user for all details dynamically.
23
- """
24
- click .echo ("Generating setup.py and README.md..." )
25
-
26
- # Asking for required details
27
- version = click .prompt ("Version (e.g., 0.1.0)" , type = str , default = "0.1.0" )
28
- description = click .prompt ("Short project description (optional)" , type = str , default = "" )
29
- long_description = click .prompt ("Long description (optional, use content from your README.md)" , type = str , default = "" )
30
-
31
- # Author info now optional
32
- author = click .prompt ("Author name (optional)" , type = str , default = "" )
33
- author_email = click .prompt ("Author email (optional)" , type = str , default = "" )
34
-
35
- # Asking for license selection by index
36
- click .echo ("Select a license:" )
37
- for idx , license in enumerate (VALID_LICENSES ):
38
- click .echo (f"{ idx } . { license } " )
39
- license_idx = click .prompt ("License (Enter the index number)" , type = int , default = 0 )
40
- license_type = VALID_LICENSES [license_idx ]
41
-
42
- python_version = click .prompt ("Minimum Python version required (e.g., 3.8)" , type = str , default = "3.8" )
43
-
44
- # Optional fields with defaults if left empty
45
- dependencies = click .prompt ("Comma-separated list of dependencies (leave empty for none)" , default = "" , type = str )
46
- dependencies = [dep .strip () for dep in dependencies .split ("," ) if dep .strip ()]
47
-
48
- test_dependencies = click .prompt ("Comma-separated list of test dependencies (leave empty for none)" , default = "" ,
49
- type = str )
50
- test_dependencies = [dep .strip () for dep in test_dependencies .split ("," ) if dep .strip ()]
51
-
52
- # URLs now optional
53
- project_url = click .prompt ("Project URL (optional)" , type = str , default = "" )
54
- bug_tracker_url = click .prompt ("Bug tracker URL (optional)" , type = str , default = "" )
55
- documentation_url = click .prompt ("Documentation URL (optional)" , type = str , default = "" )
56
-
57
- # Ask if the user wants to specify classifiers
58
- click .echo ("Would you like to specify 'Development Status', 'Intended Audience', and 'Programming Language'?" )
59
- use_classifiers = click .confirm ("Specify classifiers?" , default = False )
60
-
61
- classifiers = DEFAULT_CLASSIFIERS
62
- if use_classifiers :
63
- # Development Status
64
- development_status = click .prompt ("Select 'Development Status' (e.g., 1 - Planning, 2 - Pre-Alpha, etc.)" , type = str , default = "5 - Production/Stable" )
65
- classifiers [0 ] = f"Development Status :: { development_status } "
66
-
67
- # Intended Audience
68
- audience = click .prompt ("Select 'Intended Audience' (e.g., Developers, Education, etc.)" , type = str , default = "Developers" )
69
- classifiers [1 ] = f"Intended Audience :: { audience } "
70
-
71
- # Programming Language
72
- language = click .prompt ("Select 'Programming Language' (e.g., Python :: 3)" , type = str , default = "Python :: 3" )
73
- classifiers [2 ] = f"Programming Language :: { language } "
74
-
75
- # Prepare the content for the README.md file
76
- readme_content = f"# { project_name } \n \n { long_description if long_description else 'Project description' } \n "
77
-
78
- # Prepare the content for the setup.py file
79
- setup_content = f"""
80
- from setuptools import setup, find_packages
81
-
82
- VERSION = "{ version } " # Version of your package
83
- DESCRIPTION = '{ description if description else "Project description" } ' # Short description
84
-
85
- # Long description of the project (can be pulled from README.md)
86
- LONG_DESCRIPTION = '''{ long_description if long_description else 'Detailed project description from README.md' } '''
87
-
88
- setup(
89
- name="{ project_name } ", # Name of your package
90
- version=VERSION, # Package version
91
- author="{ author if author else '' } ", # Author name
92
- author_email="{ author_email if author_email else '' } ", # Author's email
93
- description=DESCRIPTION, # Short description
94
- long_description=LONG_DESCRIPTION, # Detailed description from README.md
95
- long_description_content_type="text/markdown", # Format of the long description
96
- url="{ project_url if project_url else '' } ", # URL to the project's GitHub page
97
- packages=find_packages(), # Automatically find all packages in the directory
98
- classifiers={ classifiers } , # List of classifiers to categorize your package
99
- python_requires=">={ python_version } ", # Minimum Python version required
100
- install_requires={ dependencies } , # List of dependencies
101
- setup_requires=["pytest-runner"], # For running tests during installation
102
- tests_require={ test_dependencies } , # Specify dependencies needed for running tests
103
- license="{ license_type } ", # License under which the project is released
104
- project_urls={{ # Additional URLs related to your project
105
- "Source Code": "{ project_url } " ,
106
- "Bug Tracker": "{ bug_tracker_url } ",
107
- "Documentation": "{ documentation_url } ",
108
- }},
109
- )
110
- """
111
-
112
- # Create the README.md and setup.py files in the current directory
113
- with open ("README.md" , "w" ) as readme_file :
114
- readme_file .write (readme_content )
115
-
116
- with open ("setup.py" , "w" ) as setup_file :
117
- setup_file .write (setup_content )
118
-
119
- print (f"README.md and setup.py have been successfully generated for project '{ project_name } '." )
120
-
121
- if __name__ == "__main__" :
122
- generate_setup ()
1
+ import sys
2
+
3
+ import click
4
+
5
+ from setups .help import print_help
6
+
7
+ # Define a comprehensive list of valid licenses from GitHub
8
+ VALID_LICENSES = [
9
+ 'MIT' , 'Apache-2.0' , 'GPL-3.0' , 'LGPL-3.0' , 'BSD-2-Clause' , 'BSD-3-Clause' ,
10
+ 'CC0-1.0' , 'MPL-2.0' , 'EPL-2.0' , 'AGPL-3.0' , 'MIT-0' , 'ISC' , 'Unlicense'
11
+ ]
12
+
13
+ # Define available classifiers for easier reference
14
+ DEFAULT_CLASSIFIERS = [
15
+ "Development Status :: 5 - Production/Stable" ,
16
+ "Intended Audience :: Developers" ,
17
+ "Programming Language :: Python :: 3" ,
18
+ "License :: OSI Approved :: MIT" ,
19
+ "Operating System :: OS Independent"
20
+ ]
21
+
22
+ @click .command (help = "Generate a complete setup.py and README.md file for a new Python project." )
23
+ @click .argument ("project_name" , required = False )
24
+ @click .option ('--help' , '-h' , is_flag = True , help = "Show this message and exit." )
25
+ def generate_setup (project_name , help ):
26
+ if help :
27
+ print_help ()
28
+ else :
29
+ if not project_name :
30
+ click .echo ("Error: Missing argument 'PROJECT_NAME'." )
31
+ click .echo (generate_setup .get_help (click .Context (generate_setup )))
32
+ return
33
+
34
+ """
35
+ Generate a complete setup.py and README.md file for a new Python project, asking the user for all details dynamically.
36
+ """
37
+ click .echo ("Generating setup.py and README.md..." )
38
+
39
+ # Asking for required details
40
+ version = click .prompt ("Version (e.g., 0.1.0)" , type = str , default = "0.1.0" )
41
+ description = click .prompt ("Short project description (optional)" , type = str , default = "" )
42
+ long_description = click .prompt ("Long description (optional, use content from your README.md)" , type = str , default = "" )
43
+
44
+ # Author info now optional
45
+ author = click .prompt ("Author name (optional)" , type = str , default = "" )
46
+ author_email = click .prompt ("Author email (optional)" , type = str , default = "" )
47
+
48
+ # Asking for license selection by index
49
+ click .echo ("Select a license:" )
50
+ for idx , license in enumerate (VALID_LICENSES ):
51
+ click .echo (f"{ idx } . { license } " )
52
+ license_idx = click .prompt ("License (Enter the index number)" , type = int , default = 0 )
53
+ license_type = VALID_LICENSES [license_idx ]
54
+
55
+ python_version = click .prompt ("Minimum Python version required (e.g., 3.8)" , type = str , default = "3.8" )
56
+
57
+ # Optional fields with defaults if left empty
58
+ dependencies = click .prompt ("Comma-separated list of dependencies (leave empty for none)" , default = "" , type = str )
59
+ dependencies = [dep .strip () for dep in dependencies .split ("," ) if dep .strip ()]
60
+
61
+ test_dependencies = click .prompt ("Comma-separated list of test dependencies (leave empty for none)" , default = "" ,
62
+ type = str )
63
+ test_dependencies = [dep .strip () for dep in test_dependencies .split ("," ) if dep .strip ()]
64
+
65
+ # URLs now optional
66
+ project_url = click .prompt ("Project URL (optional)" , type = str , default = "" )
67
+ bug_tracker_url = click .prompt ("Bug tracker URL (optional)" , type = str , default = "" )
68
+ documentation_url = click .prompt ("Documentation URL (optional)" , type = str , default = "" )
69
+
70
+ # Ask if the user wants to specify classifiers
71
+ click .echo ("Would you like to specify 'Development Status', 'Intended Audience', and 'Programming Language'?" )
72
+ use_classifiers = click .confirm ("Specify classifiers?" , default = False )
73
+
74
+ classifiers = DEFAULT_CLASSIFIERS
75
+ if use_classifiers :
76
+ # Development Status
77
+ development_status = click .prompt ("Select 'Development Status' (e.g., 1 - Planning, 2 - Pre-Alpha, etc.)" , type = str , default = "5 - Production/Stable" )
78
+ classifiers [0 ] = f"Development Status :: { development_status } "
79
+
80
+ # Intended Audience
81
+ audience = click .prompt ("Select 'Intended Audience' (e.g., Developers, Education, etc.)" , type = str , default = "Developers" )
82
+ classifiers [1 ] = f"Intended Audience :: { audience } "
83
+
84
+ # Programming Language
85
+ language = click .prompt ("Select 'Programming Language' (e.g., Python :: 3)" , type = str , default = "Python :: 3" )
86
+ classifiers [2 ] = f"Programming Language :: { language } "
87
+
88
+ # Prepare the content for the README.md file
89
+ readme_content = f"# { project_name } \n \n { long_description if long_description else 'Project description' } \n "
90
+
91
+ # Prepare the content for the setup.py file
92
+ setup_content = f"""
93
+ from setuptools import setup, find_packages
94
+
95
+ VERSION = "{ version } " # Version of your package
96
+ DESCRIPTION = '{ description if description else "Project description" } ' # Short description
97
+
98
+ # Long description of the project (can be pulled from README.md)
99
+ LONG_DESCRIPTION = '''{ long_description if long_description else 'Detailed project description from README.md' } '''
100
+
101
+ setup(
102
+ name="{ project_name } ", # Name of your package
103
+ version=VERSION, # Package version
104
+ author="{ author if author else '' } ", # Author name
105
+ author_email="{ author_email if author_email else '' } ", # Author's email
106
+ description=DESCRIPTION, # Short description
107
+ long_description=LONG_DESCRIPTION, # Detailed description from README.md
108
+ long_description_content_type="text/markdown", # Format of the long description
109
+ url="{ project_url if project_url else '' } ", # URL to the project's GitHub page
110
+ packages=find_packages(), # Automatically find all packages in the directory
111
+ classifiers={ classifiers } , # List of classifiers to categorize your package
112
+ python_requires=">={ python_version } ", # Minimum Python version required
113
+ install_requires={ dependencies } , # List of dependencies
114
+ setup_requires=["pytest-runner"], # For running tests during installation
115
+ extras_require={{'test': { test_dependencies } }},
116
+ license="{ license_type } ", # License under which the project is released
117
+ project_urls={{ # Additional URLs related to your project
118
+ "Source Code": "{ project_url } "
119
+ "Bug Tracker": "{ bug_tracker_url } "
120
+ "Documentation": "{ documentation_url } "
121
+ }},
122
+ )
123
+ """
124
+
125
+ # Create the README.md and setup.py files in the current directory
126
+ with open ("README.md" , "w" ) as readme_file :
127
+ readme_file .write (readme_content )
128
+
129
+ with open ("setup.py" , "w" ) as setup_file :
130
+ setup_file .write (setup_content )
131
+
132
+ print (f"README.md and setup.py have been successfully generated for project '{ project_name } '." )
133
+
134
+ if __name__ == "__main__" :
135
+ generate_setup ()
0 commit comments