From 55011e2dc276fdc81dbd456eb41efe7eccc10011 Mon Sep 17 00:00:00 2001 From: muhammad-usman-108 Date: Mon, 27 May 2024 23:09:50 +0200 Subject: [PATCH] Cleanup --- build/lib/src/__init__.py | 0 build/lib/src/medium.py | 153 ------------------ build/lib/test/__init__.py | 0 build/lib/test/test_medium.py | 14 -- dist/medium_article_py-0.1.3-py3-none-any.whl | Bin 4209 -> 0 bytes dist/medium_article_py-0.1.3.tar.gz | Bin 3566 -> 0 bytes medium_article_py.egg-info/PKG-INFO | 56 ------- medium_article_py.egg-info/SOURCES.txt | 12 -- .../dependency_links.txt | 1 - medium_article_py.egg-info/requires.txt | 1 - medium_article_py.egg-info/top_level.txt | 2 - setup.py | 2 +- src/__pycache__/__init__.cpython-312.pyc | Bin 145 -> 0 bytes src/__pycache__/medium.cpython-312.pyc | Bin 8639 -> 0 bytes 14 files changed, 1 insertion(+), 240 deletions(-) delete mode 100644 build/lib/src/__init__.py delete mode 100644 build/lib/src/medium.py delete mode 100644 build/lib/test/__init__.py delete mode 100644 build/lib/test/test_medium.py delete mode 100644 dist/medium_article_py-0.1.3-py3-none-any.whl delete mode 100644 dist/medium_article_py-0.1.3.tar.gz delete mode 100644 medium_article_py.egg-info/PKG-INFO delete mode 100644 medium_article_py.egg-info/SOURCES.txt delete mode 100644 medium_article_py.egg-info/dependency_links.txt delete mode 100644 medium_article_py.egg-info/requires.txt delete mode 100644 medium_article_py.egg-info/top_level.txt delete mode 100644 src/__pycache__/__init__.cpython-312.pyc delete mode 100644 src/__pycache__/medium.cpython-312.pyc diff --git a/build/lib/src/__init__.py b/build/lib/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/build/lib/src/medium.py b/build/lib/src/medium.py deleted file mode 100644 index 9954965..0000000 --- a/build/lib/src/medium.py +++ /dev/null @@ -1,153 +0,0 @@ -import requests - -class MediumArticles: - def __init__(self): - self.URL = 'https://api.rss2json.com/v1/api.json?rss_url=https://medium.com/feed/' - self.error = { - "message": "Invalid username..." - } - - def get_base_url(self, username: str) -> str: - if username.strip().startswith('@'): - username = username[1:] - return f"{self.URL}@{username}" - - def get_data(self, username: str) -> dict: - try: - response = requests.get(self.get_base_url(username)) - response.raise_for_status() - data = response.json() - return data - except requests.exceptions.RequestException as e: - print(f'An error occurred while fetching data: {e}') - return {'error': 'An error occurred while fetching data'} - - def check_error(self, response: dict) -> bool: - return response.get('status') != 'ok' - - def get_profile_url(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['feed']['url'] - except Exception as e: - print(f'An error occurred while getting profile URL: {e}') - return self.error["message"] - - def get_profile_title(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['feed']['title'] - except Exception as e: - print(f'An error occurred while getting profile title: {e}') - return self.error["message"] - - def get_profile_author(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['feed']['author'] - except Exception as e: - print(f'An error occurred while getting profile author: {e}') - return self.error["message"] - - def get_profile_description(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['feed']['description'] - except Exception as e: - print(f'An error occurred while getting profile description: {e}') - return self.error["message"] - - def get_profile_image_url(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['feed']['image'] - except Exception as e: - print(f'An error occurred while getting profile image URL: {e}') - return self.error["message"] - - def get_latest_article_title(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['items'][0]['title'] - except Exception as e: - print(f'An error occurred while getting latest article title: {e}') - return self.error["message"] - - def get_latest_article_publication_date(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['items'][0]['pubDate'] - except Exception as e: - print(f'An error occurred while getting latest article publication date: {e}') - return self.error["message"] - - def get_latest_article_url(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['items'][0]['link'] - except Exception as e: - print(f'An error occurred while getting latest article URL: {e}') - return self.error["message"] - - def get_latest_article_description(self, username: str) -> str: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['items'][0]['description'] - except Exception as e: - print(f'An error occurred while getting latest article description: {e}') - return self.error["message"] - - def get_latest_article(self, username: str) -> dict: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - return data['items'][0] - except Exception as e: - print(f'An error occurred while getting latest article: {e}') - return self.error["message"] - - def get_latest_articles_title(self, username: str) -> list: - try: - data = self.get_data(username) - if self.check_error(data): - return self.error["message"] - res = [item['title'] for item in data['items']] - return res - except Exception as e: - print(f'An error occurred while getting latest article titles: {e}') - return self.error["message"] - -# Example usage -# if __name__ == "__main__": -# medium = MediumArticles() -# username = "@engrmuhammadusman108" -# print(medium.get_profile_url(username)) -# print(medium.get_profile_title(username)) -# print(medium.get_profile_author(username)) -# print(medium.get_profile_description(username)) -# print(medium.get_profile_image_url(username)) -# print(medium.get_latest_article_title(username)) -# print(medium.get_latest_article_publication_date(username)) -# print(medium.get_latest_article_url(username)) -# print(medium.get_latest_article_description(username)) -# print(medium.get_latest_article(username)) -# print(medium.get_latest_articles_title(username)) diff --git a/build/lib/test/__init__.py b/build/lib/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/build/lib/test/test_medium.py b/build/lib/test/test_medium.py deleted file mode 100644 index 8e6996f..0000000 --- a/build/lib/test/test_medium.py +++ /dev/null @@ -1,14 +0,0 @@ -import unittest -from src.medium import MediumArticles - -class TestOperations(unittest.TestCase): - def setUp(self): - self.medium_articles = MediumArticles() - self.username = "@engrmuhammadusman108" - - def test_get_profile_url(self): - result = self.medium_articles.get_profile_url(self.username) - self.assertEqual(result, 'https://medium.com/feed/@engrmuhammadusman108') - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/dist/medium_article_py-0.1.3-py3-none-any.whl b/dist/medium_article_py-0.1.3-py3-none-any.whl deleted file mode 100644 index 668eafc57b744485ef1d92eaec9b461631b178ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4209 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.6 -License-File: LICENSE -Requires-Dist: requests - -medium-article-py -==================================================== - -A Python library designed to retrieve articles and user information from Medium. This library offers an easy-to-use method for developers to incorporate Medium content into their applications. - - -Installation ------------- - -You can install this library using pip. - -.. code-block:: python - - pip install medium-article-py - - -Usage ------------- - -Here is a simple example to get you started: - -.. code-block:: python - - from medium-article-py import MediumArticles - username = '' - - print(MediumArticles.get_profile_url(username)) - # Output: https://medium.com/feed/@engrmuhammadusman108 - - - -Contributing ------------- - -- [Misbah Afzal](https://github.com/misbahafzal) -- [Muhammad Usman](https://github.com/muhammad-usman-108) - -LICENSE ------------- - -This project is licensed under the MIT License - see the [LICENSE](https://github.com/muhammad-usman-108/medium-article-api/blob/main/LICENSE) file for details. diff --git a/medium_article_py.egg-info/SOURCES.txt b/medium_article_py.egg-info/SOURCES.txt deleted file mode 100644 index f6299da..0000000 --- a/medium_article_py.egg-info/SOURCES.txt +++ /dev/null @@ -1,12 +0,0 @@ -LICENSE -README.rst -setup.py -medium_article_py.egg-info/PKG-INFO -medium_article_py.egg-info/SOURCES.txt -medium_article_py.egg-info/dependency_links.txt -medium_article_py.egg-info/requires.txt -medium_article_py.egg-info/top_level.txt -src/__init__.py -src/medium.py -test/__init__.py -test/test_medium.py \ No newline at end of file diff --git a/medium_article_py.egg-info/dependency_links.txt b/medium_article_py.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/medium_article_py.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/medium_article_py.egg-info/requires.txt b/medium_article_py.egg-info/requires.txt deleted file mode 100644 index f229360..0000000 --- a/medium_article_py.egg-info/requires.txt +++ /dev/null @@ -1 +0,0 @@ -requests diff --git a/medium_article_py.egg-info/top_level.txt b/medium_article_py.egg-info/top_level.txt deleted file mode 100644 index 281df39..0000000 --- a/medium_article_py.egg-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -src -test diff --git a/setup.py b/setup.py index 1dac8a6..ae9fe75 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name='medium-article-py', - version='v0.1.5', + version='v0.1.6', description='A simple python library for Medium Articles APIs', long_description=long_description, author='Muhammad Usman', diff --git a/src/__pycache__/__init__.cpython-312.pyc b/src/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1ab9d267ea0687f125722219bf0687979dbc4ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 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 Q^)I&9Mhh<~q`KCB0a9MA4gdfE