Python pprint Exercise - Fetch information about a project
5. Fetch PyPI Project Info with Pprint
Write a Python program to fetch information about a project (from PyPI) using pprint() function.
Sample Solution:
Python Code:
import json
import pprint
from urllib.request import urlopen
with urlopen('https://pypi.org/pypi/scriptgen/json') as resp:
    project_info = json.load(resp)['info']
pprint.pprint(project_info)
Sample Output:
{'author': 'Elmer Nocon, fopoon',
 'author_email': 'elmernocon@gmail.com',
 'bugtrack_url': None,
 'classifiers': ['Development Status :: 1 - Planning',
                 'License :: OSI Approved :: MIT License',
                 'Operating System :: MacOS :: MacOS X',
                 'Operating System :: Microsoft :: Windows :: Windows 10',
                 'Operating System :: Unix',
                 'Programming Language :: Python :: 3',
                 'Programming Language :: Python :: 3 :: Only',
                 'Programming Language :: Python :: 3.7'],
 'description': '[//]: # (Auto-generated: 2021-01-13T09:44:07.865904)\n'
                '\n'
                '# scriptgen\n'
                '\n'
                '[//]: # (badges)\n'
                '[](https://github.com/Fopoon/scriptgen)\n'
                '[](https://github.com/Fopoon/scriptgen/releases)\n'
                '[](https://pypi.org/project/scriptgen/#history)\n'
                '\n'
                '\n'
                '[](LICENSE.txt)\n'
                '\n'
                '[](https://pepy.tech/project/scriptgen)\n'
                '\n'
                'A collection of script generation helpers and templates.\n'
                '\n'
                '## Installation\n'
                '\n'
                '```sh\n'
                'pip install scriptgen\n'
                '```\n'
                '\n'
                '## Usage\n'
                '\n'
                '```python\n'
                'from scriptgen import StringBuilder\n'
                '\n'
                '\n'
                'if __name__ == "__main__":\n'
                '    # Create a StringBuilder instance.\n'
                '    sb = StringBuilder()\n'
                '\n'
                '    sb.wt("Hello ")  # write text "Hello "\n'
                '    sb.wl("World!")  # write line "World!\\n"\n'
                '\n'
                '    print(str(sb))\n'
                '```\n'
                '\n'
                '```\n'
                'Hello World!\n'
                '\n'
                '```\n'
                '\n'
                '
\n'
                '\n'
                '```python\n'
                'from scriptgen import StringBuilder\n'
                '\n'
                'from scriptgen.templates.csharp import \\\n'
                '    csharp_usings, \\\n'
                '    csharp_namespace, \\\n'
                '    csharp_class, \\\n'
                '    csharp_method\n'
                '\n'
                '\n'
                'if __name__ == "__main__":\n'
                '    # Create a StringBuilder instance.\n'
                '    sb = StringBuilder()\n'
                '\n'
                '    # Write using statements.\n'
                '    sb.wb(csharp_usings(\n'
                '        "System"\n'
                '    ))\n'
                '\n'
                '    # Add a new line after the using statements.\n'
                '    sb.nl()\n'
                '\n'
                '    # Create a namespace StringBuilder instance.\n'
                '    ns = csharp_namespace("Sample")\n'
                '\n'
                '    # Create a class StringBuilder instance.\n'
                '    c = csharp_class(\n'
                '        class_name="Program",\n'
                '        access_modifier="public"\n'
                '    )\n'
                '\n'
                '    # Create a method StringBuilder instance.\n'
                '    m = csharp_method(\n'
                '        method_name="Main",\n'
                '        access_modifier="public static",\n'
                '        return_type="int"\n'
                '    )\n'
                '\n'
                '    # Write the following lines inside the method.\n'
                '    m.wl(\'Console.WriteLine("Hello World!");\')\n'
                '    m.wl("return 0;")\n'
                '\n'
                '    c.wb(m)  # Write the method inside the class.\n'
                '    ns.wb(c)  # Write the class inside the namespace.\n'
                '    sb.wb(ns)  # Write the namespace.\n'
                '\n'
                '    print(str(sb))\n'
                '\n'
                '```\n'
                '\n'
                '```csharp\n'
                'using System;\n'
                '\n'
                'namespace Sample\n'
                '{\n'
                '    public class Program\n'
                '    {\n'
                '        public static int Main()\n'
                '        {\n'
                '            Console.WriteLine("Hello World!");\n'
                '            return 0;\n'
                '        }\n'
                '    }\n'
                '}\n'
                '\n'
                '```\n'
                '\n'
                '
\n'
                '\n'
                '```python\n'
                'from scriptgen import StringBuilder\n'
                '\n'
                'from scriptgen.templates.csharp import \\\n'
                '    csharp_autogen, \\\n'
                '    csharp_namespace, \\\n'
                '    csharp_class, \\\n'
                '    csharp_region\n'
                '\n'
                '\n'
                'if __name__ == "__main__":\n'
                '    # Get version from arguments..\n'
                '    # i.e. python script.py -major 0 -minor 0 -patch 1\n'
                '    major: int = 0\n'
                '    minor: int = 0\n'
                '    patch: int = 1\n'
                '\n'
                '    # Create a StringBuilder instance.\n'
                '    sb = StringBuilder()\n'
                '\n'
                '    # Write timestamp.\n'
                '    sb.wb(csharp_autogen())\n'
                '\n'
                '    # Add a new line after the using statements.\n'
                '    sb.nl()\n'
                '\n'
                '    # Create a namespace StringBuilder instance.\n'
                '    ns = csharp_namespace("Sample")\n'
                '\n'
                '    # Create a class StringBuilder instance.\n'
                '    c = csharp_class(\n'
                '        class_name="BuildInfo",\n'
                '        access_modifier="public static partial"\n'
                '    )\n'
                '\n'
                '    # Create a "Constants" region StringBuilder instance.\n'
                '    r = csharp_region("Constants")\n'
                '\n'
                '    # Write the following lines inside the "Constants" '
                'region.\n'
                '    r.wl(f"public const int MAJOR = {major};")\n'
                '    r.nl()\n'
                '    r.wl(f"public const int MINOR = {minor};")\n'
                '    r.nl()\n'
                '    r.wl(f"public const int PATCH = {patch};")\n'
                '\n'
                '    c.wb(r)  # Write the region inside the class.\n'
                '    ns.wb(c)  # Write the class inside the namespace.\n'
                '    sb.wb(ns)  # Write the namespace.\n'
                '\n'
                '    print(str(sb))\n'
                '\n'
                '```\n'
                '\n'
                '```csharp\n'
                '// Auto-generated: 2020-03-15T04:20:47.909851\n'
                '\n'
                'namespace Sample\n'
                '{\n'
                '    public static partial class BuildInfo\n'
                '    {\n'
                '        #region Constants\n'
                '\n'
                '        public const int MAJOR = 0;\n'
                '\n'
                '        public const int MINOR = 0;\n'
                '\n'
                '        public const int PATCH = 1;\n'
                '\n'
                '        #endregion Constants\n'
                '    }\n'
                '}\n'
                '\n'
                '```\n'
                '\n'
                '
\n'
                '\n'
                'Look at this [script](tools/gen_docs.py) to see its practical '
                'use case.\n'
                '\n'
                '## Contribution\n'
                '\n'
                'Suggestions and contributions are always welcome.\n'
                'Make sure to read the [Contribution '
                'Guidelines](CONTRIBUTING.md) file for more information before '
                'submitting a `pull request`.\n'
                '\n'
                '## License\n'
                '\n'
                '`scriptgen` is released under the MIT License. See the '
                '[LICENSE](LICENSE.txt) file for details.\n'
                '\n'
                '\n'
                '# Changelog\n'
                '\n'
                '## v0.0.5\n'
                '- Fixed multiple new lines in Windows.\n'
                '- Added more C# templates.\n'
                '\n'
                '## v0.0.4\n'
                '\n'
                '- Added XML templates.\n'
                '\n'
                '## v0.0.3\n'
                '\n'
                '- Added index parameter in filter_func.\n'
                '- Changed from current working path to file directory path in '
                '`gen_docs.py` script.\n'
                '\n'
                '## v0.0.2\n'
                '\n'
                '- Added default values for the builder classes.\n'
                '- Added optional parameters.\n'
                '- Exposed `CSharpBlockBuilder` class in '
                '`scriptgen.templates.csharp` package.\n'
                '- Bug fixes.\n'
                '\n'
                '## v0.0.1\n'
                '\n'
                '- Added `IndentType`, `StringBuilder`, and `BlockBuilder` '
                'classes.\n'
                '- Added `diff_lines`, `diff_text`, `interpolate_text`, '
                '`timestamp`, and `write_text_file` utility methods.\n'
                '- Added C# and Markdown templates.\n'
                '- Added tests for the utility methods, C# templates, and '
                'Markdown templates.\n'
                '- Added `gen_docs.py` script and template files.\n'
                '\n',
 'description_content_type': 'text/markdown',
 'docs_url': None,
 'download_url': 'https://pypi.org/project/scriptgen/',
 'downloads': {'last_day': -1, 'last_month': -1, 'last_week': -1},
 'home_page': 'https://github.com/Fopoon/scriptgen',
 'keywords': '',
 'license': 'MIT',
 'maintainer': '',
 'maintainer_email': '',
 'name': 'scriptgen',
 'package_url': 'https://pypi.org/project/scriptgen/',
 'platform': 'Any',
 'project_url': 'https://pypi.org/project/scriptgen/',
 'project_urls': {'Download': 'https://pypi.org/project/scriptgen/',
                  'Homepage': 'https://github.com/Fopoon/scriptgen'},
 'release_url': 'https://pypi.org/project/scriptgen/0.0.5/',
 'requires_dist': None,
 'requires_python': '',
 'summary': 'A collection of script generation helpers and templates.',
 'version': '0.0.5',
 'yanked': False,
 'yanked_reason': None}
Flowchart:
 
For more Practice: Solve these Related Problems:
- Write a Python program that fetches metadata for a PyPI project using the requests module and pretty-prints the JSON response using pprint.
- Write a Python function that retrieves information about a PyPI package (like version, author, and summary) and then uses pprint to display the information in a readable format.
- Write a Python script to query the PyPI JSON API for a specified package and then use pprint to print key metadata, such as license and project URL.
- Write a Python program to fetch and pretty-print detailed project information from PyPI, then filter the output to only show selected fields (e.g., author, email, and description).
Go to:
Previous: Specify the indentation while printing a nested dictionary.
Next:   Get project information limiting the results to a certain level.
Python Code Editor:
Have another way to solve this solution? Contribute your code (and comments) through Disqus.
What is the difficulty level of this exercise?
Test your Programming skills with w3resource's quiz.
