cloudscope 0.1.0__tar.gz → 0.2.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 (56) hide show
  1. {cloudscope-0.1.0 → cloudscope-0.2.0}/PKG-INFO +1 -1
  2. cloudscope-0.2.0/README.md +217 -0
  3. {cloudscope-0.1.0 → cloudscope-0.2.0}/pyproject.toml +1 -1
  4. {cloudscope-0.1.0 → cloudscope-0.2.0}/.github/workflows/python-publish.yml +0 -0
  5. {cloudscope-0.1.0 → cloudscope-0.2.0}/.gitignore +0 -0
  6. {cloudscope-0.1.0 → cloudscope-0.2.0}/package-lock.json +0 -0
  7. {cloudscope-0.1.0 → cloudscope-0.2.0}/package.json +0 -0
  8. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/__init__.py +0 -0
  9. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/__main__.py +0 -0
  10. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/app.py +0 -0
  11. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/auth/__init__.py +0 -0
  12. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/auth/aws.py +0 -0
  13. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/auth/drive_oauth.py +0 -0
  14. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/auth/gcp.py +0 -0
  15. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/backends/__init__.py +0 -0
  16. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/backends/base.py +0 -0
  17. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/backends/drive.py +0 -0
  18. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/backends/gcs.py +0 -0
  19. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/backends/registry.py +0 -0
  20. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/backends/s3.py +0 -0
  21. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/config.py +0 -0
  22. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/models/__init__.py +0 -0
  23. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/models/cloud_file.py +0 -0
  24. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/models/sync_state.py +0 -0
  25. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/models/transfer.py +0 -0
  26. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/sync/__init__.py +0 -0
  27. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/sync/differ.py +0 -0
  28. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/sync/engine.py +0 -0
  29. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/sync/plan.py +0 -0
  30. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/sync/resolver.py +0 -0
  31. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/sync/state.py +0 -0
  32. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/transfer/__init__.py +0 -0
  33. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/transfer/manager.py +0 -0
  34. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/transfer/progress.py +0 -0
  35. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/__init__.py +0 -0
  36. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/commands.py +0 -0
  37. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/modals/__init__.py +0 -0
  38. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/modals/confirm_dialog.py +0 -0
  39. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/modals/download_dialog.py +0 -0
  40. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/modals/new_folder.py +0 -0
  41. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/modals/sync_dialog.py +0 -0
  42. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/modals/upload_dialog.py +0 -0
  43. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/screens/__init__.py +0 -0
  44. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/screens/auth_setup.py +0 -0
  45. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/screens/browse.py +0 -0
  46. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/screens/settings.py +0 -0
  47. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/screens/sync_config.py +0 -0
  48. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/styles/cloudscope.tcss +0 -0
  49. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/widgets/__init__.py +0 -0
  50. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/widgets/app_footer.py +0 -0
  51. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/widgets/breadcrumb.py +0 -0
  52. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/widgets/cloud_tree.py +0 -0
  53. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/widgets/file_table.py +0 -0
  54. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/widgets/preview_panel.py +0 -0
  55. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/widgets/status_bar.py +0 -0
  56. {cloudscope-0.1.0 → cloudscope-0.2.0}/src/cloudscope/tui/widgets/transfer_panel.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudscope
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: TUI for browsing and syncing files across S3, GCS, and Google Drive
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: aiofiles>=23.0.0
@@ -0,0 +1,217 @@
1
+ # CloudScope
2
+
3
+ A terminal UI for browsing, downloading, uploading, and bi-directionally syncing files across **AWS S3**, **Google Cloud Storage**, and **Google Drive**.
4
+
5
+ Built with [Textual](https://textual.textualize.io/) for a keyboard-driven, Linear.app-inspired dark interface.
6
+
7
+ ## Features
8
+
9
+ - **Multi-backend browsing** — Switch between S3, GCS, and Google Drive with a single keypress (`1`, `2`, `3`)
10
+ - **Lazy-loading tree sidebar** — Expand buckets/drives on demand without loading everything upfront
11
+ - **Sortable file table** — Click column headers to sort by name, size, modified date, or type
12
+ - **File preview** — Metadata panel appears when a file is highlighted (size, modified date, ETag, content type)
13
+ - **Downloads and uploads** — File picker dialogs for selecting local paths
14
+ - **Folder creation** — Create new folders/prefixes directly from the TUI
15
+ - **Bi-directional sync** — Three-way diff engine with conflict resolution (newer wins, local wins, remote wins, keep both, or ask)
16
+ - **Command palette** — Press `Ctrl+K` to search and run any command
17
+ - **Settings screen** — Configure default backend, AWS profile/region, GCP project, Drive OAuth credentials
18
+ - **Auth setup** — Guided authentication testing for each backend
19
+
20
+ ## Requirements
21
+
22
+ - Python 3.11+
23
+ - AWS credentials (for S3) — environment variables, `~/.aws/credentials`, or IAM role
24
+ - GCP credentials (for GCS) — Application Default Credentials (`gcloud auth application-default login`)
25
+ - OAuth2 client secrets (for Google Drive) — `client_secrets.json` placed in config directory
26
+
27
+ ## Installation
28
+
29
+ ### From source
30
+
31
+ ```bash
32
+ git clone https://github.com/your-username/cloudscope.git
33
+ cd cloudscope
34
+ pip install -e .
35
+ ```
36
+
37
+ ### With dev dependencies
38
+
39
+ ```bash
40
+ pip install -e ".[dev]"
41
+ ```
42
+
43
+ ### Run
44
+
45
+ ```bash
46
+ cloudscope
47
+ ```
48
+
49
+ Or via module:
50
+
51
+ ```bash
52
+ python -m cloudscope
53
+ ```
54
+
55
+ ## Authentication Setup
56
+
57
+ ### AWS S3
58
+
59
+ CloudScope uses standard boto3 credential resolution. Any of the following will work:
60
+
61
+ - Environment variables (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`)
62
+ - Shared credentials file (`~/.aws/credentials`)
63
+ - AWS config file (`~/.aws/config`) with named profiles
64
+ - IAM instance role (on EC2)
65
+
66
+ Configure a specific profile in Settings (`,`) or pass it through the config file at `~/.config/cloudscope/config.toml`.
67
+
68
+ ### Google Cloud Storage
69
+
70
+ Uses [Application Default Credentials](https://cloud.google.com/docs/authentication/application-default-credentials):
71
+
72
+ ```bash
73
+ gcloud auth application-default login
74
+ ```
75
+
76
+ Or point to a service account key in Settings.
77
+
78
+ ### Google Drive
79
+
80
+ Requires OAuth2 consent flow:
81
+
82
+ 1. Create OAuth credentials in the [Google Cloud Console](https://console.cloud.google.com/apis/credentials)
83
+ 2. Download the client secrets JSON
84
+ 3. Place it at `~/.config/cloudscope/drive_client_secrets.json` (or configure the path in Settings)
85
+ 4. Press `a` in CloudScope to run the auth flow — a browser window will open for consent
86
+
87
+ The token is persisted at `~/.config/cloudscope/drive_token.json` and refreshed automatically.
88
+
89
+ ## Keyboard Shortcuts
90
+
91
+ ### Browsing
92
+
93
+ | Key | Action |
94
+ |---|---|
95
+ | `1` | Switch to S3 |
96
+ | `2` | Switch to GCS |
97
+ | `3` | Switch to Google Drive |
98
+ | `d` | Download selected file |
99
+ | `u` | Upload a file |
100
+ | `n` | Create new folder |
101
+ | `Delete` | Delete selected file |
102
+ | `r` | Refresh current view |
103
+ | `Tab` | Focus next panel |
104
+ | `Shift+Tab` | Focus previous panel |
105
+ | `Ctrl+K` | Open command palette |
106
+ | `s` | Open sync configuration |
107
+ | `,` | Open settings |
108
+ | `a` | Open auth setup |
109
+ | `?` | Show help |
110
+ | `q` | Quit |
111
+
112
+ ### In file table
113
+
114
+ | Key | Action |
115
+ |---|---|
116
+ | `Up`/`Down` | Navigate files |
117
+ | `Enter` | Open folder or select file |
118
+ | Click column header | Sort by that column |
119
+
120
+ ## Configuration
121
+
122
+ Settings are stored at `~/.config/cloudscope/config.toml`:
123
+
124
+ ```toml
125
+ default_backend = "s3"
126
+ max_concurrent_transfers = 3
127
+
128
+ [backends.s3]
129
+ profile = "default"
130
+ region = "us-east-1"
131
+
132
+ [backends.gcs]
133
+ project = "my-project-id"
134
+
135
+ [backends.drive]
136
+ client_secrets_path = "/path/to/client_secrets.json"
137
+ ```
138
+
139
+ All settings can also be edited from the TUI via the Settings screen (`,`).
140
+
141
+ ## Project Structure
142
+
143
+ ```
144
+ src/cloudscope/
145
+ ├── app.py # Main Textual application
146
+ ├── config.py # TOML config management
147
+ ├── __main__.py # CLI entry point
148
+ ├── auth/
149
+ │ ├── aws.py # AWS profile listing and client creation
150
+ │ ├── gcp.py # GCS client creation (ADC or service account)
151
+ │ └── drive_oauth.py # Google Drive OAuth2 flow
152
+ ├── backends/
153
+ │ ├── base.py # CloudBackend Protocol and error hierarchy
154
+ │ ├── registry.py # Backend factory (register/get/list)
155
+ │ ├── s3.py # AWS S3 backend (boto3)
156
+ │ ├── gcs.py # Google Cloud Storage backend
157
+ │ └── drive.py # Google Drive backend (path-to-ID cache, export)
158
+ ├── models/
159
+ │ ├── cloud_file.py # CloudFile, CloudFileType, CloudLocation
160
+ │ ├── transfer.py # TransferJob, TransferDirection, TransferStatus
161
+ │ └── sync_state.py # SyncRecord, SyncConflict, SyncPlan, etc.
162
+ ├── sync/
163
+ │ ├── state.py # SQLite-backed sync state persistence
164
+ │ ├── differ.py # Three-way diff algorithm
165
+ │ ├── resolver.py # Conflict resolution strategies
166
+ │ ├── plan.py # Converts SyncDiff to executable SyncPlan
167
+ │ └── engine.py # Sync orchestrator (diff → plan → execute)
168
+ ├── transfer/
169
+ │ ├── manager.py # Concurrent transfer queue (asyncio.Semaphore)
170
+ │ └── progress.py # Progress adapter for SDK callbacks
171
+ └── tui/
172
+ ├── commands.py # Command palette provider (Ctrl+K)
173
+ ├── screens/
174
+ │ ├── browse.py # Main browsing screen
175
+ │ ├── settings.py # Settings form
176
+ │ ├── sync_config.py # Sync configuration and execution
177
+ │ └── auth_setup.py # Guided auth testing
178
+ ├── modals/
179
+ │ ├── confirm_dialog.py
180
+ │ ├── download_dialog.py
181
+ │ ├── upload_dialog.py
182
+ │ ├── new_folder.py
183
+ │ └── sync_dialog.py # Sync conflict resolution
184
+ ├── widgets/
185
+ │ ├── status_bar.py # AppHeader (slim 1-line header)
186
+ │ ├── app_footer.py # Context-sensitive keybind hints
187
+ │ ├── cloud_tree.py # Lazy-loading tree sidebar
188
+ │ ├── file_table.py # Sortable file listing (DataTable)
189
+ │ ├── breadcrumb.py # Path breadcrumb with › separators
190
+ │ ├── preview_panel.py # File metadata display
191
+ │ └── transfer_panel.py# Transfer progress bar
192
+ └── styles/
193
+ └── cloudscope.tcss # Linear-inspired dark theme
194
+ ```
195
+
196
+ ## Development
197
+
198
+ ```bash
199
+ # Install with dev dependencies
200
+ pip install -e ".[dev]"
201
+
202
+ # Lint
203
+ ruff check src/
204
+
205
+ # Type check
206
+ mypy src/cloudscope/
207
+
208
+ # Test
209
+ pytest
210
+
211
+ # Run with Textual dev tools (live CSS reloading, etc.)
212
+ textual run --dev cloudscope.app:CloudScopeApp
213
+ ```
214
+
215
+ ## License
216
+
217
+ MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "cloudscope"
7
- version = "0.1.0"
7
+ version = "0.2.0"
8
8
  description = "TUI for browsing and syncing files across S3, GCS, and Google Drive"
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
File without changes
File without changes
File without changes