Skip to main content

irvalidate

CI PyPI License: MIT

کتابخانه‌ی سبک و بدون وابستگی پایتون برای اعتبارسنجی داده‌های ایرانی: کد ملی، شناسه ملی شرکت، شماره کارت، شبا، موبایل، تلفن ثابت و کد پستی؛ با پیام خطای فارسی، تولید داده‌ی تستی و ولیدیتور آماده برای Pydantic/FastAPI، Django و WTForms.

A tiny, zero-dependency Python library for validating Iranian data (national ID, legal ID, bank card, Sheba/IBAN, mobile, landline, postal code), with Persian/English error messages, test-data generators and ready-made Pydantic/FastAPI, Django and WTForms validators.

نصب

pip install irvalidate

# با یکپارچگی فریم‌ورک موردنظر
pip install "irvalidate[pydantic]"   # Pydantic v2 / FastAPI
pip install "irvalidate[django]"
pip install "irvalidate[wtforms]"

یا مستقیم از گیت‌هاب: pip install git+https://github.com/mehdirzfx/irvalidate.git

نیازمند پایتون ۳.۹ به بالا.

استفاده‌ی سریع

from irvalidate import (
    is_valid_national_id, is_valid_legal_id, is_valid_card_number,
    is_valid_sheba, is_valid_mobile, is_valid_landline, is_valid_postal_code,
    card_bank, sheba_bank, mobile_operator, landline_area, normalize_mobile,
)

is_valid_national_id("0013542419")      # True
is_valid_national_id("۰۰۱۳۵۴۲۴۱۹")      # True  (ارقام فارسی هم پشتیبانی می‌شود)
is_valid_legal_id("14003778990")        # True  (شناسه ملی شرکت‌ها)

is_valid_card_number("6037-9910-0000-0004")        # True
card_bank("6037991000000004").name_fa              # 'بانک ملی ایران'

is_valid_sheba("IR580540105180021273113007")       # True (پیشوند IR اختیاری است)
sheba_bank("IR580540105180021273113007").name_en   # 'Parsian Bank'

is_valid_mobile("+98 912 345 6789")                # True
normalize_mobile("۰۹۱۲۳۴۵۶۷۸۹")                     # '09123456789'
mobile_operator("09351234567")                     # 'Irancell'

is_valid_landline("021-22345678")                  # True
landline_area("02122345678").province_fa           # 'تهران'

is_valid_postal_code("1593764856")                 # True

دلیل خطا

توابع validate_* به‌جای فقط False، دلیل را هم می‌گویند:

from irvalidate import validate_national_id, set_default_language

r = validate_national_id("1234567890")
bool(r)          # False
r.code           # 'bad_checksum'
r.message        # 'کد ملی نامعتبر است (رقم کنترلی اشتباه است)'
r.message_en     # 'national ID is invalid (checksum mismatch)'

ok = validate_national_id("۰۰۱۳۵۴۲۴۱۹")
ok.value         # '0013542419'  (مقدار نرمال‌شده)

ok.raise_for_error()   # مقدار نرمال‌شده را برمی‌گرداند، یا ValidationError (زیرکلاس ValueError)

set_default_language("en")   # زبان پیش‌فرض r.message و پیام‌های فریم‌ورک‌ها

کدهای خطا: not_a_string، empty، invalid_characters، invalid_length، all_same_digits، bad_checksum، invalid_format، unknown_area_code.

برای هر نوع، validate_national_id، validate_legal_id، validate_card_number، validate_sheba، validate_mobile، validate_landline و validate_postal_code وجود دارد.

یکپارچگی با فریم‌ورک‌ها

Pydantic / FastAPI

from fastapi import FastAPI
from pydantic import BaseModel
from irvalidate.integrations.pydantic import NationalId, MobileNumber

class User(BaseModel):
    national_id: NationalId   # "۰۰۱۳۵۴۲۴۱۹" -> "0013542419"
    mobile: MobileNumber      # "+98 912 345 6789" -> "09123456789"

app = FastAPI()

@app.post("/users")
def create(user: User):
    return user

انواع موجود: NationalId، LegalId، CardNumber، Sheba، MobileNumber، PostalCode، Landline. مقدار خروجی همیشه نرمال‌شده است. ورودی باید رشته باشد.

Django

from django.db import models
from irvalidate.integrations.django import national_id_validator, mobile_validator

class Profile(models.Model):
    national_id = models.CharField(max_length=10, validators=[national_id_validator])
    mobile = models.CharField(max_length=14, validators=[mobile_validator])

کد خطا در ValidationError.code قرار می‌گیرد. ولیدیتورها: national_id_validator، legal_id_validator، card_number_validator، sheba_validator، mobile_validator، postal_code_validator، landline_validator.

WTForms

from wtforms import Form, StringField
from irvalidate.integrations.wtforms import NationalId, MobileNumber

class SignupForm(Form):
    national_id = StringField(validators=[NationalId()])
    mobile = StringField(validators=[MobileNumber(message="موبایل درست نیست")])

تولید داده‌ی تستی

import random
from irvalidate import (
    generate_national_id, generate_legal_id, generate_card_number, generate_sheba,
    generate_mobile, generate_landline, generate_postal_code,
)

generate_national_id()                        # '1043321810' (نمونه‌ی تصادفی معتبر)
generate_card_number(bank="Mellat")           # کارت معتبر با BIN بانک ملت
generate_sheba(bank="ملی")                    # شبای معتبر بانک ملی
generate_mobile("Irancell")                   # '0937xxxxxxx'
generate_landline("021")                      # '021xxxxxxxx'

rng = random.Random(42)                       # نتیجه‌ی تکرارپذیر
generate_national_id(rng=rng)

مقادیر تولیدشده فقط از نظر ساختار و رقم کنترلی معتبرند و برای داده‌ی فیک در تست‌اند. ممکن است تصادفاً با مقدار واقعی کسی یکی باشند؛ برای جعل هویت یا کارهای مشابه استفاده نکنید. تولیدکننده‌ی پیش‌فرض برای امنیت مناسب نیست.

فرمت و ماسک

from irvalidate import (
    mask_card_number, format_card_number, format_sheba, format_mobile,
    format_landline, to_persian_digits,
)

mask_card_number("6037991000000004")     # '6037-99**-****-0004'
format_card_number("6037991000000004")   # '6037-9910-0000-0004'
format_sheba("IR580540105180021273113007")  # 'IR58 0540 1051 8002 1273 1130 07'
format_mobile("+989123456789")           # '0912 345 6789'
format_landline("02122345678")           # '021-22345678'
to_persian_digits("0912")                # '۰۹۱۲'

تلفن ثابت

شماره‌ی ثابت = پیش‌شماره‌ی استان + شماره‌ی ۸ رقمی (که با ۰ یا ۱ شروع نمی‌شود). پیش‌شماره‌ی هر ۳۱ استان در irvalidate.landline.AREA_CODES هست. فرمت‌های 02122345678، 2122345678، +982122345678 و 00982122345678 پذیرفته می‌شوند. شماره‌های قدیمیِ ۷ رقمی و شماره‌های خدماتی (مثل ۱۱۰) پشتیبانی نمی‌شوند.

خط فرمان

irvalidate national-id 0013542419
irvalidate card 6037991000000004
irvalidate sheba IR580540105180021273113007
irvalidate national-id 1234567890      # invalid + reason: bad_checksum
irvalidate card --generate             # یک کارت معتبر تستی
# انواع: national-id, legal-id, card, sheba, mobile, landline, postal-code

کد خروج ۰ (معتبر) یا ۱ (نامعتبر) است و برای اسکریپت‌ها مناسب است.

نکات مهم

  • ورودی را رشته بدهید، نه عدد. کد ملی‌هایی که با صفر شروع می‌شوند در تبدیل به عدد خراب می‌شوند؛ ورودی غیررشته‌ای نامعتبر (not_a_string) است.
  • فاصله، خط تیره، نیم‌فاصله و پرانتز نادیده گرفته می‌شوند. فقط ارقام ۰-۹ و فارسی/عربی مجازند.
  • معتبر بودن ≠ وجود داشتن. فقط ساختار و رقم کنترلی بررسی می‌شود؛ نمی‌شود فهمید کارت یا کد ملی واقعاً متعلق به کسی است. کد پستی هم فقط از نظر قالب بررسی می‌شود.
  • لیست بانک‌ها (BIN کارت و کد شبا)، پیش‌شماره‌ی اپراتورهای موبایل و پیش‌شماره‌ی استان‌ها بر پایه‌ی اطلاعات عمومی است و ممکن است ناقص یا قدیمی باشد. اگر موردی جا افتاده، PR بدهید (src/irvalidate/banks.py).

مشارکت

git clone https://github.com/mehdirzfx/irvalidate.git
cd irvalidate
pip install -e ".[dev]"
pytest

Issue و Pull Request خوشحالمان می‌کند.

مجوز

MIT — آزاد برای استفاده‌ی شخصی و تجاری.

Metadata

Release files for irvalidate 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for irvalidate 0.2.0
File Size Uploaded Provenance Actions
irvalidate-0.2.0.tar.gz 22.7 kB With provenance Details for irvalidate-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for irvalidate 0.2.0
File Interpreter ABI Platform Actions
irvalidate-0.2.0-py3-none-any.whl Python 3 none any Details for irvalidate-0.2.0-py3-none-any.whl

Total release size: 49.4 kB

Release files / irvalidate-0.2.0.tar.gz

Download URL irvalidate-0.2.0.tar.gz
Size 22.7 kB
Tags Source
SHA-256 checksum
How to use checksums
3cc5400f092a547e6d319660fe68d05cb8633f4880521b360fb3b94f5fa52af6
BLAKE2b-256 checksum
How to use checksums
e547cfcbe9aa3614dd3dfe6cfe02001de568b4dd429671e3212eb80b8a3ca41e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Release files / irvalidate-0.2.0-py3-none-any.whl

Download URL irvalidate-0.2.0-py3-none-any.whl
Size 26.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
36740cca8f7ea956e20d9d872e25762f3ff45ba49a67973b56e35efa7e279949
BLAKE2b-256 checksum
How to use checksums
a91797ca3276bebb685d011698f9b3349f02d41369150a185350cc850f1e3f56
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

Security for irvalidate 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for irvalidate-0.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 31, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page