memobot 1.0.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.
@@ -0,0 +1,2 @@
1
+ recursive-include src/memobot/ui *
2
+ include README.md
memobot-1.0.0/PKG-INFO ADDED
@@ -0,0 +1,168 @@
1
+ Metadata-Version: 2.4
2
+ Name: memobot
3
+ Version: 1.0.0
4
+ Summary: Google Drive-synchronized floating Post-it memo pad for Windows, macOS, and Linux
5
+ Home-page: https://github.com/yourusername/memo-bot
6
+ Author: Your Name
7
+ Author-email: Your Name <your.email@example.com>
8
+ Project-URL: Homepage, https://github.com/yourusername/memo-bot
9
+ Project-URL: Bug-Tracker, https://github.com/yourusername/memo-bot/issues
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Topic :: Office/Business :: News/Diary
14
+ Requires-Python: >=3.8
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: pywebview>=5.0
17
+ Requires-Dist: google-api-python-client>=2.0
18
+ Requires-Dist: google-auth-oauthlib>=1.0
19
+ Requires-Dist: google-auth-httplib2>=0.1.0
20
+ Requires-Dist: pystray>=0.19.0
21
+ Requires-Dist: pillow>=10.0.0
22
+ Dynamic: author
23
+ Dynamic: home-page
24
+ Dynamic: requires-python
25
+
26
+ # Memo-Bot v1.0 ๐Ÿ“Œ
27
+
28
+ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ ๊ธฐ๋ฐ˜์˜ ์™„๋ฒฝํžˆ ๋™๊ธฐํ™”๋˜๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํฌ์ŠคํŠธ์ž‡ ๋ฉ”๋ชจ์žฅ์ž…๋‹ˆ๋‹ค.
29
+ ์•ˆ๋“œ๋กœ์ด๋“œ(Flutter)์™€ ๋ฐ์Šคํฌํ†ฑ(Windows, macOS, Linux - Python/PyWebView) ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ **์ˆจ๊ฒจ์ง„ ์•ฑ ํด๋” (Application Data Folder)**๋ฅผ ์ด์šฉํ•ด ๋ณด์•ˆ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚˜๊ณ  ๊น”๋”ํ•œ ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
30
+
31
+ ---
32
+
33
+ ## ๐ŸŽจ ๊ธฐ์ˆ  ์Šคํƒ ๋ฐ ํŠน์ง•
34
+
35
+ * **Desktop Client**: Python + PyWebView (HTML/JS/CSS). OS ๋‚ด์žฅ ์›น๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฐฐํฌ ํŒŒ์ผ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ๊ฐ€ ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค.
36
+ * **Mobile Client (Android)**: Flutter (Material 3 ๋‹คํฌ ๋ชจ๋“œ). ๋ชจ๋˜ํ•˜๊ณ  ์œ ๋ คํ•œ ํฌ์ŠคํŠธ์ž‡ ๋ฆฌ์ŠคํŠธ ๋ฐ ํŽธ์ง‘ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต.
37
+ * **Sync Engine**: Google Drive AppData API. ์‚ฌ์šฉ์ž์˜ ํŒŒ์ผ ๋ชฉ๋ก์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ณ ์œ  ์•ฑ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํŒŒ์ผ์˜ `appProperties` ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ์†Œ๋ชจ๊ฐ€ ๋งค์šฐ ์ ๊ณ  ๋ฐ˜์‘์ด ๋น ๋ฅธ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
38
+
39
+ ---
40
+
41
+ ## ๐Ÿ“‚ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฒฝ๋กœ ๋ฐ ํŒŒ์ผ ํฌ๋งท
42
+
43
+ ๋ฉ”๋ชจ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ๊ฐ ๋ฉ”๋ชจ๋Š” ๋กœ์ปฌ ์ปดํ“จํ„ฐ์— ๊ฐœ๋ณ„ **JSON ํŒŒ์ผ** ํ˜•ํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
44
+
45
+ ### 1. ๋กœ์ปฌ ์ €์žฅ ๊ฒฝ๋กœ
46
+ * **Windows**: `C:\Users\<์‚ฌ์šฉ์ž๋ช…>\.memobot\notes\`
47
+ * **macOS / Linux**: `~/.memobot/notes/`
48
+
49
+ ### 2. ํŒŒ์ผ ํ˜•์‹ ๋ฐ ์ด๋ฆ„
50
+ * ๊ฐ ๋ฉ”๋ชจ๋‹น `note_<๊ณ ์œ ID>.json` ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. (์˜ˆ: `note_a1b2c3d4.json`)
51
+
52
+ ### 3. JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์˜ˆ์‹œ
53
+ ๋ฉ”๋ชจ์˜ ๋‚ด์šฉ, ์ƒ‰์ƒ, ์ขŒํ‘œ ๋ฐ ํฌ๊ธฐ, ํƒœ๊ทธ ์ •๋ณด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฒจ๋ถ€๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋‹จ์ผ JSON ํŒŒ์ผ ๋‚ด์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
54
+ ```json
55
+ {
56
+ "id": "a1b2c3d4-...",
57
+ "content": "๋ฉ”๋ชจ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. #ํƒœ๊ทธ",
58
+ "color": "yellow",
59
+ "tags": ["ํƒœ๊ทธ"],
60
+ "x": 120,
61
+ "y": 250,
62
+ "width": 250,
63
+ "height": 250,
64
+ "is_folded": false,
65
+ "on_top": true,
66
+ "updated_at": "2026-06-04T12:57:08Z",
67
+ "image": "data:image/png;base64,iVBORw0KGgoAAA..." // ์ฒจ๋ถ€๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ (Base64 ์ธ์ฝ”๋”ฉ)
68
+ }
69
+ ```
70
+
71
+ > [!NOTE]
72
+ > ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ ๋™๊ธฐํ™”๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ์˜ ์ˆจ๊ฒจ์ง„ ์•ฑ ์ „์šฉ ์ €์žฅ์†Œ(AppData Folder) ํด๋”์—๋„ ๋กœ์ปฌ๊ณผ ๋™์ผํ•œ ํŒŒ์ผ๋ช… ๋ฐ JSON ๋ฐ์ดํ„ฐ ํฌ๋งท์œผ๋กœ ์ €์žฅ ๋ฐ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
73
+
74
+ ---
75
+
76
+ ## ๐Ÿ”‘ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ API ์„ค์ • (OAuth 2.0)
77
+
78
+ ์–‘์ชฝ ํ”Œ๋žซํผ์—์„œ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด Google Cloud Console์—์„œ OAuth 2.0 ์ž๊ฒฉ ์ฆ๋ช…์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
79
+
80
+ 1. **Google Cloud Console ์ ‘์†**:
81
+ * [Google Cloud Console](https://console.cloud.google.com/)์— ๊ตฌ๊ธ€ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
82
+ * ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: `Memo-Bot`).
83
+
84
+ 2. **Google Drive API ํ™œ์„ฑํ™”**:
85
+ * **API ๋ฐ ์„œ๋น„์Šค > ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
86
+ * `Google Drive API`๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  **์‚ฌ์šฉ(Enable)** ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
87
+
88
+ 3. **OAuth ๋™์˜ ํ™”๋ฉด ์„ค์ •**:
89
+ * **API ๋ฐ ์„œ๋น„์Šค > OAuth ๋™์˜ ํ™”๋ฉด**์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
90
+ * User Type์„ **์™ธ๋ถ€(External)**๋กœ ์„ ํƒํ•˜๊ณ  ์ƒ์„ฑ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
91
+ * ํ•„์ˆ˜ ์ •๋ณด(์•ฑ ์ด๋ฆ„, ์ด๋ฉ”์ผ ๋“ฑ)๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
92
+ * **๋ฒ”์œ„(Scopes)** ์„ค์ • ๋‹จ๊ณ„์—์„œ `.../auth/drive.appdata` ๋ฒ”์œ„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ์˜ ์•ฑ ์ „์šฉ ์ˆจ๊ฒจ์ง„ ํด๋” ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ถŒํ•œ).
93
+ * **ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž (Test Users)** ๋“ฑ๋ก ๋‹จ๊ณ„์—์„œ ๋™๊ธฐํ™” ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ๋ณธ์ธ์˜ ๊ตฌ๊ธ€ ์ด๋ฉ”์ผ์„ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
94
+
95
+ > [!IMPORTANT]
96
+ > OAuth ๋™์˜ ํ™”๋ฉด์˜ ํผ๋ธ”๋ฆฌ์‹ฑ ์ƒํƒœ๊ฐ€ **ํ…Œ์ŠคํŠธ(Testing)** ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ, ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž๋กœ ์ด๋ฉ”์ผ ๊ณ„์ •์ด ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ๋งŒ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์ด ์ •์ƒ ์ฒ˜๋ฆฌ๋˜๊ณ  ์ฐจ๋‹จ ์—๋Ÿฌ(403 access_denied)๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
97
+
98
+ 4. **์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด(Credentials) ์ƒ์„ฑ**:
99
+ * **API ๋ฐ ์„œ๋น„์Šค > ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด**๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
100
+ * **์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ > OAuth ํด๋ผ์ด์–ธํŠธ ID**๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
101
+ * ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ ํ˜•์„ **๋ฐ์Šคํฌํ†ฑ ์•ฑ(Desktop App)**์œผ๋กœ ์„ ํƒํ•˜๊ณ  ์ด๋ฆ„์„ ์ž…๋ ฅ ํ›„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
102
+ * ์ƒ์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ ID์˜ JSON ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
103
+
104
+ ---
105
+
106
+ ## ๐Ÿ’ป ๋ฐ์Šคํฌํ†ฑ ์•ฑ ์‹คํ–‰ ๋ฐ ๋ฐฐํฌ (Python)
107
+
108
+ ### 1. ์ž๊ฒฉ ์ฆ๋ช… ํŒŒ์ผ ๋ฐฐ์น˜
109
+ ๋‹ค์šด๋กœ๋“œ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ JSON ํŒŒ์ผ์„ `client_secrets.json`์œผ๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์Œ ๊ฒฝ๋กœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
110
+ * **Windows**: `C:\Users\<์‚ฌ์šฉ์ž๋ช…>\.memobot\client_secrets.json`
111
+ * **macOS/Linux**: `~/.memobot/client_secrets.json`
112
+
113
+ ### 2. ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ๋กœ์ปฌ ์‹คํ–‰
114
+ ```bash
115
+ cd desktop
116
+ # ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
117
+ python -m venv venv
118
+ source venv/bin/activate # Windows: venv\Scripts\activate
119
+
120
+ # ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜
121
+ pip install -e .
122
+
123
+ # ์•ฑ ์‹คํ–‰
124
+ memobot
125
+ ```
126
+
127
+ ### 3. PyPI ๋ฐฐํฌ์šฉ ๋นŒ๋“œ ๋ฐ ์—…๋กœ๋“œ
128
+ ํŒจํ‚ค์ง€ ์ฒญ์†Œ, ๋นŒ๋“œ, ์—…๋กœ๋“œ๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์ž๋™ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฐ์น˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:
129
+ ```bash
130
+ # Windows ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ๋ฐฐ์น˜ํŒŒ์ผ ์‹คํ–‰
131
+ ./publish_pypi.bat
132
+ ```
133
+ * ์‹คํ–‰ ์‹œ ๊ธฐ์กด ๋นŒ๋“œ ์ž„์‹œ ํŒŒ์ผ๋“ค์„ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , `build` ๋ฐ `twine` ๋ชจ๋“ˆ์„ ์ž๋™์œผ๋กœ ์ตœ์‹  ์„ค์น˜/์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
134
+ * ๋นŒ๋“œ ์™„๋ฃŒ ํ›„ **[1] TestPyPI ์—…๋กœ๋“œ**, **[2] ๊ณต์‹ PyPI ์—…๋กœ๋“œ**, **[3] ์—…๋กœ๋“œ ์—†์ด ๋นŒ๋“œ๋งŒ ์ˆ˜ํ–‰** ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
135
+ * ๋ฐฐํฌ ์™„๋ฃŒ ์‹œ ์‚ฌ์šฉ์ž๋Š” `pip install memobot` ๋ช…๋ น์–ด๋งŒ์œผ๋กœ ํฌ๋กœ์Šค ํ”Œ๋žซํผ(Windows, macOS, Linux) ํ™˜๊ฒฝ์— ์„ค์น˜ํ•˜๊ณ  `memobot` ๋ช…๋ น์–ด๋กœ ์ฆ‰์‹œ ์•ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
136
+
137
+ ---
138
+
139
+ ## ๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ์•ฑ ์‹คํ–‰ (Flutter Android)
140
+
141
+ ### 1. Flutter ์˜์กด์„ฑ ๊ตฌ์„ฑ
142
+ ```bash
143
+ cd mobile
144
+ flutter pub get
145
+ ```
146
+
147
+ ### 2. ์•ˆ๋“œ๋กœ์ด๋“œ ํ”Œ๋žซํผ ์„ค์ •
148
+ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ์—ฐ๋™์„ ์œ„ํ•ด ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์˜ ํŒจํ‚ค์ง€๋ช…๊ณผ ๋””๋ฒ„๊ทธ ์„œ๋ช… ํ‚ค(SHA-1)๋ฅผ Google Cloud Console์˜ ๋™์ผ ํ”„๋กœ์ ํŠธ์— ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
149
+
150
+ 1. **OAuth ํด๋ผ์ด์–ธํŠธ ID ์ถ”๊ฐ€ ์ƒ์„ฑ**:
151
+ * Google Cloud Console > ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด > OAuth ํด๋ผ์ด์–ธํŠธ ID ์ƒ์„ฑ.
152
+ * ์œ ํ˜•์„ **Android**๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
153
+ * ํŒจํ‚ค์ง€ ์ด๋ฆ„ ์ž…๋ ฅ (์˜ˆ: `com.example.memobot`).
154
+ * ๊ฐœ๋ฐœ์šฉ SHA-1 ์ง€๋ฌธ ์ธ์ฆ์„œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค (JDK์˜ `keytool`์„ ํ†ตํ•ด ์กฐํšŒ ๊ฐ€๋Šฅ).
155
+ 2. **์„œ๋น„์Šค ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ**:
156
+ * ํ•„์š”์— ๋”ฐ๋ผ Firebase์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ `google-services.json`์„ `mobile/android/app/` ์•„๋ž˜์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ณธ ๊ตฌํ˜„์—์„œ๋Š” `google_sign_in` ํŒจํ‚ค์ง€๊ฐ€ ํด๋ผ์ด์–ธํŠธ ID๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ตœ์†Œํ•œ์˜ ์„ค์ •๋งŒ์œผ๋กœ ์ž‘๋™ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
157
+
158
+ ### 3. ์•ฑ ์‹คํ–‰
159
+ ```bash
160
+ flutter run
161
+ ```
162
+
163
+ ---
164
+
165
+ ## ๐Ÿ”„ ๋™๊ธฐํ™” ๋ฐ ์ถฉ๋Œ ๋ฐฉ์ง€ ์„ธ๋ถ€ ์„ค๊ณ„
166
+
167
+ * **Tombstoning (์†Œํ”„ํŠธ ์‚ญ์ œ)**: ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ๋‚ด์—์„œ ๋ฉ”๋ชจ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ํŒŒ์ผ์ด ์ฆ‰์‹œ ์˜๊ตฌ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ํ•„๋“œ๊ฐ€ `is_deleted: true`๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋™๊ธฐํ™” ์‹œ์ ์— ํ•ด๋‹น ๋ฉ”๋ชจ๋ฅผ ๋กœ์ปฌ์—์„œ๋„ ๋˜‘๊ฐ™์ด ์ง€์›Œ์ฃผ๋„๋ก ์œ ๋„ํ•˜๋ฉฐ, ์™„๋ฒฝํ•œ ์‚ญ์ œ ์ „ํŒŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
168
+ * **Last-Write-Wins (์ตœ์ข… ์“ฐ๊ธฐ ์šฐ์„ )**: ์˜คํ”„๋ผ์ธ ์ˆ˜์ •์„ ํฌํ•จํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๊ธฐ์—์„œ ๊ฐ™์€ ํฌ์ŠคํŠธ์ž‡์„ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ, JSON ๋‚ด๋ถ€์˜ `updated_at` ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋” ๋Šฆ๊ฒŒ ํŽธ์ง‘๋œ ์ตœ์ข… ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
@@ -0,0 +1,143 @@
1
+ # Memo-Bot v1.0 ๐Ÿ“Œ
2
+
3
+ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ ๊ธฐ๋ฐ˜์˜ ์™„๋ฒฝํžˆ ๋™๊ธฐํ™”๋˜๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํฌ์ŠคํŠธ์ž‡ ๋ฉ”๋ชจ์žฅ์ž…๋‹ˆ๋‹ค.
4
+ ์•ˆ๋“œ๋กœ์ด๋“œ(Flutter)์™€ ๋ฐ์Šคํฌํ†ฑ(Windows, macOS, Linux - Python/PyWebView) ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ **์ˆจ๊ฒจ์ง„ ์•ฑ ํด๋” (Application Data Folder)**๋ฅผ ์ด์šฉํ•ด ๋ณด์•ˆ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚˜๊ณ  ๊น”๋”ํ•œ ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
5
+
6
+ ---
7
+
8
+ ## ๐ŸŽจ ๊ธฐ์ˆ  ์Šคํƒ ๋ฐ ํŠน์ง•
9
+
10
+ * **Desktop Client**: Python + PyWebView (HTML/JS/CSS). OS ๋‚ด์žฅ ์›น๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฐฐํฌ ํŒŒ์ผ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ๊ฐ€ ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค.
11
+ * **Mobile Client (Android)**: Flutter (Material 3 ๋‹คํฌ ๋ชจ๋“œ). ๋ชจ๋˜ํ•˜๊ณ  ์œ ๋ คํ•œ ํฌ์ŠคํŠธ์ž‡ ๋ฆฌ์ŠคํŠธ ๋ฐ ํŽธ์ง‘ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต.
12
+ * **Sync Engine**: Google Drive AppData API. ์‚ฌ์šฉ์ž์˜ ํŒŒ์ผ ๋ชฉ๋ก์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ณ ์œ  ์•ฑ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํŒŒ์ผ์˜ `appProperties` ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ์†Œ๋ชจ๊ฐ€ ๋งค์šฐ ์ ๊ณ  ๋ฐ˜์‘์ด ๋น ๋ฅธ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
13
+
14
+ ---
15
+
16
+ ## ๐Ÿ“‚ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฒฝ๋กœ ๋ฐ ํŒŒ์ผ ํฌ๋งท
17
+
18
+ ๋ฉ”๋ชจ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ €์žฅํ•˜๋ฉด ๊ฐ ๋ฉ”๋ชจ๋Š” ๋กœ์ปฌ ์ปดํ“จํ„ฐ์— ๊ฐœ๋ณ„ **JSON ํŒŒ์ผ** ํ˜•ํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
19
+
20
+ ### 1. ๋กœ์ปฌ ์ €์žฅ ๊ฒฝ๋กœ
21
+ * **Windows**: `C:\Users\<์‚ฌ์šฉ์ž๋ช…>\.memobot\notes\`
22
+ * **macOS / Linux**: `~/.memobot/notes/`
23
+
24
+ ### 2. ํŒŒ์ผ ํ˜•์‹ ๋ฐ ์ด๋ฆ„
25
+ * ๊ฐ ๋ฉ”๋ชจ๋‹น `note_<๊ณ ์œ ID>.json` ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. (์˜ˆ: `note_a1b2c3d4.json`)
26
+
27
+ ### 3. JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์˜ˆ์‹œ
28
+ ๋ฉ”๋ชจ์˜ ๋‚ด์šฉ, ์ƒ‰์ƒ, ์ขŒํ‘œ ๋ฐ ํฌ๊ธฐ, ํƒœ๊ทธ ์ •๋ณด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฒจ๋ถ€๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋‹จ์ผ JSON ํŒŒ์ผ ๋‚ด์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
29
+ ```json
30
+ {
31
+ "id": "a1b2c3d4-...",
32
+ "content": "๋ฉ”๋ชจ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. #ํƒœ๊ทธ",
33
+ "color": "yellow",
34
+ "tags": ["ํƒœ๊ทธ"],
35
+ "x": 120,
36
+ "y": 250,
37
+ "width": 250,
38
+ "height": 250,
39
+ "is_folded": false,
40
+ "on_top": true,
41
+ "updated_at": "2026-06-04T12:57:08Z",
42
+ "image": "data:image/png;base64,iVBORw0KGgoAAA..." // ์ฒจ๋ถ€๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ (Base64 ์ธ์ฝ”๋”ฉ)
43
+ }
44
+ ```
45
+
46
+ > [!NOTE]
47
+ > ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ ๋™๊ธฐํ™”๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ์˜ ์ˆจ๊ฒจ์ง„ ์•ฑ ์ „์šฉ ์ €์žฅ์†Œ(AppData Folder) ํด๋”์—๋„ ๋กœ์ปฌ๊ณผ ๋™์ผํ•œ ํŒŒ์ผ๋ช… ๋ฐ JSON ๋ฐ์ดํ„ฐ ํฌ๋งท์œผ๋กœ ์ €์žฅ ๋ฐ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
48
+
49
+ ---
50
+
51
+ ## ๐Ÿ”‘ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ API ์„ค์ • (OAuth 2.0)
52
+
53
+ ์–‘์ชฝ ํ”Œ๋žซํผ์—์„œ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด Google Cloud Console์—์„œ OAuth 2.0 ์ž๊ฒฉ ์ฆ๋ช…์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
54
+
55
+ 1. **Google Cloud Console ์ ‘์†**:
56
+ * [Google Cloud Console](https://console.cloud.google.com/)์— ๊ตฌ๊ธ€ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
57
+ * ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: `Memo-Bot`).
58
+
59
+ 2. **Google Drive API ํ™œ์„ฑํ™”**:
60
+ * **API ๋ฐ ์„œ๋น„์Šค > ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
61
+ * `Google Drive API`๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  **์‚ฌ์šฉ(Enable)** ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
62
+
63
+ 3. **OAuth ๋™์˜ ํ™”๋ฉด ์„ค์ •**:
64
+ * **API ๋ฐ ์„œ๋น„์Šค > OAuth ๋™์˜ ํ™”๋ฉด**์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
65
+ * User Type์„ **์™ธ๋ถ€(External)**๋กœ ์„ ํƒํ•˜๊ณ  ์ƒ์„ฑ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
66
+ * ํ•„์ˆ˜ ์ •๋ณด(์•ฑ ์ด๋ฆ„, ์ด๋ฉ”์ผ ๋“ฑ)๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
67
+ * **๋ฒ”์œ„(Scopes)** ์„ค์ • ๋‹จ๊ณ„์—์„œ `.../auth/drive.appdata` ๋ฒ”์œ„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ์˜ ์•ฑ ์ „์šฉ ์ˆจ๊ฒจ์ง„ ํด๋” ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ถŒํ•œ).
68
+ * **ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž (Test Users)** ๋“ฑ๋ก ๋‹จ๊ณ„์—์„œ ๋™๊ธฐํ™” ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ๋ณธ์ธ์˜ ๊ตฌ๊ธ€ ์ด๋ฉ”์ผ์„ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
69
+
70
+ > [!IMPORTANT]
71
+ > OAuth ๋™์˜ ํ™”๋ฉด์˜ ํผ๋ธ”๋ฆฌ์‹ฑ ์ƒํƒœ๊ฐ€ **ํ…Œ์ŠคํŠธ(Testing)** ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ, ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž๋กœ ์ด๋ฉ”์ผ ๊ณ„์ •์ด ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ๋งŒ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์ด ์ •์ƒ ์ฒ˜๋ฆฌ๋˜๊ณ  ์ฐจ๋‹จ ์—๋Ÿฌ(403 access_denied)๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
72
+
73
+ 4. **์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด(Credentials) ์ƒ์„ฑ**:
74
+ * **API ๋ฐ ์„œ๋น„์Šค > ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด**๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
75
+ * **์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ > OAuth ํด๋ผ์ด์–ธํŠธ ID**๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
76
+ * ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ ํ˜•์„ **๋ฐ์Šคํฌํ†ฑ ์•ฑ(Desktop App)**์œผ๋กœ ์„ ํƒํ•˜๊ณ  ์ด๋ฆ„์„ ์ž…๋ ฅ ํ›„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
77
+ * ์ƒ์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ ID์˜ JSON ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
78
+
79
+ ---
80
+
81
+ ## ๐Ÿ’ป ๋ฐ์Šคํฌํ†ฑ ์•ฑ ์‹คํ–‰ ๋ฐ ๋ฐฐํฌ (Python)
82
+
83
+ ### 1. ์ž๊ฒฉ ์ฆ๋ช… ํŒŒ์ผ ๋ฐฐ์น˜
84
+ ๋‹ค์šด๋กœ๋“œ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ JSON ํŒŒ์ผ์„ `client_secrets.json`์œผ๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์Œ ๊ฒฝ๋กœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
85
+ * **Windows**: `C:\Users\<์‚ฌ์šฉ์ž๋ช…>\.memobot\client_secrets.json`
86
+ * **macOS/Linux**: `~/.memobot/client_secrets.json`
87
+
88
+ ### 2. ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ๋กœ์ปฌ ์‹คํ–‰
89
+ ```bash
90
+ cd desktop
91
+ # ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
92
+ python -m venv venv
93
+ source venv/bin/activate # Windows: venv\Scripts\activate
94
+
95
+ # ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜
96
+ pip install -e .
97
+
98
+ # ์•ฑ ์‹คํ–‰
99
+ memobot
100
+ ```
101
+
102
+ ### 3. PyPI ๋ฐฐํฌ์šฉ ๋นŒ๋“œ ๋ฐ ์—…๋กœ๋“œ
103
+ ํŒจํ‚ค์ง€ ์ฒญ์†Œ, ๋นŒ๋“œ, ์—…๋กœ๋“œ๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์ž๋™ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฐ์น˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:
104
+ ```bash
105
+ # Windows ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ๋ฐฐ์น˜ํŒŒ์ผ ์‹คํ–‰
106
+ ./publish_pypi.bat
107
+ ```
108
+ * ์‹คํ–‰ ์‹œ ๊ธฐ์กด ๋นŒ๋“œ ์ž„์‹œ ํŒŒ์ผ๋“ค์„ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , `build` ๋ฐ `twine` ๋ชจ๋“ˆ์„ ์ž๋™์œผ๋กœ ์ตœ์‹  ์„ค์น˜/์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
109
+ * ๋นŒ๋“œ ์™„๋ฃŒ ํ›„ **[1] TestPyPI ์—…๋กœ๋“œ**, **[2] ๊ณต์‹ PyPI ์—…๋กœ๋“œ**, **[3] ์—…๋กœ๋“œ ์—†์ด ๋นŒ๋“œ๋งŒ ์ˆ˜ํ–‰** ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
110
+ * ๋ฐฐํฌ ์™„๋ฃŒ ์‹œ ์‚ฌ์šฉ์ž๋Š” `pip install memobot` ๋ช…๋ น์–ด๋งŒ์œผ๋กœ ํฌ๋กœ์Šค ํ”Œ๋žซํผ(Windows, macOS, Linux) ํ™˜๊ฒฝ์— ์„ค์น˜ํ•˜๊ณ  `memobot` ๋ช…๋ น์–ด๋กœ ์ฆ‰์‹œ ์•ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
111
+
112
+ ---
113
+
114
+ ## ๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ์•ฑ ์‹คํ–‰ (Flutter Android)
115
+
116
+ ### 1. Flutter ์˜์กด์„ฑ ๊ตฌ์„ฑ
117
+ ```bash
118
+ cd mobile
119
+ flutter pub get
120
+ ```
121
+
122
+ ### 2. ์•ˆ๋“œ๋กœ์ด๋“œ ํ”Œ๋žซํผ ์„ค์ •
123
+ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ์—ฐ๋™์„ ์œ„ํ•ด ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์˜ ํŒจํ‚ค์ง€๋ช…๊ณผ ๋””๋ฒ„๊ทธ ์„œ๋ช… ํ‚ค(SHA-1)๋ฅผ Google Cloud Console์˜ ๋™์ผ ํ”„๋กœ์ ํŠธ์— ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
124
+
125
+ 1. **OAuth ํด๋ผ์ด์–ธํŠธ ID ์ถ”๊ฐ€ ์ƒ์„ฑ**:
126
+ * Google Cloud Console > ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด > OAuth ํด๋ผ์ด์–ธํŠธ ID ์ƒ์„ฑ.
127
+ * ์œ ํ˜•์„ **Android**๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
128
+ * ํŒจํ‚ค์ง€ ์ด๋ฆ„ ์ž…๋ ฅ (์˜ˆ: `com.example.memobot`).
129
+ * ๊ฐœ๋ฐœ์šฉ SHA-1 ์ง€๋ฌธ ์ธ์ฆ์„œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค (JDK์˜ `keytool`์„ ํ†ตํ•ด ์กฐํšŒ ๊ฐ€๋Šฅ).
130
+ 2. **์„œ๋น„์Šค ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ**:
131
+ * ํ•„์š”์— ๋”ฐ๋ผ Firebase์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ `google-services.json`์„ `mobile/android/app/` ์•„๋ž˜์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ณธ ๊ตฌํ˜„์—์„œ๋Š” `google_sign_in` ํŒจํ‚ค์ง€๊ฐ€ ํด๋ผ์ด์–ธํŠธ ID๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ตœ์†Œํ•œ์˜ ์„ค์ •๋งŒ์œผ๋กœ ์ž‘๋™ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
132
+
133
+ ### 3. ์•ฑ ์‹คํ–‰
134
+ ```bash
135
+ flutter run
136
+ ```
137
+
138
+ ---
139
+
140
+ ## ๐Ÿ”„ ๋™๊ธฐํ™” ๋ฐ ์ถฉ๋Œ ๋ฐฉ์ง€ ์„ธ๋ถ€ ์„ค๊ณ„
141
+
142
+ * **Tombstoning (์†Œํ”„ํŠธ ์‚ญ์ œ)**: ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ๋‚ด์—์„œ ๋ฉ”๋ชจ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ํŒŒ์ผ์ด ์ฆ‰์‹œ ์˜๊ตฌ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ํ•„๋“œ๊ฐ€ `is_deleted: true`๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋™๊ธฐํ™” ์‹œ์ ์— ํ•ด๋‹น ๋ฉ”๋ชจ๋ฅผ ๋กœ์ปฌ์—์„œ๋„ ๋˜‘๊ฐ™์ด ์ง€์›Œ์ฃผ๋„๋ก ์œ ๋„ํ•˜๋ฉฐ, ์™„๋ฒฝํ•œ ์‚ญ์ œ ์ „ํŒŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
143
+ * **Last-Write-Wins (์ตœ์ข… ์“ฐ๊ธฐ ์šฐ์„ )**: ์˜คํ”„๋ผ์ธ ์ˆ˜์ •์„ ํฌํ•จํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๊ธฐ์—์„œ ๊ฐ™์€ ํฌ์ŠคํŠธ์ž‡์„ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ, JSON ๋‚ด๋ถ€์˜ `updated_at` ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋” ๋Šฆ๊ฒŒ ํŽธ์ง‘๋œ ์ตœ์ข… ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
@@ -0,0 +1,44 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "memobot"
7
+ version = "1.0.0"
8
+ authors = [
9
+ { name = "Your Name", email = "your.email@example.com" }
10
+ ]
11
+ description = "Google Drive-synchronized floating Post-it memo pad for Windows, macOS, and Linux"
12
+ readme = "README.md"
13
+ requires-python = ">=3.8"
14
+ classifiers = [
15
+ "Programming Language :: Python :: 3",
16
+ "License :: OSI Approved :: MIT License",
17
+ "Operating System :: OS Independent",
18
+ "Topic :: Office/Business :: News/Diary",
19
+ ]
20
+ dependencies = [
21
+ "pywebview>=5.0",
22
+ "google-api-python-client>=2.0",
23
+ "google-auth-oauthlib>=1.0",
24
+ "google-auth-httplib2>=0.1.0",
25
+ "pystray>=0.19.0",
26
+ "pillow>=10.0.0",
27
+ ]
28
+
29
+ [project.urls]
30
+ Homepage = "https://github.com/yourusername/memo-bot"
31
+ Bug-Tracker = "https://github.com/yourusername/memo-bot/issues"
32
+
33
+ [project.scripts]
34
+ memobot = "memobot.main:main"
35
+
36
+ [tool.setuptools]
37
+ package-dir = {"" = "src"}
38
+ include-package-data = true
39
+
40
+ [tool.setuptools.packages.find]
41
+ where = ["src"]
42
+
43
+ [tool.setuptools.package-data]
44
+ memobot = ["ui/*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
memobot-1.0.0/setup.py ADDED
@@ -0,0 +1,38 @@
1
+ from setuptools import setup, find_packages
2
+
3
+ with open("README.md", "r", encoding="utf-8") as fh:
4
+ long_description = fh.read()
5
+
6
+ setup(
7
+ name="memobot",
8
+ version="1.0.0",
9
+ author="Your Name",
10
+ author_email="your.email@example.com",
11
+ description="Google Drive-synchronized floating Post-it memo pad for Windows, macOS, and Linux",
12
+ long_description=long_description,
13
+ long_description_content_type="text/markdown",
14
+ url="https://github.com/yourusername/memo-bot",
15
+ package_dir={"": "src"},
16
+ packages=find_packages(where="src"),
17
+ classifiers=[
18
+ "Programming Language :: Python :: 3",
19
+ "License :: OSI Approved :: MIT License",
20
+ "Operating System :: OS Independent",
21
+ "Topic :: Office/Business :: News/Diary",
22
+ ],
23
+ python_requires=">=3.8",
24
+ install_requires=[
25
+ "pywebview>=5.0",
26
+ "google-api-python-client>=2.0",
27
+ "google-auth-oauthlib>=1.0",
28
+ "google-auth-httplib2>=0.1.0",
29
+ "pystray>=0.19.0",
30
+ "pillow>=10.0.0",
31
+ ],
32
+ entry_points={
33
+ "gui_scripts": [
34
+ "memobot=memobot.main:main",
35
+ ],
36
+ },
37
+ include_package_data=True,
38
+ )
@@ -0,0 +1,2 @@
1
+ # memobot package init file
2
+ __version__ = "0.1.0"