ey-commerce-lib 1.0.17__py3-none-any.whl → 1.0.18__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 ey-commerce-lib might be problematic. Click here for more details.
- ey_commerce_lib/dxm/main.py +88 -11
- ey_commerce_lib/dxm/parser/common.py +17 -0
- ey_commerce_lib/dxm/parser/tracking.py +56 -0
- ey_commerce_lib/dxm/schemas/tracking.py +45 -0
- {ey_commerce_lib-1.0.17.dist-info → ey_commerce_lib-1.0.18.dist-info}/METADATA +1 -1
- {ey_commerce_lib-1.0.17.dist-info → ey_commerce_lib-1.0.18.dist-info}/RECORD +7 -5
- {ey_commerce_lib-1.0.17.dist-info → ey_commerce_lib-1.0.18.dist-info}/WHEEL +0 -0
ey_commerce_lib/dxm/main.py
CHANGED
|
@@ -6,17 +6,19 @@ from httpx import AsyncClient, Timeout
|
|
|
6
6
|
from playwright.async_api import async_playwright
|
|
7
7
|
|
|
8
8
|
from ey_commerce_lib.dxm.constant.order import DxmOrderRuleType
|
|
9
|
-
from ey_commerce_lib.dxm.parser.common import get_page_info, get_purchase_pagination_info
|
|
9
|
+
from ey_commerce_lib.dxm.parser.common import get_page_info, get_purchase_pagination_info, get_tracking_page_info
|
|
10
10
|
from ey_commerce_lib.dxm.parser.count import parse_count
|
|
11
11
|
from ey_commerce_lib.dxm.parser.order import list_order_base_by_html, list_order_rule, get_rule_detail, \
|
|
12
12
|
get_order_detail_by_html
|
|
13
13
|
from ey_commerce_lib.dxm.parser.purchase import list_purchasing_all, list_1688_purchase_order_number, \
|
|
14
14
|
list_wait_pay_page_purchase_order_number
|
|
15
|
+
from ey_commerce_lib.dxm.parser.tracking import parse_tracking_page
|
|
15
16
|
from ey_commerce_lib.dxm.parser.warehouse import list_warehouse_product
|
|
16
17
|
from ey_commerce_lib.dxm.schemas.common import Page
|
|
17
18
|
from ey_commerce_lib.dxm.schemas.dxm_commodity_product import ViewDxmCommodityProductResponse
|
|
18
19
|
from ey_commerce_lib.dxm.schemas.ebay_product import DxmEbayProductModel
|
|
19
20
|
from ey_commerce_lib.dxm.schemas.order import DxmOrderSearchForm, DxmJsonResponse, DxmCheckProcessResponse, DxmOrderRule
|
|
21
|
+
from ey_commerce_lib.dxm.schemas.tracking import TrackingPageListQuery, TrackingPageListItem
|
|
20
22
|
from ey_commerce_lib.dxm.schemas.warehouse import WarehouseProduct, WarehouseProductQuery, PurchasingAllQuery
|
|
21
23
|
|
|
22
24
|
|
|
@@ -710,10 +712,12 @@ class DxmClient:
|
|
|
710
712
|
try:
|
|
711
713
|
async with async_playwright() as p:
|
|
712
714
|
browser = await p.chromium.launch(
|
|
713
|
-
headless=
|
|
715
|
+
headless=True,
|
|
714
716
|
args=[
|
|
715
717
|
'--start-maximized',
|
|
716
718
|
'--disable-blink-features=AutomationControlled',
|
|
719
|
+
'--no-sandbox',
|
|
720
|
+
'--disable-dev-shm-usage'
|
|
717
721
|
]
|
|
718
722
|
)
|
|
719
723
|
context = await browser.new_context()
|
|
@@ -729,21 +733,94 @@ class DxmClient:
|
|
|
729
733
|
])
|
|
730
734
|
page = await context.new_page()
|
|
731
735
|
# 访问
|
|
732
|
-
await page.goto(f'{self.__base_url}/dxmCommodityProduct/openEditModal.htm?id={proid}&editOrCopy=0'
|
|
736
|
+
await page.goto(f'{self.__base_url}/dxmCommodityProduct/openEditModal.htm?id={proid}&editOrCopy=0',
|
|
737
|
+
timeout=60000)
|
|
733
738
|
# 关闭模态框
|
|
734
|
-
|
|
739
|
+
try:
|
|
740
|
+
await page.locator(
|
|
741
|
+
'#theNewestModalLabel > div.modal-dialog > div > div.modal-header > button').click()
|
|
742
|
+
except:
|
|
743
|
+
pass
|
|
735
744
|
# 输入sku
|
|
736
745
|
await page.locator('input.variationValue.ui-autocomplete-input').fill(front_sku)
|
|
737
746
|
# 失去焦点
|
|
738
747
|
await page.locator('input.variationValue.ui-autocomplete-input').press('Tab')
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
748
|
+
try:
|
|
749
|
+
# 休眠两秒
|
|
750
|
+
error_text = await page.text_content(selector='div.alert-dangerRed span', timeout=2000)
|
|
751
|
+
return {
|
|
752
|
+
'code': 500,
|
|
753
|
+
'msg': error_text
|
|
754
|
+
}
|
|
755
|
+
except Exception as e:
|
|
756
|
+
# 创建监听任务
|
|
757
|
+
async def wait_for_api1():
|
|
758
|
+
async with page.expect_response(
|
|
759
|
+
f"{self.__base_url}/dxmCommodityProduct/editCommodityProduct.json") as response_info:
|
|
760
|
+
pass
|
|
761
|
+
return await response_info.value
|
|
762
|
+
|
|
763
|
+
async def wait_for_api2():
|
|
764
|
+
async with page.expect_response(
|
|
765
|
+
f"{self.__base_url}/dxmCommodityProduct/editCommodityProductGroup.json") as response_info:
|
|
766
|
+
pass
|
|
767
|
+
return await response_info.value
|
|
768
|
+
|
|
769
|
+
# 创建并发任务
|
|
770
|
+
task1 = asyncio.create_task(wait_for_api1())
|
|
771
|
+
task2 = asyncio.create_task(wait_for_api2())
|
|
772
|
+
# 点击保存按钮
|
|
773
|
+
await page.locator('.button.btn-orange.m-left10').first.click()
|
|
774
|
+
# 等待任何一个请求完成
|
|
775
|
+
done, pending = await asyncio.wait(
|
|
776
|
+
[task1, task2],
|
|
777
|
+
return_when=asyncio.FIRST_COMPLETED
|
|
778
|
+
)
|
|
779
|
+
# 取消其他未完成的任务
|
|
780
|
+
for task in pending:
|
|
781
|
+
task.cancel()
|
|
782
|
+
# 获取完成的请求结果
|
|
783
|
+
completed_task = list(done)[0]
|
|
784
|
+
response = await completed_task
|
|
785
|
+
return await response.json()
|
|
745
786
|
except Exception as e:
|
|
746
|
-
|
|
787
|
+
return {
|
|
788
|
+
'code': 500,
|
|
789
|
+
'msg': traceback.format_exc()
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
async def tracking_page_list(self, query: TrackingPageListQuery) -> Page[TrackingPageListItem]:
|
|
793
|
+
"""
|
|
794
|
+
分页查询物流追踪页表
|
|
795
|
+
:param query:
|
|
796
|
+
:return:
|
|
797
|
+
"""
|
|
798
|
+
async with self.__sem:
|
|
799
|
+
tracking_page_list_response = await self.__async_client.post('/tracking/pageList.htm',
|
|
800
|
+
data=query.model_dump(by_alias=True))
|
|
801
|
+
tracking_page_list_html = tracking_page_list_response.text
|
|
802
|
+
page = get_tracking_page_info(tracking_page_list_html)
|
|
803
|
+
page.records = parse_tracking_page(tracking_page_list_html)
|
|
804
|
+
return page
|
|
805
|
+
|
|
806
|
+
async def tracking_list(self, query: TrackingPageListQuery) -> list[TrackingPageListItem]:
|
|
807
|
+
async with self.__sem:
|
|
808
|
+
query.page_no = '1'
|
|
809
|
+
tracking_page_list_response = await self.__async_client.post('/tracking/pageList.htm',
|
|
810
|
+
data=query.model_dump(by_alias=True))
|
|
811
|
+
tracking_page_list_html = tracking_page_list_response.text
|
|
812
|
+
# 获取分页数据
|
|
813
|
+
page = get_tracking_page_info(tracking_page_list_html)
|
|
814
|
+
# 获取总页数
|
|
815
|
+
total_page = page.total_page
|
|
816
|
+
# 最终记录
|
|
817
|
+
result = parse_tracking_page(tracking_page_list_html)
|
|
818
|
+
for page_num in range(2, total_page + 1):
|
|
819
|
+
query.page_no = str(page_num)
|
|
820
|
+
# 获取分页数据
|
|
821
|
+
page_data = await self.tracking_page_list(query)
|
|
822
|
+
result.extend(page_data.records)
|
|
823
|
+
return result
|
|
747
824
|
|
|
748
825
|
async def __aenter__(self):
|
|
749
826
|
return self
|
|
@@ -4,6 +4,7 @@ from typing import TypedDict
|
|
|
4
4
|
from lxml import html
|
|
5
5
|
|
|
6
6
|
from ey_commerce_lib.dxm.exception.common import PageInfoNotFoundException
|
|
7
|
+
from ey_commerce_lib.model import Page
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class PageInfo(TypedDict):
|
|
@@ -92,3 +93,19 @@ def get_purchasing_page_info(html_str: str):
|
|
|
92
93
|
'total_size': total_size,
|
|
93
94
|
'page_number': page_number
|
|
94
95
|
}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def get_tracking_page_info(html_str: str):
|
|
99
|
+
tree = html.fromstring(html_str)
|
|
100
|
+
total = int(tree.xpath('//input[@id="totalSizeOrder"]/@value')[0])
|
|
101
|
+
page_size = int(tree.xpath('//input[@id="pageSizeOrder"]/@value')[0])
|
|
102
|
+
page_number = int(tree.xpath('//input[@id="pageNoOrder"]/@value')[0])
|
|
103
|
+
total_page = int(tree.xpath('//input[@id="totalPageOrder"]/@value')[0])
|
|
104
|
+
return Page(
|
|
105
|
+
total=total,
|
|
106
|
+
page_size=page_size,
|
|
107
|
+
page_number=page_number,
|
|
108
|
+
total_page=total_page,
|
|
109
|
+
records=[]
|
|
110
|
+
)
|
|
111
|
+
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from lxml import html
|
|
2
|
+
|
|
3
|
+
from ey_commerce_lib.dxm.schemas.tracking import TrackingPageListItem
|
|
4
|
+
from ey_commerce_lib.utils.list_util import get_str_list_first_not_blank_or_none
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def parse_tracking_page(html_content: str):
|
|
8
|
+
tree = html.fromstring(html_content)
|
|
9
|
+
# 物流追踪节点列表
|
|
10
|
+
tracking_element_list = tree.xpath('//tbody[@id="dhSysMsg"]/tr[@class="content"]')
|
|
11
|
+
tracking_list = []
|
|
12
|
+
for tracking_element in tracking_element_list:
|
|
13
|
+
# 获取包裹号
|
|
14
|
+
package_number = tracking_element.xpath('@data-tracknum')[0].strip()
|
|
15
|
+
# 获取订单id
|
|
16
|
+
order_id = tracking_element.xpath('@data-orderid')[0].strip()
|
|
17
|
+
# 获取收件人姓名
|
|
18
|
+
receiver_name = tracking_element.xpath('./td[3]/text()')[0].strip()
|
|
19
|
+
# 获取国家
|
|
20
|
+
country = get_str_list_first_not_blank_or_none(tracking_element.xpath('./td[3]/span/text()'))
|
|
21
|
+
# 获取物流方式
|
|
22
|
+
logistics_method = tracking_element.xpath('./td[4]/text()')[0].strip()
|
|
23
|
+
# 物流状态
|
|
24
|
+
logistics_status = tracking_element.xpath('./td[4]/span/@title')[0].replace('「', '').replace('」', '')
|
|
25
|
+
# 物流单号
|
|
26
|
+
logistics_number = tracking_element.xpath('./td[4]//span[@class="limingcentUrlpic"]/text()')[0].strip()
|
|
27
|
+
# carrierCode
|
|
28
|
+
carrier_code = get_str_list_first_not_blank_or_none(tracking_element.xpath('./td[5]/a/@data-carriercode'))
|
|
29
|
+
# 最新消息
|
|
30
|
+
latest_message = get_str_list_first_not_blank_or_none(tracking_element.xpath('./td[5]/text()'))
|
|
31
|
+
# 运输信息
|
|
32
|
+
transport_info = tracking_element.xpath('./td[6]/text()')[0].strip()
|
|
33
|
+
# 平台和店铺
|
|
34
|
+
platform, shop = tracking_element.xpath('./td[7]')[0].text_content().split(':')
|
|
35
|
+
time_list = []
|
|
36
|
+
# 获取时间
|
|
37
|
+
for time in tracking_element.xpath('./td[8]')[0].text_content().strip().split('\n'):
|
|
38
|
+
time_list.append(time.strip())
|
|
39
|
+
platform = platform.strip()
|
|
40
|
+
shop = shop.strip()
|
|
41
|
+
tracking_list.append(TrackingPageListItem(
|
|
42
|
+
package_number=package_number,
|
|
43
|
+
order_id=order_id,
|
|
44
|
+
receiver_name=receiver_name,
|
|
45
|
+
country=country,
|
|
46
|
+
logistics_method=logistics_method,
|
|
47
|
+
logistics_status=logistics_status,
|
|
48
|
+
logistics_number=logistics_number,
|
|
49
|
+
latest_message=latest_message,
|
|
50
|
+
transport_info=transport_info,
|
|
51
|
+
platform=platform,
|
|
52
|
+
shop=shop,
|
|
53
|
+
time_list=time_list,
|
|
54
|
+
carrier_code=carrier_code
|
|
55
|
+
))
|
|
56
|
+
return tracking_list
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field, ConfigDict
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TrackingPageListQuery(BaseModel):
|
|
7
|
+
page_no: str = Field('1', alias='pageNo', description='页码')
|
|
8
|
+
state_type: str = Field('all', alias='stateType', description='状态类型,默认 all(全部)')
|
|
9
|
+
platform: str = Field('', alias='platform', description='平台渠道')
|
|
10
|
+
shop_id: str = Field('-1', alias="shopId", description='店铺 ID')
|
|
11
|
+
country: str = Field('', alias="country", description="国家")
|
|
12
|
+
auth_id: str = Field('-1', alias="authId", description="物流方式")
|
|
13
|
+
ship_start_time: str = Field('', alias="shipStartTime", description="发货开始时间")
|
|
14
|
+
ship_end_time: str = Field('', alias="shipEndTime", description="发货结束时间")
|
|
15
|
+
track_start_time: str = Field('-1', alias='trackStartTime', description='运输天数')
|
|
16
|
+
track_end_time: str = Field('-1', alias='trackEndTime', description='运输天数')
|
|
17
|
+
is_comm: str = Field('', alias='isComm', description='备注')
|
|
18
|
+
order_field: str = Field('shipped_time', alias='orderField', description='排序方式')
|
|
19
|
+
is_desc: str = Field('1', alias='isDesc', description='排序方式')
|
|
20
|
+
search_type: str = Field('orderId', alias='searchType', description='搜索类型 orderId(订单id)')
|
|
21
|
+
search_value: str = Field('', alias="searchValue", description="搜索关键字")
|
|
22
|
+
is_del: str = Field('0', alias="isDel", description="是否删除,0 否 1 是")
|
|
23
|
+
history: str = Field('', alias="history", description="历史记录标志")
|
|
24
|
+
is_stop: str = Field('0', alias='isStop', description='是否暂停,0 正常追踪 1 暂停追踪')
|
|
25
|
+
no_update_days: str = Field('0', alias="noUpdateDays", description="异常类型 无更新天数")
|
|
26
|
+
|
|
27
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class TrackingPageListItem(BaseModel):
|
|
31
|
+
package_number: str = Field(..., alias='packageNumber', description='包裹号')
|
|
32
|
+
order_id: str = Field(..., alias='orderId', description='订单号')
|
|
33
|
+
receiver_name: str = Field(..., alias='receiverName', description='收件人姓名')
|
|
34
|
+
country: Optional[str] = Field(..., alias='country', description='国家')
|
|
35
|
+
logistics_method: str = Field(..., alias='logisticsMethod', description='物流方式')
|
|
36
|
+
logistics_status: str = Field(..., alias='logisticsStatus', description='物流状态')
|
|
37
|
+
logistics_number: str = Field(..., alias='logisticsNumber', description='物流单号')
|
|
38
|
+
carrier_code: Optional[str] = Field(..., alias='carrierCode', description='物流公司编码')
|
|
39
|
+
latest_message: Optional[str] = Field(..., alias='latestMessage', description='最新物流信息')
|
|
40
|
+
transport_info: str = Field(..., alias='transportInfo', description='运输信息')
|
|
41
|
+
platform: str = Field(..., alias='platform', description='平台渠道')
|
|
42
|
+
shop: str = Field(..., alias='shop', description='店铺')
|
|
43
|
+
time_list: list[str] = Field([], alias='timeList', description='时间列表')
|
|
44
|
+
|
|
45
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
@@ -2,24 +2,26 @@ ey_commerce_lib/__init__.py,sha256=QTYqXqSTHFRkM9TEgpDFcHvwLbvqHDqvqfQ9EiXkcAM,2
|
|
|
2
2
|
ey_commerce_lib/model.py,sha256=0ZCE68502blzRDsQ38AIswc8kPk7H34Am5x8IiDi2DU,232
|
|
3
3
|
ey_commerce_lib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
ey_commerce_lib/dxm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
-
ey_commerce_lib/dxm/main.py,sha256=
|
|
5
|
+
ey_commerce_lib/dxm/main.py,sha256=XJ_n9aiLK9QOJ6b-eypwk3slbdV4C5d-vs9ceGG3zfI,33048
|
|
6
6
|
ey_commerce_lib/dxm/order.py,sha256=hMdNm9X5h9tbvMWFnyE5hcSF4butzn7m-akGqLQUD0k,35
|
|
7
7
|
ey_commerce_lib/dxm/constant/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
ey_commerce_lib/dxm/constant/order.py,sha256=U-2NYnkIcqukzMtOFpfqvzIktu_t7jYEms_n9LgKMlY,2213
|
|
9
9
|
ey_commerce_lib/dxm/exception/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
ey_commerce_lib/dxm/exception/common.py,sha256=DM5vItHdZCGK2Piqp2S5TFxPm3pioMzzlV-1RTxty00,159
|
|
11
11
|
ey_commerce_lib/dxm/parser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
-
ey_commerce_lib/dxm/parser/common.py,sha256
|
|
12
|
+
ey_commerce_lib/dxm/parser/common.py,sha256=srzjwl7CviDgv0vizDC3RO2cbkQG9Pl-JpQpGAO5U14,3627
|
|
13
13
|
ey_commerce_lib/dxm/parser/count.py,sha256=WOrGeA6DP6_IBtiF1TEZhW528f8kHxlT2cpmg_7FKPM,1561
|
|
14
14
|
ey_commerce_lib/dxm/parser/ebay_product.py,sha256=Ub6of2YhFnXQwZiFBvZa6wnTIsGbsedAKHW92dbBHIY,589
|
|
15
15
|
ey_commerce_lib/dxm/parser/order.py,sha256=vnu5jqea8IoTGk_kFlDcUnrZF5NKuBIQUGAYaxQVSg4,17972
|
|
16
16
|
ey_commerce_lib/dxm/parser/purchase.py,sha256=lmcC41HtdUqCgGamFASPnzHatUziLFaenTJmazsiMm0,5750
|
|
17
|
+
ey_commerce_lib/dxm/parser/tracking.py,sha256=ND7Xo31lMycmRLXIYtPAXqOh2W-tmeFE8t-f-sNDLLI,2629
|
|
17
18
|
ey_commerce_lib/dxm/parser/warehouse.py,sha256=oQVojPX8VKHUphdV1KY5ZK1PCFtOY2zwkyLNUeJ3JT0,3310
|
|
18
19
|
ey_commerce_lib/dxm/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
20
|
ey_commerce_lib/dxm/schemas/common.py,sha256=ihCeYrh4K_-m9_4rVzHm-o8rFNqzcD5XkO0JQd2023g,234
|
|
20
21
|
ey_commerce_lib/dxm/schemas/dxm_commodity_product.py,sha256=9CiMTkRFk2McFL5jiHI35furvuxhJlqBr4AWOC3hlXw,30871
|
|
21
22
|
ey_commerce_lib/dxm/schemas/ebay_product.py,sha256=k8LqBCz657vYRcLRjjyPJjQYjQOSwSGBivvp2LPWuYc,3696
|
|
22
23
|
ey_commerce_lib/dxm/schemas/order.py,sha256=6ps9aXFcEiRASLv1CH5uW7wnplaWzD_vTfyzvi5eLE0,7881
|
|
24
|
+
ey_commerce_lib/dxm/schemas/tracking.py,sha256=ZysvY6zbgfwmeNCS-s21XugrKG5d0OPHMFTZfLYBDAc,3059
|
|
23
25
|
ey_commerce_lib/dxm/schemas/warehouse.py,sha256=BT9r92DgkGKRI-HPqHPt5FKPdPJr2h-rxjfh25STR2E,5094
|
|
24
26
|
ey_commerce_lib/dxm/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
27
|
ey_commerce_lib/dxm/utils/dxm_commodity_product.py,sha256=OkL9Ve0lnSA2l-3DMWXF2fSj-A0uV4ucrhfEWNL2Z-Y,5398
|
|
@@ -53,6 +55,6 @@ ey_commerce_lib/utils/dxm.py,sha256=jVNltK_Pm_yMzXReD0Aw5VW6kzIZ5Bn23RucS0DKBI0,
|
|
|
53
55
|
ey_commerce_lib/utils/float.py,sha256=PiOMf9pRApc1DskKkhKx0LAWHAYTpAPT_G4QRZRd8ZU,905
|
|
54
56
|
ey_commerce_lib/utils/list_util.py,sha256=R1w7B1m3sEXr38zSHWp-15C3xAs5ykYCCpvwmnRW4xs,545
|
|
55
57
|
ey_commerce_lib/utils/str.py,sha256=939xE0y8U7KEWjwbEezMlaWJNBsfb2BSb-dBpYbOD8Q,138
|
|
56
|
-
ey_commerce_lib-1.0.
|
|
57
|
-
ey_commerce_lib-1.0.
|
|
58
|
-
ey_commerce_lib-1.0.
|
|
58
|
+
ey_commerce_lib-1.0.18.dist-info/METADATA,sha256=izsvwLI_75aS7a_ZkpSmdGrXiRO4aXE2yMyMMAkJj3U,391
|
|
59
|
+
ey_commerce_lib-1.0.18.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
60
|
+
ey_commerce_lib-1.0.18.dist-info/RECORD,,
|
|
File without changes
|