Skip to content

Commit 540a400

Browse files
committed
Fea: Add Deutsch Language
1 parent 372b2b4 commit 540a400

23 files changed

+890
-9
lines changed

.pylintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ disable=
1010
W0703, # Catching too general exception Exception (broad-except)
1111
R0911, #Too many return statements
1212
#should remove
13-
R0201, #Method could be a function (no-self-use)
13+
#R0201, #Method could be a function (no-self-use)
1414
W0238, #Unused private member `Required.__data` (unused-private-member)

src/__init__.py

Whitespace-only changes.

src/pyvalidations/factory/bind_exception.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .. import lang as Lang
1+
from ..lang import Languages
22

33

44
class BindException:
@@ -12,11 +12,14 @@ def __init__(self, key, value):
1212
self.__key = key
1313
self.__value = value
1414

15-
def build(self, rule):
15+
def build(self, rule, lang="en"):
1616
"""
1717
build failed message
1818
:param rule: name of validation
1919
:return: string
2020
"""
21-
message = Lang.En(self.__key, self.__value).messages()
21+
message = Languages(lang) \
22+
.set_key(self.__key) \
23+
.set_value(self.__value) \
24+
.messages()[lang]
2225
return message[rule]

src/pyvalidations/factory/validate.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,21 @@ class Validate:
66
"""
77
Data Validation factory
88
"""
9+
__lang = "en"
910

1011
def __init__(self, key, value, rules, all_data):
1112
self.__key = key
1213
self.__value = value
1314
self.__rules = rules
1415
self.__all_data = all_data
1516

17+
def lang(self, lang):
18+
"""
19+
set the language of validation messaged
20+
"""
21+
self.__lang = lang
22+
return self
23+
1624
def validation(self):
1725
"""
1826
do validate by rule on data and return message if failed
@@ -29,12 +37,13 @@ def validation(self):
2937
rule_value = None if len(split_rule) < 2 else split_rule[1]
3038
is_passed = BindRules(rule, rule_value, self.__all_data).build(self.__key, self.__value)
3139
if not is_passed:
32-
messages.append(BindException(self.__key, rule_value).build(rule))
40+
messages.append(BindException(self.__key, rule_value).build(rule, self.__lang))
41+
3342
if rule in ('required_if', 'required_unless', 'required_with', 'required_without'):
3443
if not is_passed:
3544
return []
3645
is_passed_required = BindRules("required", rule_value, self.__all_data).build(self.__key, self.__value)
3746
if not is_passed_required:
38-
messages.append(BindException(self.__key, rule_value).build(rule))
47+
messages.append(BindException(self.__key, rule_value).build(rule, self.__lang))
3948

4049
return messages

src/pyvalidations/lang/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from .en import En
1+
from .language import Languages

src/pyvalidations/lang/de.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
class De:
2+
"""
3+
Validation Exception message in Deutsch language
4+
:param attribute : name of validation target
5+
:param value : value of attribute
6+
"""
7+
8+
def __init__(self, attribute, value):
9+
self.attribute = attribute
10+
self.value = value
11+
12+
def messages(self):
13+
"""
14+
validation messages
15+
:return: dict
16+
"""
17+
return {
18+
"field": f"Das {self.attribute} ist nicht vorhanden",
19+
"required": f"Das Feld {self.attribute} ist erforderlich.",
20+
"required_if": f"Das Feld {self.attribute} ist erforderlich, wenn {self.value} vorhanden ist.",
21+
"required_unless": f"Das Feld {self.attribute} ist erforderlich, es sei denn, {self.value} ist nicht vorhanden oder leer.",
22+
"required_with": f"Das Feld {self.attribute} ist erforderlich, wenn {self.value} vorhanden ist/sind.",
23+
"required_without": f"Das Feld {self.attribute} ist erforderlich, wenn {self.value} nicht vorhanden ist/sind.",
24+
"accepted": f"Das {self.attribute} muss akzeptiert werden.",
25+
"alpha": f"Das {self.attribute} darf nur Buchstaben enthalten.",
26+
"boolean": f"Das {self.attribute} darf nur einen booleschen Wert haben: true , false , 1 oder 0.",
27+
"string": f"Das {self.attribute} darf nur Strings enthalten.",
28+
"start_with": f"Das {self.attribute} darf nur mit {self.value} beginnen.",
29+
"end_with": f"Das {self.attribute} darf nur mit {self.value} enden.",
30+
"numeric": f"Das {self.attribute} muss eine Zahl sein.",
31+
"digits": f"Das {self.attribute} muss aus {self.value} Ziffern bestehen.",
32+
"max": f"Das {self.attribute} darf nicht größer als {self.value} sein.",
33+
"min": f"Das {self.attribute} muss mindestens {self.value} sein.",
34+
"email": f"Das {self.attribute} muss eine gültige E-Mail-Adresse sein.",
35+
"url": f"Das {self.attribute} muss eine gültige URL-Adresse sein.",
36+
"ip": f"Das {self.attribute} muss eine gültige IP-Adresse sein.",
37+
"ipv4": f"Das {self.attribute} muss eine gültige IPv4-Adresse sein.",
38+
"ipv6": f"The {self.attribute} must be a valid IPv6 address.",
39+
"in": f"Das ausgewählte {self.attribute} ist ungültig.",
40+
"not_in": f"Das ausgewählte {self.attribute} ist ungültig.",
41+
"uuid": f"Das {self.attribute} muss eine gültige UUID sein.",
42+
"date": f"Das {self.attribute} ist kein gültiges Datum.",
43+
"time": f"Das {self.attribute} ist keine gültige Zeit.",
44+
"datetime": f"Das {self.attribute} ist kein gültiges datetime.",
45+
"timezone": f"Das {self.attribute} ist keine gültige Zeitzone.",
46+
"date_equals": f"Das {self.attribute} muss ein Datum gleich {self.value} sein.",
47+
"after": f"Das {self.attribute} muss ein Datum nach {self.value} sein.",
48+
"after_or_equal": f"Das {self.attribute} muss ein Datum nach oder gleich {self.value} sein.",
49+
"before": f"Das {self.attribute} muss ein Datum vor {self.value} sein.",
50+
"before_or_equal": f"Das {self.attribute} muss ein Datum vor oder gleich {self.value} sein.",
51+
"different": f"Das {self.attribute} muss sich von {self.value} unterscheiden.",
52+
"equal": f"Das {self.attribute} muss gleich {self.value} sein.",
53+
"gt": f"Das {self.attribute} muss größer als {self.value} sein.",
54+
"gte": f"Das {self.attribute} muss größer oder gleich {self.value} sein.",
55+
"lt": f"Das {self.attribute} muss kleiner als {self.value} sein.",
56+
"lte": f"Das {self.attribute} muss kleiner oder gleich {self.value} sein.",
57+
"confirmed": f"Die {self.attribute}-Bestätigung stimmt nicht überein.",
58+
"nullable": f"Das {self.attribute} kann eine Null sein.",
59+
"file": f"Das {self.attribute} muss eine Datei sein.",
60+
"mimes": f"Das {self.attribute} muss eine Datei des Typs sein: {self.value}.",
61+
"mime_types": f"Das {self.attribute} muss eine Datei des Typs sein: {self.value}.",
62+
"max_size": f"Das {self.attribute} darf nicht größer als {self.value} Kilobyte sein.",
63+
"min_size": f"Das {self.attribute} muss mindestens {self.value} Kilobyte groß sein.",
64+
}

src/pyvalidations/lang/language.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from .en import En
2+
from .de import De
3+
4+
5+
class Languages:
6+
"""
7+
Set and load validation messages
8+
"""
9+
__key = None
10+
__value = None
11+
12+
def __init__(self, lang_name="en"):
13+
self.lang_name = lang_name
14+
15+
def set_key(self, key):
16+
"""
17+
set message attribute name
18+
:return self
19+
"""
20+
self.__key = key
21+
return self
22+
23+
def set_value(self, value):
24+
"""
25+
set message attribute value
26+
:return self
27+
"""
28+
self.__value = value
29+
return self
30+
31+
def messages(self):
32+
"""
33+
Collection of Languages Support class to load messages
34+
"""
35+
return {
36+
"en": En(self.__key, self.__value).messages(),
37+
"de": De(self.__key, self.__value).messages()
38+
}

src/pyvalidations/make.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from .factory import Validate
22

33

4-
def make(data, rules):
4+
def make(data, rules, lang="en"):
55
"""
66
make validation
77
:return: dictionary
@@ -15,7 +15,7 @@ def make(data, rules):
1515
rule_value = rules[rule]
1616
if key in data:
1717
data_value = data[key]
18-
result = Validate(key, data_value, rule_value, data).validation()
18+
result = Validate(key, data_value, rule_value, data).lang(lang).validation()
1919
if len(result) > 0:
2020
validate["failed"] = True
2121
validate["errors"][key] = result

tests/test_accepted_de.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import unittest
2+
import src.pyvalidations as PyValidation
3+
4+
5+
class TestAcceptedDe(unittest.TestCase):
6+
7+
def test_pyvalidation_accepted(self):
8+
data = {
9+
"accept_1": "on",
10+
"accept_2": "yes",
11+
"accept_3": "true",
12+
"accept_4": 1,
13+
"accept_5": "1",
14+
"accept_6": "off",
15+
"accept_7": "false",
16+
"accept_8": "0",
17+
}
18+
rules = {
19+
"accept_1": ["required", "accepted"],
20+
"accept_2": ["required", "accepted"],
21+
"accept_3": ["required", "accepted"],
22+
"accept_4": ["required", "accepted"],
23+
"accept_5": ["required", "accepted"],
24+
"accept_6": ["required", "accepted"],
25+
"accept_7": ["required", "accepted"],
26+
"accept_8": ["required", "accepted"],
27+
}
28+
validate = PyValidation.make(data, rules, "de")
29+
self.assertEqual(validate, {'errors': {'accept_6': ['Das accept_6 muss akzeptiert werden.'],
30+
'accept_7': ['Das accept_7 muss akzeptiert werden.'],
31+
'accept_8': ['Das accept_8 muss akzeptiert werden.']},
32+
'failed': True})
33+
34+
35+
if __name__ == '__main__':
36+
unittest.main()

tests/test_alpha_de.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import unittest
2+
import src.pyvalidations as PyValidation
3+
4+
5+
class TestAlphaDe(unittest.TestCase):
6+
7+
def test_pyvalidation_alpha_failed(self):
8+
data = {
9+
"name": "John Doe 2021",
10+
"user_name": 920,
11+
"start_code": "G223other_string",
12+
"end_code": "other_stringG222"
13+
}
14+
rules = {
15+
"name": ["required", "alpha"],
16+
"user_name": ["required", "string"],
17+
"start_code": ["required", "start_with:G123"],
18+
"end_code": ["required", "end_with:G123"],
19+
}
20+
validate = PyValidation.make(data, rules, "de")
21+
self.assertEqual(validate, {'errors': {'end_code': ['Das end_code darf nur mit G123 enden.'],
22+
'name': ['Das name darf nur Buchstaben enthalten.'],
23+
'start_code': ['Das start_code darf nur mit G123 beginnen.'],
24+
'user_name': ['Das user_name darf nur Strings enthalten.']},
25+
'failed': True})
26+
27+
28+
if __name__ == '__main__':
29+
unittest.main()

0 commit comments

Comments
 (0)