# SmartFaker
A powerful asynchronous Python library for generating fake addresses and IBANs, supporting up to 181 countries for addresses and 50+ countries for IBANs. Ideal for bots, MTProto API frameworks, and Python scripts.
---
## What's New in Version 3.25.1
- **Added IBAN Generation**: Generate valid IBANs for over 53 countries with detailed breakdowns (e.g., bank code, account number).
- Improved metadata for proper author display in PyPI.
- Fixed typo in description ("Asyncrhonous" to "Asynchronous").
---
## Installation
Install SmartFaker via pip:
```bash
pip install smartfaker
```
---
## Usage
SmartFaker supports both asynchronous and synchronous generation of fake addresses and IBANs. Below are examples for using the library in different contexts.
### Basic Asyncio Example
This example demonstrates the menu-driven interface for generating addresses, listing available address countries, generating IBANs, and listing available IBAN countries.
```python
import asyncio
from smartfaker import Faker
fake = Faker()
async def main():
while True:
print("\nSelect an option:")
print("1. Generate Fake Address Based On Code")
print("2. Get Available Fake Address Countries")
print("3. Generate Fake Iban Based On Code")
print("4. Get Available Fake Ibans Countries")
print("5. Exit")
choice = input("Enter your choice (1-5): ").strip()
if choice == "1":
print("Enter country code (e.g., DE):")
country_code = input().strip().upper()
if not country_code:
print("Country code is required.")
continue
print("Enter amount (default 1):")
amount_input = input().strip()
amount = 1 if not amount_input else int(amount_input)
try:
addresses = await fake.address(country_code, amount)
print("Addresses:")
if amount == 1:
print(addresses)
else:
for addr in addresses:
print(addr)
except ValueError as e:
print(f"Error: {e}")
elif choice == "2":
countries = fake.countries()
print("Available Fake Address Countries:")
for country in countries:
print(f"{country['country_code']}: {country['country_name']}")
elif choice == "3":
print("Enter country code (e.g., DE):")
country_code = input().strip().upper()
if not country_code:
print("Country code is required.")
continue
print("Enter amount (default 1):")
amount_input = input().strip()
amount = 1 if not amount_input else int(amount_input)
try:
ibans = await fake.iban(country_code, amount)
print("IBANs:")
if amount == 1:
print(ibans)
else:
for iban in ibans:
print(iban)
except ValueError as e:
print(f"Error: {e}")
elif choice == "4":
countries = fake.iban_countries()
print("Available Fake IBAN Countries:")
for country in countries:
print(f"{country['country_code']}: {country['country_name']}")
elif choice == "5":
print("Exiting...")
break
else:
print("Invalid choice. Please select 1, 2, 3, 4, or 5.")
if __name__ == "__main__":
asyncio.run(main())
```
### Basic Pyrofork Example
This example shows how to integrate SmartFaker with a Pyrofork bot to generate fake addresses via Telegram commands.
```python
import asyncio
import logging
from pyrogram import Client, filters
from pyrogram.types import Message, InlineKeyboardButton, InlineKeyboardMarkup
from pyrogram.enums import ParseMode
from smartfaker import Faker
import pycountry
LOGGER = logging.getLogger(__name__)
LOGGER.setLevel(logging.INFO)
COMMAND_PREFIX = ["/", ",", ".", "!", "#"]
app = Client(
"my_bot",
api_id=YOUR_API_ID,
api_hash="YOUR_API_HASH",
bot_token="YOUR_BOT_TOKEN"
)
fake = Faker()
page_data = {}
def get_flag(country_code):
try:
return ''.join(chr(0x1F1E6 + ord(c) - ord('A')) for c in country_code.upper())
except Exception:
return "🏚"
@app.on_message(filters.command("start", prefixes=COMMAND_PREFIX) & (filters.private | filters.group))
async def start_handler(client: Client, message: Message):
welcome_text = (
"**Welcome to SmartFaker Bot! 🚀**\n"
"**━━━━━━━━━━━━━**\n"
"Generate fake addresses easily!\n"
"Use **/fake <code>** for an address (e.g., /fake BD).\n"
"Use **/countries** to list available countries.\n"
"**━━━━━━━━━━━━━**\n"
"Powered by @ISmartCoder | Updates: t.me/TheSmartDev"
)
await client.send_message(message.chat.id, welcome_text, parse_mode=ParseMode.MARKDOWN)
@app.on_message(filters.command(["fake", "rnd"], prefixes=COMMAND_PREFIX) & (filters.private | filters.group))
async def fake_handler(client: Client, message: Message):
if len(message.command) <= 1:
await client.send_message(message.chat.id, "**❌ Please Provide A Country Code**", parse_mode=ParseMode.MARKDOWN)
LOGGER.warning(f"Invalid command format: {message.text}")
return
country_code = message.command[1].upper()
if country_code == "UK":
country_code = "GB"
generating_message = await client.send_message(message.chat.id, "**Generating Fake Address...**", parse_mode=ParseMode.MARKDOWN)
try:
data = await fake.address(country_code)
flag_emoji = data['country_flag']
keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton("Copy Postal Code", callback_data=f"copy:{data['postal_code']}")]
])
await generating_message.edit_text(
f"**Address for {data['country']} {flag_emoji}**\n"
f"**━━━━━━━━━━━━━**\n"
f"**- Street :** `{data['street_address']}`\n"
f"**- Full Name :** `{data['person_name']}`\n"
f"**- City/Town/Village :** `{data['city']}`\n"
f"**- Gender :** `{data['gender']}`\n"
f"**- Postal Code :** `{data['postal_code']}`\n"
f"**- Phone Number :** `{data['phone_number']}`\n"
f"**- Country :** `{data['country']}`\n"
f"**━━━━━━━━━━━━━**\n"
f"**Click Below Button For Code 👇**",
parse_mode=ParseMode.MARKDOWN,
reply_markup=keyboard
)
LOGGER.info(f"Sent fake address for {country_code} in chat {message.chat.id}")
except ValueError as e:
LOGGER.error(f"Fake address error for country '{country_code}': {e}")
await generating_message.edit_text("**❌ Sorry, Fake Address Generator Failed**", parse_mode=ParseMode.MARKDOWN)
except Exception as e:
LOGGER.error(f"Fake address error for country '{country_code}': {e}")
await generating_message.edit_text("**❌ Sorry, Fake Address Generator Failed**", parse_mode=ParseMode.MARKDOWN)
@app.on_message(filters.command("countries", prefixes=COMMAND_PREFIX) & (filters.private | filters.group))
async def countries_handler(client: Client, message: Message):
chat_id = message.chat.id
page_data[chat_id] = page_data.get(chat_id, 0)
countries = fake.countries()
total_pages = (len(countries) + 9) // 10
if not countries or total_pages == 0:
await client.send_message(message.chat.id, "No countries available.")
return
await send_countries_page(client, chat_id, 0, page_data[chat_id]) # Use 0 for initial message_id
async def send_countries_page(client: Client, chat_id: int, message_id: int, page: int):
countries = fake.countries()
total_pages = (len(countries) + 9) // 10
start_idx = page * 10
end_idx = min(start_idx + 10, len(countries))
current_countries = countries[start_idx:end_idx]
response = "**Available Countries (Page {}/{}):**\n\n".format(page + 1, total_pages)
for i, country in enumerate(current_countries, start=start_idx + 1):
flag = get_flag(country['country_code'])
response += f"**{i}. {country['country_name']}**\n"
response += f" - Code: {country['country_code']}\n"
response += f" - Flag: {flag}\n\n"
markup = InlineKeyboardMarkup(inline_keyboard=[])
row = []
if page > 0:
row.append(InlineKeyboardButton("Previous", callback_data=f"prev:{page}:{chat_id}"))
if page < total_pages - 1:
row.append(InlineKeyboardButton("Next", callback_data=f"next:{page}:{chat_id}"))
if row:
markup.inline_keyboard.append(row)
if message_id == 0:
sent_msg = await client.send_message(chat_id, response, parse_mode=ParseMode.MARKDOWN, reply_markup=markup)
return
await client.edit_message_text(chat_id, message_id, response, parse_mode=ParseMode.MARKDOWN, reply_markup=markup)
@app.on_callback_query(filters.regex(r"^(prev|next):(\d+):(\d+)$"))
async def pagination_handler(client: Client, callback_query):
action, page_str, chat_id_str = callback_query.data.split(':')
page = int(page_str)
chat_id = int(chat_id_str)
total_pages = (len(fake.countries()) + 9) // 10
if action == "prev" and page > 0:
page -= 1
elif action == "next" and page < total_pages - 1:
page += 1
await send_countries_page(client, chat_id, callback_query.message.id, page)
await callback_query.answer()
if __name__ == "__main__":
app.run()
```
---
## Features
- **Asynchronous**: Built with `asyncio` for non-blocking performance.
- **Address Generation**: Supports fake addresses for 181 countries with details like street, city, postal code, and phone number.
- **IBAN Generation**: Generates valid IBANs for over 50 countries with detailed breakdowns (e.g., bank code, account number).
- **Country Listing**: Easily list supported countries for both addresses and IBANs.
- **Bot Integration**: Seamless integration with Telegram bots via Pyrofork or other MTProto frameworks.
- **Lightweight**: Minimal dependencies, requiring only `pycountry`.
---
## Contributing
Contributions are welcome! Please fork the repository and submit a pull request. For issues, report them on the [GitHub Issues](https://github.com/abirxdhack/TheSmartFaker/issues) page.
---
## License
SmartFaker is licensed under the [MIT License](LICENSE).
---
## Contact
- **Author**: @ISmartCoder
- **Email**: abrixdhackz.info.me@gmail.com
- **Updates Channel**: [t.me/TheSmartDev](https://t.me/TheSmartDev)
- **Documentation**: [SmartFaker Docs](https://abirxdhack.github.io/SmartFakerDocs)
Raw data
{
"_id": null,
"home_page": null,
"name": "smartfaker",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "address-generator, fake-data, faker, iban-generator, mtproto, python-library, telegram-bot",
"author": null,
"author_email": "ISmartCoder <abrixdhackz.info.me@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/1e/00/5189ce1a5fdeb262acbe69d07a5801cd7c4391c9abe2473e2c3052740496/smartfaker-3.25.1.tar.gz",
"platform": null,
"description": "# SmartFaker\n\nA powerful asynchronous Python library for generating fake addresses and IBANs, supporting up to 181 countries for addresses and 50+ countries for IBANs. Ideal for bots, MTProto API frameworks, and Python scripts.\n\n---\n\n## What's New in Version 3.25.1\n- **Added IBAN Generation**: Generate valid IBANs for over 53 countries with detailed breakdowns (e.g., bank code, account number).\n- Improved metadata for proper author display in PyPI.\n- Fixed typo in description (\"Asyncrhonous\" to \"Asynchronous\").\n\n---\n\n## Installation\n\nInstall SmartFaker via pip:\n\n```bash\npip install smartfaker\n```\n\n---\n\n## Usage\n\nSmartFaker supports both asynchronous and synchronous generation of fake addresses and IBANs. Below are examples for using the library in different contexts.\n\n### Basic Asyncio Example\n\nThis example demonstrates the menu-driven interface for generating addresses, listing available address countries, generating IBANs, and listing available IBAN countries.\n\n```python\nimport asyncio\nfrom smartfaker import Faker\n\nfake = Faker()\n\nasync def main():\n while True:\n print(\"\\nSelect an option:\")\n print(\"1. Generate Fake Address Based On Code\")\n print(\"2. Get Available Fake Address Countries\")\n print(\"3. Generate Fake Iban Based On Code\")\n print(\"4. Get Available Fake Ibans Countries\")\n print(\"5. Exit\")\n choice = input(\"Enter your choice (1-5): \").strip()\n if choice == \"1\":\n print(\"Enter country code (e.g., DE):\")\n country_code = input().strip().upper()\n if not country_code:\n print(\"Country code is required.\")\n continue\n print(\"Enter amount (default 1):\")\n amount_input = input().strip()\n amount = 1 if not amount_input else int(amount_input)\n try:\n addresses = await fake.address(country_code, amount)\n print(\"Addresses:\")\n if amount == 1:\n print(addresses)\n else:\n for addr in addresses:\n print(addr)\n except ValueError as e:\n print(f\"Error: {e}\")\n elif choice == \"2\":\n countries = fake.countries()\n print(\"Available Fake Address Countries:\")\n for country in countries:\n print(f\"{country['country_code']}: {country['country_name']}\")\n elif choice == \"3\":\n print(\"Enter country code (e.g., DE):\")\n country_code = input().strip().upper()\n if not country_code:\n print(\"Country code is required.\")\n continue\n print(\"Enter amount (default 1):\")\n amount_input = input().strip()\n amount = 1 if not amount_input else int(amount_input)\n try:\n ibans = await fake.iban(country_code, amount)\n print(\"IBANs:\")\n if amount == 1:\n print(ibans)\n else:\n for iban in ibans:\n print(iban)\n except ValueError as e:\n print(f\"Error: {e}\")\n elif choice == \"4\":\n countries = fake.iban_countries()\n print(\"Available Fake IBAN Countries:\")\n for country in countries:\n print(f\"{country['country_code']}: {country['country_name']}\")\n elif choice == \"5\":\n print(\"Exiting...\")\n break\n else:\n print(\"Invalid choice. Please select 1, 2, 3, 4, or 5.\")\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n```\n\n### Basic Pyrofork Example\n\nThis example shows how to integrate SmartFaker with a Pyrofork bot to generate fake addresses via Telegram commands.\n\n```python\nimport asyncio\nimport logging\nfrom pyrogram import Client, filters\nfrom pyrogram.types import Message, InlineKeyboardButton, InlineKeyboardMarkup\nfrom pyrogram.enums import ParseMode\nfrom smartfaker import Faker\nimport pycountry\n\nLOGGER = logging.getLogger(__name__)\nLOGGER.setLevel(logging.INFO)\n\nCOMMAND_PREFIX = [\"/\", \",\", \".\", \"!\", \"#\"]\n\napp = Client(\n \"my_bot\",\n api_id=YOUR_API_ID,\n api_hash=\"YOUR_API_HASH\",\n bot_token=\"YOUR_BOT_TOKEN\"\n)\n\nfake = Faker()\npage_data = {}\n\ndef get_flag(country_code):\n try:\n return ''.join(chr(0x1F1E6 + ord(c) - ord('A')) for c in country_code.upper())\n except Exception:\n return \"\ud83c\udfda\"\n\n@app.on_message(filters.command(\"start\", prefixes=COMMAND_PREFIX) & (filters.private | filters.group))\nasync def start_handler(client: Client, message: Message):\n welcome_text = (\n \"**Welcome to SmartFaker Bot! \ud83d\ude80**\\n\"\n \"**\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501**\\n\"\n \"Generate fake addresses easily!\\n\"\n \"Use **/fake <code>** for an address (e.g., /fake BD).\\n\"\n \"Use **/countries** to list available countries.\\n\"\n \"**\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501**\\n\"\n \"Powered by @ISmartCoder | Updates: t.me/TheSmartDev\"\n )\n await client.send_message(message.chat.id, welcome_text, parse_mode=ParseMode.MARKDOWN)\n\n@app.on_message(filters.command([\"fake\", \"rnd\"], prefixes=COMMAND_PREFIX) & (filters.private | filters.group))\nasync def fake_handler(client: Client, message: Message):\n if len(message.command) <= 1:\n await client.send_message(message.chat.id, \"**\u274c Please Provide A Country Code**\", parse_mode=ParseMode.MARKDOWN)\n LOGGER.warning(f\"Invalid command format: {message.text}\")\n return\n \n country_code = message.command[1].upper()\n if country_code == \"UK\":\n country_code = \"GB\"\n \n generating_message = await client.send_message(message.chat.id, \"**Generating Fake Address...**\", parse_mode=ParseMode.MARKDOWN)\n \n try:\n data = await fake.address(country_code)\n flag_emoji = data['country_flag']\n keyboard = InlineKeyboardMarkup(inline_keyboard=[\n [InlineKeyboardButton(\"Copy Postal Code\", callback_data=f\"copy:{data['postal_code']}\")]\n ])\n await generating_message.edit_text(\n f\"**Address for {data['country']} {flag_emoji}**\\n\"\n f\"**\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501**\\n\"\n f\"**- Street :** `{data['street_address']}`\\n\"\n f\"**- Full Name :** `{data['person_name']}`\\n\"\n f\"**- City/Town/Village :** `{data['city']}`\\n\"\n f\"**- Gender :** `{data['gender']}`\\n\"\n f\"**- Postal Code :** `{data['postal_code']}`\\n\"\n f\"**- Phone Number :** `{data['phone_number']}`\\n\"\n f\"**- Country :** `{data['country']}`\\n\"\n f\"**\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501**\\n\"\n f\"**Click Below Button For Code \ud83d\udc47**\",\n parse_mode=ParseMode.MARKDOWN,\n reply_markup=keyboard\n )\n LOGGER.info(f\"Sent fake address for {country_code} in chat {message.chat.id}\")\n except ValueError as e:\n LOGGER.error(f\"Fake address error for country '{country_code}': {e}\")\n await generating_message.edit_text(\"**\u274c Sorry, Fake Address Generator Failed**\", parse_mode=ParseMode.MARKDOWN)\n except Exception as e:\n LOGGER.error(f\"Fake address error for country '{country_code}': {e}\")\n await generating_message.edit_text(\"**\u274c Sorry, Fake Address Generator Failed**\", parse_mode=ParseMode.MARKDOWN)\n\n@app.on_message(filters.command(\"countries\", prefixes=COMMAND_PREFIX) & (filters.private | filters.group))\nasync def countries_handler(client: Client, message: Message):\n chat_id = message.chat.id\n page_data[chat_id] = page_data.get(chat_id, 0)\n \n countries = fake.countries()\n total_pages = (len(countries) + 9) // 10\n if not countries or total_pages == 0:\n await client.send_message(message.chat.id, \"No countries available.\")\n return\n \n await send_countries_page(client, chat_id, 0, page_data[chat_id]) # Use 0 for initial message_id\n\nasync def send_countries_page(client: Client, chat_id: int, message_id: int, page: int):\n countries = fake.countries()\n total_pages = (len(countries) + 9) // 10\n start_idx = page * 10\n end_idx = min(start_idx + 10, len(countries))\n current_countries = countries[start_idx:end_idx]\n \n response = \"**Available Countries (Page {}/{}):**\\n\\n\".format(page + 1, total_pages)\n for i, country in enumerate(current_countries, start=start_idx + 1):\n flag = get_flag(country['country_code'])\n response += f\"**{i}. {country['country_name']}**\\n\"\n response += f\" - Code: {country['country_code']}\\n\"\n response += f\" - Flag: {flag}\\n\\n\"\n \n markup = InlineKeyboardMarkup(inline_keyboard=[])\n row = []\n if page > 0:\n row.append(InlineKeyboardButton(\"Previous\", callback_data=f\"prev:{page}:{chat_id}\"))\n if page < total_pages - 1:\n row.append(InlineKeyboardButton(\"Next\", callback_data=f\"next:{page}:{chat_id}\"))\n if row:\n markup.inline_keyboard.append(row)\n \n if message_id == 0:\n sent_msg = await client.send_message(chat_id, response, parse_mode=ParseMode.MARKDOWN, reply_markup=markup)\n return \n \n await client.edit_message_text(chat_id, message_id, response, parse_mode=ParseMode.MARKDOWN, reply_markup=markup)\n\n@app.on_callback_query(filters.regex(r\"^(prev|next):(\\d+):(\\d+)$\"))\nasync def pagination_handler(client: Client, callback_query):\n action, page_str, chat_id_str = callback_query.data.split(':')\n page = int(page_str)\n chat_id = int(chat_id_str)\n \n total_pages = (len(fake.countries()) + 9) // 10\n if action == \"prev\" and page > 0:\n page -= 1\n elif action == \"next\" and page < total_pages - 1:\n page += 1\n \n await send_countries_page(client, chat_id, callback_query.message.id, page)\n await callback_query.answer()\n\nif __name__ == \"__main__\":\n app.run()\n```\n\n---\n\n## Features\n- **Asynchronous**: Built with `asyncio` for non-blocking performance.\n- **Address Generation**: Supports fake addresses for 181 countries with details like street, city, postal code, and phone number.\n- **IBAN Generation**: Generates valid IBANs for over 50 countries with detailed breakdowns (e.g., bank code, account number).\n- **Country Listing**: Easily list supported countries for both addresses and IBANs.\n- **Bot Integration**: Seamless integration with Telegram bots via Pyrofork or other MTProto frameworks.\n- **Lightweight**: Minimal dependencies, requiring only `pycountry`.\n\n---\n\n## Contributing\nContributions are welcome! Please fork the repository and submit a pull request. For issues, report them on the [GitHub Issues](https://github.com/abirxdhack/TheSmartFaker/issues) page.\n\n---\n\n## License\nSmartFaker is licensed under the [MIT License](LICENSE).\n\n---\n\n## Contact\n- **Author**: @ISmartCoder\n- **Email**: abrixdhackz.info.me@gmail.com\n- **Updates Channel**: [t.me/TheSmartDev](https://t.me/TheSmartDev)\n- **Documentation**: [SmartFaker Docs](https://abirxdhack.github.io/SmartFakerDocs)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A powerful Asynchronous Python library for generating fake addresses and IBANs, supporting bots, MTProto API frameworks, and Python scripts",
"version": "3.25.1",
"project_urls": {
"Changelog": "https://github.com/abirxdhack/TheSmartFaker/releases",
"Documentation": "https://abirxdhack.github.io/SmartFakerDocs",
"Homepage": "https://github.com/abirxdhack/TheSmartFaker",
"Source": "https://github.com/abirxdhack/TheSmartFaker",
"Tracker": "https://github.com/abirxdhack/TheSmartFaker/issues"
},
"split_keywords": [
"address-generator",
" fake-data",
" faker",
" iban-generator",
" mtproto",
" python-library",
" telegram-bot"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "440448320676b9ce3b30cfcd407ecfd31fee9e21d737c20d72ff8243542a0a13",
"md5": "130cd19274579a20e5e3575945ca99f3",
"sha256": "06767627aff794d830a25428045a9d35beced79c586953f68f7e2cfa71a077f9"
},
"downloads": -1,
"filename": "smartfaker-3.25.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "130cd19274579a20e5e3575945ca99f3",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 235115,
"upload_time": "2025-08-18T14:39:01",
"upload_time_iso_8601": "2025-08-18T14:39:01.969694Z",
"url": "https://files.pythonhosted.org/packages/44/04/48320676b9ce3b30cfcd407ecfd31fee9e21d737c20d72ff8243542a0a13/smartfaker-3.25.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1e005189ce1a5fdeb262acbe69d07a5801cd7c4391c9abe2473e2c3052740496",
"md5": "9c45d01dba952ad58008b017f7c3a3eb",
"sha256": "e8281685551cfb4387225c75ab321a5ecc819445002af94e0b048db5c3859dab"
},
"downloads": -1,
"filename": "smartfaker-3.25.1.tar.gz",
"has_sig": false,
"md5_digest": "9c45d01dba952ad58008b017f7c3a3eb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 167256,
"upload_time": "2025-08-18T14:39:03",
"upload_time_iso_8601": "2025-08-18T14:39:03.391619Z",
"url": "https://files.pythonhosted.org/packages/1e/00/5189ce1a5fdeb262acbe69d07a5801cd7c4391c9abe2473e2c3052740496/smartfaker-3.25.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-18 14:39:03",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "abirxdhack",
"github_project": "TheSmartFaker",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "pycountry",
"specs": []
}
],
"lcname": "smartfaker"
}