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.
- memobot-1.0.0/MANIFEST.in +2 -0
- memobot-1.0.0/PKG-INFO +168 -0
- memobot-1.0.0/README.md +143 -0
- memobot-1.0.0/pyproject.toml +44 -0
- memobot-1.0.0/setup.cfg +4 -0
- memobot-1.0.0/setup.py +38 -0
- memobot-1.0.0/src/memobot/__init__.py +2 -0
- memobot-1.0.0/src/memobot/main.py +1607 -0
- memobot-1.0.0/src/memobot/sync.py +295 -0
- memobot-1.0.0/src/memobot/ui/app.js +816 -0
- memobot-1.0.0/src/memobot/ui/icon.ico +0 -0
- memobot-1.0.0/src/memobot/ui/index.html +345 -0
- memobot-1.0.0/src/memobot/ui/note.html +201 -0
- memobot-1.0.0/src/memobot/ui/note.js +875 -0
- memobot-1.0.0/src/memobot/ui/style.css +996 -0
- memobot-1.0.0/src/memobot.egg-info/PKG-INFO +168 -0
- memobot-1.0.0/src/memobot.egg-info/SOURCES.txt +19 -0
- memobot-1.0.0/src/memobot.egg-info/dependency_links.txt +1 -0
- memobot-1.0.0/src/memobot.egg-info/entry_points.txt +2 -0
- memobot-1.0.0/src/memobot.egg-info/requires.txt +6 -0
- memobot-1.0.0/src/memobot.egg-info/top_level.txt +1 -0
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` ํ์์คํฌํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ๋ฆ๊ฒ ํธ์ง๋ ์ต์ข
๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฎ์ด์๋๋ค.
|
memobot-1.0.0/README.md
ADDED
|
@@ -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/*"]
|
memobot-1.0.0/setup.cfg
ADDED
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
|
+
)
|