vos-data-utils 0.0.2__py3-none-any.whl → 0.0.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vos-data-utils might be problematic. Click here for more details.
- vdutils/__init__.py +21 -45
- vdutils/bjd.py +40 -10
- vdutils/bjdconnector.py +322 -55
- vdutils/convaddr.py +121 -26
- vdutils/cordate.py +1 -1
- vdutils/data/__init__.py +10 -9
- vdutils/genpnu.py +623 -0
- vdutils/library/__init__.py +42 -0
- vdutils/library/data.py +51 -1
- vdutils/tests/test_convaddr.py +1 -3
- vdutils/tests/test_cordate.py +6 -1
- vdutils/tests/test_genpnu.py +1004 -0
- vdutils/tests/test_vid.py +247 -0
- vdutils/tests/tests.py +15 -5
- vdutils/vid.py +157 -99
- {vos_data_utils-0.0.2.dist-info → vos_data_utils-0.0.4.dist-info}/METADATA +3 -2
- vos_data_utils-0.0.4.dist-info/RECORD +21 -0
- vdutils/data/bjd.txt +0 -49844
- vdutils/data/bjd_changed.txt +0 -8579
- vdutils/data/bjd_connectors.pkl +0 -0
- vdutils/data/bjd_current.txt +0 -20560
- vdutils/data/bjd_frequency_dictionary.txt +0 -11290
- vdutils/data/bjd_smallest.txt +0 -9786
- vdutils/data/date_dictionary.txt +0 -738978
- vdutils/data/full_bjd_connectors.pkl +0 -0
- vdutils/data/multiple_word_sgg_list.txt +0 -65
- vdutils/data/pnu/bjd_20230701.pkl +0 -0
- vdutils/data/pnu/bjd_20240101.pkl +0 -0
- vdutils/data/pnu/bjd_20240118.pkl +0 -0
- vdutils/pnu.py +0 -221
- vos_data_utils-0.0.2.dist-info/RECORD +0 -31
- {vos_data_utils-0.0.2.dist-info → vos_data_utils-0.0.4.dist-info}/WHEEL +0 -0
- {vos_data_utils-0.0.2.dist-info → vos_data_utils-0.0.4.dist-info}/entry_points.txt +0 -0
- {vos_data_utils-0.0.2.dist-info → vos_data_utils-0.0.4.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import unittest
|
|
4
|
+
import logging
|
|
5
|
+
from typing import Pattern
|
|
6
|
+
sys.path.append(os.getcwd())
|
|
7
|
+
from vdutils.vid import Vid
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TestClass(unittest.TestCase):
|
|
11
|
+
|
|
12
|
+
@classmethod
|
|
13
|
+
def setUp(cls):
|
|
14
|
+
"Hook method for setting fixture before running tests in the class"
|
|
15
|
+
cls.driver = 'test'
|
|
16
|
+
cls.instance = Vid()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def tearDown(cls):
|
|
21
|
+
"Hook method for deconstructing the class fixture after running all tests in the class"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_class_initialization_type(self):
|
|
25
|
+
"""
|
|
26
|
+
클래스 인스턴스 초기 생성자 타입 테스트 메소드
|
|
27
|
+
|
|
28
|
+
- 클래스 인스턴스 초기 생성자 객체의 값의 타입이 지정된 타입과 일치하는지 확인하는 테스트
|
|
29
|
+
- __init__.logger 객체 테스트
|
|
30
|
+
- __init__.is_pnu_valid_regex 객체 테스트
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
self.assertTrue(self.instance.logger, logging.Logger)
|
|
34
|
+
self.assertTrue(self.instance.is_pnu_valid_regex, Pattern[str]) # default False
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_class_initialization_not_empty(self):
|
|
38
|
+
"""
|
|
39
|
+
클래스 인스턴스 초기 생성자 객체 테스트 메소드
|
|
40
|
+
|
|
41
|
+
- 클래스 인스턴스 초기 생성자 객체의 값이 None이 아닌지(IsNotNone) 확인하는 테스트
|
|
42
|
+
- __init__.logger 객체 테스트
|
|
43
|
+
- __init__.is_pnu_valid_regex 객체 테스트
|
|
44
|
+
|
|
45
|
+
- 클래스 인스턴스 초기 생성자 객체의 Length가 0이 아닌지 확인하는 테스트
|
|
46
|
+
- __init__.logger 객체 테스트 (logging.Logger pass)
|
|
47
|
+
- __init__.is_pnu_valid_regex 객체 테스트 (pattern pass)
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
self.assertIsNotNone(self.instance.logger)
|
|
51
|
+
self.assertIsNotNone(self.instance.is_pnu_valid_regex)
|
|
52
|
+
|
|
53
|
+
# self.assertNotEqual(len(self.instance.logger), 0)
|
|
54
|
+
# self.assertNotEqual(len(self.instance.is_pnu_valid_regex), 0)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_generate_registration_vid(self):
|
|
58
|
+
"""
|
|
59
|
+
generate_registration_vid 함수 테스트 메소드
|
|
60
|
+
|
|
61
|
+
- generate_registration_vid 함수 리턴값 테스트(올바른 입력값 제공)
|
|
62
|
+
- generate_registration_vid 함수 리턴값 타입 테스트
|
|
63
|
+
- generate_registration_vid 함수 리턴값 None 이 아닌지 테스트
|
|
64
|
+
- generate_registration_vid 함수 리턴값 리스트 첫번째 객체값 타입 테스트
|
|
65
|
+
- generate_registration_vid 함수 리턴값 리스트 첫번째 객체값 None 이 아닌지 테스트
|
|
66
|
+
- generate_registration_vid 함수 리턴값 리스트 두번째 객체값 타입 테스트
|
|
67
|
+
- generate_registration_vid 함수 리턴값 리스트 두번째 객체값 None 이 아닌지 테스트
|
|
68
|
+
- generate_registration_vid 함수 리턴값 리스트 세번째 객체값 타입 테스트
|
|
69
|
+
- generate_registration_vid 함수 리턴값 리스트 세번째 객체값 None 이 아닌지 테스트
|
|
70
|
+
- generate_registration_vid 함수 리턴값 일치 테스트
|
|
71
|
+
|
|
72
|
+
- generate_registration_vid 함수 리턴값 테스트(올바르지 않은 입력값 제공)
|
|
73
|
+
- generate_registration_vid 함수 리턴값 타입 테스트
|
|
74
|
+
- generate_registration_vid 함수 리턴값 None 이 아닌지 테스트
|
|
75
|
+
- generate_registration_vid 함수 리턴값 리스트 첫번째 객체값 타입 테스트
|
|
76
|
+
- generate_registration_vid 함수 리턴값 리스트 첫번째 객체값 None 이 아닌지 테스트
|
|
77
|
+
- generate_registration_vid 함수 리턴값 리스트 두번째 객체값 타입 테스트 (None pass)
|
|
78
|
+
- generate_registration_vid 함수 리턴값 리스트 두번째 객체값 None 이 맞는지 테스트
|
|
79
|
+
- generate_registration_vid 함수 리턴값 리스트 세번째 객체값 타입 테스트 (None pass)
|
|
80
|
+
- generate_registration_vid 함수 리턴값 리스트 세번째 객체값 None 이 맞는지 테스트
|
|
81
|
+
- generate_registration_vid 함수 리턴값 일치 테스트
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
res = self.instance.generate_registration_vid(
|
|
85
|
+
pnu='1234567890123456789',
|
|
86
|
+
contract_ymd='20240101',
|
|
87
|
+
price=100,
|
|
88
|
+
unit_ar=100.1,
|
|
89
|
+
lot_ar=100.1,
|
|
90
|
+
seller='seller',
|
|
91
|
+
buyer='buyer',
|
|
92
|
+
)
|
|
93
|
+
self.assertIsInstance(res, list)
|
|
94
|
+
self.assertIsNotNone(res)
|
|
95
|
+
self.assertIsInstance(res[0], str)
|
|
96
|
+
self.assertIsNotNone(res[0])
|
|
97
|
+
self.assertIsInstance(res[1], str)
|
|
98
|
+
self.assertIsNotNone(res[1])
|
|
99
|
+
self.assertIsInstance(res[2], str)
|
|
100
|
+
self.assertIsNotNone(res[2])
|
|
101
|
+
self.assertEqual(res, [
|
|
102
|
+
'R_1234567890_581e28e445_0000',
|
|
103
|
+
'581e28e4457103048784572e858c5ed1297cf8747169a8454e98a19233036f55',
|
|
104
|
+
'1234567890123456789_20240101_100_100.1_100.1_seller_buyer'
|
|
105
|
+
])
|
|
106
|
+
|
|
107
|
+
res = self.instance.generate_registration_vid(
|
|
108
|
+
pnu='1234567890123456789',
|
|
109
|
+
contract_ymd='20240101',
|
|
110
|
+
price='100',
|
|
111
|
+
unit_ar='100.1',
|
|
112
|
+
lot_ar='100.1',
|
|
113
|
+
seller='seller',
|
|
114
|
+
buyer='buyer',
|
|
115
|
+
)
|
|
116
|
+
self.assertIsInstance(res, list)
|
|
117
|
+
self.assertIsNotNone(res)
|
|
118
|
+
self.assertIsInstance(res[0], str)
|
|
119
|
+
self.assertIsNotNone(res[0])
|
|
120
|
+
self.assertIsInstance(res[1], str)
|
|
121
|
+
self.assertIsNotNone(res[1])
|
|
122
|
+
self.assertIsInstance(res[2], str)
|
|
123
|
+
self.assertIsNotNone(res[2])
|
|
124
|
+
self.assertEqual(res, [
|
|
125
|
+
'R_1234567890_581e28e445_0000',
|
|
126
|
+
'581e28e4457103048784572e858c5ed1297cf8747169a8454e98a19233036f55',
|
|
127
|
+
'1234567890123456789_20240101_100_100.1_100.1_seller_buyer'
|
|
128
|
+
])
|
|
129
|
+
|
|
130
|
+
res = self.instance.generate_registration_vid(
|
|
131
|
+
pnu='12345678901234567890', # 19자리 형식에 맞지 않는 잘못된 입력값 제공
|
|
132
|
+
contract_ymd='20240101',
|
|
133
|
+
price=100,
|
|
134
|
+
unit_ar=100.1,
|
|
135
|
+
lot_ar=100.1,
|
|
136
|
+
seller='seller',
|
|
137
|
+
buyer='buyer',
|
|
138
|
+
)
|
|
139
|
+
self.assertIsInstance(res, list)
|
|
140
|
+
self.assertIsNotNone(res)
|
|
141
|
+
self.assertIsInstance(res[0], str)
|
|
142
|
+
self.assertIsNotNone(res[0])
|
|
143
|
+
# self.assertIsInstance(res[1], None) # (None pass)
|
|
144
|
+
self.assertIsNone(res[1])
|
|
145
|
+
# self.assertIsInstance(res[2], None) # (None pass)
|
|
146
|
+
self.assertIsNone(res[2])
|
|
147
|
+
self.assertEqual(res, [
|
|
148
|
+
'R_pnu10dhead_hashstring_0000',
|
|
149
|
+
None,
|
|
150
|
+
None
|
|
151
|
+
])
|
|
152
|
+
|
|
153
|
+
res = self.instance.generate_registration_vid(
|
|
154
|
+
pnu='1234567890123456789',
|
|
155
|
+
contract_ymd='2024-01-01', # YYYYMMDD 형식에 맞지 않는 잘못된 입력값 제공
|
|
156
|
+
price=100,
|
|
157
|
+
unit_ar=100.1,
|
|
158
|
+
lot_ar=100.1,
|
|
159
|
+
seller='seller',
|
|
160
|
+
buyer='buyer',
|
|
161
|
+
)
|
|
162
|
+
self.assertIsInstance(res, list)
|
|
163
|
+
self.assertIsNotNone(res)
|
|
164
|
+
self.assertIsInstance(res[0], str)
|
|
165
|
+
self.assertIsNotNone(res[0])
|
|
166
|
+
# self.assertIsInstance(res[1], None) # (None pass)
|
|
167
|
+
self.assertIsNone(res[1])
|
|
168
|
+
# self.assertIsInstance(res[2], None) # (None pass)
|
|
169
|
+
self.assertIsNone(res[2])
|
|
170
|
+
self.assertEqual(res, [
|
|
171
|
+
'R_1234567890_hashstring_0000',
|
|
172
|
+
None,
|
|
173
|
+
None
|
|
174
|
+
])
|
|
175
|
+
|
|
176
|
+
res = self.instance.generate_registration_vid(
|
|
177
|
+
pnu='1234567890123456789',
|
|
178
|
+
contract_ymd='20240101',
|
|
179
|
+
price=-100, # 음수 잘못된 입력값 제공
|
|
180
|
+
unit_ar=100.1,
|
|
181
|
+
lot_ar=100.1,
|
|
182
|
+
seller='seller',
|
|
183
|
+
buyer='buyer',
|
|
184
|
+
)
|
|
185
|
+
self.assertIsInstance(res, list)
|
|
186
|
+
self.assertIsNotNone(res)
|
|
187
|
+
self.assertIsInstance(res[0], str)
|
|
188
|
+
self.assertIsNotNone(res[0])
|
|
189
|
+
# self.assertIsInstance(res[1], None) # (None pass)
|
|
190
|
+
self.assertIsNone(res[1])
|
|
191
|
+
# self.assertIsInstance(res[2], None) # (None pass)
|
|
192
|
+
self.assertIsNone(res[2])
|
|
193
|
+
self.assertEqual(res, [
|
|
194
|
+
'R_1234567890_hashstring_0000',
|
|
195
|
+
None,
|
|
196
|
+
None
|
|
197
|
+
])
|
|
198
|
+
|
|
199
|
+
res = self.instance.generate_registration_vid(
|
|
200
|
+
pnu='1234567890123456789',
|
|
201
|
+
contract_ymd='20240101',
|
|
202
|
+
price=100,
|
|
203
|
+
unit_ar='a', # 숫자 혹은 숫자문자열이 아닌 문자열 입력값 제공
|
|
204
|
+
lot_ar=100.1,
|
|
205
|
+
seller='seller',
|
|
206
|
+
buyer='buyer',
|
|
207
|
+
)
|
|
208
|
+
self.assertIsInstance(res, list)
|
|
209
|
+
self.assertIsNotNone(res)
|
|
210
|
+
self.assertIsInstance(res[0], str)
|
|
211
|
+
self.assertIsNotNone(res[0])
|
|
212
|
+
# self.assertIsInstance(res[1], None) # (None pass)
|
|
213
|
+
self.assertIsNone(res[1])
|
|
214
|
+
# self.assertIsInstance(res[2], None) # (None pass)
|
|
215
|
+
self.assertIsNone(res[2])
|
|
216
|
+
self.assertEqual(res, [
|
|
217
|
+
'R_1234567890_hashstring_0000',
|
|
218
|
+
None,
|
|
219
|
+
None
|
|
220
|
+
])
|
|
221
|
+
|
|
222
|
+
res = self.instance.generate_registration_vid(
|
|
223
|
+
pnu='1234567890123456789',
|
|
224
|
+
contract_ymd='20240101',
|
|
225
|
+
price=100,
|
|
226
|
+
unit_ar=100.1,
|
|
227
|
+
lot_ar=100.1,
|
|
228
|
+
seller=1, # 문자열 아닌 숫자 입력값 제공
|
|
229
|
+
buyer='buyer',
|
|
230
|
+
)
|
|
231
|
+
self.assertIsInstance(res, list)
|
|
232
|
+
self.assertIsNotNone(res)
|
|
233
|
+
self.assertIsInstance(res[0], str)
|
|
234
|
+
self.assertIsNotNone(res[0])
|
|
235
|
+
# self.assertIsInstance(res[1], None) # (None pass)
|
|
236
|
+
self.assertIsNone(res[1])
|
|
237
|
+
# self.assertIsInstance(res[2], None) # (None pass)
|
|
238
|
+
self.assertIsNone(res[2])
|
|
239
|
+
self.assertEqual(res, [
|
|
240
|
+
'R_1234567890_hashstring_0000',
|
|
241
|
+
None,
|
|
242
|
+
None
|
|
243
|
+
])
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
if __name__ == "__main__":
|
|
247
|
+
unittest.main()
|
vdutils/tests/tests.py
CHANGED
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
import unittest
|
|
2
|
-
from test_convaddr import TestClass as
|
|
3
|
-
from test_cordate import TestClass as
|
|
2
|
+
from test_convaddr import TestClass as TestClassConvAddr
|
|
3
|
+
from test_cordate import TestClass as TestClassCordate
|
|
4
|
+
from test_genpnu import TestClass as TestClassGenPnu
|
|
5
|
+
from test_vid import TestClass as TestClassVid
|
|
4
6
|
|
|
5
7
|
|
|
6
8
|
def suite():
|
|
7
9
|
test_loader = unittest.TestLoader()
|
|
8
10
|
test_suite = unittest.TestSuite()
|
|
9
11
|
|
|
10
|
-
test_suite.addTest(test_loader.loadTestsFromTestCase(
|
|
11
|
-
test_suite.addTest(test_loader.loadTestsFromTestCase(
|
|
12
|
+
test_suite.addTest(test_loader.loadTestsFromTestCase(TestClassConvAddr))
|
|
13
|
+
test_suite.addTest(test_loader.loadTestsFromTestCase(TestClassCordate))
|
|
14
|
+
test_suite.addTest(test_loader.loadTestsFromTestCase(TestClassGenPnu))
|
|
15
|
+
test_suite.addTest(test_loader.loadTestsFromTestCase(TestClassVid))
|
|
12
16
|
|
|
13
17
|
return test_suite
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
def __run_test__():
|
|
16
20
|
runner = unittest.TextTestRunner(verbosity=2)
|
|
17
21
|
test_suite = suite()
|
|
18
22
|
result = runner.run(test_suite)
|
|
23
|
+
|
|
24
|
+
# python -m unittest vdutils.tests.tests
|
|
25
|
+
if __name__ == '__main__':
|
|
26
|
+
runner = unittest.TextTestRunner(verbosity=2)
|
|
27
|
+
test_suite = suite()
|
|
28
|
+
result = runner.run(test_suite)
|
vdutils/vid.py
CHANGED
|
@@ -1,119 +1,177 @@
|
|
|
1
1
|
import re
|
|
2
2
|
import hashlib
|
|
3
3
|
from datetime import date
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import (
|
|
5
|
+
List,
|
|
6
|
+
Union
|
|
7
|
+
)
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from vdutils.library import Log
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class Vid():
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def __init__(self):
|
|
17
|
+
self.logger = Log('Vid').stream_handler("INFO")
|
|
18
|
+
self.is_pnu_valid_regex = re.compile("^\d{19}$")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@staticmethod
|
|
22
|
+
def _remove_comma(value: str) -> str:
|
|
23
|
+
return value.replace(",", "")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def _format_float_string(float_str: str) -> str:
|
|
28
|
+
if float_str:
|
|
29
|
+
dot_split = float_str.split(".")
|
|
30
|
+
if len(dot_split) == 1:
|
|
31
|
+
return float_str
|
|
32
|
+
elif len(dot_split) == 2:
|
|
33
|
+
part_int, part_float = dot_split
|
|
34
|
+
float_numbers = list(part_float)
|
|
35
|
+
for i in range(len(part_float) - 1, -1, -1):
|
|
36
|
+
number = float_numbers[i]
|
|
37
|
+
if number != "0":
|
|
38
|
+
break
|
|
39
|
+
else:
|
|
40
|
+
float_numbers.pop()
|
|
41
|
+
no_trailing_zero_float_part = "".join(float_numbers)
|
|
42
|
+
if no_trailing_zero_float_part:
|
|
43
|
+
return ".".join([part_int, no_trailing_zero_float_part])
|
|
44
|
+
else:
|
|
45
|
+
return part_int
|
|
46
|
+
else:
|
|
47
|
+
return float_str
|
|
48
|
+
else:
|
|
49
|
+
return ""
|
|
5
50
|
|
|
6
51
|
|
|
7
|
-
|
|
52
|
+
def _format_float(
|
|
53
|
+
self,
|
|
54
|
+
float_num: str
|
|
55
|
+
) -> str:
|
|
56
|
+
return self._format_float_string(self._remove_comma(str(float_num)))
|
|
8
57
|
|
|
9
|
-
formatFloat = lambda float_num: format_float_string(removeComma(str(float_num)))
|
|
10
58
|
|
|
11
|
-
|
|
59
|
+
def _is_number_valid(
|
|
60
|
+
self,
|
|
61
|
+
number: Union[float, int, str, None]
|
|
62
|
+
) -> bool:
|
|
63
|
+
try:
|
|
64
|
+
ff = self._format_float(number)
|
|
65
|
+
if (
|
|
66
|
+
not ff
|
|
67
|
+
or len(ff.split(".")) > 2
|
|
68
|
+
or not re.compile("^\d*$").match(ff.replace(".", ""))
|
|
69
|
+
):
|
|
70
|
+
return False
|
|
71
|
+
else:
|
|
72
|
+
return True
|
|
73
|
+
except:
|
|
74
|
+
return False
|
|
12
75
|
|
|
13
|
-
def format_float_string(float_str: str) -> str:
|
|
14
|
-
if float_str:
|
|
15
|
-
dot_split = float_str.split(".")
|
|
16
|
-
if len(dot_split) == 1:
|
|
17
|
-
return float_str
|
|
18
76
|
|
|
19
|
-
|
|
20
|
-
|
|
77
|
+
def _is_pnu_valid(
|
|
78
|
+
self,
|
|
79
|
+
pnu: str
|
|
80
|
+
):
|
|
81
|
+
return self.is_pnu_valid_regex.match(pnu)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@staticmethod
|
|
85
|
+
def _is_contract_date_valid(
|
|
86
|
+
contract_ymd: Union[str, int, None]
|
|
87
|
+
) -> bool:
|
|
88
|
+
if type(contract_ymd) != str:
|
|
89
|
+
contract_ymd = str(contract_ymd)
|
|
90
|
+
if len(contract_ymd) == 8 and re.compile("^\d{8}$").match(contract_ymd):
|
|
91
|
+
try:
|
|
92
|
+
d = date.fromisoformat(
|
|
93
|
+
f"{contract_ymd[:4]}-{contract_ymd[4:6]}-{contract_ymd[6:]}"
|
|
94
|
+
)
|
|
95
|
+
return True
|
|
96
|
+
except:
|
|
97
|
+
return False
|
|
98
|
+
return False
|
|
21
99
|
|
|
22
|
-
float_numbers = list(part_float)
|
|
23
100
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
break
|
|
28
|
-
else:
|
|
29
|
-
float_numbers.pop()
|
|
101
|
+
@staticmethod
|
|
102
|
+
def _is_string_valid(value) -> bool:
|
|
103
|
+
return isinstance(value, str)
|
|
30
104
|
|
|
31
|
-
no_trailing_zero_float_part = "".join(float_numbers)
|
|
32
105
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
106
|
+
@staticmethod
|
|
107
|
+
def _validate(validator, value, value_nm):
|
|
108
|
+
if value and not validator(value):
|
|
109
|
+
raise Exception(f"invalid {validator}, {value_nm}: {value}")
|
|
37
110
|
|
|
38
|
-
else:
|
|
39
|
-
return float_str
|
|
40
111
|
|
|
41
|
-
|
|
42
|
-
|
|
112
|
+
@staticmethod
|
|
113
|
+
def _get_hash_raw(data_str: str) -> str:
|
|
114
|
+
return hashlib.sha256(data_str.encode("utf-8")).hexdigest()
|
|
43
115
|
|
|
44
|
-
def is_contract_date_valid(contract_ymd):
|
|
45
|
-
if type(contract_ymd) != str:
|
|
46
|
-
contract_ymd = str(contract_ymd)
|
|
47
|
-
if len(contract_ymd) == 8 and re.compile("^\d{8}$").match(contract_ymd):
|
|
48
|
-
try:
|
|
49
|
-
d = date.fromisoformat(
|
|
50
|
-
f"{contract_ymd[:4]}-{contract_ymd[4:6]}-{contract_ymd[6:]}"
|
|
51
|
-
)
|
|
52
|
-
return True
|
|
53
|
-
except:
|
|
54
|
-
return False
|
|
55
|
-
return False
|
|
56
|
-
|
|
57
|
-
def is_number_valid(number):
|
|
58
|
-
try:
|
|
59
|
-
ff = formatFloat(number)
|
|
60
|
-
if (
|
|
61
|
-
not ff
|
|
62
|
-
or len(ff.split(".")) > 2
|
|
63
|
-
or not re.compile("^\d*$").match(ff.replace(".", ""))
|
|
64
|
-
):
|
|
65
|
-
return False
|
|
66
|
-
else:
|
|
67
|
-
return True
|
|
68
|
-
except:
|
|
69
|
-
return False
|
|
70
116
|
|
|
71
|
-
def
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
[
|
|
100
|
-
pnu,
|
|
101
|
-
contract_ymd,
|
|
102
|
-
formatFloat(price) if price else "",
|
|
103
|
-
formatFloat(unit_ar) if price else "",
|
|
104
|
-
formatFloat(lot_ar) if price else "",
|
|
105
|
-
seller or "",
|
|
106
|
-
buyer or "",
|
|
107
|
-
]
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
h = get_hash_raw(data_str)
|
|
111
|
-
|
|
112
|
-
return [f"R_{pnu[:10]}_{h[:10]}_0000", h, data_str]
|
|
113
|
-
except Exception as e:
|
|
114
|
-
print(pnu, e)
|
|
115
|
-
return [
|
|
116
|
-
f"R_{pnu[:10] if isPnuValid(pnu) else 'pnu10dhead'}_{'hashstring'}_0000",
|
|
117
|
+
def generate_registration_vid(
|
|
118
|
+
self,
|
|
119
|
+
pnu: str,
|
|
120
|
+
contract_ymd: Union[str, int, None],
|
|
121
|
+
price: Union[float, int, None] = None,
|
|
122
|
+
unit_ar: Union[float, int, str, None] = None,
|
|
123
|
+
lot_ar: Union[float, int, str, None] = None,
|
|
124
|
+
seller: Union[str, None] = None,
|
|
125
|
+
buyer: Union[str, None] = None,
|
|
126
|
+
) -> List[Union[str, None]]:
|
|
127
|
+
|
|
128
|
+
"""
|
|
129
|
+
주어진 입력값들을 문자열로 변환하여 SHA-256 해시값을 생성하여 반환\n
|
|
130
|
+
각 입력값들의 타입정의 및 형식이 명확하지 않아, TypeError, ValueError 를 정의하지 않고 모든 오류에 대해 동일한 예외용 응답만을 반환
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
pnu (str): Represents the Parcel Numbering Unit, a 19-digit numeric string (10 digits for the administrative district code + 1 digit for the mountain code + 8 digits for the plot number).
|
|
134
|
+
contract_ymd (str): Transaction date in YYYYMMDD format, an 8-digit numeric string.
|
|
135
|
+
price (Union[float, int, None]): Transaction price.
|
|
136
|
+
unit_ar (Union[float, int, str, None]): Transaction unit area.
|
|
137
|
+
lot_ar (Union[float, int, str, None]): Transaction land area.
|
|
138
|
+
seller (Union[str, None]): Seller.
|
|
139
|
+
buyer (Union[str, None]): Buyer.
|
|
140
|
+
|
|
141
|
+
Returns: List[Union[str, None]]
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
except_response = [
|
|
145
|
+
f"R_{pnu[:10] if self._is_pnu_valid(pnu) else 'pnu10dhead'}_{'hashstring'}_0000",
|
|
117
146
|
None,
|
|
118
147
|
None,
|
|
119
148
|
]
|
|
149
|
+
try:
|
|
150
|
+
self._validate(self._is_pnu_valid, pnu, "pnu")
|
|
151
|
+
self._validate(self._is_contract_date_valid, contract_ymd, "contract_ymd")
|
|
152
|
+
self._validate(self._is_number_valid, price, "price")
|
|
153
|
+
if not unit_ar == "-":
|
|
154
|
+
self._validate(self._is_number_valid, unit_ar, "unit_ar")
|
|
155
|
+
if not lot_ar == "-":
|
|
156
|
+
self._validate(self._is_number_valid, lot_ar, "lot_ar")
|
|
157
|
+
self._validate(self._is_string_valid, seller, "seller")
|
|
158
|
+
self._validate(self._is_string_valid, buyer, "buyer")
|
|
159
|
+
|
|
160
|
+
data_str = "_".join(
|
|
161
|
+
[
|
|
162
|
+
pnu,
|
|
163
|
+
contract_ymd,
|
|
164
|
+
self._format_float(price) if price else "",
|
|
165
|
+
self._format_float(unit_ar) if price else "",
|
|
166
|
+
self._format_float(lot_ar) if price else "",
|
|
167
|
+
seller or "",
|
|
168
|
+
buyer or "",
|
|
169
|
+
]
|
|
170
|
+
)
|
|
171
|
+
h = self._get_hash_raw(data_str)
|
|
172
|
+
|
|
173
|
+
return [f"R_{pnu[:10]}_{h[:10]}_0000", h, data_str]
|
|
174
|
+
|
|
175
|
+
except Exception as e:
|
|
176
|
+
self.logger.info(f"{pnu}, {e}")
|
|
177
|
+
return except_response
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: vos-data-utils
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.4
|
|
4
4
|
Summary: description
|
|
5
|
-
Author:
|
|
5
|
+
Author: ValueOfSpace
|
|
6
6
|
Author-email: dev@valueofspace.com
|
|
7
7
|
Classifier: Programming Language :: Python :: 3
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -11,6 +11,7 @@ Requires-Python: >=3.7
|
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
12
|
Requires-Dist: symspellpy
|
|
13
13
|
Requires-Dist: pandas
|
|
14
|
+
Requires-Dist: requests
|
|
14
15
|
|
|
15
16
|
vos-data-utils <br>
|
|
16
17
|
[](https://pypi.org/project/vos-data-utils/)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
vdutils/__init__.py,sha256=yNZYpK5OcST5JsiWHL6NBM4HFWcf9__NZTQVy86nuXA,987
|
|
2
|
+
vdutils/bjd.py,sha256=77eqeKogpf7XVjmXlo6j08RGlAKXd7fVDO7nkScy_y4,20936
|
|
3
|
+
vdutils/bjdconnector.py,sha256=QpucOyXQ3mx1qQZXfyJWGkoVxqQZzmy5qG878eUNBVA,29437
|
|
4
|
+
vdutils/convaddr.py,sha256=E7ol9XRAHR10GEM6V8ci0jdW0Y0rBwK369M7hyylpW0,14264
|
|
5
|
+
vdutils/cordate.py,sha256=ednTBnSscr5w8gTDi98ldNtaLfAUAF1BjYV2D2f09so,13638
|
|
6
|
+
vdutils/genpnu.py,sha256=YcpGJ_4msLUP_StWIsdM0IA9nP73Qn6pTzMEtPBSjZc,21663
|
|
7
|
+
vdutils/vid.py,sha256=7ATGsKmXThB74TfENwUY9aF6XVkP6sUKL62TYQfTygg,5734
|
|
8
|
+
vdutils/data/__init__.py,sha256=cDlRzTe-SRJ4VhiQfd7Pi_3cvlnLAiyurA5uqnD7t5U,248
|
|
9
|
+
vdutils/library/__init__.py,sha256=mSEXZfovoMwimrm164NGx1CTXv2ufL-mjvDz_KSyNqk,1204
|
|
10
|
+
vdutils/library/data.py,sha256=tpQHukHuKSXKsyhN3EnqWTCXXWk0LN-ah_r2o7Mi_5E,206956
|
|
11
|
+
vdutils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
vdutils/tests/test_convaddr.py,sha256=jRSHAIXrEj8rpV1aWSMVuvS9OdcUMWpz0q7UMQYqyGo,7309
|
|
13
|
+
vdutils/tests/test_cordate.py,sha256=4vNbLugbgmko8a-SKaBvsWrfp_eMBfblLre4027krSQ,11950
|
|
14
|
+
vdutils/tests/test_genpnu.py,sha256=6qHsEm45h6Uzt5gG_DJRKhlCtZTvF87PlFz6DSAl7gU,71218
|
|
15
|
+
vdutils/tests/test_vid.py,sha256=ogyCJ29ac6qEPBp5pIdWZKiP-R103h-6gk8ga_U8xfI,9714
|
|
16
|
+
vdutils/tests/tests.py,sha256=bhwo2nABDatNXcu--EOMg3pONx2lpCvy-dQXEgjp-j0,957
|
|
17
|
+
vos_data_utils-0.0.4.dist-info/METADATA,sha256=VEdY1gvN4IMZpF3G-Sq_WViWZ_tL4oQQbC8hCVBvJZ8,34441
|
|
18
|
+
vos_data_utils-0.0.4.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
19
|
+
vos_data_utils-0.0.4.dist-info/entry_points.txt,sha256=TPB2LUYp5rOLabatv0O-Bg6bId3UWYUhIVGM0hLZY3g,97
|
|
20
|
+
vos_data_utils-0.0.4.dist-info/top_level.txt,sha256=HHg_xE8RoOT58ELEUeaUMbJaRTq7ry3gLSnC4vB4F4E,8
|
|
21
|
+
vos_data_utils-0.0.4.dist-info/RECORD,,
|