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

Reply via email to