contracts-hj3415 0.2.0__tar.gz → 0.4.0__tar.gz

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.
Files changed (24) hide show
  1. {contracts_hj3415-0.2.0 → contracts_hj3415-0.4.0}/PKG-INFO +1 -1
  2. {contracts_hj3415-0.2.0 → contracts_hj3415-0.4.0}/pyproject.toml +3 -3
  3. contracts_hj3415-0.4.0/src/contracts_hj3415/nfs/c101_dto.py +27 -0
  4. contracts_hj3415-0.4.0/src/contracts_hj3415/nfs/c103_dto.py +35 -0
  5. contracts_hj3415-0.4.0/src/contracts_hj3415/nfs/c104_dto.py +44 -0
  6. contracts_hj3415-0.4.0/src/contracts_hj3415/nfs/c106_dto.py +28 -0
  7. contracts_hj3415-0.4.0/src/contracts_hj3415/nfs/c108_dto.py +21 -0
  8. contracts_hj3415-0.4.0/src/contracts_hj3415/nfs/constants.py +49 -0
  9. contracts_hj3415-0.4.0/src/contracts_hj3415/nfs/nfs_dto.py +17 -0
  10. contracts_hj3415-0.4.0/src/contracts_hj3415/nfs/types.py +61 -0
  11. contracts_hj3415-0.4.0/src/contracts_hj3415/universe/__init__.py +0 -0
  12. contracts_hj3415-0.4.0/src/contracts_hj3415/universe/constants.py +4 -0
  13. contracts_hj3415-0.4.0/src/contracts_hj3415/universe/dto.py +17 -0
  14. contracts_hj3415-0.4.0/src/contracts_hj3415/universe/types.py +6 -0
  15. contracts_hj3415-0.2.0/src/contracts/.DS_Store +0 -0
  16. contracts_hj3415-0.2.0/src/contracts/nfs/c101.py +0 -52
  17. contracts_hj3415-0.2.0/src/contracts/nfs/c103.py +0 -19
  18. contracts_hj3415-0.2.0/src/contracts/nfs/c104.py +0 -24
  19. contracts_hj3415-0.2.0/src/contracts/nfs/c106.py +0 -37
  20. contracts_hj3415-0.2.0/src/contracts/nfs/c108.py +0 -61
  21. {contracts_hj3415-0.2.0 → contracts_hj3415-0.4.0}/LICENSE +0 -0
  22. {contracts_hj3415-0.2.0 → contracts_hj3415-0.4.0}/README.md +0 -0
  23. {contracts_hj3415-0.2.0/src/contracts → contracts_hj3415-0.4.0/src/contracts_hj3415}/__init__.py +0 -0
  24. {contracts_hj3415-0.2.0/src/contracts → contracts_hj3415-0.4.0/src/contracts_hj3415}/nfs/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: contracts-hj3415
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: DTO pakages for hj3415
5
5
  Keywords: example,demo
6
6
  Author-email: Hyungjin Kim <hj3415@gmail.com>
@@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi"
4
4
 
5
5
  [project]
6
6
  name = "contracts-hj3415" # PyPI 이름 (하이픈 허용)
7
- version = "0.2.0"
7
+ version = "0.4.0"
8
8
  description = "DTO pakages for hj3415"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -22,5 +22,5 @@ dependencies = [
22
22
  ]
23
23
 
24
24
  [tool.flit.module]
25
- name = "contracts"
26
- path = "src/contracts"
25
+ name = "contracts_hj3415"
26
+ path = "src/contracts_hj3415"
@@ -0,0 +1,27 @@
1
+ # contracts_hj3415/nfs/c101_dto.py
2
+ from __future__ import annotations
3
+
4
+ from typing_extensions import TypedDict
5
+ from typing import Any
6
+ from .nfs_dto import NfsDTO
7
+ from .types import PeriodKey, Num, MetricKey
8
+
9
+ Scalar = str | float | int | None
10
+ ValuesMap = dict[PeriodKey, Num]
11
+
12
+
13
+ class C101Blocks(TypedDict):
14
+ 요약: dict[str, Scalar]
15
+ 시세: dict[str, Scalar]
16
+ 주주현황: list[dict[str, Scalar]]
17
+ 기업개요: dict[str, Scalar]
18
+ 펀더멘털: dict[MetricKey, ValuesMap]
19
+
20
+ 어닝서프라이즈: dict[str, Any]
21
+ 연간컨센서스: dict[MetricKey, ValuesMap]
22
+
23
+ class C101Payload(TypedDict):
24
+ blocks: C101Blocks
25
+
26
+ class C101DTO(NfsDTO):
27
+ payload: C101Payload
@@ -0,0 +1,35 @@
1
+ # contracts_hj3415/nfs/c103_dto.py
2
+ from __future__ import annotations
3
+
4
+ from typing_extensions import TypedDict
5
+ from .nfs_dto import NfsDTO
6
+ from .types import Num, MetricKey, PeriodKey
7
+
8
+
9
+ C103ValuesMap = dict[PeriodKey, Num]
10
+
11
+ class C103Blocks(TypedDict):
12
+ 손익계산서y: dict[MetricKey, C103ValuesMap]
13
+ 손익계산서q: dict[MetricKey, C103ValuesMap]
14
+ 재무상태표y: dict[MetricKey, C103ValuesMap]
15
+ 재무상태표q: dict[MetricKey, C103ValuesMap]
16
+ 현금흐름표y: dict[MetricKey, C103ValuesMap]
17
+ 현금흐름표q: dict[MetricKey, C103ValuesMap]
18
+
19
+
20
+ class C103Labels(TypedDict):
21
+ 손익계산서y: dict[MetricKey, str]
22
+ 손익계산서q: dict[MetricKey, str]
23
+ 재무상태표y: dict[MetricKey, str]
24
+ 재무상태표q: dict[MetricKey, str]
25
+ 현금흐름표y: dict[MetricKey, str]
26
+ 현금흐름표q: dict[MetricKey, str]
27
+
28
+
29
+ class C103Payload(TypedDict):
30
+ blocks: C103Blocks
31
+ labels: C103Labels
32
+
33
+
34
+ class C103DTO(NfsDTO):
35
+ payload: C103Payload
@@ -0,0 +1,44 @@
1
+ # contracts_hj3415/nfs/c104_dto.py
2
+ from __future__ import annotations
3
+
4
+ from typing_extensions import TypedDict
5
+ from .nfs_dto import NfsDTO
6
+ from .types import Num, MetricKey, PeriodKey
7
+
8
+
9
+ C104ValuesMap = dict[PeriodKey, Num]
10
+
11
+ class C104Blocks(TypedDict):
12
+ 수익성y: dict[MetricKey, C104ValuesMap]
13
+ 성장성y: dict[MetricKey, C104ValuesMap]
14
+ 안정성y: dict[MetricKey, C104ValuesMap]
15
+ 활동성y: dict[MetricKey, C104ValuesMap]
16
+ 가치분석y: dict[MetricKey, C104ValuesMap]
17
+ 수익성q: dict[MetricKey, C104ValuesMap]
18
+ 성장성q: dict[MetricKey, C104ValuesMap]
19
+ 안정성q: dict[MetricKey, C104ValuesMap]
20
+ 활동성q: dict[MetricKey, C104ValuesMap]
21
+ 가치분석q: dict[MetricKey, C104ValuesMap]
22
+
23
+
24
+ class C104Labels(TypedDict):
25
+ 수익성y: dict[MetricKey, str]
26
+ 성장성y: dict[MetricKey, str]
27
+ 안정성y: dict[MetricKey, str]
28
+ 활동성y: dict[MetricKey, str]
29
+ 가치분석y: dict[MetricKey, str]
30
+ 수익성q: dict[MetricKey, str]
31
+ 성장성q: dict[MetricKey, str]
32
+ 안정성q: dict[MetricKey, str]
33
+ 활동성q: dict[MetricKey, str]
34
+ 가치분석q: dict[MetricKey, str]
35
+
36
+
37
+
38
+ class C104Payload(TypedDict):
39
+ blocks: C104Blocks
40
+ labels: C104Labels
41
+
42
+
43
+ class C104DTO(NfsDTO):
44
+ payload: C104Payload
@@ -0,0 +1,28 @@
1
+ # contracts_hj3415/nfs/c106_dto.py
2
+ from __future__ import annotations
3
+
4
+ from typing_extensions import TypedDict
5
+ from .nfs_dto import NfsDTO
6
+ from .types import Num, MetricKey, CodeKey
7
+
8
+
9
+ C106ValuesMap = dict[CodeKey, Num]
10
+
11
+
12
+ class C106Blocks(TypedDict):
13
+ y: dict[MetricKey, C106ValuesMap]
14
+ q: dict[MetricKey, C106ValuesMap]
15
+
16
+
17
+ class C106Labels(TypedDict):
18
+ y: dict[MetricKey, str]
19
+ q: dict[MetricKey, str]
20
+
21
+
22
+ class C106Payload(TypedDict):
23
+ blocks: C106Blocks
24
+ labels: C106Labels
25
+
26
+
27
+ class C106DTO(NfsDTO):
28
+ payload: C106Payload
@@ -0,0 +1,21 @@
1
+ # contracts_hj3415/nfs/c108_dto.py
2
+ from __future__ import annotations
3
+
4
+ from typing_extensions import TypedDict
5
+ from .nfs_dto import NfsDTO
6
+ from .types import MetricKey
7
+
8
+
9
+ C108ValuesMap = dict[MetricKey, str|int|None]
10
+
11
+
12
+ class C108Blocks(TypedDict):
13
+ 리포트: list[C108ValuesMap]
14
+
15
+
16
+ class C108Payload(TypedDict):
17
+ blocks: C108Blocks
18
+
19
+
20
+ class C108DTO(NfsDTO):
21
+ payload: C108Payload
@@ -0,0 +1,49 @@
1
+ # contracts_hj3415/nfs/constants.py
2
+ from __future__ import annotations
3
+
4
+
5
+ ENDPOINTS: tuple[str, ...] = ("c101", "c103", "c104", "c106", "c108")
6
+
7
+
8
+ C101_BLOCK_KEYS: tuple[str, ...] = (
9
+ "요약",
10
+ "시세",
11
+ "주주현황",
12
+ "기업개요",
13
+ "펀더멘털",
14
+ "어닝서프라이즈",
15
+ "연간컨센서스",
16
+ )
17
+
18
+
19
+ C103_BLOCK_KEYS: tuple[str, ...] = (
20
+ "손익계산서y",
21
+ "손익계산서q",
22
+ "재무상태표y",
23
+ "재무상태표q",
24
+ "현금흐름표y",
25
+ "현금흐름표q",
26
+ )
27
+
28
+
29
+ C104_BLOCK_KEYS: tuple[str, ...] = (
30
+ "수익성y",
31
+ "성장성y",
32
+ "안정성y",
33
+ "활동성y",
34
+ "가치분석y",
35
+ "수익성q",
36
+ "성장성q",
37
+ "안정성q",
38
+ "활동성q",
39
+ "가치분석q",
40
+ )
41
+
42
+
43
+ C106_BLOCK_KEYS: tuple[str, ...] = (
44
+ "y",
45
+ "q",
46
+ )
47
+
48
+
49
+ C108_BLOCK_KEYS: tuple[str, ...] = ("리포트",)
@@ -0,0 +1,17 @@
1
+ # contracts_hj3415/nfs/nfs_dto.py
2
+ from __future__ import annotations
3
+
4
+ from datetime import datetime
5
+ from pydantic import BaseModel, ConfigDict
6
+ from .types import Endpoints, Payload
7
+
8
+
9
+ class NfsDTO(BaseModel):
10
+ code: str
11
+ asof: datetime
12
+ endpoint: Endpoints
13
+ payload: Payload
14
+
15
+ model_config = ConfigDict(extra="ignore")
16
+
17
+
@@ -0,0 +1,61 @@
1
+ # contracts_hj3415/nfs/types.py
2
+ from __future__ import annotations
3
+
4
+ from typing import Mapping, Any, Literal, TypeAlias
5
+
6
+ C101BlockKeys = Literal[
7
+ "요약", "시세", "주주현황", "기업개요", "펀더멘털", "어닝서프라이즈", "연간컨센서스"
8
+ ]
9
+
10
+ C103BlockKeys = Literal[
11
+ "손익계산서y",
12
+ "손익계산서q",
13
+ "재무상태표y",
14
+ "재무상태표q",
15
+ "현금흐름표y",
16
+ "현금흐름표q",
17
+ ]
18
+
19
+
20
+ C104BlockKeys = Literal[
21
+ "수익성y",
22
+ "성장성y",
23
+ "안정성y",
24
+ "활동성y",
25
+ "가치분석y",
26
+ "수익성q",
27
+ "성장성q",
28
+ "안정성q",
29
+ "활동성q",
30
+ "가치분석q",
31
+ ]
32
+
33
+
34
+ # C106===========================
35
+
36
+ C106BlockKeys = Literal[
37
+ "y",
38
+ "q",
39
+ ]
40
+
41
+
42
+ # C108============================
43
+
44
+ C108BlockKeys = Literal["리포트",]
45
+
46
+
47
+ # General====================
48
+
49
+ MetricKey = str
50
+ PeriodKey = str
51
+ CodeKey = str
52
+ Num = float | int | None
53
+
54
+ Endpoints = Literal["c101", "c103", "c104", "c106", "c108"]
55
+
56
+
57
+ Payload = Mapping[str, Any]
58
+
59
+ BlockKeys: TypeAlias = (
60
+ C101BlockKeys | C103BlockKeys | C104BlockKeys | C106BlockKeys | C108BlockKeys
61
+ )
@@ -0,0 +1,4 @@
1
+ # contracts_hj3415/universe/constants.py
2
+ from __future__ import annotations
3
+
4
+ UNIVERSE_NAMES: tuple[str, ...] = ("krx300",)
@@ -0,0 +1,17 @@
1
+ # contracts_hj3415/universe/dto.py
2
+ from __future__ import annotations
3
+
4
+ from typing import Any, TypedDict
5
+
6
+ class UniverseItemDTO(TypedDict, total=False):
7
+ code: str # required by convention
8
+ name: str
9
+ market: str
10
+ meta: dict[str, Any]
11
+
12
+
13
+ class UniversePayloadDTO(TypedDict):
14
+ universe: str
15
+ asof: str # ISO string 권장 (UTC). datetime을 넘겨도 되지만 계약은 str이 깔끔함
16
+ source: str
17
+ items: list[UniverseItemDTO]
@@ -0,0 +1,6 @@
1
+ # contracts_hj3415/universe/dto.py
2
+ from __future__ import annotations
3
+
4
+ from typing import Literal
5
+
6
+ UniverseNames = Literal["krx300",]
@@ -1,52 +0,0 @@
1
- # contracts/nfs/c101.py
2
- from __future__ import annotations
3
-
4
- from pydantic import BaseModel, Field
5
- from typing import Optional
6
-
7
-
8
- class C101DTO(BaseModel):
9
- # 기본 식별 정보
10
- 종목명: str
11
- 코드: str
12
- 날짜: str
13
- 업종: str
14
-
15
- # 재무 지표
16
- eps: Optional[int] = None
17
- bps: Optional[int] = None
18
- per: Optional[float] = None
19
- 업종per: Optional[float] = None
20
- pbr: Optional[float] = None
21
- 배당수익률: Optional[float] = None
22
-
23
- # 주가 정보
24
- 주가: Optional[int] = None
25
- 전일대비: Optional[int] = None
26
- 수익률: Optional[float] = None
27
-
28
- 최고52: Optional[int] = None
29
- 최저52: Optional[int] = None
30
-
31
- 거래량: Optional[int] = None
32
- 거래대금: Optional[int] = None
33
- 시가총액: Optional[int] = None
34
-
35
- 베타52주: Optional[float] = None
36
-
37
- 발행주식: Optional[int] = None
38
- 유동비율: Optional[float] = None
39
- 외국인지분율: Optional[float] = None
40
-
41
- # 기간 수익률
42
- 수익률1M: Optional[float] = None
43
- 수익률3M: Optional[float] = None
44
- 수익률6M: Optional[float] = None
45
- 수익률1Y: Optional[float] = None
46
-
47
- # 텍스트 정보
48
- 개요: str = ""
49
-
50
- class Config:
51
- # 한글 필드명을 그대로 쓰기 위한 옵션
52
- populate_by_name = True
@@ -1,19 +0,0 @@
1
- # contracts/nfs/c103.py
2
- from __future__ import annotations
3
-
4
- from pydantic import BaseModel, ConfigDict, Field
5
-
6
- Num = float | int | None
7
- Row = dict[str, Num] # 예: {"2020/12": 1.0, "전년대비": 2.0, ...}
8
- ItemsMap = dict[str, Row] # 예: {"매출액(수익)": {...}, ...}
9
-
10
- class C103DTO(BaseModel):
11
- 코드: str
12
- 손익계산서y: ItemsMap = Field(default_factory=dict)
13
- 손익계산서q: ItemsMap = Field(default_factory=dict)
14
- 재무상태표y: ItemsMap = Field(default_factory=dict)
15
- 재무상태표q: ItemsMap = Field(default_factory=dict)
16
- 현금흐름표y: ItemsMap = Field(default_factory=dict)
17
- 현금흐름표q: ItemsMap = Field(default_factory=dict)
18
-
19
- model_config = ConfigDict(extra="ignore")
@@ -1,24 +0,0 @@
1
- # contracts/nfs/c104.py
2
- from __future__ import annotations
3
-
4
- from pydantic import BaseModel, ConfigDict, Field
5
-
6
- Num = float | int | None
7
- Row = dict[str, Num] # 예: {"2020/12": 1.0, "전년대비": 2.0, ...}
8
- ItemsMap = dict[str, Row] # 예: {"ROE": {...}, ...}
9
-
10
- class C104DTO(BaseModel):
11
- 코드: str
12
- 수익성y: ItemsMap = Field(default_factory=dict)
13
- 수익성q: ItemsMap = Field(default_factory=dict)
14
- 성장성y: ItemsMap = Field(default_factory=dict)
15
- 성장성q: ItemsMap = Field(default_factory=dict)
16
- 안정성y: ItemsMap = Field(default_factory=dict)
17
- 안정성q: ItemsMap = Field(default_factory=dict)
18
- 활동성y: ItemsMap = Field(default_factory=dict)
19
- 활동성q: ItemsMap = Field(default_factory=dict)
20
- 가치분석y: ItemsMap = Field(default_factory=dict)
21
- 가치분석q: ItemsMap = Field(default_factory=dict)
22
-
23
-
24
- model_config = ConfigDict(extra="ignore")
@@ -1,37 +0,0 @@
1
- # contracts/nfs/c106.py
2
- from __future__ import annotations
3
-
4
- from pydantic import BaseModel, Field, ConfigDict
5
-
6
- NumMap = dict[str, float | None]
7
-
8
-
9
- class C106Block(BaseModel):
10
- 전일종가: NumMap = Field(default_factory=dict)
11
- 시가총액: NumMap = Field(default_factory=dict)
12
- 자산총계: NumMap = Field(default_factory=dict)
13
- 부채총계: NumMap = Field(default_factory=dict)
14
-
15
- 매출액: NumMap = Field(default_factory=dict)
16
- 영업이익: NumMap = Field(default_factory=dict)
17
- 당기순이익: NumMap = Field(default_factory=dict)
18
- 당기순이익_지배: NumMap = Field(default_factory=dict)
19
-
20
- 영업이익률: NumMap = Field(default_factory=dict)
21
- 순이익률: NumMap = Field(default_factory=dict)
22
- ROE: NumMap = Field(default_factory=dict)
23
- 부채비율: NumMap = Field(default_factory=dict)
24
-
25
- PER: NumMap = Field(default_factory=dict)
26
- PBR: NumMap = Field(default_factory=dict)
27
-
28
- 투자의견: NumMap = Field(default_factory=dict)
29
- 목표주가: NumMap = Field(default_factory=dict)
30
-
31
- model_config = ConfigDict(extra="ignore")
32
-
33
-
34
- class C106DTO(BaseModel):
35
- 코드: str
36
- q: C106Block
37
- y: C106Block
@@ -1,61 +0,0 @@
1
- import math
2
- from pydantic import BaseModel, field_validator
3
- from typing import List, Optional, Any
4
- import re
5
-
6
- class C108DTO(BaseModel):
7
- 코드: str
8
- 날짜: Optional[str]
9
- 제목: str
10
- 작성자: Optional[str]
11
- 제공처: Optional[str]
12
- 투자의견: Optional[str]
13
- 목표가: Optional[float]
14
- 분량: Optional[str]
15
- 내용: List[str]
16
-
17
-
18
- @field_validator("투자의견", mode="before")
19
- @classmethod
20
- def _coerce_opinion(cls, v):
21
- # pandas/bs4 parsing sometimes yields float('nan') for empty cells
22
- if v is None:
23
- return None
24
- if isinstance(v, float) and math.isnan(v):
25
- return None
26
- if isinstance(v, str):
27
- s = v.strip()
28
- if not s or s.lower() == "nan" or s in {"-", "N/A", "NA"}:
29
- return None
30
- return s
31
- # Any other type -> string fallback (keeps validation tolerant)
32
- return str(v)
33
-
34
- @field_validator("목표가", mode="before")
35
- @classmethod
36
- def _v_target_price(cls, v: Any):
37
- if v is None:
38
- return None
39
-
40
- # nan 방어
41
- if isinstance(v, float) and math.isnan(v):
42
- return None
43
-
44
- # 안내 문구/결측 문자열 방어
45
- if isinstance(v, str):
46
- s = v.strip()
47
- if not s or s in {"-", "N/A"} or "검색된 데이터가 없습니다" in s:
48
- return None
49
-
50
- # "123,456원" 같은 케이스에서 숫자만 추출
51
- m = re.findall(r"\d+(?:,\d+)*", s)
52
- if not m:
53
- return None
54
- return float(m[0].replace(",", ""))
55
-
56
- # 숫자면 그대로 float로
57
- if isinstance(v, (int, float)):
58
- return float(v)
59
-
60
- # 그 외 타입은 None 처리(또는 raise로 엄격하게)
61
- return None