flashforge-python-api 1.0.2__py3-none-any.whl → 1.1.0__py3-none-any.whl
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.
- flashforge/__init__.py +62 -29
- flashforge/api/__init__.py +1 -0
- flashforge/api/constants/__init__.py +1 -0
- flashforge/api/constants/commands.py +1 -0
- flashforge/api/constants/endpoints.py +1 -0
- flashforge/api/controls/__init__.py +1 -0
- flashforge/api/controls/control.py +64 -61
- flashforge/api/controls/files.py +28 -26
- flashforge/api/controls/info.py +84 -85
- flashforge/api/controls/job_control.py +120 -82
- flashforge/api/controls/temp_control.py +14 -11
- flashforge/api/misc/__init__.py +1 -1
- flashforge/api/network/__init__.py +2 -1
- flashforge/api/network/utils.py +7 -8
- flashforge/client.py +131 -63
- flashforge/discovery/__init__.py +30 -3
- flashforge/discovery/discovery.py +637 -308
- flashforge/models/__init__.py +11 -10
- flashforge/models/machine_info.py +220 -100
- flashforge/models/responses.py +103 -43
- flashforge/tcp/__init__.py +25 -17
- flashforge/tcp/a3_client.py +405 -0
- flashforge/tcp/ff_client.py +93 -90
- flashforge/tcp/gcode/__init__.py +4 -2
- flashforge/tcp/gcode/a3_gcode_controller.py +109 -0
- flashforge/tcp/gcode/gcode_controller.py +48 -36
- flashforge/tcp/gcode/gcodes.py +7 -1
- flashforge/tcp/parsers/__init__.py +11 -11
- flashforge/tcp/parsers/endstop_status.py +103 -132
- flashforge/tcp/parsers/location_info.py +26 -13
- flashforge/tcp/parsers/print_status.py +49 -56
- flashforge/tcp/parsers/printer_info.py +38 -48
- flashforge/tcp/parsers/temp_info.py +46 -47
- flashforge/tcp/parsers/thumbnail_info.py +65 -40
- flashforge/tcp/tcp_client.py +296 -293
- {flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/METADATA +35 -14
- flashforge_python_api-1.1.0.dist-info/RECORD +45 -0
- {flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/WHEEL +1 -1
- flashforge_python_api-1.0.2.dist-info/RECORD +0 -43
- {flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/entry_points.txt +0 -0
- {flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flashforge-python-api
|
|
3
|
-
Version: 1.0
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: A comprehensive Python library for controlling FlashForge 3D printers
|
|
5
5
|
Project-URL: Homepage, https://github.com/GhostTypes/ff-5mp-api-py
|
|
6
6
|
Project-URL: Documentation, https://github.com/GhostTypes/ff-5mp-api-py#readme
|
|
@@ -13,15 +13,13 @@ Keywords: 3d-printer,api,async,control,flashforge,python
|
|
|
13
13
|
Classifier: Development Status :: 5 - Production/Stable
|
|
14
14
|
Classifier: Intended Audience :: Developers
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
19
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
19
|
Classifier: Topic :: Scientific/Engineering
|
|
22
20
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
21
|
Classifier: Topic :: System :: Hardware :: Hardware Drivers
|
|
24
|
-
Requires-Python: >=3.
|
|
22
|
+
Requires-Python: >=3.11
|
|
25
23
|
Requires-Dist: aiohttp>=3.8.0
|
|
26
24
|
Requires-Dist: netifaces>=0.11.0
|
|
27
25
|
Requires-Dist: pydantic>=2.0.0
|
|
@@ -53,7 +51,7 @@ Description-Content-Type: text/markdown
|
|
|
53
51
|
|
|
54
52
|
**A comprehensive Python library for controlling FlashForge 3D printers**
|
|
55
53
|
|
|
56
|
-
    
|
|
57
55
|
|
|
58
56
|
    
|
|
59
57
|
|
|
@@ -77,7 +75,7 @@ Description-Content-Type: text/markdown
|
|
|
77
75
|
| **File Operations** | List, upload, and download files • Extract print thumbnails • File metadata retrieval |
|
|
78
76
|
| **Async Architecture** | Native async/await implementation • Non-blocking network operations • Concurrent operations support |
|
|
79
77
|
| **Type Safety** | Full type hints for IDE autocomplete • Pydantic models for data validation • mypy strict mode compatible |
|
|
80
|
-
| **Model Detection** | Automatic capability detection •
|
|
78
|
+
| **Model Detection** | Automatic capability detection • Runtime camera stream detection via `camera_stream_url` • Graceful degradation for older models |
|
|
81
79
|
|
|
82
80
|
</div>
|
|
83
81
|
|
|
@@ -85,15 +83,13 @@ Description-Content-Type: text/markdown
|
|
|
85
83
|
|
|
86
84
|
<div align="center">
|
|
87
85
|
|
|
88
|
-
##
|
|
86
|
+
## Printer Testing & Coverage
|
|
89
87
|
|
|
90
|
-
| Model | Support
|
|
88
|
+
| Printer Model | Support Status | Testing Status | API Type |
|
|
91
89
|
| --- | --- | --- | --- |
|
|
92
|
-
| **
|
|
93
|
-
| **
|
|
94
|
-
| **
|
|
95
|
-
| **FlashForge Adventurer 3 / 4** | Partial Support | TCP Only | Basic control, temperature, movement, status |
|
|
96
|
-
| **Other (Network-enabled)** | Experimental | TCP Only | Generic G-code commands, may vary by model |
|
|
90
|
+
| **AD5X** | Full | Tested | HTTP (New) + TCP |
|
|
91
|
+
| **Adventurer 5M/Pro** | Full | Tested | HTTP (New) + TCP |
|
|
92
|
+
| **Adventurer 3/4** | Partial | Partial | TCP (Legacy) |
|
|
97
93
|
|
|
98
94
|
</div>
|
|
99
95
|
|
|
@@ -207,6 +203,31 @@ async def monitor_printer():
|
|
|
207
203
|
asyncio.run(monitor_printer())
|
|
208
204
|
```
|
|
209
205
|
|
|
206
|
+
### Camera Stream Detection
|
|
207
|
+
|
|
208
|
+
Use the printer-reported runtime camera stream URL as the OEM camera source of truth:
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
from flashforge import FlashForgeClient
|
|
212
|
+
import asyncio
|
|
213
|
+
|
|
214
|
+
async def check_camera():
|
|
215
|
+
async with FlashForgeClient("192.168.1.100", "SERIAL", "CODE") as client:
|
|
216
|
+
if not await client.initialize():
|
|
217
|
+
return
|
|
218
|
+
|
|
219
|
+
if client.camera_stream_url:
|
|
220
|
+
print(f"OEM camera stream: {client.camera_stream_url}")
|
|
221
|
+
else:
|
|
222
|
+
print("Printer is not reporting an active OEM camera stream")
|
|
223
|
+
|
|
224
|
+
# Camera power control remains Pro-only.
|
|
225
|
+
if client.is_pro:
|
|
226
|
+
await client.control.turn_camera_on()
|
|
227
|
+
|
|
228
|
+
asyncio.run(check_camera())
|
|
229
|
+
```
|
|
230
|
+
|
|
210
231
|
### File Operations and Thumbnails
|
|
211
232
|
|
|
212
233
|
List files and extract G-code thumbnails:
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
flashforge/__init__.py,sha256=k67UUBpSPMCRlexqn43RRHIh8XyNb9Bq5yXOpwChsFo,5170
|
|
2
|
+
flashforge/client.py,sha256=XP_l5FsaUXKWjkRMWxbz7F1d7_8Xdh7oD5zpThtBFhM,15462
|
|
3
|
+
flashforge/api/__init__.py,sha256=vQz-DkG6LTH39bI4fyiUc0D9jQzemLh45pORLptSOlg,335
|
|
4
|
+
flashforge/api/constants/__init__.py,sha256=Q0HL2tqSBYPd4Oz49VHLS3qUvRuv__GCvTGecaLrQ-Y,163
|
|
5
|
+
flashforge/api/constants/commands.py,sha256=S9cBgU3pBXQm-dp3Bv4795NL059pmTY1NtxWzPA5gWU,329
|
|
6
|
+
flashforge/api/constants/endpoints.py,sha256=3CSCvilBJ1uAM_dZiY5NgbYl4rub1RsZZRpCBRZCqH4,271
|
|
7
|
+
flashforge/api/controls/__init__.py,sha256=53s-H25Pjwr0kvPk8MZ2Twy8VHGqGcO6Q6uBphhEOh4,293
|
|
8
|
+
flashforge/api/controls/control.py,sha256=hifFWRPs2fRvNaJMSLgDJ4ytkHrEMGqzgCazuAC6ewA,11787
|
|
9
|
+
flashforge/api/controls/files.py,sha256=fFjxOCVbK7q1P4GM9RcgB2tsJsywT_HiTBcL3-U0_Yo,7749
|
|
10
|
+
flashforge/api/controls/info.py,sha256=r_gi20ZlgpdtCJVqtoyncV714-MQcDjg4Qg4xeTWHNA,12969
|
|
11
|
+
flashforge/api/controls/job_control.py,sha256=uhuQE3weXJPvWBER0P7lvqWEzAVHXFNXWWBFfnZwtR8,23656
|
|
12
|
+
flashforge/api/controls/temp_control.py,sha256=TGkX63WHygVA9DeYfLARbktZ0o-bYX6MNyYOX6V_RB4,3034
|
|
13
|
+
flashforge/api/filament/__init__.py,sha256=isT2dl0hzUS0xMTXMm4Tip0GTG1gCsm8LKWa9xPu4Y8,104
|
|
14
|
+
flashforge/api/filament/filament.py,sha256=TtcC2G2nD9Sq4cOrCZzFLZ6Q0Ve-zfrfuEF9uQ8M3eE,1214
|
|
15
|
+
flashforge/api/misc/__init__.py,sha256=1AG7vOMRBZQtHp6QUzfr9alcJPeNv3JpU44NrznxDHs,211
|
|
16
|
+
flashforge/api/misc/scientific_notation.py,sha256=KSMTrrYhPWLv0gbcEAD6u-jEOcIwUjOCOPMBi0LiO-k,826
|
|
17
|
+
flashforge/api/misc/temperature.py,sha256=qeHlCdPzLyqGDEB874Ib5AgYHMR9Qtw61shnw4G095E,1066
|
|
18
|
+
flashforge/api/network/__init__.py,sha256=G5fBoAlq-NQPDkWp579mFIqsj0v7B1Lb2TAzO6IZA0Q,164
|
|
19
|
+
flashforge/api/network/fnet_code.py,sha256=BR2niVKKk4ZfXtizUDIMXzDhlCxPHzqWg5AQQIcoj3g,402
|
|
20
|
+
flashforge/api/network/utils.py,sha256=jwqyJaByr4q80_MJOTwS0nX8I8FZ54T_CHBwkKTXptA,1519
|
|
21
|
+
flashforge/discovery/__init__.py,sha256=G0WiP70EhfHdjXR1RNlv6xjhyHOdo-HWyOm9J0ds4SM,828
|
|
22
|
+
flashforge/discovery/discovery.py,sha256=qlyLxITY9JMKY_quONdWeZ5sbsF_pXfqRXqk7DwDGfs,26042
|
|
23
|
+
flashforge/models/__init__.py,sha256=MNpnXdS6Yah5kSwBB7cbA2Hd-8azffE62pgUrrKSZk4,984
|
|
24
|
+
flashforge/models/machine_info.py,sha256=tMec0qSq9iTVfUvLl72vL5jlDrBW2mn132dzL8842mA,14602
|
|
25
|
+
flashforge/models/responses.py,sha256=befMeXAc7XXiK7emF8Ep2cd1GuhZ-zyYPbbPqS2lcQI,7214
|
|
26
|
+
flashforge/tcp/__init__.py,sha256=g0xAZf0ZDKnH2g79tK5FeAATRo90GfDB7Lkws1LsZxU,1145
|
|
27
|
+
flashforge/tcp/a3_client.py,sha256=n7Kw0Dn9MYjjj0r2GPEiQFBKZfzuE9lboziuRt2bKgM,15411
|
|
28
|
+
flashforge/tcp/ff_client.py,sha256=CJXk0Qei2FVSpbXxZhiEQgAEcTJaBab1ouooqyC4OL4,20235
|
|
29
|
+
flashforge/tcp/tcp_client.py,sha256=KjymxUXiXgEp9y7mjr5tNO_Y2-bsGEyP-oG5en7rCCs,16996
|
|
30
|
+
flashforge/tcp/gcode/__init__.py,sha256=tFGlqCPFxVJNizXsIG4pMOK7IPFNnc_vIEMciULYkMY,271
|
|
31
|
+
flashforge/tcp/gcode/a3_gcode_controller.py,sha256=x84_xo_Ll5k6hMAwDWuNUo54znV-BBIfwnmeOiEa9Fs,3688
|
|
32
|
+
flashforge/tcp/gcode/gcode_controller.py,sha256=6K1VGgX59AcE_Kh_gm13dmxCY_kuzV_d2ooSpheONRI,10075
|
|
33
|
+
flashforge/tcp/gcode/gcodes.py,sha256=55Ii1JpJNJNmOnBivyF83vz3TZUPDtp01lX72NINfPQ,3658
|
|
34
|
+
flashforge/tcp/parsers/__init__.py,sha256=kDaJmiH0JcR5i693Fj3pwmINLWN0ipirN3LWGFvPst0,730
|
|
35
|
+
flashforge/tcp/parsers/endstop_status.py,sha256=4jTtodJiiAVeeU8Z5daFtETm8ExPGo5P1CQWZ9KYrfg,9815
|
|
36
|
+
flashforge/tcp/parsers/location_info.py,sha256=n1lUUmbk4kuuuBUbIA65dlPa4tsVGUJFlwnoeRW0yx8,2865
|
|
37
|
+
flashforge/tcp/parsers/print_status.py,sha256=4q9ZlJfO0c7_t1o15tgxbguMxpDjEW9pMyaFU6a0Nfk,6164
|
|
38
|
+
flashforge/tcp/parsers/printer_info.py,sha256=QY6LECfcOhVHSIdsvQZwJago0OjXroUwiX0H-uQaH2A,5411
|
|
39
|
+
flashforge/tcp/parsers/temp_info.py,sha256=9Waf68tt-4QBcChyUwfMHDwWdIzM4mmDpZAKeAzklgs,7908
|
|
40
|
+
flashforge/tcp/parsers/thumbnail_info.py,sha256=ZmxdEbVFOzqR1AfhXXZyjENVI66BdRdE7Q8LQ8an9FY,10201
|
|
41
|
+
flashforge_python_api-1.1.0.dist-info/METADATA,sha256=H9Lv3ThMilNw6H-BMtsi2-vdsL0u6f4u7QtGkh-6vlQ,11038
|
|
42
|
+
flashforge_python_api-1.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
43
|
+
flashforge_python_api-1.1.0.dist-info/entry_points.txt,sha256=AkOxlsLvQ7cvMLxn7tlzfKp_DCH2hXhbVceHIXxawpU,66
|
|
44
|
+
flashforge_python_api-1.1.0.dist-info/licenses/LICENSE,sha256=-cTA-hrmvlb3pqlQrBZQXUnKayhUjsLJMPb7TD91frM,1067
|
|
45
|
+
flashforge_python_api-1.1.0.dist-info/RECORD,,
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
flashforge/__init__.py,sha256=YwiGqt8E6Q5s3_iWxT0skY-468iQwKi2bRmj9pmdDhE,4302
|
|
2
|
-
flashforge/client.py,sha256=dkzIGgFQW37cstXKAAJEg4wmyuQiNdWxHbMgPHOsqxA,12805
|
|
3
|
-
flashforge/api/__init__.py,sha256=Syz3l0UO1ryK5bMKnI_Neh1PTmlkl8iKgzZrdWhArc0,334
|
|
4
|
-
flashforge/api/constants/__init__.py,sha256=JyFtW3DcynTD_VWzw3T7MCs6BYaf9Xkypi_WYUgqFA4,162
|
|
5
|
-
flashforge/api/constants/commands.py,sha256=tcCyAueNYZ7CrYxVy92r9alF6f5AcapErBBgGL1Xqwk,328
|
|
6
|
-
flashforge/api/constants/endpoints.py,sha256=aGDxZk2f_Qsfi_QeIujP8ocDux_wiBBYldaGUuyg8BA,270
|
|
7
|
-
flashforge/api/controls/__init__.py,sha256=5nHCY3U6KJIknYY_VnPjLFQIiPmEEAA6QlkC14AjAzY,292
|
|
8
|
-
flashforge/api/controls/control.py,sha256=4PEYVeHkJTvsIYq2ck_rJ9kGkozsSgJUPkFHvFEfJNk,12061
|
|
9
|
-
flashforge/api/controls/files.py,sha256=ieQI3IaWPNwyxLoIP3Ea_xtg_bTmZkleSM460yhFgIk,7626
|
|
10
|
-
flashforge/api/controls/info.py,sha256=lAYSkbpFvJrkb9IL8yVAWMFVwsk4Rl7ZlNvgEh32Ub0,12512
|
|
11
|
-
flashforge/api/controls/job_control.py,sha256=iC3bmK00r4rS7fsAuRZR-RNWguJ8rl8dCDV1L1a-leM,23169
|
|
12
|
-
flashforge/api/controls/temp_control.py,sha256=H4fdJXXrnRMQvvZhslhNAtAR78S-4Nk79OxDqOEHRM0,3108
|
|
13
|
-
flashforge/api/filament/__init__.py,sha256=isT2dl0hzUS0xMTXMm4Tip0GTG1gCsm8LKWa9xPu4Y8,104
|
|
14
|
-
flashforge/api/filament/filament.py,sha256=TtcC2G2nD9Sq4cOrCZzFLZ6Q0Ve-zfrfuEF9uQ8M3eE,1214
|
|
15
|
-
flashforge/api/misc/__init__.py,sha256=IaHcsUieaMEYEFAWTyj-X6N7JRLiLiU7D58Cl-DttJs,211
|
|
16
|
-
flashforge/api/misc/scientific_notation.py,sha256=KSMTrrYhPWLv0gbcEAD6u-jEOcIwUjOCOPMBi0LiO-k,826
|
|
17
|
-
flashforge/api/misc/temperature.py,sha256=qeHlCdPzLyqGDEB874Ib5AgYHMR9Qtw61shnw4G095E,1066
|
|
18
|
-
flashforge/api/network/__init__.py,sha256=BjrtwAMLGJ6_Q4LrZZM9KP1gfYXq4V8uHro_AxmUhD8,163
|
|
19
|
-
flashforge/api/network/fnet_code.py,sha256=BR2niVKKk4ZfXtizUDIMXzDhlCxPHzqWg5AQQIcoj3g,402
|
|
20
|
-
flashforge/api/network/utils.py,sha256=gpRU24eYtOajV-lWEjMdanjs110xG-jn2EirD5gIoWA,1607
|
|
21
|
-
flashforge/discovery/__init__.py,sha256=1Dz3zqh5ltsv34ZhugWkoC4MKp8qbz3SWpxNkPSIlMU,277
|
|
22
|
-
flashforge/discovery/discovery.py,sha256=fAY8EFw5u8R-wlh21_GrXHLL2KpAxkp0EQi8fNbgJbU,15172
|
|
23
|
-
flashforge/models/__init__.py,sha256=qRV-iuENmwyeiO63cQYA6qFB-UYG36HadSMzgZabGPA,983
|
|
24
|
-
flashforge/models/machine_info.py,sha256=Y7nfCepE6sc8slpPsFCFOGXdzxMzUA2Dtod3WHGk7TU,12108
|
|
25
|
-
flashforge/models/responses.py,sha256=LbRiT74j31fra86xorcuUmeWtV27KCj6mysERlUJzZI,5143
|
|
26
|
-
flashforge/tcp/__init__.py,sha256=JYbv_ATMJL1vJ1VP-KPcxdMM7V_aapDkZrCUhPaWLtQ,835
|
|
27
|
-
flashforge/tcp/ff_client.py,sha256=58z6qzfolIOovtzW-C3GwgrOxZV67cOMC5vGjYnsZ7c,20787
|
|
28
|
-
flashforge/tcp/tcp_client.py,sha256=GcTp_PAykH4n5NFf8uqCV5H7OfExJFPWordMtgujREU,17331
|
|
29
|
-
flashforge/tcp/gcode/__init__.py,sha256=PhRg0RVxZoWQaB8lpHXSEsY1C5ZvJ29QIAUOi0vr5OY,195
|
|
30
|
-
flashforge/tcp/gcode/gcode_controller.py,sha256=RKUwxDZkRxtn9TL4w8VS4A6xhi8kHwTche3YPJz-6tw,10053
|
|
31
|
-
flashforge/tcp/gcode/gcodes.py,sha256=exPqr7EJbJYgtJ9aQNm8Ut7WfjPCx1i2fLnu7NpgG9c,3392
|
|
32
|
-
flashforge/tcp/parsers/__init__.py,sha256=lOxmHv1ECvZ8npm_lfO8gwG23L6QlVSE0TRuOAw64bk,730
|
|
33
|
-
flashforge/tcp/parsers/endstop_status.py,sha256=tuHgBjXv9bQzUdMGC6_DHU6RsF5-6LGzjSjUkoMJK64,10374
|
|
34
|
-
flashforge/tcp/parsers/location_info.py,sha256=SfdW02nAB5Zlf-l7cPx4EetMFopJrz_IF5IxsjWwi1U,2445
|
|
35
|
-
flashforge/tcp/parsers/print_status.py,sha256=75KlzAMMjvpR4hCvK0LbHKwE_7hm2jExCFeHO1v4Kgs,6536
|
|
36
|
-
flashforge/tcp/parsers/printer_info.py,sha256=qur6zekWsTY_RsCt6Nndc1eElvJIhSXCpUfX0Z40ONQ,5443
|
|
37
|
-
flashforge/tcp/parsers/temp_info.py,sha256=YaDNCJZvwYhqD3li1aJl-66nVrZ2_lkoQVgiA1x35_w,8276
|
|
38
|
-
flashforge/tcp/parsers/thumbnail_info.py,sha256=hi-e3Dy8h8Vw1Uu5SVAodQKSJEhP0-z1NhnO3rOuYMo,9282
|
|
39
|
-
flashforge_python_api-1.0.2.dist-info/METADATA,sha256=HpduS305a5OSHzR9aUJTRVV13gRp-LmF0Hp1Yz8d9VQ,10780
|
|
40
|
-
flashforge_python_api-1.0.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
41
|
-
flashforge_python_api-1.0.2.dist-info/entry_points.txt,sha256=AkOxlsLvQ7cvMLxn7tlzfKp_DCH2hXhbVceHIXxawpU,66
|
|
42
|
-
flashforge_python_api-1.0.2.dist-info/licenses/LICENSE,sha256=-cTA-hrmvlb3pqlQrBZQXUnKayhUjsLJMPb7TD91frM,1067
|
|
43
|
-
flashforge_python_api-1.0.2.dist-info/RECORD,,
|
{flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{flashforge_python_api-1.0.2.dist-info → flashforge_python_api-1.1.0.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|