Showing
9 changed files
with
99 additions
and
71 deletions
| @@ -405,7 +405,33 @@ Get Broker Property By Username | @@ -405,7 +405,33 @@ Get Broker Property By Username | ||
| 405 | Should Not Be Equal ${left} ${None} | 405 | Should Not Be Equal ${left} ${None} |
| 406 | Should Not Be Equal ${right} ${None} | 406 | Should Not Be Equal ${right} ${None} |
| 407 | ${status}= compare_date ${left} ${right} accuracy=${accuracy} absolute_delta=${absolute_delta} | 407 | ${status}= compare_date ${left} ${right} accuracy=${accuracy} absolute_delta=${absolute_delta} |
| 408 | - Should Be True ${status} msg=Dates are not equal: ${left} != ${right} | 408 | + Should Be True ${status} msg=Dates differ: ${left} != ${right} |
| 409 | + | ||
| 410 | + | ||
| 411 | +Звірити координати доставки тендера | ||
| 412 | + [Arguments] ${username} ${tender_data} ${field} ${object_id}=${None} | ||
| 413 | + ${left_lat}= Get_From_Object ${tender_data.data} ${field}.deliveryLocation.latitude | ||
| 414 | + ${left_lon}= Get_From_Object ${tender_data.data} ${field}.deliveryLocation.longitude | ||
| 415 | + ${right_lat}= Отримати дані із тендера ${username} ${field}.deliveryLocation.latitude ${object_id} | ||
| 416 | + ${right_lon}= Отримати дані із тендера ${username} ${field}.deliveryLocation.longitude ${object_id} | ||
| 417 | + Порівняти координати ${left_lat} ${left_lon} ${right_lat} ${right_lon} | ||
| 418 | + | ||
| 419 | + | ||
| 420 | +Порівняти координати | ||
| 421 | + [Documentation] | ||
| 422 | + ... Compare coordinates with specified ``accuracy`` (in km). | ||
| 423 | + ... Default is `0.1`. | ||
| 424 | + ... | ||
| 425 | + ... The keyword will fail if the difference between | ||
| 426 | + ... ``left`` and ``right`` is more than ``accuracy``, | ||
| 427 | + ... otherwise it will pass. | ||
| 428 | + [Arguments] ${left_lat} ${left_lon} ${right_lat} ${right_lon} ${accuracy}=0.1 | ||
| 429 | + Should Not Be Equal ${left_lat} ${None} | ||
| 430 | + Should Not Be Equal ${left_lon} ${None} | ||
| 431 | + Should Not Be Equal ${right_lat} ${None} | ||
| 432 | + Should Not Be Equal ${right_lon} ${None} | ||
| 433 | + ${status}= compare_coordinates ${left_lat} ${left_lon} ${right_lat} ${right_lon} ${accuracy} | ||
| 434 | + Should Be True ${status} msg=Coordinates differ: (${left_lat}, ${left_lon}) != (${right_lat}, ${right_lon}) | ||
| 409 | 435 | ||
| 410 | 436 | ||
| 411 | Звірити поля предметів закупівлі багатопредметного тендера | 437 | Звірити поля предметів закупівлі багатопредметного тендера |
| @@ -420,12 +446,19 @@ Get Broker Property By Username | @@ -420,12 +446,19 @@ Get Broker Property By Username | ||
| 420 | Звірити дату предметів закупівлі багатопредметного тендера | 446 | Звірити дату предметів закупівлі багатопредметного тендера |
| 421 | [Arguments] ${username} ${tender_data} ${field} ${accuracy}=60 ${absolute_delta}=${False} | 447 | [Arguments] ${username} ${tender_data} ${field} ${accuracy}=60 ${absolute_delta}=${False} |
| 422 | @{items}= Get_From_Object ${tender_data.data} items | 448 | @{items}= Get_From_Object ${tender_data.data} items |
| 423 | - ${len_of_items}= Get Length ${items} | ||
| 424 | - :FOR ${index} IN RANGE ${len_of_items} | 449 | + :FOR ${index} ${_} IN ENUMERATE @{items} |
| 425 | \ Log ${index} | 450 | \ Log ${index} |
| 426 | \ Звірити дату тендера ${viewer} ${tender_data} items[${index}].${field} accuracy=${accuracy} absolute_delta=${absolute_delta} | 451 | \ Звірити дату тендера ${viewer} ${tender_data} items[${index}].${field} accuracy=${accuracy} absolute_delta=${absolute_delta} |
| 427 | 452 | ||
| 428 | 453 | ||
| 454 | +Звірити координати доставки предметів закупівлі багатопредметного тендера | ||
| 455 | + [Arguments] ${username} ${tender_data} | ||
| 456 | + @{items}= Get_From_Object ${tender_data.data} items | ||
| 457 | + :FOR ${index} ${_} IN ENUMERATE @{items} | ||
| 458 | + \ Log ${index} | ||
| 459 | + \ Звірити координати тендера ${viewer} ${tender_data} items[${index}] | ||
| 460 | + | ||
| 461 | + | ||
| 429 | Отримати дані із тендера | 462 | Отримати дані із тендера |
| 430 | [Arguments] ${username} ${field_name} ${object_id}=${None} | 463 | [Arguments] ${username} ${field_name} ${object_id}=${None} |
| 431 | Log ${username} | 464 | Log ${username} |
| @@ -314,16 +314,10 @@ Resource resource.robot | @@ -314,16 +314,10 @@ Resource resource.robot | ||
| 314 | ... absolute_delta=${True} | 314 | ... absolute_delta=${True} |
| 315 | 315 | ||
| 316 | 316 | ||
| 317 | -Відображення координат широти доставки номенклатури закупівлі | ||
| 318 | - Звірити поле тендера ${viewer} | ||
| 319 | - ... ${USERS.users['${tender_owner}'].initial_data} | ||
| 320 | - ... items[${ITEMS_NUM}].deliveryLocation.latitude | ||
| 321 | - | ||
| 322 | - | ||
| 323 | -Відображення координат довготи доставки номенклатури закупівлі | ||
| 324 | - Звірити поле тендера ${viewer} | 317 | +Відображення координат доставки номенклатури закупівлі |
| 318 | + Звірити координати доставки тендера ${viewer} | ||
| 325 | ... ${USERS.users['${tender_owner}'].initial_data} | 319 | ... ${USERS.users['${tender_owner}'].initial_data} |
| 326 | - ... items[${ITEMS_NUM}].deliveryLocation.longitude | 320 | + ... items[${ITEMS_NUM}] |
| 327 | 321 | ||
| 328 | 322 | ||
| 329 | Відображення назви нас. пункту доставки номенклатури закупівлі | 323 | Відображення назви нас. пункту доставки номенклатури закупівлі |
| @@ -52,17 +52,11 @@ ${mode} multiItem | @@ -52,17 +52,11 @@ ${mode} multiItem | ||
| 52 | ... level3 | 52 | ... level3 |
| 53 | Звірити дату предметів закупівлі багатопредметного тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} deliveryDate.endDate day absolute_delta=${True} | 53 | Звірити дату предметів закупівлі багатопредметного тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} deliveryDate.endDate day absolute_delta=${True} |
| 54 | 54 | ||
| 55 | -Відображення координат широти доставки позицій закупівлі багатопредметного тендера | 55 | +Відображення координат доставки позицій закупівлі багатопредметного тендера |
| 56 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення полів предметів багатопредметного тендера | 56 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення полів предметів багатопредметного тендера |
| 57 | ... viewer | 57 | ... viewer |
| 58 | ... ${USERS.users['${viewer}'].broker} | 58 | ... ${USERS.users['${viewer}'].broker} |
| 59 | - Звірити поля предметів закупівлі багатопредметного тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} deliveryLocation.latitude | ||
| 60 | - | ||
| 61 | -Відображення координат довготи доставки позицій закупівлі багатопредметного тендера | ||
| 62 | - [Tags] ${USERS.users['${viewer}'].broker}: Відображення полів предметів багатопредметного тендера | ||
| 63 | - ... viewer | ||
| 64 | - ... ${USERS.users['${viewer}'].broker} | ||
| 65 | - Звірити поля предметів закупівлі багатопредметного тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} deliveryLocation.longitude | 59 | + Звірити координати доставки предметів закупівлі багатопредметного тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} |
| 66 | 60 | ||
| 67 | Відображення назви нас. пункту доставки позицій закупівлі багатопредметного тендера | 61 | Відображення назви нас. пункту доставки позицій закупівлі багатопредметного тендера |
| 68 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення полів предметів багатопредметного тендера | 62 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення полів предметів багатопредметного тендера |
| @@ -357,18 +357,11 @@ ${mode} negotiation.quick | @@ -357,18 +357,11 @@ ${mode} negotiation.quick | ||
| 357 | Відображення дати доставки номенклатури закупівлі | 357 | Відображення дати доставки номенклатури закупівлі |
| 358 | 358 | ||
| 359 | 359 | ||
| 360 | -Відображення координат широти доставки номенклатури переговорної процедури за нагальною потребою | 360 | +Відображення координат доставки номенклатури переговорної процедури за нагальною потребою |
| 361 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури | 361 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури |
| 362 | ... viewer | 362 | ... viewer |
| 363 | ... ${USERS.users['${viewer}'].broker} | 363 | ... ${USERS.users['${viewer}'].broker} |
| 364 | - Відображення координат широти доставки номенклатури закупівлі | ||
| 365 | - | ||
| 366 | - | ||
| 367 | -Відображення координат довготи доставки номенклатури переговорної процедури за нагальною потребою | ||
| 368 | - [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури | ||
| 369 | - ... viewer | ||
| 370 | - ... ${USERS.users['${viewer}'].broker} | ||
| 371 | - Відображення координат довготи доставки номенклатури закупівлі | 364 | + Відображення координат доставки номенклатури закупівлі |
| 372 | 365 | ||
| 373 | 366 | ||
| 374 | Відображення назви нас. пункту доставки номенклатури переговорної процедури за нагальною потребою | 367 | Відображення назви нас. пункту доставки номенклатури переговорної процедури за нагальною потребою |
| @@ -357,18 +357,11 @@ ${mode} negotiation | @@ -357,18 +357,11 @@ ${mode} negotiation | ||
| 357 | Відображення дати доставки номенклатури закупівлі | 357 | Відображення дати доставки номенклатури закупівлі |
| 358 | 358 | ||
| 359 | 359 | ||
| 360 | -Відображення координат широти доставки номенклатури переговорної процедури | 360 | +Відображення координат доставки номенклатури переговорної процедури |
| 361 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури | 361 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури |
| 362 | ... viewer | 362 | ... viewer |
| 363 | ... ${USERS.users['${viewer}'].broker} | 363 | ... ${USERS.users['${viewer}'].broker} |
| 364 | - Відображення координат широти доставки номенклатури закупівлі | ||
| 365 | - | ||
| 366 | - | ||
| 367 | -Відображення координат довготи доставки номенклатури переговорної процедури | ||
| 368 | - [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури | ||
| 369 | - ... viewer | ||
| 370 | - ... ${USERS.users['${viewer}'].broker} | ||
| 371 | - Відображення координат довготи доставки номенклатури закупівлі | 364 | + Відображення координат доставки номенклатури закупівлі |
| 372 | 365 | ||
| 373 | 366 | ||
| 374 | Відображення назви нас. пункту доставки номенклатури переговорної процедури | 367 | Відображення назви нас. пункту доставки номенклатури переговорної процедури |
| @@ -363,18 +363,11 @@ ${mode} reporting | @@ -363,18 +363,11 @@ ${mode} reporting | ||
| 363 | Відображення дати доставки номенклатури закупівлі | 363 | Відображення дати доставки номенклатури закупівлі |
| 364 | 364 | ||
| 365 | 365 | ||
| 366 | -Відображення координат широти доставки номенклатури звіту про укладений договір | 366 | +Відображення координат доставки номенклатури звіту про укладений договір |
| 367 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури | 367 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури |
| 368 | ... viewer | 368 | ... viewer |
| 369 | ... ${USERS.users['${viewer}'].broker} | 369 | ... ${USERS.users['${viewer}'].broker} |
| 370 | - Відображення координат широти доставки номенклатури закупівлі | ||
| 371 | - | ||
| 372 | - | ||
| 373 | -Відображення координат довготи доставки номенклатури звіту про укладений договір | ||
| 374 | - [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури процедури | ||
| 375 | - ... viewer | ||
| 376 | - ... ${USERS.users['${viewer}'].broker} | ||
| 377 | - Відображення координат довготи доставки номенклатури закупівлі | 370 | + Відображення координат доставки номенклатури закупівлі |
| 378 | 371 | ||
| 379 | 372 | ||
| 380 | Відображення назви нас. пункту доставки номенклатури звіту про укладений договір | 373 | Відображення назви нас. пункту доставки номенклатури звіту про укладений договір |
| @@ -12,6 +12,8 @@ from robot.errors import ExecutionFailed | @@ -12,6 +12,8 @@ from robot.errors import ExecutionFailed | ||
| 12 | from robot.libraries.BuiltIn import BuiltIn | 12 | from robot.libraries.BuiltIn import BuiltIn |
| 13 | from robot.output import LOGGER | 13 | from robot.output import LOGGER |
| 14 | from robot.output.loggerhelper import Message | 14 | from robot.output.loggerhelper import Message |
| 15 | +from haversine import haversine | ||
| 16 | +from math import radians, cos, sin, asin, sqrt | ||
| 15 | # These imports are not pointless. Robot's resource and testsuite files | 17 | # These imports are not pointless. Robot's resource and testsuite files |
| 16 | # can access them by simply importing library "service_keywords". | 18 | # can access them by simply importing library "service_keywords". |
| 17 | # Please ignore the warning given by Flake8 or other linter. | 19 | # Please ignore the warning given by Flake8 or other linter. |
| @@ -54,6 +56,8 @@ import os | @@ -54,6 +56,8 @@ import os | ||
| 54 | from barbecue import chef | 56 | from barbecue import chef |
| 55 | import re | 57 | import re |
| 56 | 58 | ||
| 59 | +NUM_TYPES = (int, long, float) | ||
| 60 | + | ||
| 57 | 61 | ||
| 58 | def get_current_tzdate(): | 62 | def get_current_tzdate(): |
| 59 | return get_now().strftime('%Y-%m-%d %H:%M:%S.%f') | 63 | return get_now().strftime('%Y-%m-%d %H:%M:%S.%f') |
| @@ -68,20 +72,20 @@ def get_file_contents(path): | @@ -68,20 +72,20 @@ def get_file_contents(path): | ||
| 68 | return unicode(f.read()) or u'' | 72 | return unicode(f.read()) or u'' |
| 69 | 73 | ||
| 70 | 74 | ||
| 71 | -def compare_date(date1, date2, accuracy="minute", absolute_delta=True): | 75 | +def compare_date(left, right, accuracy="minute", absolute_delta=True): |
| 72 | '''Compares dates with specified accuracy | 76 | '''Compares dates with specified accuracy |
| 73 | 77 | ||
| 74 | Before comparison dates are parsed into datetime.datetime format | 78 | Before comparison dates are parsed into datetime.datetime format |
| 75 | and localized. | 79 | and localized. |
| 76 | 80 | ||
| 77 | - :param date1: First date | ||
| 78 | - :param date2: Second date | 81 | + :param left: First date |
| 82 | + :param right: Second date | ||
| 79 | :param accuracy: Max difference between dates to consider them equal | 83 | :param accuracy: Max difference between dates to consider them equal |
| 80 | Default value - "minute" | 84 | Default value - "minute" |
| 81 | Possible values - "day", "hour", "minute" or float value | 85 | Possible values - "day", "hour", "minute" or float value |
| 82 | of seconds | 86 | of seconds |
| 83 | :param absolute_delta: Type of comparison. If set to True, then no matter which date order. If set to | 87 | :param absolute_delta: Type of comparison. If set to True, then no matter which date order. If set to |
| 84 | - False then date2 must be lower then date1 for accuracy value. | 88 | + False then right must be lower then left for accuracy value. |
| 85 | Default value - True | 89 | Default value - True |
| 86 | Possible values - True and False or something what can be casted into them | 90 | Possible values - True and False or something what can be casted into them |
| 87 | :returns: Boolean value | 91 | :returns: Boolean value |
| @@ -91,15 +95,15 @@ def compare_date(date1, date2, accuracy="minute", absolute_delta=True): | @@ -91,15 +95,15 @@ def compare_date(date1, date2, accuracy="minute", absolute_delta=True): | ||
| 91 | given and accuracy will be set to 60. | 95 | given and accuracy will be set to 60. |
| 92 | 96 | ||
| 93 | ''' | 97 | ''' |
| 94 | - date1 = parse(date1) | ||
| 95 | - date2 = parse(date2) | 98 | + left = parse(left) |
| 99 | + right = parse(right) | ||
| 96 | 100 | ||
| 97 | - if date1.tzinfo is None: | ||
| 98 | - date1 = TZ.localize(date1) | ||
| 99 | - if date2.tzinfo is None: | ||
| 100 | - date2 = TZ.localize(date2) | 101 | + if left.tzinfo is None: |
| 102 | + left = TZ.localize(left) | ||
| 103 | + if right.tzinfo is None: | ||
| 104 | + right = TZ.localize(right) | ||
| 101 | 105 | ||
| 102 | - delta = (date1 - date2).total_seconds() | 106 | + delta = (left - right).total_seconds() |
| 103 | 107 | ||
| 104 | if accuracy == "day": | 108 | if accuracy == "day": |
| 105 | accuracy = 24 * 60 * 60 - 1 | 109 | accuracy = 24 * 60 * 60 - 1 |
| @@ -120,6 +124,38 @@ def compare_date(date1, date2, accuracy="minute", absolute_delta=True): | @@ -120,6 +124,38 @@ def compare_date(date1, date2, accuracy="minute", absolute_delta=True): | ||
| 120 | return True | 124 | return True |
| 121 | 125 | ||
| 122 | 126 | ||
| 127 | +def compare_coordinates(left_lat, left_lon, right_lat, right_lon, accuracy=0.1): | ||
| 128 | + '''Compares dates with specified accuracy | ||
| 129 | + | ||
| 130 | + Before comparison dates are parsed into datetime.datetime format | ||
| 131 | + and localized. | ||
| 132 | + | ||
| 133 | + :param left_lat: First coordinate latitude | ||
| 134 | + :param left_lon: First coordinate longitude | ||
| 135 | + :param right_lat: Second coordinate latitude | ||
| 136 | + :param right_lon: Second coordinate longitude | ||
| 137 | + :param accuracy: Max difference between coordinates to consider them equal | ||
| 138 | + Default value - 0.1 | ||
| 139 | + Possible values - float or integer value of kilometers | ||
| 140 | + | ||
| 141 | + :returns: Boolean value | ||
| 142 | + | ||
| 143 | + :error: ValueError when there is problem with converting accuracy | ||
| 144 | + into float value. When it will be catched warning will be | ||
| 145 | + given and accuracy will be set to 0.1. | ||
| 146 | + | ||
| 147 | + ''' | ||
| 148 | + for key, value in {'left_lat': left_lat, 'left_lon': left_lon, 'right_lat': right_lat, 'right_lon': right_lon}.iteritems(): | ||
| 149 | + if not isinstance(value, NUM_TYPES): | ||
| 150 | + raise TypeError("Invalid type for coordinate '{0}'. " | ||
| 151 | + "Expected one of {1}, got {2}".format( | ||
| 152 | + key, str(NUM_TYPES), str(type(value)))) | ||
| 153 | + distance = haversine((left_lat, left_lon), (right_lat, right_lon)) | ||
| 154 | + if distance > accuracy: | ||
| 155 | + return False | ||
| 156 | + return True | ||
| 157 | + | ||
| 158 | + | ||
| 123 | def log_object_data(data, file_name=None, format="yaml", update=False): | 159 | def log_object_data(data, file_name=None, format="yaml", update=False): |
| 124 | """Log object data in pretty format (JSON or YAML) | 160 | """Log object data in pretty format (JSON or YAML) |
| 125 | 161 | ||
| @@ -201,8 +237,6 @@ def compute_intrs(brokers_data, used_brokers): | @@ -201,8 +237,6 @@ def compute_intrs(brokers_data, used_brokers): | ||
| 201 | does not contain ``Default`` entry. | 237 | does not contain ``Default`` entry. |
| 202 | Using `load_data_from` with ``mode='brokers'`` is recommended. | 238 | Using `load_data_from` with ``mode='brokers'`` is recommended. |
| 203 | """ | 239 | """ |
| 204 | - num_types = (int, long, float) | ||
| 205 | - | ||
| 206 | def recur(l, r): | 240 | def recur(l, r): |
| 207 | l, r = deepcopy(l), deepcopy(r) | 241 | l, r = deepcopy(l), deepcopy(r) |
| 208 | if isinstance(l, list) and isinstance(r, list) and len(l) == len(r): | 242 | if isinstance(l, list) and isinstance(r, list) and len(l) == len(r): |
| @@ -210,7 +244,7 @@ def compute_intrs(brokers_data, used_brokers): | @@ -210,7 +244,7 @@ def compute_intrs(brokers_data, used_brokers): | ||
| 210 | for ll, rr in zip(l, r): | 244 | for ll, rr in zip(l, r): |
| 211 | lst.append(recur(ll, rr)) | 245 | lst.append(recur(ll, rr)) |
| 212 | return lst | 246 | return lst |
| 213 | - elif isinstance(l, num_types) and isinstance(r, num_types): | 247 | + elif isinstance(l, NUM_TYPES) and isinstance(r, NUM_TYPES): |
| 214 | if l == r: | 248 | if l == r: |
| 215 | return l | 249 | return l |
| 216 | if l > r: | 250 | if l > r: |
| @@ -169,18 +169,11 @@ ${mode} single | @@ -169,18 +169,11 @@ ${mode} single | ||
| 169 | Звірити дату тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} items[0].deliveryDate.endDate day absolute_delta=${True} | 169 | Звірити дату тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} items[0].deliveryDate.endDate day absolute_delta=${True} |
| 170 | 170 | ||
| 171 | 171 | ||
| 172 | -Відображення координат широти доставки номенклатури однопредметного тендера | 172 | +Відображення координати доставки позицій закупівлі однопредметного тендера |
| 173 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури тендера | 173 | [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури тендера |
| 174 | ... viewer | 174 | ... viewer |
| 175 | ... ${USERS.users['${viewer}'].broker} | 175 | ... ${USERS.users['${viewer}'].broker} |
| 176 | - Звірити поле тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} items[0].deliveryLocation.latitude | ||
| 177 | - | ||
| 178 | - | ||
| 179 | -Відображення координат довготи доставки номенклатури однопредметного тендера | ||
| 180 | - [Tags] ${USERS.users['${viewer}'].broker}: Відображення номенклатури тендера | ||
| 181 | - ... viewer | ||
| 182 | - ... ${USERS.users['${viewer}'].broker} | ||
| 183 | - Звірити поле тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} items[0].deliveryLocation.longitude | 176 | + Звірити координати доставки тендера ${viewer} ${USERS.users['${tender_owner}'].initial_data} items[0] |
| 184 | 177 | ||
| 185 | 178 | ||
| 186 | Відображення назви нас. пункту доставки номенклатури однопредметного тендера | 179 | Відображення назви нас. пункту доставки номенклатури однопредметного тендера |
| @@ -33,7 +33,8 @@ setup(name='op_robot_tests', | @@ -33,7 +33,8 @@ setup(name='op_robot_tests', | ||
| 33 | 'pytz', | 33 | 'pytz', |
| 34 | 'parse', | 34 | 'parse', |
| 35 | 'chromedriver', | 35 | 'chromedriver', |
| 36 | - 'barbecue' | 36 | + 'barbecue', |
| 37 | + 'haversine' | ||
| 37 | ], | 38 | ], |
| 38 | entry_points={ | 39 | entry_points={ |
| 39 | 'console_scripts': [ | 40 | 'console_scripts': [ |
Please
register
or
login
to post a comment