Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-Faker for openSUSE:Factory checked in at 2023-05-15 16:53:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-Faker (Old) and /work/SRC/openSUSE:Factory/.python-Faker.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-Faker" Mon May 15 16:53:59 2023 rev:42 rq:1087106 version:18.7.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-Faker/python-Faker.changes 2023-05-09 13:05:56.584522884 +0200 +++ /work/SRC/openSUSE:Factory/.python-Faker.new.1533/python-Faker.changes 2023-05-15 16:53:59.792065845 +0200 @@ -1,0 +2,9 @@ +Sun May 14 15:22:34 UTC 2023 - Dirk Müller <dmuel...@suse.com> + +- update to 18.7.0: + * Add `license_plate` for `zh_CN` and `zh_TW`. + * Improve accuracy of departments in `fr_FR` provider + `postcode`. + * Fix `ssn` provider for `zh_TW`. + +------------------------------------------------------------------- Old: ---- Faker-18.6.0.tar.gz New: ---- Faker-18.7.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-Faker.spec ++++++ --- /var/tmp/diff_new_pack.XS7Frz/_old 2023-05-15 16:54:00.332068826 +0200 +++ /var/tmp/diff_new_pack.XS7Frz/_new 2023-05-15 16:54:00.336068847 +0200 @@ -20,7 +20,7 @@ %global skip_python2 1 %{?sle15_python_module_pythons} Name: python-Faker -Version: 18.6.0 +Version: 18.7.0 Release: 0 Summary: Python package that generates fake data License: MIT ++++++ Faker-18.6.0.tar.gz -> Faker-18.7.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/CHANGELOG.md new/Faker-18.7.0/CHANGELOG.md --- old/Faker-18.6.0/CHANGELOG.md 2023-04-27 17:11:43.000000000 +0200 +++ new/Faker-18.7.0/CHANGELOG.md 2023-05-08 20:06:50.000000000 +0200 @@ -1,5 +1,17 @@ ## Changelog +### [v18.7.0 - 2023-05-08](https://github.com/joke2k/faker/compare/v18.6.2...v18.7.0) + +* Add `license_plate` for `zh_CN` and `zh_TW`. Thanks @cyanghsieh. + +### [v18.6.2 - 2023-05-03](https://github.com/joke2k/faker/compare/v18.6.1...v18.6.2) + +* Improve accuracy of departments in `fr_FR` provider `postcode`. Thanks @tonial. + +### [v18.6.1 - 2023-05-02](https://github.com/joke2k/faker/compare/v18.6.0...v18.6.1) + +* Fix `ssn` provider for `zh_TW`. Thanks @cyanghsieh. + ### [v18.6.0 - 2023-04-27](https://github.com/joke2k/faker/compare/v18.5.1...v18.6.0) * Add a separate `basic_phone_number` for `en_US`. Thanks @dlwrnc. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/Faker.egg-info/PKG-INFO new/Faker-18.7.0/Faker.egg-info/PKG-INFO --- old/Faker-18.6.0/Faker.egg-info/PKG-INFO 2023-04-27 17:12:52.000000000 +0200 +++ new/Faker-18.7.0/Faker.egg-info/PKG-INFO 2023-05-08 20:07:21.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: Faker -Version: 18.6.0 +Version: 18.7.0 Summary: Faker is a Python package that generates fake data for you. Home-page: https://github.com/joke2k/faker Author: joke2k diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/Faker.egg-info/SOURCES.txt new/Faker-18.7.0/Faker.egg-info/SOURCES.txt --- old/Faker-18.6.0/Faker.egg-info/SOURCES.txt 2023-04-27 17:12:54.000000000 +0200 +++ new/Faker-18.7.0/Faker.egg-info/SOURCES.txt 2023-05-08 20:07:22.000000000 +0200 @@ -137,6 +137,8 @@ faker/providers/automotive/tl_PH/__init__.py faker/providers/automotive/tr_TR/__init__.py faker/providers/automotive/vi_VN/__init__.py +faker/providers/automotive/zh_CN/__init__.py +faker/providers/automotive/zh_TW/__init__.py faker/providers/bank/__init__.py faker/providers/bank/az_AZ/__init__.py faker/providers/bank/bn_BD/__init__.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/PKG-INFO new/Faker-18.7.0/PKG-INFO --- old/Faker-18.6.0/PKG-INFO 2023-04-27 17:12:55.708264400 +0200 +++ new/Faker-18.7.0/PKG-INFO 2023-05-08 20:07:22.890436200 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: Faker -Version: 18.6.0 +Version: 18.7.0 Summary: Faker is a Python package that generates fake data for you. Home-page: https://github.com/joke2k/faker Author: joke2k diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/VERSION new/Faker-18.7.0/VERSION --- old/Faker-18.6.0/VERSION 2023-04-27 17:12:12.000000000 +0200 +++ new/Faker-18.7.0/VERSION 2023-05-08 20:07:06.000000000 +0200 @@ -1 +1 @@ -18.6.0 +18.7.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/faker/__init__.py new/Faker-18.7.0/faker/__init__.py --- old/Faker-18.6.0/faker/__init__.py 2023-04-27 17:12:12.000000000 +0200 +++ new/Faker-18.7.0/faker/__init__.py 2023-05-08 20:07:06.000000000 +0200 @@ -2,6 +2,6 @@ from faker.generator import Generator from faker.proxy import Faker -VERSION = "18.6.0" +VERSION = "18.7.0" __all__ = ("Factory", "Generator", "Faker") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/faker/providers/address/fr_FR/__init__.py new/Faker-18.7.0/faker/providers/address/fr_FR/__init__.py --- old/Faker-18.6.0/faker/providers/address/fr_FR/__init__.py 2023-02-28 21:39:57.000000000 +0100 +++ new/Faker-18.7.0/faker/providers/address/fr_FR/__init__.py 2023-05-04 00:26:30.000000000 +0200 @@ -46,7 +46,6 @@ address_formats = ("{{street_address}}\n{{postcode}} {{city}}",) building_number_formats = ("%", "%#", "%#", "%#", "%##") - postcode_formats = ("#####",) countries = ( "Afghanistan", "Afrique du sud", @@ -467,3 +466,13 @@ :example: '59' """ return self.department()[0] + + def postcode(self) -> str: + """ + Randomly returns a postcode generated from existing french depertment number. + exemple: '33260' + """ + department = self.department_number() + if department in ["2A", "2B"]: + department = "20" + return f"{department}{self.random_number(digits=5 - len(department))}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/faker/providers/automotive/zh_CN/__init__.py new/Faker-18.7.0/faker/providers/automotive/zh_CN/__init__.py --- old/Faker-18.6.0/faker/providers/automotive/zh_CN/__init__.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Faker-18.7.0/faker/providers/automotive/zh_CN/__init__.py 2023-05-08 20:05:30.000000000 +0200 @@ -0,0 +1,47 @@ +from .. import Provider as AutomotiveProvider + + +class Provider(AutomotiveProvider): + """ + Implement automotive provider for `zh_CN` locale. + electric vehicles or downtown-restricted plates are not included + """ + + province_code = ( + "京", + "æ´¥", + "å", + "æ", + "è", + "è¾½", + "å", + "é»", + "沪", + "è", + "æµ", + "ç", + "é½", + "èµ£", + "é²", + "豫", + "é", + "æ¹", + "粤", + "æ¡", + "ç¼", + "æ¸", + "å·", + "è´µ", + "äº", + "è", + "é", + "ç", + "é", + "å®", + "æ°", + ) + + def license_plate(self) -> str: + """Generate a license plate.""" + pattern: str = str(self.random_element(self.province_code)) + self.random_uppercase_letter() + "-#####" + return self.numerify(self.generator.parse(pattern)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/faker/providers/automotive/zh_TW/__init__.py new/Faker-18.7.0/faker/providers/automotive/zh_TW/__init__.py --- old/Faker-18.6.0/faker/providers/automotive/zh_TW/__init__.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Faker-18.7.0/faker/providers/automotive/zh_TW/__init__.py 2023-05-08 20:04:27.000000000 +0200 @@ -0,0 +1,19 @@ +from .. import Provider as AutomotiveProvider + + +class Provider(AutomotiveProvider): + """Implement automotive provider for ``zh_TW`` locale. + + Sources: + - https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Taiwan + + """ + + license_formats = ( + "####-??", + "??-####", + # Commercial vehicles since 2012 + "???-###", + # New format since 2014 + "???-####", + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/faker/providers/ssn/zh_TW/__init__.py new/Faker-18.7.0/faker/providers/ssn/zh_TW/__init__.py --- old/Faker-18.6.0/faker/providers/ssn/zh_TW/__init__.py 2022-02-14 18:03:11.000000000 +0100 +++ new/Faker-18.7.0/faker/providers/ssn/zh_TW/__init__.py 2023-05-02 16:07:06.000000000 +0200 @@ -1,8 +1,45 @@ from .. import Provider as SsnProvider -class Provider(SsnProvider): - ssn_formats = ("?#########",) +def checksum(s: str) -> int: + def _get_alphabet_weight(c: str) -> int: + """A=10, B=11, ...., H=17, + I=34, + J=18, K=19, ..., N=22, + O=35, + P=23, Q=24, ..., V=29, + W=32, + X=30, Y=31, Z=33 + """ + if ord(c) < 73: # A-H + return ord(c) - 55 + if ord(c) == 73: # I + return ord(c) - 39 + if ord(c) < 79: # J-N + return ord(c) - 56 + if ord(c) == 79: # O + return ord(c) - 44 + if ord(c) < 87: # P-V + return ord(c) - 57 + if ord(c) == 87: # W + return ord(c) - 55 + if ord(c) < 90: # X, Y + return ord(c) - 58 + return ord(c) - 57 # Z + + res = 0 + for i, c in enumerate(s): + if i == 0: + res = _get_alphabet_weight(c) % 10 * 9 + _get_alphabet_weight(c) // 10 + elif i < 9: + res += int(c) * (9 - i) + else: + res += int(c) + return res + +class Provider(SsnProvider): def ssn(self) -> str: - return self.bothify(self.random_element(self.ssn_formats)).upper() + ssn_without_last_char = self.numerify(self.random_uppercase_letter() + str(self.random_int(1, 2)) + "#######") + last_char = str((10 - checksum(ssn_without_last_char) % 10) % 10) + return ssn_without_last_char + last_char diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/tests/providers/test_address.py new/Faker-18.7.0/tests/providers/test_address.py --- old/Faker-18.6.0/tests/providers/test_address.py 2023-03-23 20:57:10.000000000 +0100 +++ new/Faker-18.7.0/tests/providers/test_address.py 2023-05-04 00:26:30.000000000 +0200 @@ -865,6 +865,17 @@ assert isinstance(department_number, str) assert department_number in department_numbers + def test_postcode(self, faker, num_samples): + department_numbers = [dept_num for dept_num, dept_name in FrFrAddressProvider.departments] + for _ in range(num_samples): + postcode = faker.postcode() + assert isinstance(postcode, str) + assert ( + postcode[:3] in department_numbers # for 3 digits deparments number + or postcode[:2] == "20" # for Corsica : "2A" or "2B" + or postcode[:2] in department_numbers # any other + ) + class TestHeIl: """Test he_IL address provider methods""" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/tests/providers/test_automotive.py new/Faker-18.7.0/tests/providers/test_automotive.py --- old/Faker-18.6.0/tests/providers/test_automotive.py 2023-03-20 17:50:51.000000000 +0100 +++ new/Faker-18.7.0/tests/providers/test_automotive.py 2023-05-08 20:05:30.000000000 +0200 @@ -316,3 +316,20 @@ """Test nl_BE automotive provider methods""" license_plate_pattern: Pattern = re.compile(r"(\d{3}-[A-Z]{3})|" r"([A-Z]{3}-\d{3})|" r"([1-2]-[A-Z]{3}-\d{3})") + + +class TestZhCn(_SimpleAutomotiveTestMixin): + """Test zh_CN automotive provider methods""" + + license_plate_pattern: Pattern = re.compile(r"^[京津åæèè¾½åé»æ²ªèæµçé½èµ£é²è±«éæ¹ç²¤æ¡ç¼å·è´µäºæ¸èéçéå®æ°]{1}[A-Z]{1}-[A-Z0-9]{5}") + + +class TestZhTw(_SimpleAutomotiveTestMixin): + """Test zh_TW automotive provider methods""" + + license_plate_pattern: Pattern = re.compile( + r"([A-Z]{2}-\d{4})|" # prior 2012 v1 + r"(\d{4}-[A-Z]{2})|" # prior 2012 v2 + r"([A-Z]{3}-\d{4})|" # new format since 2014 + r"([A-Z]{3}-\d{3})", # commercial cars since 2012 + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Faker-18.6.0/tests/providers/test_ssn.py new/Faker-18.7.0/tests/providers/test_ssn.py --- old/Faker-18.6.0/tests/providers/test_ssn.py 2023-02-24 22:33:17.000000000 +0100 +++ new/Faker-18.7.0/tests/providers/test_ssn.py 2023-05-02 16:07:06.000000000 +0200 @@ -34,6 +34,7 @@ from faker.providers.ssn.pt_BR import checksum as pt_checksum from faker.providers.ssn.ro_RO import ssn_checksum as ro_ssn_checksum from faker.providers.ssn.ro_RO import vat_checksum as ro_vat_checksum +from faker.providers.ssn.zh_TW import checksum as tw_checksum from faker.utils.checksums import luhn_checksum @@ -1271,3 +1272,25 @@ def test_vat_id(self): for _ in range(100): assert re.search(r"^LV\d{11}$", self.fake.vat_id()) + + +class TestZhTW(unittest.TestCase): + num_sample_runs = 10 + + def setUp(self): + self.fake = Faker("zh_TW") + Faker.seed(0) + self.samples = [self.fake.ssn() for _ in range(self.num_sample_runs)] + + def test_length(self): + for sample in self.samples: + assert len(sample) == 10 + + def test_gender(self): + """only '1' and '2' are allowed in the second char""" + for sample in self.samples: + assert sample[1] == "1" or sample[1] == "2" + + def test_checksum(self): + for sample in self.samples: + assert tw_checksum(sample) % 10 == 0