Extracting release dates from figures
This commit is contained in:
31
.idea/workspace.xml
generated
31
.idea/workspace.xml
generated
@@ -5,7 +5,11 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="899cd61a-5136-49cb-8f5d-42c8fa021b17" name="Changes" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/tests/test_release.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/hpoi/models/figure.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/hpoi/models/figure.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/hpoi/models/release.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/hpoi/models/release.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/tests/test_data/figures.json" beforeDir="false" afterPath="$PROJECT_DIR$/tests/test_data/figures.json" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@@ -37,6 +41,7 @@
|
||||
"Python tests.Python tests for test_figures.test_miku_nendoroid_15_anniversary.executor": "Run",
|
||||
"Python tests.pytest for test_figures.test_figures.executor": "Run",
|
||||
"Python tests.pytest for test_utils.test_get_price_from_text.executor": "Run",
|
||||
"Python tests.pytest in test_release.py.executor": "Run",
|
||||
"Python.generate_test_data.executor": "Run",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"git-widget-placeholder": "main",
|
||||
@@ -125,9 +130,28 @@
|
||||
<option name="_new_targetType" value=""PYTHON"" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<configuration name="pytest in test_release.py" type="tests" factoryName="py.test" temporary="true" nameIsGenerated="true">
|
||||
<module name="hpoi" />
|
||||
<option name="ENV_FILES" value="" />
|
||||
<option name="INTERPRETER_OPTIONS" value="" />
|
||||
<option name="PARENT_ENVS" value="true" />
|
||||
<option name="SDK_HOME" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
|
||||
<option name="IS_MODULE_SDK" value="true" />
|
||||
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||
<option name="_new_keywords" value="""" />
|
||||
<option name="_new_parameters" value="""" />
|
||||
<option name="_new_additionalArguments" value="""" />
|
||||
<option name="_new_target" value=""$PROJECT_DIR$/tests/test_release.py"" />
|
||||
<option name="_new_targetType" value=""PATH"" />
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
<recent_temporary>
|
||||
<list>
|
||||
<item itemvalue="Python.generate_test_data" />
|
||||
<item itemvalue="Python tests.pytest in test_release.py" />
|
||||
<item itemvalue="Python tests.pytest for test_figures.test_figures" />
|
||||
<item itemvalue="Python tests.pytest for test_utils.test_get_price_from_text" />
|
||||
<item itemvalue="Python tests.Python tests for test_figures.test_miku_nendoroid_15_anniversary" />
|
||||
@@ -150,7 +174,7 @@
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1747813041813</updated>
|
||||
<workItem from="1747813042896" duration="411000" />
|
||||
<workItem from="1747813474316" duration="10655000" />
|
||||
<workItem from="1747813474316" duration="14469000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
@@ -159,8 +183,9 @@
|
||||
</component>
|
||||
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
||||
<SUITE FILE_PATH="coverage/hpoi$.coverage" NAME=" Coverage Results" MODIFIED="1747818304683" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
|
||||
<SUITE FILE_PATH="coverage/hpoi$generate_test_data.coverage" NAME="generate_test_data Coverage Results" MODIFIED="1747836427933" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests/test_data" />
|
||||
<SUITE FILE_PATH="coverage/hpoi$generate_test_data.coverage" NAME="generate_test_data Coverage Results" MODIFIED="1747858057684" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests/test_data" />
|
||||
<SUITE FILE_PATH="coverage/hpoi$pytest_for_test_figures_test_figures.coverage" NAME="pytest for test_figures.test_figures Coverage Results" MODIFIED="1747820902835" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
|
||||
<SUITE FILE_PATH="coverage/hpoi$pytest_for_test_utils_test_get_price_from_text.coverage" NAME="pytest for test_utils.test_get_price_from_text Coverage Results" MODIFIED="1747820435956" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
|
||||
<SUITE FILE_PATH="coverage/hpoi$pytest_in_test_release_py.coverage" NAME="pytest in test_release.py Coverage Results" MODIFIED="1747857799700" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/tests" />
|
||||
</component>
|
||||
</project>
|
@@ -69,6 +69,20 @@ class Figure:
|
||||
if info_list_item_size:
|
||||
self.size = info_list_item_size.p.string.strip()
|
||||
|
||||
info_list_item_releases = info_list_items.get("发售")
|
||||
if info_list_item_releases:
|
||||
for x in info_list_item_releases.find_all("p"):
|
||||
release = Release.from_string(x.get_text().strip())
|
||||
if release:
|
||||
self.release.append(release)
|
||||
|
||||
info_list_item_releases = info_list_items.get("出货日")
|
||||
if info_list_item_releases:
|
||||
for x in info_list_item_releases.find_all("p"):
|
||||
release = Release.from_string(x.get_text().strip())
|
||||
if release:
|
||||
self.release.append(release)
|
||||
|
||||
self.images = [
|
||||
re.sub(
|
||||
r"^https://r\.hpoi\.net/gk/pic/s/(\d{4})/(\d{2})/([\w\d]{32})\.(\w+)(?:\?.*)?",
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import re
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional, Dict
|
||||
|
||||
@@ -6,8 +7,45 @@ from hpoi.models.currency import Currency
|
||||
|
||||
@dataclass
|
||||
class Release:
|
||||
year: Optional[int]
|
||||
month: Optional[int]
|
||||
day: Optional[int]
|
||||
price: Optional[Dict[Currency, int]]
|
||||
full_text: str
|
||||
full_text: str
|
||||
year: Optional[int] = None
|
||||
month: Optional[int] = None
|
||||
day: Optional[int] = None
|
||||
price: Optional[tuple[Currency, int]] = None
|
||||
|
||||
@classmethod
|
||||
def from_string(cls, text) -> Optional["Release"]:
|
||||
if text == "未知":
|
||||
return None
|
||||
|
||||
self = cls(full_text=text)
|
||||
|
||||
text = text.replace(",", "")
|
||||
|
||||
full_date = re.search(r"(\d{4})/(\d{1,2})/(\d{1,2})", text)
|
||||
if full_date:
|
||||
self.year = int(full_date.group(1))
|
||||
self.month = int(full_date.group(2))
|
||||
self.day = int(full_date.group(3))
|
||||
else:
|
||||
year_match = re.search(r"(\d{4})年", text)
|
||||
if year_match:
|
||||
self.year = int(year_match.group(1))
|
||||
|
||||
month_match = re.search(r"(\d{1,2})月", text)
|
||||
if month_match:
|
||||
self.month = int(month_match.group(1))
|
||||
|
||||
day_match = re.search(r"(\d{1,2})日", text)
|
||||
if day_match:
|
||||
self.day = int(day_match.group(1))
|
||||
|
||||
cny_regex = re.search(r"(\d+)人民币", text)
|
||||
if cny_regex:
|
||||
self.price = (Currency.CNY, int(cny_regex.group(1)))
|
||||
|
||||
jpy_regex = re.search(r"(\d+)日元", text)
|
||||
if jpy_regex:
|
||||
self.price = (Currency.JPY, int(jpy_regex.group(1)))
|
||||
|
||||
return self
|
||||
|
@@ -26,7 +26,28 @@
|
||||
"JPY": 9400,
|
||||
"CNY": 465
|
||||
},
|
||||
"release": [],
|
||||
"release": [
|
||||
{
|
||||
"full_text": "2023/2/15 , 9,400日元(税)",
|
||||
"year": 2023,
|
||||
"month": 2,
|
||||
"day": 15,
|
||||
"price": [
|
||||
"JPY",
|
||||
9400
|
||||
]
|
||||
},
|
||||
{
|
||||
"full_text": "2022/8/6 , 9,400日元(税) , Smile Fest 2022 先行贩售",
|
||||
"year": 2022,
|
||||
"month": 8,
|
||||
"day": 6,
|
||||
"price": [
|
||||
"JPY",
|
||||
9400
|
||||
]
|
||||
}
|
||||
],
|
||||
"scale": null,
|
||||
"size": "H=100mm",
|
||||
"mfc_id": null,
|
||||
@@ -66,7 +87,15 @@
|
||||
"value": {
|
||||
"CNY": 1999
|
||||
},
|
||||
"release": [],
|
||||
"release": [
|
||||
{
|
||||
"full_text": "2022年10月",
|
||||
"year": 2022,
|
||||
"month": 10,
|
||||
"day": null,
|
||||
"price": null
|
||||
}
|
||||
],
|
||||
"scale": "1/3",
|
||||
"size": "H=270mm L=335mm D=355mm",
|
||||
"mfc_id": null,
|
||||
|
46
tests/test_release.py
Normal file
46
tests/test_release.py
Normal file
@@ -0,0 +1,46 @@
|
||||
from hpoi.models.currency import Currency
|
||||
from hpoi.models.release import Release
|
||||
|
||||
|
||||
def test_unknown():
|
||||
assert Release.from_string("未知") is None
|
||||
|
||||
|
||||
def test_chinese_year():
|
||||
release = Release.from_string("2025年")
|
||||
assert release.year == 2025
|
||||
assert release.month is None
|
||||
assert release.day is None
|
||||
assert release.price is None
|
||||
|
||||
|
||||
def test_chinese_year_month():
|
||||
release = Release.from_string("2022年10月")
|
||||
assert release.year == 2022
|
||||
assert release.month == 10
|
||||
assert release.day is None
|
||||
assert release.price is None
|
||||
|
||||
|
||||
def test_chinese_full_date():
|
||||
release = Release.from_string("2025年5月28日")
|
||||
assert release.year == 2025
|
||||
assert release.month == 5
|
||||
assert release.day == 28
|
||||
assert release.price is None
|
||||
|
||||
|
||||
def test_full_date_japanese_yen():
|
||||
release = Release.from_string("2023/2/15 , 9,400日元(税)")
|
||||
assert release.year == 2023
|
||||
assert release.month == 2
|
||||
assert release.day == 15
|
||||
assert release.price == (Currency.JPY, 9400)
|
||||
|
||||
|
||||
def test_full_date_chinese_yuan():
|
||||
release = Release.from_string("2025/5/7 , 369人民币 , 预售优惠价")
|
||||
assert release.year == 2025
|
||||
assert release.month == 5
|
||||
assert release.day == 7
|
||||
assert release.price == (Currency.CNY, 369)
|
Reference in New Issue
Block a user