db2_hj3415 0.1.2__py2.py3-none-any.whl → 0.1.4__py2.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.
@@ -1,6 +1,8 @@
1
1
  # MongoDB/Redis 연결
2
2
  import os
3
3
  from motor.motor_asyncio import AsyncIOMotorClient
4
+ import redis.asyncio as redis
5
+ from redis.asyncio.client import Redis
4
6
 
5
7
  # 싱글톤 몽고 클라이언트 정의
6
8
  MONGO_URI = os.getenv("MONGO_ADDR", "mongodb://localhost:27017")
@@ -14,4 +16,14 @@ def get_mongo_client() -> AsyncIOMotorClient:
14
16
 
15
17
  def close_mongo_client():
16
18
  if client:
17
- client.close()
19
+ client.close()
20
+
21
+
22
+ async def get_redis() -> Redis:
23
+ client = redis.Redis(host="localhost", port=6379, decode_responses=True)
24
+ try:
25
+ await client.ping()
26
+ return client
27
+ except Exception as e:
28
+ print("Redis connection failed:", e)
29
+ return None
@@ -1 +1,24 @@
1
- # 자주 쓰는 간단한 유틸 함수
1
+ # 자주 쓰는 간단한 유틸 함수
2
+ import pandas as pd
3
+ import numpy as np
4
+
5
+ def df_to_dict_replace_nan(df: pd.DataFrame) -> list[dict]:
6
+ # NaN → None으로 변환
7
+ return df.replace({np.nan: None}).to_dict(orient="records")
8
+
9
+ import json
10
+ from bson import json_util
11
+ from pydantic import BaseModel
12
+
13
+ def pretty_print(obj):
14
+ if isinstance(obj, BaseModel):
15
+ # Pydantic 모델이면 dict로 변환
16
+ data = obj.model_dump(by_alias=True)
17
+ elif isinstance(obj, list) and all(isinstance(o, BaseModel) for o in obj):
18
+ # 리스트 안에 BaseModel만 있다면 변환
19
+ data = [o.model_dump(by_alias=True) for o in obj]
20
+ else:
21
+ # 일반 dict나 기타 객체
22
+ data = obj
23
+
24
+ print(json.dumps(data, indent=2, ensure_ascii=False, default=json_util.default))
@@ -4,4 +4,5 @@ DATE_FORMAT = "%Y.%m.%d"
4
4
  from db2_hj3415.common import connection
5
5
  from db2_hj3415.common.utils import *
6
6
  from db2_hj3415.common.db_ops import *
7
- from db2_hj3415.nfs._ops import *
7
+ from db2_hj3415.nfs._ops import *
8
+ from db2_hj3415.nfs.models import *
db2_hj3415/nfs/_c10346.py CHANGED
@@ -1,12 +1,16 @@
1
+ from unittest import case
2
+
1
3
  from deepdiff import DeepDiff
2
4
  from pymongo import ASCENDING, DESCENDING
3
5
  from motor.motor_asyncio import AsyncIOMotorClient
4
6
  import pprint
5
7
  import pandas as pd
6
8
  import json
7
- from db2_hj3415.nfs import DB_NAME
9
+ from db2_hj3415.nfs import DB_NAME, C103, C104, C106
8
10
  from db2_hj3415.common.db_ops import get_collection
9
11
  from datetime import datetime, timezone
12
+ import numpy as np
13
+
10
14
 
11
15
  from utils_hj3415 import setup_logger
12
16
 
@@ -59,30 +63,15 @@ async def _compare_and_log_diff(code: str, new_doc: dict, latest_doc: dict | Non
59
63
 
60
64
 
61
65
  def _prepare_c10346_document(code: str, data: dict[str, pd.DataFrame]) -> dict:
62
- """
63
- 종목 코드와 여러 페이지의 DataFrame 데이터를 바탕으로 MongoDB에 저장할 문서(dict)를 생성합니다.
64
-
65
- 각 DataFrame은 null 값을 None으로 변환한 후, 레코드(행) 단위의 딕셔너리 리스트로 변환됩니다.
66
- 생성된 문서에는 '코드', '날짜', 그리고 각 페이지 이름을 키로 하는 데이터가 포함됩니다.
67
-
68
- Args:
69
- code (str): 종목 코드 (6자리 문자열).
70
- data (dict[str, pd.DataFrame]): 페이지 이름을 키로 하고, 해당 페이지의 데이터를 담은 DataFrame을 값으로 가지는 딕셔너리.
71
-
72
- Returns:
73
- dict: MongoDB에 저장 가능한 형식의 문서. 예: {
74
- "코드": "005930",
75
- "날짜": <datetime>,
76
- "재무상태표y": <DataFrame>,
77
- "손익계산서y": <DataFrame>,
78
- ...
79
- }
80
- """
81
66
  now = datetime.now(timezone.utc)
82
67
  document = {"코드": code, "날짜": now}
68
+
83
69
  for page, df in data.items():
84
70
  if isinstance(df, pd.DataFrame):
85
- document[page] = df.where(pd.notnull(df), None).to_dict(orient="records")
71
+ # NaN을 None으로 안전하게 변환
72
+ cleaned = df.replace({np.nan: None})
73
+ document[page] = cleaned.to_dict(orient="records")
74
+
86
75
  return document
87
76
 
88
77
 
@@ -138,7 +127,7 @@ async def save_many(col: str, many_data: dict[str, dict[str, pd.DataFrame]], cli
138
127
  return results
139
128
 
140
129
 
141
- async def get_latest(col: str, code: str, page: str, client: AsyncIOMotorClient) -> pd.DataFrame | None:
130
+ async def get_latest(col: str, code: str, client: AsyncIOMotorClient) -> C103 | C104 | C106 | None:
142
131
  collection = get_collection(client, DB_NAME, col)
143
132
 
144
133
  # 최신 날짜 기준으로 정렬하여 1건만 조회
@@ -147,14 +136,24 @@ async def get_latest(col: str, code: str, page: str, client: AsyncIOMotorClient)
147
136
  sort=[("날짜", DESCENDING)]
148
137
  )
149
138
 
150
- if not latest_doc or page not in latest_doc:
151
- print(f"문서 없음 또는 '{page}' 항목 없음")
139
+ if not latest_doc:
140
+ print(f"문서 없음: {code}")
152
141
  return None
153
142
 
154
- # records → DataFrame
155
- records = latest_doc[page]
156
- df = pd.DataFrame(records)
157
- return df
143
+ latest_doc["_id"] = str(latest_doc["_id"])
144
+
145
+ try:
146
+ match col:
147
+ case 'c103':
148
+ return C103(**latest_doc)
149
+ case 'c104':
150
+ return C104(**latest_doc)
151
+ case 'c106':
152
+ return C106(**latest_doc)
153
+
154
+ except Exception as e:
155
+ print(f"[{code}] C103 파싱 실패: {e}")
156
+ return None
158
157
 
159
158
 
160
159
  async def has_doc_changed(col: str, code: str, client: AsyncIOMotorClient) -> bool:
db2_hj3415/nfs/c101.py CHANGED
@@ -1,9 +1,10 @@
1
+ from typing import Literal
2
+
1
3
  from pymongo import ASCENDING, UpdateOne, DESCENDING
2
4
  from motor.motor_asyncio import AsyncIOMotorClient
3
5
  from datetime import datetime, timezone
4
- import pandas as pd
5
6
 
6
- from db2_hj3415.nfs import DATE_FORMAT, DB_NAME
7
+ from db2_hj3415.nfs import DATE_FORMAT, DB_NAME, C101
7
8
  from db2_hj3415.common.db_ops import get_collection
8
9
  from utils_hj3415 import setup_logger
9
10
 
@@ -91,7 +92,7 @@ async def save_many(many_data: dict[str, dict | None], client: AsyncIOMotorClien
91
92
  return {"inserted": inserted, "updated": updated}
92
93
 
93
94
 
94
- async def get_latest(code: str, client: AsyncIOMotorClient) -> dict | None:
95
+ async def get_latest(code: str, client: AsyncIOMotorClient) -> C101 | None:
95
96
  collection = get_collection(client, DB_NAME, COL_NAME)
96
97
  doc = await collection.find_one(
97
98
  {"코드": code},
@@ -99,26 +100,45 @@ async def get_latest(code: str, client: AsyncIOMotorClient) -> dict | None:
99
100
  )
100
101
 
101
102
  if doc:
102
- doc.pop("_id", None)
103
- return doc
103
+ doc["_id"] = str(doc["_id"])
104
+ mylogger.debug(doc)
105
+ return C101(**doc)
104
106
  else:
105
107
  print(f"데이터 없음: {code}")
106
108
  return None
107
109
 
108
110
 
109
- async def get_all_as_df(code: str, client: AsyncIOMotorClient) -> pd.DataFrame | None:
111
+ SortOrder = Literal["asc", "desc"]
112
+
113
+ async def get_all_data(code: str, client: AsyncIOMotorClient, sort: SortOrder = 'asc') -> list[C101]:
114
+ """
115
+ 지정한 종목 코드의 C101 도큐먼트 전체를 날짜 기준으로 정렬하여 반환합니다.
116
+
117
+ Args:
118
+ code (str): 조회할 종목 코드 (예: "005930").
119
+ client (AsyncIOMotorClient): 비동기 MongoDB 클라이언트 인스턴스.
120
+ sort (Literal["asc", "desc"], optional): 날짜 정렬 방식.
121
+ - "asc": 오름차순 (과거 → 최신)
122
+ - "desc": 내림차순 (최신 → 과거)
123
+ 기본값은 "asc".
124
+
125
+ Returns:
126
+ list[C101]: 정렬된 C101 모델 리스트.
127
+ 문서가 없을 경우 빈 리스트를 반환합니다.
128
+ """
110
129
  collection = get_collection(client, DB_NAME, COL_NAME)
111
- cursor = collection.find({"코드": code}).sort("날짜", ASCENDING)
130
+ sort_order = ASCENDING if sort == "asc" else DESCENDING
131
+ cursor = collection.find({"코드": code}).sort("날짜", sort_order)
112
132
  docs = await cursor.to_list(length=None)
113
133
 
114
134
  if not docs:
115
135
  print(f"[{code}] 관련 문서 없음")
116
- return None
136
+ return []
117
137
 
118
- # _id 필드는 문자열로 변환하거나 제거
138
+ result: list[C101] = []
119
139
  for doc in docs:
120
- doc.pop("_id", None)
140
+ doc["_id"] = str(doc["_id"]) # ObjectId → str (C101에서 id: str)
141
+ result.append(C101(**doc))
121
142
 
122
- df = pd.DataFrame(docs)
123
- return df
143
+ return result
124
144
 
db2_hj3415/nfs/c103.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from motor.motor_asyncio import AsyncIOMotorClient
2
2
  import pandas as pd
3
3
 
4
- from db2_hj3415.nfs import _c10346
4
+ from db2_hj3415.nfs import _c10346, C103
5
5
  from utils_hj3415 import setup_logger
6
6
 
7
7
  mylogger = setup_logger(__name__, 'WARNING')
@@ -17,8 +17,8 @@ async def save_many(many_data: dict[str, dict[str, pd.DataFrame]], client: Async
17
17
  return await _c10346.save_many(COL_NAME, many_data, client)
18
18
 
19
19
 
20
- async def get_latest(code: str, page: str, client: AsyncIOMotorClient) -> pd.DataFrame | None:
21
- return await _c10346.get_latest(COL_NAME, code, page, client)
20
+ async def get_latest(code: str, client: AsyncIOMotorClient) -> C103 | None:
21
+ return await _c10346.get_latest(COL_NAME, code, client)
22
22
 
23
23
 
24
24
  async def has_doc_changed(code: str, client: AsyncIOMotorClient) -> bool:
db2_hj3415/nfs/c104.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from motor.motor_asyncio import AsyncIOMotorClient
2
2
  import pandas as pd
3
3
 
4
- from db2_hj3415.nfs import _c10346
4
+ from db2_hj3415.nfs import _c10346, C104
5
5
  from utils_hj3415 import setup_logger
6
6
 
7
7
  mylogger = setup_logger(__name__, 'WARNING')
@@ -17,8 +17,8 @@ async def save_many(many_data: dict[str, dict[str, pd.DataFrame]], client: Async
17
17
  return await _c10346.save_many(COL_NAME, many_data, client)
18
18
 
19
19
 
20
- async def get_latest(code: str, page: str, client: AsyncIOMotorClient) -> pd.DataFrame | None:
21
- return await _c10346.get_latest(COL_NAME, code, page, client)
20
+ async def get_latest(code: str, client: AsyncIOMotorClient) -> C104 | None:
21
+ return await _c10346.get_latest(COL_NAME, code, client)
22
22
 
23
23
 
24
24
  async def has_doc_changed(code: str, client: AsyncIOMotorClient) -> bool:
db2_hj3415/nfs/c106.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from motor.motor_asyncio import AsyncIOMotorClient
2
2
  import pandas as pd
3
3
 
4
- from db2_hj3415.nfs import _c10346
4
+ from db2_hj3415.nfs import _c10346, C106
5
5
  from utils_hj3415 import setup_logger
6
6
 
7
7
  mylogger = setup_logger(__name__, 'WARNING')
@@ -17,8 +17,8 @@ async def save_many(many_data: dict[str, dict[str, pd.DataFrame]], client: Async
17
17
  return await _c10346.save_many(COL_NAME, many_data, client)
18
18
 
19
19
 
20
- async def get_latest(code: str, page: str, client: AsyncIOMotorClient) -> pd.DataFrame | None:
21
- return await _c10346.get_latest(COL_NAME, code, page, client)
20
+ async def get_latest(code: str, client: AsyncIOMotorClient) -> C106 | None:
21
+ return await _c10346.get_latest(COL_NAME, code, client)
22
22
 
23
23
 
24
24
  async def has_doc_changed(code: str, client: AsyncIOMotorClient) -> bool:
db2_hj3415/nfs/c108.py CHANGED
@@ -1,9 +1,9 @@
1
1
  from motor.motor_asyncio import AsyncIOMotorClient
2
- from pymongo import ASCENDING, UpdateOne
2
+ from pymongo import ASCENDING, UpdateOne, DESCENDING
3
3
  import pandas as pd
4
- from datetime import datetime, timezone
4
+ from datetime import datetime, timezone, timedelta
5
5
 
6
- from db2_hj3415.nfs import DATE_FORMAT, DB_NAME
6
+ from db2_hj3415.nfs import DATE_FORMAT, DB_NAME, C108
7
7
  from db2_hj3415.common.db_ops import get_collection
8
8
  from utils_hj3415 import setup_logger
9
9
 
@@ -75,3 +75,37 @@ async def save_many(many_data: dict[str, pd.DataFrame], client: AsyncIOMotorClie
75
75
  return total_result
76
76
 
77
77
 
78
+ async def get_latest(code: str, client: AsyncIOMotorClient, days:int = 30) -> list[C108]:
79
+ """
80
+ 최근 N일 이내의 C108 리포트 도큐먼트를 조회합니다.
81
+
82
+ Args:
83
+ code (str): 종목 코드 (예: "005930").
84
+ client (AsyncIOMotorClient): 비동기 MongoDB 클라이언트.
85
+ days (int, optional): 현재 시점에서 며칠 전까지의 데이터를 조회할지 설정합니다. 기본값은 30일.
86
+
87
+ Returns:
88
+ list[C108]: 조건에 해당하는 C108 도큐먼트 리스트. 일치하는 문서가 없을 경우 빈 리스트를 반환합니다.
89
+ """
90
+ collection = get_collection(client, DB_NAME, COL_NAME)
91
+ now = datetime.now(timezone.utc)
92
+ cutoff = now - timedelta(days=days)
93
+
94
+ cursor = collection.find(
95
+ {
96
+ "코드": code,
97
+ "날짜": {"$gte": cutoff}
98
+ }
99
+ ).sort("날짜", DESCENDING)
100
+
101
+ docs = await cursor.to_list(length=None)
102
+ if not docs:
103
+ return []
104
+ else:
105
+ c108s = []
106
+ for doc in docs:
107
+ doc["_id"] = str(doc["_id"])
108
+ c108s.append(C108(**doc))
109
+ return c108s
110
+
111
+
@@ -0,0 +1,147 @@
1
+ from pydantic import BaseModel, Field, field_serializer, ConfigDict
2
+ from datetime import datetime
3
+
4
+ class C101(BaseModel):
5
+ id: str | None = Field(alias="_id")
6
+ 날짜: datetime
7
+ 코드: str
8
+ bps: int | None
9
+ eps: int | None
10
+ pbr: float | None
11
+ per: float | None
12
+ 개요: str | None
13
+ 거래대금: int | None
14
+ 거래량: int | None
15
+ 발행주식: int | None
16
+ 배당수익률: float | None
17
+ 베타52주: float | None
18
+ 수익률: float | None
19
+ 수익률1M: float | None
20
+ 수익률1Y: float | None
21
+ 수익률3M: float | None
22
+ 수익률6M: float | None
23
+ 시가총액: int | None
24
+ 업종: str | None
25
+ 업종per: float | None
26
+ 외국인지분율: float | None
27
+ 유동비율: float | None
28
+ 전일대비: int | None
29
+ 종목명: str | None
30
+ 주가: int | None
31
+ 최고52: int | None
32
+ 최저52: int | None
33
+
34
+ @field_serializer("날짜")
35
+ def serialize_날짜(self, value: datetime) -> str:
36
+ return value.isoformat()
37
+
38
+ model_config = ConfigDict(
39
+ populate_by_name=True,
40
+ str_strip_whitespace=True,
41
+ )
42
+
43
+ class 항목값y(BaseModel):
44
+ 항목: str
45
+ 전년대비: float | None
46
+ 전년대비_1: float | None = Field(default=None, alias="전년대비 1")
47
+
48
+ model_config = ConfigDict(
49
+ populate_by_name=True,
50
+ extra="allow"
51
+ )
52
+
53
+ class 항목값q(BaseModel):
54
+ 항목: str
55
+ 전분기대비: float | None
56
+
57
+ model_config = ConfigDict(extra="allow")
58
+
59
+
60
+ class C103(BaseModel):
61
+ id: str = Field(alias="_id")
62
+ 코드: str
63
+ 날짜: datetime
64
+ 손익계산서q: list[항목값q]
65
+ 손익계산서y: list[항목값y]
66
+ 재무상태표q: list[항목값q]
67
+ 재무상태표y: list[항목값y]
68
+ 현금흐름표q: list[항목값q]
69
+ 현금흐름표y: list[항목값y]
70
+
71
+ @field_serializer("날짜")
72
+ def serialize_date(self, v: datetime) -> str:
73
+ return v.isoformat()
74
+
75
+ model_config = ConfigDict(populate_by_name=True)
76
+
77
+
78
+ class C104(BaseModel):
79
+ id: str = Field(alias="_id")
80
+ 코드: str
81
+ 날짜: datetime
82
+
83
+ 수익성y: list[항목값y] | None = None
84
+ 성장성y: list[항목값y] | None = None
85
+ 안정성y: list[항목값y] | None = None
86
+ 활동성y: list[항목값y] | None = None
87
+ 가치분석y: list[항목값y] | None = None
88
+
89
+ 수익성q: list[항목값q] | None = None
90
+ 성장성q: list[항목값q] | None = None
91
+ 안정성q: list[항목값q] | None = None
92
+ 활동성q: list[항목값q] | None = None
93
+ 가치분석q: list[항목값q] | None = None
94
+
95
+ @field_serializer("날짜")
96
+ def serialize_date(self, v: datetime) -> str:
97
+ return v.isoformat()
98
+
99
+ model_config = ConfigDict(populate_by_name=True)
100
+
101
+
102
+ class 기업데이터(BaseModel):
103
+ 항목: str
104
+ 항목2: str
105
+
106
+ model_config = ConfigDict(
107
+ populate_by_name=True,
108
+ extra="allow"
109
+ )
110
+
111
+ class C106(BaseModel):
112
+ id: str = Field(alias="_id")
113
+ 코드: str
114
+ 날짜: datetime
115
+
116
+ q: list[기업데이터]
117
+ y: list[기업데이터]
118
+
119
+ @field_serializer("날짜")
120
+ def serialize_date(self, v: datetime) -> str:
121
+ return v.isoformat()
122
+
123
+ model_config = ConfigDict(populate_by_name=True)
124
+
125
+
126
+ class C108(BaseModel):
127
+ id: str = Field(alias="_id")
128
+ 코드: str
129
+ 날짜: datetime
130
+
131
+ 제목: str | None = None
132
+ 내용: list[str] | None = None
133
+ 목표가: int | None = None
134
+ 분량: str | None = None
135
+ 작성자: str | None = None
136
+ 제공처: str | None = None
137
+ 투자의견: str | None = None
138
+
139
+ # 날짜 필드 ISO 직렬화
140
+ @field_serializer("날짜")
141
+ def serialize_date(self, v: datetime) -> str:
142
+ return v.isoformat()
143
+
144
+ model_config = ConfigDict(
145
+ populate_by_name=True,
146
+ str_strip_whitespace=True
147
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: db2_hj3415
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Gathering the stock data by playwright
5
5
  Author-email: Hyungjin Kim <hj3415@gmail.com>
6
6
  Description-Content-Type: text/markdown
@@ -10,6 +10,8 @@ Requires-Dist: pandas
10
10
  Requires-Dist: pandas-stubs
11
11
  Requires-Dist: deepdiff
12
12
  Requires-Dist: utils_hj3415>=3.2.3
13
+ Requires-Dist: redis
14
+ Requires-Dist: pydantic
13
15
  Project-URL: Home, https://www.hyungjin.kr
14
16
 
15
17
  ### db2-hj3415
@@ -2,9 +2,9 @@ db2_hj3415/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  db2_hj3415/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  db2_hj3415/cli/db.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  db2_hj3415/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- db2_hj3415/common/connection.py,sha256=-pKXNhzlUY4gd9L-cepcvvCilZfnVcjEhxTko7_0aHg,443
5
+ db2_hj3415/common/connection.py,sha256=QpjDtDHy6By0MCj81z5upJkWeuIgqeIsbXsihHcpKX4,774
6
6
  db2_hj3415/common/db_ops.py,sha256=CajXob5FofIzsuyFvtlOEo1UkdYMfsLUwKDmbb29Kas,212
7
- db2_hj3415/common/utils.py,sha256=bV5NiQU9t5SSTsldaDUMJ_Z-97o1fu-QBY-xgVhEqWM,39
7
+ db2_hj3415/common/utils.py,sha256=TfbsAR1FWgbuxZUybXRdrFg6QSeJ8DInn6b8aw_NagE,805
8
8
  db2_hj3415/mi/__init__.py,sha256=4XIwdkLfdUCiq2zLqCnR5ypuI45nzX02qez80xWQ70A,159
9
9
  db2_hj3415/mi/_ops.py,sha256=Xm2ZpnKxAymIieut8JyK3epHED8uMlhO77ScACfoB7g,3988
10
10
  db2_hj3415/mi/aud.py,sha256=w4w4EC0hn6kKHjNkeIUL5ZsvHH4IzRGBpTKRptHapVY,765
@@ -18,17 +18,17 @@ db2_hj3415/mi/sp500.py,sha256=2OFCo6SxXgLijOGLQhV9Ygh0OR10IviGXI0EjKcwfOI,800
18
18
  db2_hj3415/mi/usdidx.py,sha256=cT6w-Y-Ysv0KI9yeFqDQYCdT0KPElwn8IZ0JF5oZ_MA,550
19
19
  db2_hj3415/mi/usdkrw.py,sha256=QjcHqFSpSgyzI5lzRfYycNUzolzM-ikOvPDFy4FPadM,876
20
20
  db2_hj3415/mi/wti.py,sha256=wMoS5yHGOlUS2b2P7Eok5U_59eehYXQGfqWa56J_dkk,768
21
- db2_hj3415/nfs/__init__.py,sha256=tl0pk2ZNaXqlCFyBA0GgJm6f0IYMBXZfPzaOFMLC-Q4,193
22
- db2_hj3415/nfs/_c10346.py,sha256=dDSsD6O1pe9ycMTGZzBHoo5TBVpCaSt_NilW3h2QrX4,7470
21
+ db2_hj3415/nfs/__init__.py,sha256=w5QUgr_qWQNHRVcLrT8G8Rx6pNry2PnHfyezBDI5D2A,229
22
+ db2_hj3415/nfs/_c10346.py,sha256=yKBOA4QkY2eAUMzOiYWz4BB1c4cW6X4s4D2Nj9rAgOA,6939
23
23
  db2_hj3415/nfs/_ops.py,sha256=lqrBBhEFcPupB2dQBXZU-Gftvd9dYTlmgJGTb5LdX-o,1193
24
- db2_hj3415/nfs/c101.py,sha256=O3BUftcDhciaWRC63-7_SxTpD-cOWUDWDCla0D33s6w,4014
25
- db2_hj3415/nfs/c103.py,sha256=n5xwq8Ire5nBslFrZuwfNHTJZDRZh-_UnbU1KhHFEAM,1479
26
- db2_hj3415/nfs/c104.py,sha256=QpYOct3JCoX6scyM98YNO_9J_RB3T_odkXa5186UvfI,1479
27
- db2_hj3415/nfs/c106.py,sha256=-kJ90dzUzyqamjBPxhihOjl9rw0Swfb0bVoThApCBfI,1479
28
- db2_hj3415/nfs/c108.py,sha256=vmm_vaxEixDZeOWMsfgLzAj4LvlcyCqe_V4E9WnIVHo,2604
24
+ db2_hj3415/nfs/c101.py,sha256=ORCNXr3pq43zn4naSnyu1erDxFmDc2HLpXO19gv0KNo,4853
25
+ db2_hj3415/nfs/c103.py,sha256=NY2e_BTfSHkELIEUJ8XhhYdNETQaRGOrF4qNaewB2_E,1460
26
+ db2_hj3415/nfs/c104.py,sha256=aVLchUoxomlthS7FZ0adskBXmxIWQISGfc2EgWkWZDI,1460
27
+ db2_hj3415/nfs/c106.py,sha256=dAVSnEM5E-sJZExMTfqDoQlozTtH05JOtenzbIUdvtQ,1460
28
+ db2_hj3415/nfs/c108.py,sha256=F_kP1HMhpe9E6VKm_m-aDl6PZ-FqVs5-O2_-rU8f34Y,3761
29
29
  db2_hj3415/nfs/dart.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- db2_hj3415/redis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- db2_hj3415-0.1.2.dist-info/entry_points.txt,sha256=JAGFsxKtvbNgaKCSKo-QRYwCyToabWmdRW0MZWtg9kg,45
32
- db2_hj3415-0.1.2.dist-info/WHEEL,sha256=Dyt6SBfaasWElUrURkknVFAZDHSTwxg3PaTza7RSbkY,100
33
- db2_hj3415-0.1.2.dist-info/METADATA,sha256=SHea9_aQ5Wplv-KKlkaPhQA9_XV_ns1ZvXKdeSJSECw,664
34
- db2_hj3415-0.1.2.dist-info/RECORD,,
30
+ db2_hj3415/nfs/models.py,sha256=4RtPkD2DdSd8UuqI8DrJhY2Iyr4UNiCADbTVcqpb3MY,3765
31
+ db2_hj3415-0.1.4.dist-info/entry_points.txt,sha256=JAGFsxKtvbNgaKCSKo-QRYwCyToabWmdRW0MZWtg9kg,45
32
+ db2_hj3415-0.1.4.dist-info/WHEEL,sha256=Dyt6SBfaasWElUrURkknVFAZDHSTwxg3PaTza7RSbkY,100
33
+ db2_hj3415-0.1.4.dist-info/METADATA,sha256=ww11ReGoCpq6kLlnVaHRTTSQpx92oNfR7tnecsWdjJk,709
34
+ db2_hj3415-0.1.4.dist-info/RECORD,,
File without changes