mySQLDBCtrlAPI 0.1.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.

Potentially problematic release.


This version of mySQLDBCtrlAPI might be problematic. Click here for more details.

@@ -0,0 +1,8 @@
1
+ Metadata-Version: 2.4
2
+ Name: mySQLDBCtrlAPI
3
+ Version: 0.1.0
4
+ Summary: mySQLDBCtrlAPI Python package
5
+ Author-email: James Lin <tylin123@ms27.hinet.net>
6
+ Project-URL: Homepage, https://mis.gotech.biz
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: pymysql
File without changes
File without changes
@@ -0,0 +1,397 @@
1
+ #UTF-8 #-*- coding:
2
+ # ----------------------------------------------------------------------------
3
+ # MySQL 資料庫類別: CLASS_mySQLDBCtrl
4
+ # [使用範例]:
5
+ # ms_SQL = "SELECT * FROM ztbxtalk_reglist";
6
+ # self.CVobj_MyQuery = self.CVobj_mySQLDBCtrl.CUF_DB_OpenSQL(
7
+ # self.CVobj_Conn, ms_SQL);
8
+ # mi_RECCNT = self.CVobj_mySQLDBCtrl.CUF_DB_RecordCount(self.CVobj_MyQuery);
9
+ # print("Record count = "+ str(mi_RECCNT));
10
+ # while(not self.CVobj_mySQLDBCtrl.CUF_Eof(self.CVobj_MyQuery)):
11
+ # obj_DataSet = self.CVobj_mySQLDBCtrl.CUF_DB_FETCH(self.CVobj_MyQuery)
12
+ # print(obj_DataSet["SADDR"], " ", obj_DataSet["LOGIN_TIME"],
13
+ # obj_DataSet["IP_ADDR"], " ", obj_DataSet["APP_NAME"]);
14
+ # ----------------------------------------------------------------------------
15
+
16
+ import os
17
+ import pymysql as Gobj_pymysql
18
+
19
+ # --------------------------------------------------------------------------------
20
+ # 資料庫字元集
21
+ class ENUM_DB_CHARSET:
22
+ def __init__(self):
23
+ self.cE_DBCS_ascii = 1, # ascii US ASCII
24
+ self.cE_DBCS_big5 = 2, # big5 Big5 Traditional Chinese
25
+ self.cE_DBCS_binary = 3, # binary Binary pseudo charset
26
+ self.cE_DBCS_cp1250 = 4, # cp1250 Windows Central European
27
+ self.cE_DBCS_gb2312 = 5, # gb2312 GB2312 Simplified Chinese
28
+ self.cE_DBCS_gbk = 6, # gbk GBK Simplified Chinese
29
+ self.cE_DBCS_latin1 = 7, # latin1 cp1252 West European
30
+ self.cE_DBCS_latin2 = 8, # latin2 ISO 8859-2 Central European
31
+ self.cE_DBCS_latin5 = 9, # latin5 ISO 8859-9 Turkish
32
+ self.cE_DBCS_latin7 = 10, # latin7 ISO 8859-13 Baltic
33
+ self.cE_DBCS_utf16 = 11, # utf16 UTF-16 Unicode
34
+ self.cE_DBCS_utf16le = 12, # utf16le UTF-16LE Unicode
35
+ # --------------------------------------------------------------------------------
36
+ self.cE_DBCS_utf32 = 13, # utf32 UTF-32 Unicode
37
+ # --------------------------------------------------------------------------------
38
+ self.cE_DBCS_utf8mb3 = 14, # utf8mb3 UTF-8 Unicode
39
+ self.cE_DBCS_utf8mb4 = 15 # utf8mb4 UTF-8 Unicode
40
+
41
+
42
+ # ================================================================================
43
+ # define mySQLDBCtrl API structure
44
+ # ================================================================================
45
+ class STRU_mySQLDBInfo:
46
+ def __init__(self):
47
+ self.ms_DB_HostIP = "127.0.0.1";
48
+ self.mi_DB_Port = 3306;
49
+ self.ms_DB_Name = "";
50
+ self.ms_User = "";
51
+ self.ms_Password = "";
52
+
53
+
54
+ # ================================================================================
55
+ # CLASS_mySQLDBCtrl
56
+ # ================================================================================
57
+ class CLASS_mySQLDBCtrl:
58
+ def __init__(self):
59
+ self.CUms_DB_HostIP = '127.0.0.1';
60
+ self.CUmi_DB_Port = 3306;
61
+ self.CUms_DB_Name = '';
62
+ self.CUms_User = '';
63
+ self.CUms_Password = '';
64
+ # ------------------------------------------------------------
65
+ self.CVmi_qryRECCNT = 0;
66
+ # ------------------------------------------------------------
67
+ self.CVmsa_DBCS = ["ascii", "big5", "binary", "cp1250", \
68
+ "gb2312", "gbk", "latin1", "latin2", \
69
+ "latin5", "latin7", "utf16", "utf16le",\
70
+ "utf32", "utf8mb3", "utf8mb4"];
71
+
72
+
73
+ # ----------------------------------------------------------------------
74
+ # 功能: 設定資料庫 Charset
75
+ # 傳入: PmE_DB_Charset --> ENUM_DB_CHARSET
76
+ # 傳回: obj_Query
77
+ # ----------------------------------------------------------------------
78
+ def CUF_SET_Charset(self, PmE_DB_Charset):
79
+ if(self.CUobj_Conn != None and len(PmE_DB_Charset) > 0):
80
+ ms_SQL = "SET NAMES " + self.CVmsa_DBCS[PmE_DB_Charset[0]];
81
+ # ----------------------------------------
82
+ self.CUF_DB_ExecSQL(self.CUobj_Conn, ms_SQL);
83
+
84
+
85
+ # ----------------------------------------------------------------------
86
+ # 功能: 開啟 MySQL 資料庫
87
+ # 傳入:
88
+ # 傳回: obj_Query
89
+ # ----------------------------------------------------------------------
90
+ def CUF_OpenConnection_DBCS(self, Pms_DB_HostIP, Pmi_DB_Port, Pms_DB_Name, \
91
+ Pms_User, Pms_Password,
92
+ PmE_DB_CHARSET):
93
+ self.CUms_DB_HostIP = Pms_DB_HostIP;
94
+ self.CUmi_DB_Port = Pmi_DB_Port;
95
+ self.CUms_DB_Name = Pms_DB_Name;
96
+ self.CUms_User = Pms_User;
97
+ self.CUms_Password = Pms_Password;
98
+ # ----------------------------------------------------------------
99
+ try:
100
+ self.CUobj_Conn = Gobj_pymysql.connect(
101
+ host = self.CUms_DB_HostIP,
102
+ port = self.CUmi_DB_Port,
103
+ user = self.CUms_User,
104
+ password = self.CUms_Password,
105
+ db = self.CUms_DB_Name,
106
+ cursorclass= Gobj_pymysql.cursors.DictCursor);
107
+ except:
108
+ self.CUobj_Conn = None;
109
+ #------------------------------------------------------------
110
+ # 設定資料庫字元集
111
+ self.CUF_SET_Charset(PmE_DB_CHARSET)
112
+ #------------------------------------------------------------
113
+ return(self.CUobj_Conn);
114
+ # ======================================================================
115
+ def CUF_OpenConnection(self, Pms_DB_HostIP, Pmi_DB_Port, Pms_DB_Name, \
116
+ Pms_User, Pms_Password):
117
+ mE_DB_Charset = ENUM_DB_CHARSET();
118
+ # ------------------------------------------------------------
119
+ return(self.CUF_OpenConnection_DBCS(Pms_DB_HostIP, Pmi_DB_Port, \
120
+ Pms_DB_Name, Pms_User, \
121
+ Pms_Password, \
122
+ mE_DB_Charset.cE_DBCS_utf32));
123
+ # ======================================================================
124
+ def CUF_DB_OpenConn(self, Pstru_mySQLDBInfo):
125
+ self.CUobj_Conn.commit();
126
+ return(self.CUF_OpenConnection(Pstru_mySQLDBInfo.ms_DB_HostIP,
127
+ Pstru_mySQLDBInfo.mi_DB_Port,
128
+ Pstru_mySQLDBInfo.ms_DB_Name,
129
+ Pstru_mySQLDBInfo.ms_User,
130
+ Pstru_mySQLDBInfo.ms_Password));
131
+
132
+
133
+ # ----------------------------------------------------------------------
134
+ # 功能: 開啟 Pms_SQL 資料錄
135
+ # 傳入:
136
+ # 傳回: obj_Query
137
+ # ----------------------------------------------------------------------
138
+ def CUF_DB_OpenSQL(self, Pobj_Connection, Pms_SQL):
139
+ Pobj_Connection.commit();
140
+ # ------------------------------------------------------------
141
+ obj_Query = Pobj_Connection.cursor();
142
+ # ------------------------------------------------------------
143
+ obj_Query.execute(Pms_SQL);
144
+ # ------------------------------------------------------------
145
+ Pobj_Connection.commit();
146
+ # ------------------------------------------------------------
147
+ self.CVmi_qryRECCNT = self.CUF_DB_RecordCount(obj_Query);
148
+ # ------------------------------------------------------------
149
+ return(obj_Query);
150
+
151
+
152
+ # ----------------------------------------------------------------------
153
+ # 功能: 擷取資料錄
154
+ # 傳入:
155
+ # 傳回: obj_Field
156
+ # ----------------------------------------------------------------------
157
+ def CUF_DB_FETCH(self, Pobj_Query):
158
+ self.CVmi_qryRECCNT = self.CVmi_qryRECCNT - 1;
159
+ # ------------------------------------------------------------
160
+ return(Pobj_Query.fetchone());
161
+
162
+
163
+ # ----------------------------------------------------------------------
164
+ # 功能: 執行 Open SQL 命令
165
+ # 傳入:
166
+ # 傳回: obj_Field
167
+ # ----------------------------------------------------------------------
168
+ def CUF_DB_ExecSQL(self, Pobj_Connection, Pms_SQL):
169
+ obj_Query = Pobj_Connection.cursor();
170
+ # ------------------------------------------------------------
171
+ obj_Query.execute(Pms_SQL);
172
+ # ------------------------------------------------------------
173
+ Pobj_Connection.commit();
174
+ # ------------------------------------------------------------
175
+ return(obj_Query);
176
+
177
+
178
+ # ----------------------------------------------------------------------
179
+ # 功能: 取得資料錄筆數
180
+ # 傳入:
181
+ # 傳回: obj_Field
182
+ # ----------------------------------------------------------------------
183
+ def CUF_DB_RecordCount(self, Pobj_Query):
184
+ return(Pobj_Query.rowcount);
185
+ # ----------------------------------------------------------------------
186
+ def CUF_DB_RECCOUNT(self, Pobj_Query):
187
+ return(self.CUF_DB_RecordCount(Pobj_Query));
188
+
189
+
190
+ # ----------------------------------------------------------------------
191
+ # 功能: 執行 Open SQL 命令
192
+ # 傳入:
193
+ # 傳回: true: Eof
194
+ # ----------------------------------------------------------------------
195
+ def CUF_DB_Eof(self, Pobj_Query):
196
+ mB_RetVal = True;
197
+ # ------------------------------------------------
198
+ if(self.CVmi_qryRECCNT > 0):
199
+ mB_RetVal = False;
200
+ # ------------------------------------------------
201
+ return(mB_RetVal);
202
+
203
+
204
+ # ----------------------------------------------------------------------
205
+ # 功能: 執行 Open SQL 命令
206
+ # 傳入:
207
+ # 傳回: true: Eof
208
+ # Robj_DataSet: 資料集
209
+ # ----------------------------------------------------------------------
210
+ def CUF_Eof(self, Pobj_Query):
211
+ return(self.CUF_DB_Eof(Pobj_Query));
212
+
213
+
214
+ # ----------------------------------------------------------------------
215
+ # 功能: 讀取 BLOB Field
216
+ # 傳入:
217
+ # 傳回: true: Eof
218
+ # Pobj_Query: 資料集
219
+ # ----------------------------------------------------------------------
220
+ def CUF_GetBlobField(self, Pobj_Query, Pms_BlobFieldName, Pms_FileName):
221
+ if(Pobj_Query):
222
+ obj_DataSet = Pobj_Query.fetchone();
223
+ if(obj_DataSet is None):
224
+ return;
225
+ # --------------------------------------------------
226
+ obj_FileData = obj_DataSet[Pms_BlobFieldName];
227
+ # --------------------------------------------------
228
+ with open(Pms_FileName, "wb") as obj_FP:
229
+ obj_FP.write(obj_FileData);
230
+
231
+
232
+ # ----------------------------------------------------------------------
233
+ # 功能: 寫入 BLOB Field
234
+ # 傳入:
235
+ # 傳回: true: Eof
236
+ # Pobj_Query: 資料集
237
+ # ----------------------------------------------------------------------
238
+ def CUF_SetBlobField(self, Pobj_Query, Pms_TableName, Pms_QUERY, Pms_BlobFieldName, Pms_FileName):
239
+ ms_SQL :str;
240
+ mi_FileSize:int;
241
+
242
+ mi_FileSize = os.path.getsize(Pms_FileName);
243
+ if(mi_FileSize > 4200000000):
244
+ print("File over size!!");
245
+ return;
246
+ # --------------------------------------------------
247
+ with open(Pms_FileName, "rb") as obj_FP:
248
+ obj_FileData = obj_FP.read();
249
+ # --------------------------------------------------
250
+ ms_SQL = f"UPDATE {Pms_TableName} SET {Pms_BlobFieldName}=%s WHERE {Pms_QUERY}";
251
+ Pobj_Query.execute(ms_SQL, (obj_FileData,));
252
+ # --------------------------------------------------
253
+ self.CUobj_Conn.commit();
254
+
255
+
256
+ # --------------------------------------------------------------------------------
257
+ # FUNC: 取得伺服主機系統日期時間
258
+ # PIN :
259
+ # POUT:
260
+ # --------------------------------------------------------------------------------
261
+ def CUF_GetServerDateTime(self, Pms_SEPCHAR_DATE, Pms_SEPCHAR_TIME,
262
+ Pms_SEPERATOR):
263
+ ms_DateTime = "";
264
+ # ------------------------------------------------------------
265
+ ms_FMT_DATE = "%Y" + Pms_SEPCHAR_DATE + "%m" + Pms_SEPCHAR_DATE + "%d";
266
+ ms_FMT_TIME = "%H" + Pms_SEPCHAR_TIME + "%i" + Pms_SEPCHAR_TIME + "%s";
267
+ # ------------------------------------------------------------
268
+ ms_SQL = "SELECT CONCAT(DATE_FORMAT(CURRENT_DATE(), '"+ \
269
+ ms_FMT_DATE + "'), '"+ Pms_SEPERATOR + \
270
+ "',TIME_FORMAT(CURRENT_TIME(), '" + \
271
+ ms_FMT_TIME + "')) AS _DATETIME";
272
+ obj_MyQuery = self.CUF_DB_OpenSQL(self.CUobj_Conn, ms_SQL);
273
+ obj_DataSet = self.CUF_DB_FETCH(obj_MyQuery);
274
+ # ------------------------------------------------------------
275
+ ms_DateTime = obj_DataSet["_DATETIME"];
276
+ # ------------------------------------------------------------
277
+ return(ms_DateTime);
278
+ # --------------------------------------------------------------------------------
279
+ def CUF_GetServerDateTime1(self, PmB_DELIMITER):
280
+ if(PmB_DELIMITER == True):
281
+ ms_RetVal = self.CUF_GetServerDateTime("/", ":", " ");
282
+ else:
283
+ ms_RetVal = self.CUF_GetServerDateTime("", "", "");
284
+ # ------------------------------------------------------------
285
+ return(ms_RetVal);
286
+ # --------------------------------------------------------------------------------
287
+ def CUF_GetServerDateTime2(self):
288
+ return(self.CUF_GetServerDateTime("", "", ""));
289
+ # --------------------------------------------------------------------------------
290
+ def CUF_GetServerDate(self, Pms_DELIMITER):
291
+ ms_DateTime = "";
292
+ # ------------------------------------------------------------
293
+ ms_SQL = "SELECT DATE_FORMAT(CURRENT_DATE(), " \
294
+ "'%Y" + Pms_DELIMITER + "%m" + Pms_DELIMITER + \
295
+ "%d') AS _DATE";
296
+ obj_MyQuery = self.CUF_DB_OpenSQL(self.CUobj_Conn , ms_SQL);
297
+ obj_DataSet = self.CUF_DB_FETCH(obj_MyQuery);
298
+ # ------------------------------------------------------------
299
+ ms_DateTime = obj_DataSet["_DATE"];
300
+ # ------------------------------------------------------------
301
+ return(ms_DateTime);
302
+ # --------------------------------------------------------------------------------
303
+ def CUF_GetServerTime(self, Pms_DELIMITER):
304
+ ms_DateTime = "";
305
+ # ------------------------------------------------------------
306
+ ms_SQL = "SELECT TIME_FORMAT(CURRENT_TIME(), " \
307
+ "'%H" + Pms_DELIMITER + "%i" + Pms_DELIMITER + \
308
+ "%s') AS _TIME";
309
+ obj_MyQuery = self.CUF_DB_OpenSQL(self.CUobj_Conn, ms_SQL);
310
+ obj_DataSet = self.CUF_DB_FETCH(obj_MyQuery);
311
+ # ------------------------------------------------------------
312
+ ms_DateTime = obj_DataSet["_TIME"];
313
+ # ------------------------------------------------------------
314
+ return(ms_DateTime);
315
+
316
+
317
+ # --------------------------------------------------------------------------------
318
+ # FUNC: 日期時間計算 (相加/減 Pmi_TimeSecond)
319
+ # PIN : Pms_DateTime 可配合使用 CUF_GetServerDateTime(...) 取得系統日期時間
320
+ # Pmi_TImeSecond -59 ~ +59 秒
321
+ # POUT:
322
+ # --------------------------------------------------------------------------------
323
+ def CUF_AddTime(self, Pms_DateTime, Pmi_TimeSecond):
324
+ ms_SQL = "SELECT ADDTIME('"+ Pms_DateTime + "', "+\
325
+ str(Pmi_TimeSecond)+ ") AS _TIMESTR ";
326
+ obj_MyQuery = self.CUF_DB_OpenSQL(self.CUobj_Conn, ms_SQL);
327
+ obj_DataSet = self.CUF_DB_FETCH(obj_MyQuery);
328
+ ms_TimeSTR = obj_DataSet["_TIMESTR"];
329
+ # ------------------------------------------------------------
330
+ return(ms_TimeSTR);
331
+
332
+
333
+ # --------------------------------------------------------------------------------
334
+ # FUNC: 將目前時間 加/減 Pmi_TimeSecond 秒
335
+ # PIN :
336
+ # POUT:
337
+ # --------------------------------------------------------------------------------
338
+ def CUF_AddTime_Current(self, Pmi_TimeSecond):
339
+ ms_CurrTime = self.CUF_GetServerDateTime1(True);
340
+ ms_CurrTime = self.CUF_AddTime(ms_CurrTime, Pmi_TimeSecond);
341
+ # ------------------------------------------------------------
342
+ return(ms_CurrTime);
343
+
344
+
345
+ # ---------------------------------------------------------------------------
346
+ # 使用範例
347
+ # ---------------------------------------------------------------------------
348
+ if(__name__ == '__main__'):
349
+ Gobj_mySQLDBCtrl = CLASS_mySQLDBCtrl();
350
+ # ------------------------------------------------------------
351
+ Gobj_Conn = Gobj_mySQLDBCtrl.CUF_OpenConnection(Pms_DB_HostIP= "mis.gotech.biz",
352
+ Pmi_DB_Port = 3300,
353
+ Pms_DB_Name = "gotech_mis",
354
+ Pms_User = "root",
355
+ Pms_Password = "gotechdf8000sys");
356
+ # ------------------------------------------------------------
357
+ # [範例1]
358
+ # ms_SQL = 'SELECT * From tbemployee';
359
+ # obj_Query = Gobj_mySQLDBCtrl.CUF_DB_OpenSQL(Gobj_Conn, ms_SQL);
360
+ # print(Gobj_mySQLDBCtrl.CUF_DB_FETCH(obj_Query)); # NEXT
361
+ # print(Gobj_mySQLDBCtrl.CUF_DB_FETCH(obj_Query)); # NEXT
362
+ # [範例2]
363
+ # ms_SQL = "SELECT * From tbdepartment order by DEPNO";
364
+ # obj_Query = self.CVobj_mySQLDBCtrl.CUF_DB_OpenSQL(self.CVobj_Conn, ms_SQL);
365
+ #
366
+ ms_SQL = """
367
+ SELECT tbdepartment.*, tbemployee.*
368
+ From tbemployee
369
+ INNER JOIN tbdepartment ON (
370
+ tbemployee.ZONE_ID = tbdepartment.ZONE_ID AND
371
+ tbemployee.DEPNO = tbdepartment.DEPNO)
372
+ WHERE EMPID >= 10 AND EMPID <= 30
373
+ ORDER BY EMPID
374
+ """;
375
+ obj_Query = Gobj_mySQLDBCtrl.CUF_DB_OpenSQL(Gobj_Conn, ms_SQL);
376
+ mi_RECCNT = Gobj_mySQLDBCtrl.CUF_DB_RecordCount(obj_Query);
377
+ print("Record count = "+ str(mi_RECCNT));
378
+
379
+ for mi_c in range(1, 10):
380
+ obj_DataSet = Gobj_mySQLDBCtrl.CUF_DB_FETCH(obj_Query);
381
+ print(obj_DataSet["DEPNO"], " ", obj_DataSet["DEPNAME"],
382
+ obj_DataSet["EMPID"], " ", obj_DataSet["EMPNAME"]);
383
+
384
+
385
+ ms_SQL = "SELECT * FROM _def_fileservicemedia_d "\
386
+ " WHERE FolderType=1 AND MEDIAID=1 AND BlockID=1 ";
387
+ obj_Query = Gobj_mySQLDBCtrl.CUF_DB_OpenSQL(Gobj_Conn, ms_SQL);
388
+ Gobj_mySQLDBCtrl.CUF_SetBlobField(obj_Query, "_def_fileservicemedia_d",
389
+ "FolderType=1 AND MEDIAID=1 AND BlockID=1 ",
390
+ "Media_Block",
391
+ "C:\\TEMP\\baselib.zip")
392
+
393
+
394
+ ms_SQL = "SELECT * FROM _def_fileservicemedia_d "\
395
+ " WHERE FolderType=1 AND MEDIAID=1 AND BlockID=1 ";
396
+ obj_Query = Gobj_mySQLDBCtrl.CUF_DB_OpenSQL(Gobj_Conn, ms_SQL);
397
+ Gobj_mySQLDBCtrl.CUF_GetBlobField(obj_Query, "Media_Block", "C:\\temp\\PPPKKK.zip");
@@ -0,0 +1,8 @@
1
+ Metadata-Version: 2.4
2
+ Name: mySQLDBCtrlAPI
3
+ Version: 0.1.0
4
+ Summary: mySQLDBCtrlAPI Python package
5
+ Author-email: James Lin <tylin123@ms27.hinet.net>
6
+ Project-URL: Homepage, https://mis.gotech.biz
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: pymysql
@@ -0,0 +1,10 @@
1
+ README.md
2
+ pyproject.toml
3
+ setup.cfg
4
+ mySQLDBCtrlAPI/__init__.py
5
+ mySQLDBCtrlAPI/mySQLDBCtrl.py
6
+ mySQLDBCtrlAPI.egg-info/PKG-INFO
7
+ mySQLDBCtrlAPI.egg-info/SOURCES.txt
8
+ mySQLDBCtrlAPI.egg-info/dependency_links.txt
9
+ mySQLDBCtrlAPI.egg-info/requires.txt
10
+ mySQLDBCtrlAPI.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ mySQLDBCtrlAPI
@@ -0,0 +1,19 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "mySQLDBCtrlAPI"
7
+ version = "0.1.0"
8
+ description = "mySQLDBCtrlAPI Python package"
9
+ authors = [
10
+ { name="James Lin", email="tylin123@ms27.hinet.net" }
11
+ ]
12
+ readme = "README.md"
13
+ license = { file = "LICENSE" }
14
+ dependencies = [
15
+ "pymysql",
16
+ ]
17
+
18
+ [project.urls]
19
+ Homepage = "https://mis.gotech.biz"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+