green2blue 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.
- green2blue-0.1.0/LICENSE +21 -0
- green2blue-0.1.0/PKG-INFO +153 -0
- green2blue-0.1.0/README.md +119 -0
- green2blue-0.1.0/pyproject.toml +67 -0
- green2blue-0.1.0/setup.cfg +4 -0
- green2blue-0.1.0/src/green2blue/__init__.py +3 -0
- green2blue-0.1.0/src/green2blue/__main__.py +7 -0
- green2blue-0.1.0/src/green2blue/archive/__init__.py +54 -0
- green2blue-0.1.0/src/green2blue/archive/android_import.py +321 -0
- green2blue-0.1.0/src/green2blue/archive/db.py +790 -0
- green2blue-0.1.0/src/green2blue/archive/export_android.py +366 -0
- green2blue-0.1.0/src/green2blue/archive/ios_import.py +521 -0
- green2blue-0.1.0/src/green2blue/archive/merge.py +424 -0
- green2blue-0.1.0/src/green2blue/archive/render_verify.py +650 -0
- green2blue-0.1.0/src/green2blue/archive/report.py +269 -0
- green2blue-0.1.0/src/green2blue/archive/stage.py +243 -0
- green2blue-0.1.0/src/green2blue/archive/verify.py +257 -0
- green2blue-0.1.0/src/green2blue/archive/workflow.py +569 -0
- green2blue-0.1.0/src/green2blue/cli.py +2760 -0
- green2blue-0.1.0/src/green2blue/converter/__init__.py +0 -0
- green2blue-0.1.0/src/green2blue/converter/message_converter.py +416 -0
- green2blue-0.1.0/src/green2blue/converter/phone.py +174 -0
- green2blue-0.1.0/src/green2blue/converter/timestamp.py +55 -0
- green2blue-0.1.0/src/green2blue/corpus.py +355 -0
- green2blue-0.1.0/src/green2blue/exceptions.py +179 -0
- green2blue-0.1.0/src/green2blue/ios/__init__.py +0 -0
- green2blue-0.1.0/src/green2blue/ios/attachment.py +138 -0
- green2blue-0.1.0/src/green2blue/ios/attributed_body.py +330 -0
- green2blue-0.1.0/src/green2blue/ios/backup.py +271 -0
- green2blue-0.1.0/src/green2blue/ios/crypto.py +648 -0
- green2blue-0.1.0/src/green2blue/ios/device.py +860 -0
- green2blue-0.1.0/src/green2blue/ios/manifest.py +327 -0
- green2blue-0.1.0/src/green2blue/ios/mbdb.py +368 -0
- green2blue-0.1.0/src/green2blue/ios/message_summary.py +98 -0
- green2blue-0.1.0/src/green2blue/ios/plist_utils.py +441 -0
- green2blue-0.1.0/src/green2blue/ios/prepare_sync.py +229 -0
- green2blue-0.1.0/src/green2blue/ios/sms_db.py +1678 -0
- green2blue-0.1.0/src/green2blue/ios/trigger_utils.py +68 -0
- green2blue-0.1.0/src/green2blue/models.py +258 -0
- green2blue-0.1.0/src/green2blue/parser/__init__.py +0 -0
- green2blue-0.1.0/src/green2blue/parser/ndjson_parser.py +282 -0
- green2blue-0.1.0/src/green2blue/parser/zip_reader.py +87 -0
- green2blue-0.1.0/src/green2blue/pipeline.py +921 -0
- green2blue-0.1.0/src/green2blue/review.py +844 -0
- green2blue-0.1.0/src/green2blue/testing/__init__.py +1 -0
- green2blue-0.1.0/src/green2blue/testing/android_fixture.py +474 -0
- green2blue-0.1.0/src/green2blue/testing/assets/README.md +10 -0
- green2blue-0.1.0/src/green2blue/testing/assets/fixture_attachment_only.jpg +0 -0
- green2blue-0.1.0/src/green2blue/testing/assets/fixture_caption.jpg +0 -0
- green2blue-0.1.0/src/green2blue/testing/assets/fixture_clip.mp4 +0 -0
- green2blue-0.1.0/src/green2blue/testing/assets/fixture_group.png +0 -0
- green2blue-0.1.0/src/green2blue/testing/assets/fixture_rcs.jpg +0 -0
- green2blue-0.1.0/src/green2blue/testing/assets/fixture_receipt.jpg +0 -0
- green2blue-0.1.0/src/green2blue/verify.py +303 -0
- green2blue-0.1.0/src/green2blue/wizard.py +898 -0
- green2blue-0.1.0/src/green2blue.egg-info/PKG-INFO +153 -0
- green2blue-0.1.0/src/green2blue.egg-info/SOURCES.txt +84 -0
- green2blue-0.1.0/src/green2blue.egg-info/dependency_links.txt +1 -0
- green2blue-0.1.0/src/green2blue.egg-info/entry_points.txt +2 -0
- green2blue-0.1.0/src/green2blue.egg-info/requires.txt +11 -0
- green2blue-0.1.0/src/green2blue.egg-info/top_level.txt +1 -0
- green2blue-0.1.0/tests/test_android_fixture.py +166 -0
- green2blue-0.1.0/tests/test_archive.py +894 -0
- green2blue-0.1.0/tests/test_attachment.py +165 -0
- green2blue-0.1.0/tests/test_attributed_body.py +687 -0
- green2blue-0.1.0/tests/test_backup.py +271 -0
- green2blue-0.1.0/tests/test_cli.py +1208 -0
- green2blue-0.1.0/tests/test_clone.py +1004 -0
- green2blue-0.1.0/tests/test_corpus.py +53 -0
- green2blue-0.1.0/tests/test_crypto.py +488 -0
- green2blue-0.1.0/tests/test_device.py +744 -0
- green2blue-0.1.0/tests/test_manifest.py +585 -0
- green2blue-0.1.0/tests/test_mbdb.py +390 -0
- green2blue-0.1.0/tests/test_message_converter.py +480 -0
- green2blue-0.1.0/tests/test_message_summary.py +254 -0
- green2blue-0.1.0/tests/test_ndjson_parser.py +276 -0
- green2blue-0.1.0/tests/test_overwrite.py +790 -0
- green2blue-0.1.0/tests/test_phone.py +130 -0
- green2blue-0.1.0/tests/test_pipeline.py +1107 -0
- green2blue-0.1.0/tests/test_prepare_sync.py +440 -0
- green2blue-0.1.0/tests/test_review.py +54 -0
- green2blue-0.1.0/tests/test_sms_db.py +1479 -0
- green2blue-0.1.0/tests/test_timestamp.py +63 -0
- green2blue-0.1.0/tests/test_verify.py +264 -0
- green2blue-0.1.0/tests/test_wizard.py +654 -0
- green2blue-0.1.0/tests/test_zip_reader.py +58 -0
green2blue-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Robert Cordwell
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: green2blue
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Transfer SMS/MMS/RCS messages from Android to iPhone
|
|
5
|
+
Author: green2blue contributors
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/discordwell/green2blue
|
|
8
|
+
Project-URL: Repository, https://github.com/discordwell/green2blue
|
|
9
|
+
Project-URL: Issues, https://github.com/discordwell/green2blue/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/discordwell/green2blue/releases
|
|
11
|
+
Keywords: sms,mms,android,iphone,backup,migration
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Communications :: Chat
|
|
20
|
+
Classifier: Topic :: System :: Archiving
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: cryptography>=41.0
|
|
25
|
+
Provides-Extra: device
|
|
26
|
+
Requires-Dist: pymobiledevice3>=4.0; extra == "device"
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
31
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
32
|
+
Requires-Dist: twine>=5.0; extra == "dev"
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# green2blue
|
|
36
|
+
|
|
37
|
+
Move your texts from Android to iPhone. SMS, MMS, RCS, group chats, photos, videos — all of it.
|
|
38
|
+
|
|
39
|
+
green2blue takes an export from the free [SMS Import/Export](https://github.com/tmo1/sms-ie) app and injects it into an iPhone backup. Restore the backup, and your messages show up in Messages like they were always there.
|
|
40
|
+
|
|
41
|
+
## Quickstart
|
|
42
|
+
|
|
43
|
+
### 1. Export from Android
|
|
44
|
+
|
|
45
|
+
Install [SMS Import/Export](https://github.com/tmo1/sms-ie) on your Android phone. Export all messages as **NDJSON** with attachments. You'll get a ZIP file.
|
|
46
|
+
|
|
47
|
+
### 2. Get the ZIP to your computer
|
|
48
|
+
|
|
49
|
+
Email it, AirDrop it, USB it, cloud it — whatever works.
|
|
50
|
+
|
|
51
|
+
### 3. Make an encrypted iPhone backup
|
|
52
|
+
|
|
53
|
+
Connect your iPhone. Open **Finder** (macOS) or **iTunes** (Windows). Turn on **"Encrypt local backup"**, then click **"Back Up Now"**.
|
|
54
|
+
|
|
55
|
+
> Encrypted backups are required — iOS won't restore messages from unencrypted ones.
|
|
56
|
+
|
|
57
|
+
### 4. Install green2blue
|
|
58
|
+
|
|
59
|
+
**Easiest — download a binary** from the [latest release](https://github.com/discordwell/green2blue/releases/latest). No Python needed.
|
|
60
|
+
|
|
61
|
+
Or install with pip:
|
|
62
|
+
```bash
|
|
63
|
+
pip install green2blue
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 5. Run it
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
green2blue
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
The wizard walks you through everything. Or go direct:
|
|
73
|
+
```bash
|
|
74
|
+
green2blue inject export.zip
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 6. Restore the backup
|
|
78
|
+
|
|
79
|
+
Back in Finder/iTunes, click **"Restore Backup"** and pick your backup. Done.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Features
|
|
84
|
+
|
|
85
|
+
**Review before import** — Let the Android owner browse and filter their export in-browser before you touch anything. Deselect conversations, search by contact or content, download a trimmed ZIP.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
green2blue review export.zip
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Privacy-safe corpus** — Generate a representative sample ZIP with redacted text, anonymized contacts, and placeholder media. Safe to share for testing or bug reports.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
green2blue corpus capture export.zip sample.zip
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Canonical archive** — Merge Android and iPhone message histories into a single SQLite archive. Deduplicates across sources, content-addresses attachments, and can re-export to either platform.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
green2blue archive import-android export.zip archive.sqlite
|
|
101
|
+
green2blue archive import-ios ~/path/to/backup archive.sqlite
|
|
102
|
+
green2blue archive merge archive.sqlite
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**iCloud sync protection** — iCloud Messages can wipe injected messages on sign-in. The `--disable-icloud-sync` flag prevents that.
|
|
106
|
+
|
|
107
|
+
**Dry run** — See exactly what would be injected without modifying anything:
|
|
108
|
+
```bash
|
|
109
|
+
green2blue inject export.zip --dry-run
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Troubleshooting
|
|
113
|
+
|
|
114
|
+
**"macOS can't verify this app"** — Right-click the file, click Open, then Open again. Or: `xattr -d com.apple.quarantine green2blue-macos-*`
|
|
115
|
+
|
|
116
|
+
**"Windows Defender SmartScreen"** — Click "More info", then "Run anyway".
|
|
117
|
+
|
|
118
|
+
**"No iPhone backups found"** — Create a backup first. Finder on macOS, iTunes on Windows.
|
|
119
|
+
|
|
120
|
+
**"Wrong password"** — This is your *local backup password* from Finder/iTunes, not your Apple ID.
|
|
121
|
+
|
|
122
|
+
**Messages disappear after restore** — iCloud Messages is wiping them. Re-run with `--disable-icloud-sync`, or don't sign into iCloud Messages right after restore.
|
|
123
|
+
|
|
124
|
+
**Non-US phone numbers** — Use `--country GB` (or whatever). The wizard auto-detects this.
|
|
125
|
+
|
|
126
|
+
## CLI Reference
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
green2blue Interactive wizard
|
|
130
|
+
green2blue inject <zip> Inject messages into a backup
|
|
131
|
+
green2blue review <zip> Browse/filter export in browser
|
|
132
|
+
green2blue corpus capture Privacy-safe sample generation
|
|
133
|
+
green2blue archive <cmd> Canonical archive operations
|
|
134
|
+
green2blue list-backups Show available iPhone backups
|
|
135
|
+
green2blue inspect <zip> Preview export contents
|
|
136
|
+
green2blue verify <path> Check backup integrity
|
|
137
|
+
green2blue diagnose <path> Show CloudKit sync state
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Full CLI docs: [docs/CLI.md](docs/CLI.md)
|
|
141
|
+
|
|
142
|
+
## Development
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
git clone https://github.com/discordwell/green2blue.git
|
|
146
|
+
cd green2blue
|
|
147
|
+
pip install -e ".[dev]"
|
|
148
|
+
pytest
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## License
|
|
152
|
+
|
|
153
|
+
MIT
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# green2blue
|
|
2
|
+
|
|
3
|
+
Move your texts from Android to iPhone. SMS, MMS, RCS, group chats, photos, videos — all of it.
|
|
4
|
+
|
|
5
|
+
green2blue takes an export from the free [SMS Import/Export](https://github.com/tmo1/sms-ie) app and injects it into an iPhone backup. Restore the backup, and your messages show up in Messages like they were always there.
|
|
6
|
+
|
|
7
|
+
## Quickstart
|
|
8
|
+
|
|
9
|
+
### 1. Export from Android
|
|
10
|
+
|
|
11
|
+
Install [SMS Import/Export](https://github.com/tmo1/sms-ie) on your Android phone. Export all messages as **NDJSON** with attachments. You'll get a ZIP file.
|
|
12
|
+
|
|
13
|
+
### 2. Get the ZIP to your computer
|
|
14
|
+
|
|
15
|
+
Email it, AirDrop it, USB it, cloud it — whatever works.
|
|
16
|
+
|
|
17
|
+
### 3. Make an encrypted iPhone backup
|
|
18
|
+
|
|
19
|
+
Connect your iPhone. Open **Finder** (macOS) or **iTunes** (Windows). Turn on **"Encrypt local backup"**, then click **"Back Up Now"**.
|
|
20
|
+
|
|
21
|
+
> Encrypted backups are required — iOS won't restore messages from unencrypted ones.
|
|
22
|
+
|
|
23
|
+
### 4. Install green2blue
|
|
24
|
+
|
|
25
|
+
**Easiest — download a binary** from the [latest release](https://github.com/discordwell/green2blue/releases/latest). No Python needed.
|
|
26
|
+
|
|
27
|
+
Or install with pip:
|
|
28
|
+
```bash
|
|
29
|
+
pip install green2blue
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 5. Run it
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
green2blue
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The wizard walks you through everything. Or go direct:
|
|
39
|
+
```bash
|
|
40
|
+
green2blue inject export.zip
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 6. Restore the backup
|
|
44
|
+
|
|
45
|
+
Back in Finder/iTunes, click **"Restore Backup"** and pick your backup. Done.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Features
|
|
50
|
+
|
|
51
|
+
**Review before import** — Let the Android owner browse and filter their export in-browser before you touch anything. Deselect conversations, search by contact or content, download a trimmed ZIP.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
green2blue review export.zip
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Privacy-safe corpus** — Generate a representative sample ZIP with redacted text, anonymized contacts, and placeholder media. Safe to share for testing or bug reports.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
green2blue corpus capture export.zip sample.zip
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Canonical archive** — Merge Android and iPhone message histories into a single SQLite archive. Deduplicates across sources, content-addresses attachments, and can re-export to either platform.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
green2blue archive import-android export.zip archive.sqlite
|
|
67
|
+
green2blue archive import-ios ~/path/to/backup archive.sqlite
|
|
68
|
+
green2blue archive merge archive.sqlite
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**iCloud sync protection** — iCloud Messages can wipe injected messages on sign-in. The `--disable-icloud-sync` flag prevents that.
|
|
72
|
+
|
|
73
|
+
**Dry run** — See exactly what would be injected without modifying anything:
|
|
74
|
+
```bash
|
|
75
|
+
green2blue inject export.zip --dry-run
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Troubleshooting
|
|
79
|
+
|
|
80
|
+
**"macOS can't verify this app"** — Right-click the file, click Open, then Open again. Or: `xattr -d com.apple.quarantine green2blue-macos-*`
|
|
81
|
+
|
|
82
|
+
**"Windows Defender SmartScreen"** — Click "More info", then "Run anyway".
|
|
83
|
+
|
|
84
|
+
**"No iPhone backups found"** — Create a backup first. Finder on macOS, iTunes on Windows.
|
|
85
|
+
|
|
86
|
+
**"Wrong password"** — This is your *local backup password* from Finder/iTunes, not your Apple ID.
|
|
87
|
+
|
|
88
|
+
**Messages disappear after restore** — iCloud Messages is wiping them. Re-run with `--disable-icloud-sync`, or don't sign into iCloud Messages right after restore.
|
|
89
|
+
|
|
90
|
+
**Non-US phone numbers** — Use `--country GB` (or whatever). The wizard auto-detects this.
|
|
91
|
+
|
|
92
|
+
## CLI Reference
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
green2blue Interactive wizard
|
|
96
|
+
green2blue inject <zip> Inject messages into a backup
|
|
97
|
+
green2blue review <zip> Browse/filter export in browser
|
|
98
|
+
green2blue corpus capture Privacy-safe sample generation
|
|
99
|
+
green2blue archive <cmd> Canonical archive operations
|
|
100
|
+
green2blue list-backups Show available iPhone backups
|
|
101
|
+
green2blue inspect <zip> Preview export contents
|
|
102
|
+
green2blue verify <path> Check backup integrity
|
|
103
|
+
green2blue diagnose <path> Show CloudKit sync state
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Full CLI docs: [docs/CLI.md](docs/CLI.md)
|
|
107
|
+
|
|
108
|
+
## Development
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
git clone https://github.com/discordwell/green2blue.git
|
|
112
|
+
cd green2blue
|
|
113
|
+
pip install -e ".[dev]"
|
|
114
|
+
pytest
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## License
|
|
118
|
+
|
|
119
|
+
MIT
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "green2blue"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Transfer SMS/MMS/RCS messages from Android to iPhone"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.10"
|
|
13
|
+
keywords = ["sms", "mms", "android", "iphone", "backup", "migration"]
|
|
14
|
+
dependencies = [
|
|
15
|
+
"cryptography>=41.0",
|
|
16
|
+
]
|
|
17
|
+
authors = [
|
|
18
|
+
{ name = "green2blue contributors" },
|
|
19
|
+
]
|
|
20
|
+
classifiers = [
|
|
21
|
+
"Development Status :: 3 - Alpha",
|
|
22
|
+
"Intended Audience :: End Users/Desktop",
|
|
23
|
+
"Programming Language :: Python :: 3",
|
|
24
|
+
"Programming Language :: Python :: 3.10",
|
|
25
|
+
"Programming Language :: Python :: 3.11",
|
|
26
|
+
"Programming Language :: Python :: 3.12",
|
|
27
|
+
"Programming Language :: Python :: 3.13",
|
|
28
|
+
"Topic :: Communications :: Chat",
|
|
29
|
+
"Topic :: System :: Archiving",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://github.com/discordwell/green2blue"
|
|
34
|
+
Repository = "https://github.com/discordwell/green2blue"
|
|
35
|
+
Issues = "https://github.com/discordwell/green2blue/issues"
|
|
36
|
+
Changelog = "https://github.com/discordwell/green2blue/releases"
|
|
37
|
+
|
|
38
|
+
[project.optional-dependencies]
|
|
39
|
+
device = ["pymobiledevice3>=4.0"]
|
|
40
|
+
dev = [
|
|
41
|
+
"build>=1.2",
|
|
42
|
+
"pytest>=7.0",
|
|
43
|
+
"pytest-cov>=4.0",
|
|
44
|
+
"ruff>=0.4",
|
|
45
|
+
"twine>=5.0",
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
[project.scripts]
|
|
49
|
+
green2blue = "green2blue.cli:main"
|
|
50
|
+
|
|
51
|
+
[tool.setuptools.packages.find]
|
|
52
|
+
where = ["src"]
|
|
53
|
+
|
|
54
|
+
[tool.setuptools.package-data]
|
|
55
|
+
"green2blue.testing" = ["assets/*"]
|
|
56
|
+
|
|
57
|
+
[tool.pytest.ini_options]
|
|
58
|
+
testpaths = ["tests"]
|
|
59
|
+
addopts = "-v --tb=short"
|
|
60
|
+
|
|
61
|
+
[tool.ruff]
|
|
62
|
+
target-version = "py310"
|
|
63
|
+
line-length = 100
|
|
64
|
+
|
|
65
|
+
[tool.ruff.lint]
|
|
66
|
+
select = ["E", "F", "W", "I", "N", "UP", "B", "SIM"]
|
|
67
|
+
ignore = ["N801"] # Allow iOS-prefixed class names (iOSHandle, iOSMessage, etc.)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Canonical green2blue archive support.
|
|
2
|
+
|
|
3
|
+
The canonical archive is the target-neutral storage format used for future
|
|
4
|
+
merge and re-render workflows. The first implementation slice supports
|
|
5
|
+
importing Android exports and iPhone backups into a SQLite-backed archive.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .android_import import AndroidArchiveImportResult, import_android_export
|
|
9
|
+
from .db import ArchiveSummary, CanonicalArchive
|
|
10
|
+
from .export_android import AndroidArchiveExportResult, export_merged_android_zip
|
|
11
|
+
from .ios_import import IOSArchiveImportResult, import_ios_backup
|
|
12
|
+
from .merge import ArchiveMergeResult, merge_archive
|
|
13
|
+
from .render_verify import (
|
|
14
|
+
IOSRenderedTargetVerificationResult,
|
|
15
|
+
verify_ios_render_target,
|
|
16
|
+
)
|
|
17
|
+
from .report import ArchiveReport, build_archive_report
|
|
18
|
+
from .stage import IOSStageResult, stage_ios_export
|
|
19
|
+
from .verify import ArchiveVerificationResult, verify_archive
|
|
20
|
+
from .workflow import (
|
|
21
|
+
IOSWorkflowInjectionResult,
|
|
22
|
+
IOSWorkflowPreparationResult,
|
|
23
|
+
IOSWorkflowStatus,
|
|
24
|
+
load_ios_workflow_status,
|
|
25
|
+
prepare_ios_workflow,
|
|
26
|
+
run_ios_workflow_injection,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"AndroidArchiveExportResult",
|
|
31
|
+
"AndroidArchiveImportResult",
|
|
32
|
+
"ArchiveMergeResult",
|
|
33
|
+
"ArchiveReport",
|
|
34
|
+
"ArchiveSummary",
|
|
35
|
+
"ArchiveVerificationResult",
|
|
36
|
+
"CanonicalArchive",
|
|
37
|
+
"IOSStageResult",
|
|
38
|
+
"IOSArchiveImportResult",
|
|
39
|
+
"IOSRenderedTargetVerificationResult",
|
|
40
|
+
"IOSWorkflowInjectionResult",
|
|
41
|
+
"IOSWorkflowPreparationResult",
|
|
42
|
+
"IOSWorkflowStatus",
|
|
43
|
+
"build_archive_report",
|
|
44
|
+
"export_merged_android_zip",
|
|
45
|
+
"import_android_export",
|
|
46
|
+
"import_ios_backup",
|
|
47
|
+
"load_ios_workflow_status",
|
|
48
|
+
"merge_archive",
|
|
49
|
+
"prepare_ios_workflow",
|
|
50
|
+
"run_ios_workflow_injection",
|
|
51
|
+
"stage_ios_export",
|
|
52
|
+
"verify_ios_render_target",
|
|
53
|
+
"verify_archive",
|
|
54
|
+
]
|