diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0df1bcc --- /dev/null +++ b/.gitignore @@ -0,0 +1,170 @@ +__pycache__/# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + + +# End of https://www.toptal.com/developers/gitignore/api/python +main.py \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3d1b036 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Capregsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..fff7921 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include database/hawqalDB.sqlite \ No newline at end of file diff --git a/README.md b/README.md index 617230e..ee89f9b 100644 --- a/README.md +++ b/README.md @@ -1 +1,62 @@ -# Hawqal-python +![](http://ForTheBadge.com/images/badges/made-with-python.svg) + +# Hawqal + +Python package that contains the data of world's countries,states and their cities name + +## Functions + +- Get Countries +- Get Cities By State +- Get State By Country +- Get Cities By Country + +## Installation Guide + +- windows + +```python +pip install hawqal + +``` + +- Unix/macOS + +``` +python3 -m pip install hawqal +``` + +## Usage/Examples + +```python +from hawqal.country import Country +Country.getCountries() + +from hawqal.cities import City +City.getCities("countries name", "state") + +from hawqal.states import StatesByCountry +StatesByCountry.getStates() + +from hawqal.citiesbycountry import CitiesByCountry +CitiesByCountry.getCities("country name") + +``` + +## Success Response + +- ['Afghanistan', 'Aland Islands', 'Albania', 'Algeria', . . . ] +- ['Alabama', 'Alaska', 'American Samoa', 'Arizona', . . . ] + +## Error Response + +- [ ] + +## Tech Stack + +**Client:** Python 3.10.9 + +## Authors + +- [Capregsoft](https://www.github.com/capregsoft) +- [Husnain Khurshid](https://www.github.com/husnain9) diff --git a/dal/dao.py b/dal/dao.py new file mode 100644 index 0000000..a941852 --- /dev/null +++ b/dal/dao.py @@ -0,0 +1,9 @@ +import sqlite3 + + +class Database: + def __init__(self, path): + self.databasePath = path + + def makeConnection(self): + return sqlite3.connect(f"{self.databasePath}") diff --git a/database/hawqalDB.sqlite b/database/hawqalDB.sqlite new file mode 100644 index 0000000..d387796 Binary files /dev/null and b/database/hawqalDB.sqlite differ diff --git a/hawqal/__init__.py b/hawqal/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hawqal/cities.py b/hawqal/cities.py new file mode 100644 index 0000000..cb4573a --- /dev/null +++ b/hawqal/cities.py @@ -0,0 +1,22 @@ +from dal.dao import Database +import string +import os + + +class City: + + @staticmethod + def getCities(country, state): + cities = [] + country = string.capwords(country) + state = string.capwords(state) + dirname = os.path.dirname(__file__) + file_name = os.path.join(dirname, '..', 'database', 'hawqalDB.sqlite') + with open(file_name, 'r', encoding="utf8") as db: + database = Database(file_name).makeConnection() + cursor = database.cursor() + data = cursor.execute( + f"SELECT cities.name FROM cities,states WHERE cities.state_id=states.state_id AND states.name = '{state}' AND states.country_name = '{country}'") + for row in data: + cities.append([row[0]]) + return cities diff --git a/hawqal/citiesbycountry.py b/hawqal/citiesbycountry.py new file mode 100644 index 0000000..85cffe7 --- /dev/null +++ b/hawqal/citiesbycountry.py @@ -0,0 +1,21 @@ +from dal.dao import Database +import string +import os + + +class CitiesByCountry: + + @staticmethod + def getCities(country): + states = [] + country = string.capwords(country) + dirname = os.path.dirname(__file__) + file_name = os.path.join(dirname, '..', 'database', 'hawqalDB.sqlite') + with open(file_name, 'r', encoding="utf8") as db: + database = Database(file_name).makeConnection() + cursor = database.cursor() + data = cursor.execute( + f'SELECT name FROM cities WHERE country_name = "{country}"') + for row in data: + states.append(f'{row[0]}') + return states diff --git a/hawqal/country.py b/hawqal/country.py new file mode 100644 index 0000000..a928a89 --- /dev/null +++ b/hawqal/country.py @@ -0,0 +1,20 @@ +from dal.dao import Database +import os + + +class Country: + + @staticmethod + def getCountries(): + countries = [] + + dirname = os.path.dirname(__file__) + file_name = os.path.join(dirname, '..', 'database', 'hawqalDB.sqlite') + with open(file_name, 'r', encoding="utf8") as db: + database = Database(file_name).makeConnection() + cursor = database.cursor() + data = cursor.execute( + f"SELECT * FROM countries ORDER BY country_id ASC") + for row in data: + countries.append(f'{row[1]}') + return countries diff --git a/hawqal/states.py b/hawqal/states.py new file mode 100644 index 0000000..ab66ca9 --- /dev/null +++ b/hawqal/states.py @@ -0,0 +1,21 @@ +from dal.dao import Database +import string +import os + + +class StatesByCountry: + + @staticmethod + def getStates(country): + states = [] + country = string.capwords(country) + dirname = os.path.dirname(__file__) + file_name = os.path.join(dirname, '..', 'database', 'hawqalDB.sqlite') + with open(file_name, 'r', encoding="utf8") as db: + database = Database(file_name).makeConnection() + cursor = database.cursor() + data = cursor.execute( + f'SELECT name FROM states WHERE country_name = "{country}"') + for row in data: + states.append(f'{row[0]}') + return states diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5ae5140 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +#Python version 3.10.9 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..97c9be1 --- /dev/null +++ b/setup.py @@ -0,0 +1,31 @@ +"""Python setup.py for hawqal package""" +import os +from setuptools import setup + + +def read(fname): + return open(os.path.join(os.path.dirname(__file__), fname)).read() + + +setup( + name="hawqal", + version="0.1.5.8", + description="Python package that contains the data of world's countries,states and their cities name", + long_description_content_type="text/markdown", + long_description=read('README.md'), + url="https://github.com/CapregSoft/Hawqal-python.git", + keywords=['husnain khurshid', 'capregsoft', + 'hawqal', 'world data', 'states'], + author="Husnain Khurshid", + author_email="muhammadhusnainkh@gmail.com", + packages=["hawqal", "dal", "database"], + include_package_data=True, + classifiers=[ + "Development Status :: 1 - Planning", + "Intended Audience :: Developers", + "Programming Language :: Python :: 3", + "Operating System :: Unix", + "Operating System :: MacOS :: MacOS X", + "Operating System :: Microsoft :: Windows" + ], +) diff --git a/test/test_hawqal.py b/test/test_hawqal.py new file mode 100644 index 0000000..6483bba --- /dev/null +++ b/test/test_hawqal.py @@ -0,0 +1,26 @@ +import unittest +from hawqal.country import Country +from hawqal.states import StatesByCountry +from hawqal.cities import City +from hawqal.citiesbycountry import CitiesByCountry + + +class TestFunc(unittest.TestCase): + + def test_getCountries(self): + self.assertEqual(len(Country.getCountries()), 250) + + def test_getStates(self): + self.assertEqual(len(StatesByCountry.getStates("Pakistan")), 8) + + def test_getCities(self): + self.assertEqual(len(City.getCities("Pakistan", "Punjab")), 214) + + def test_getCitiesByCountry(self): + expected = len(CitiesByCountry.getCities("Pakistan")) + self.assertEqual( + len(CitiesByCountry.getCities("Pakistan")), expected) + + +if __name__ == '__main__': + unittest.main()