meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7010__py2.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.
- meerk40t/__init__.py +1 -1
- meerk40t/balormk/balor_params.py +167 -167
- meerk40t/balormk/clone_loader.py +457 -457
- meerk40t/balormk/controller.py +1566 -1512
- meerk40t/balormk/cylindermod.py +64 -0
- meerk40t/balormk/device.py +966 -1959
- meerk40t/balormk/driver.py +778 -591
- meerk40t/balormk/galvo_commands.py +1195 -0
- meerk40t/balormk/gui/balorconfig.py +237 -111
- meerk40t/balormk/gui/balorcontroller.py +191 -184
- meerk40t/balormk/gui/baloroperationproperties.py +116 -115
- meerk40t/balormk/gui/corscene.py +845 -0
- meerk40t/balormk/gui/gui.py +179 -147
- meerk40t/balormk/livelightjob.py +466 -382
- meerk40t/balormk/mock_connection.py +131 -109
- meerk40t/balormk/plugin.py +133 -135
- meerk40t/balormk/usb_connection.py +306 -301
- meerk40t/camera/__init__.py +1 -1
- meerk40t/camera/camera.py +514 -397
- meerk40t/camera/gui/camerapanel.py +1241 -1095
- meerk40t/camera/gui/gui.py +58 -58
- meerk40t/camera/plugin.py +441 -399
- meerk40t/ch341/__init__.py +27 -27
- meerk40t/ch341/ch341device.py +628 -628
- meerk40t/ch341/libusb.py +595 -589
- meerk40t/ch341/mock.py +171 -171
- meerk40t/ch341/windriver.py +157 -157
- meerk40t/constants.py +13 -0
- meerk40t/core/__init__.py +1 -1
- meerk40t/core/bindalias.py +550 -539
- meerk40t/core/core.py +47 -47
- meerk40t/core/cutcode/cubiccut.py +73 -73
- meerk40t/core/cutcode/cutcode.py +315 -312
- meerk40t/core/cutcode/cutgroup.py +141 -137
- meerk40t/core/cutcode/cutobject.py +192 -185
- meerk40t/core/cutcode/dwellcut.py +37 -37
- meerk40t/core/cutcode/gotocut.py +29 -29
- meerk40t/core/cutcode/homecut.py +29 -29
- meerk40t/core/cutcode/inputcut.py +34 -34
- meerk40t/core/cutcode/linecut.py +33 -33
- meerk40t/core/cutcode/outputcut.py +34 -34
- meerk40t/core/cutcode/plotcut.py +335 -335
- meerk40t/core/cutcode/quadcut.py +61 -61
- meerk40t/core/cutcode/rastercut.py +168 -148
- meerk40t/core/cutcode/waitcut.py +34 -34
- meerk40t/core/cutplan.py +1843 -1316
- meerk40t/core/drivers.py +330 -329
- meerk40t/core/elements/align.py +801 -669
- meerk40t/core/elements/branches.py +1844 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4561 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4329 -3617
- meerk40t/core/elements/files.py +117 -64
- meerk40t/core/elements/geometry.py +473 -224
- meerk40t/core/elements/grid.py +467 -316
- meerk40t/core/elements/materials.py +158 -94
- meerk40t/core/elements/notes.py +50 -38
- meerk40t/core/elements/offset_clpr.py +933 -912
- meerk40t/core/elements/offset_mk.py +963 -955
- meerk40t/core/elements/penbox.py +339 -267
- meerk40t/core/elements/placements.py +300 -83
- meerk40t/core/elements/render.py +785 -687
- meerk40t/core/elements/shapes.py +2618 -2092
- meerk40t/core/elements/trace.py +651 -563
- meerk40t/core/elements/tree_commands.py +415 -409
- meerk40t/core/elements/undo_redo.py +116 -58
- meerk40t/core/elements/wordlist.py +319 -200
- meerk40t/core/exceptions.py +9 -9
- meerk40t/core/laserjob.py +220 -220
- meerk40t/core/logging.py +63 -63
- meerk40t/core/node/blobnode.py +83 -86
- meerk40t/core/node/bootstrap.py +105 -103
- meerk40t/core/node/branch_elems.py +40 -31
- meerk40t/core/node/branch_ops.py +45 -38
- meerk40t/core/node/branch_regmark.py +48 -41
- meerk40t/core/node/cutnode.py +29 -32
- meerk40t/core/node/effect_hatch.py +375 -257
- meerk40t/core/node/effect_warp.py +398 -0
- meerk40t/core/node/effect_wobble.py +441 -309
- meerk40t/core/node/elem_ellipse.py +404 -309
- meerk40t/core/node/elem_image.py +1082 -801
- meerk40t/core/node/elem_line.py +358 -292
- meerk40t/core/node/elem_path.py +259 -201
- meerk40t/core/node/elem_point.py +129 -102
- meerk40t/core/node/elem_polyline.py +310 -246
- meerk40t/core/node/elem_rect.py +376 -286
- meerk40t/core/node/elem_text.py +445 -418
- meerk40t/core/node/filenode.py +59 -40
- meerk40t/core/node/groupnode.py +138 -74
- meerk40t/core/node/image_processed.py +777 -766
- meerk40t/core/node/image_raster.py +156 -113
- meerk40t/core/node/layernode.py +31 -31
- meerk40t/core/node/mixins.py +135 -107
- meerk40t/core/node/node.py +1427 -1304
- meerk40t/core/node/nutils.py +117 -114
- meerk40t/core/node/op_cut.py +462 -335
- meerk40t/core/node/op_dots.py +296 -251
- meerk40t/core/node/op_engrave.py +414 -311
- meerk40t/core/node/op_image.py +755 -369
- meerk40t/core/node/op_raster.py +787 -522
- meerk40t/core/node/place_current.py +37 -40
- meerk40t/core/node/place_point.py +329 -126
- meerk40t/core/node/refnode.py +58 -47
- meerk40t/core/node/rootnode.py +225 -219
- meerk40t/core/node/util_console.py +48 -48
- meerk40t/core/node/util_goto.py +84 -65
- meerk40t/core/node/util_home.py +61 -61
- meerk40t/core/node/util_input.py +102 -102
- meerk40t/core/node/util_output.py +102 -102
- meerk40t/core/node/util_wait.py +65 -65
- meerk40t/core/parameters.py +709 -707
- meerk40t/core/planner.py +875 -785
- meerk40t/core/plotplanner.py +656 -652
- meerk40t/core/space.py +120 -113
- meerk40t/core/spoolers.py +706 -705
- meerk40t/core/svg_io.py +1836 -1549
- meerk40t/core/treeop.py +534 -445
- meerk40t/core/undos.py +278 -124
- meerk40t/core/units.py +784 -680
- meerk40t/core/view.py +393 -322
- meerk40t/core/webhelp.py +62 -62
- meerk40t/core/wordlist.py +513 -504
- meerk40t/cylinder/cylinder.py +247 -0
- meerk40t/cylinder/gui/cylindersettings.py +41 -0
- meerk40t/cylinder/gui/gui.py +24 -0
- meerk40t/device/__init__.py +1 -1
- meerk40t/device/basedevice.py +322 -123
- meerk40t/device/devicechoices.py +50 -0
- meerk40t/device/dummydevice.py +163 -128
- meerk40t/device/gui/defaultactions.py +618 -602
- meerk40t/device/gui/effectspanel.py +114 -0
- meerk40t/device/gui/formatterpanel.py +253 -290
- meerk40t/device/gui/warningpanel.py +337 -260
- meerk40t/device/mixins.py +13 -13
- meerk40t/dxf/__init__.py +1 -1
- meerk40t/dxf/dxf_io.py +766 -554
- meerk40t/dxf/plugin.py +47 -35
- meerk40t/external_plugins.py +79 -79
- meerk40t/external_plugins_build.py +28 -28
- meerk40t/extra/cag.py +112 -116
- meerk40t/extra/coolant.py +403 -0
- meerk40t/extra/encode_detect.py +198 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +835 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +630 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +284 -0
- meerk40t/extra/param_functions.py +1542 -1556
- meerk40t/extra/potrace.py +257 -253
- meerk40t/extra/serial_exchange.py +118 -0
- meerk40t/extra/updater.py +602 -453
- meerk40t/extra/vectrace.py +147 -146
- meerk40t/extra/winsleep.py +83 -83
- meerk40t/extra/xcs_reader.py +597 -0
- meerk40t/fill/fills.py +781 -335
- meerk40t/fill/patternfill.py +1061 -1061
- meerk40t/fill/patterns.py +614 -567
- meerk40t/grbl/control.py +87 -87
- meerk40t/grbl/controller.py +990 -903
- meerk40t/grbl/device.py +1081 -768
- meerk40t/grbl/driver.py +989 -771
- meerk40t/grbl/emulator.py +532 -497
- meerk40t/grbl/gcodejob.py +783 -767
- meerk40t/grbl/gui/grblconfiguration.py +373 -298
- meerk40t/grbl/gui/grblcontroller.py +485 -271
- meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
- meerk40t/grbl/gui/grbloperationconfig.py +105 -0
- meerk40t/grbl/gui/gui.py +147 -116
- meerk40t/grbl/interpreter.py +44 -44
- meerk40t/grbl/loader.py +22 -22
- meerk40t/grbl/mock_connection.py +56 -56
- meerk40t/grbl/plugin.py +294 -264
- meerk40t/grbl/serial_connection.py +93 -88
- meerk40t/grbl/tcp_connection.py +81 -79
- meerk40t/grbl/ws_connection.py +112 -0
- meerk40t/gui/__init__.py +1 -1
- meerk40t/gui/about.py +2042 -296
- meerk40t/gui/alignment.py +1644 -1608
- meerk40t/gui/autoexec.py +199 -0
- meerk40t/gui/basicops.py +791 -670
- meerk40t/gui/bufferview.py +77 -71
- meerk40t/gui/busy.py +170 -133
- meerk40t/gui/choicepropertypanel.py +1673 -1469
- meerk40t/gui/consolepanel.py +706 -542
- meerk40t/gui/devicepanel.py +687 -581
- meerk40t/gui/dialogoptions.py +110 -107
- meerk40t/gui/executejob.py +316 -306
- meerk40t/gui/fonts.py +90 -90
- meerk40t/gui/functionwrapper.py +252 -0
- meerk40t/gui/gui_mixins.py +729 -0
- meerk40t/gui/guicolors.py +205 -182
- meerk40t/gui/help_assets/help_assets.py +218 -201
- meerk40t/gui/helper.py +154 -0
- meerk40t/gui/hersheymanager.py +1430 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +892 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2917 -0
- meerk40t/gui/materialtest.py +1722 -1694
- meerk40t/gui/mkdebug.py +646 -359
- meerk40t/gui/mwindow.py +163 -140
- meerk40t/gui/navigationpanels.py +2605 -2467
- meerk40t/gui/notes.py +143 -142
- meerk40t/gui/opassignment.py +414 -410
- meerk40t/gui/operation_info.py +310 -299
- meerk40t/gui/plugin.py +494 -328
- meerk40t/gui/position.py +714 -669
- meerk40t/gui/preferences.py +901 -650
- meerk40t/gui/propertypanels/attributes.py +1461 -1131
- meerk40t/gui/propertypanels/blobproperty.py +117 -114
- meerk40t/gui/propertypanels/consoleproperty.py +83 -80
- meerk40t/gui/propertypanels/gotoproperty.py +77 -0
- meerk40t/gui/propertypanels/groupproperties.py +223 -217
- meerk40t/gui/propertypanels/hatchproperty.py +489 -469
- meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
- meerk40t/gui/propertypanels/inputproperty.py +59 -58
- meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
- meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
- meerk40t/gui/propertypanels/outputproperty.py +59 -58
- meerk40t/gui/propertypanels/pathproperty.py +389 -380
- meerk40t/gui/propertypanels/placementproperty.py +1214 -383
- meerk40t/gui/propertypanels/pointproperty.py +140 -136
- meerk40t/gui/propertypanels/propertywindow.py +313 -181
- meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
- meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
- meerk40t/gui/propertypanels/textproperty.py +770 -755
- meerk40t/gui/propertypanels/waitproperty.py +56 -55
- meerk40t/gui/propertypanels/warpproperty.py +121 -0
- meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
- meerk40t/gui/ribbon.py +2468 -2210
- meerk40t/gui/scene/scene.py +1100 -1051
- meerk40t/gui/scene/sceneconst.py +22 -22
- meerk40t/gui/scene/scenepanel.py +439 -349
- meerk40t/gui/scene/scenespacewidget.py +365 -365
- meerk40t/gui/scene/widget.py +518 -505
- meerk40t/gui/scenewidgets/affinemover.py +215 -215
- meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
- meerk40t/gui/scenewidgets/bedwidget.py +120 -97
- meerk40t/gui/scenewidgets/elementswidget.py +137 -107
- meerk40t/gui/scenewidgets/gridwidget.py +785 -745
- meerk40t/gui/scenewidgets/guidewidget.py +765 -765
- meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
- meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
- meerk40t/gui/scenewidgets/nodeselector.py +28 -28
- meerk40t/gui/scenewidgets/rectselectwidget.py +589 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2952 -2756
- meerk40t/gui/simpleui.py +357 -333
- meerk40t/gui/simulation.py +2431 -2094
- meerk40t/gui/snapoptions.py +208 -203
- meerk40t/gui/spoolerpanel.py +1227 -1180
- meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
- meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
- meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
- meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
- meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
- meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
- meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
- meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
- meerk40t/gui/themes.py +200 -78
- meerk40t/gui/tips.py +591 -0
- meerk40t/gui/toolwidgets/circlebrush.py +35 -35
- meerk40t/gui/toolwidgets/toolcircle.py +248 -242
- meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
- meerk40t/gui/toolwidgets/tooldraw.py +97 -90
- meerk40t/gui/toolwidgets/toolellipse.py +219 -212
- meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
- meerk40t/gui/toolwidgets/toolline.py +39 -144
- meerk40t/gui/toolwidgets/toollinetext.py +79 -236
- meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
- meerk40t/gui/toolwidgets/toolmeasure.py +160 -216
- meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
- meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
- meerk40t/gui/toolwidgets/toolparameter.py +754 -668
- meerk40t/gui/toolwidgets/toolplacement.py +108 -108
- meerk40t/gui/toolwidgets/toolpoint.py +68 -59
- meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
- meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
- meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
- meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
- meerk40t/gui/toolwidgets/toolrect.py +211 -207
- meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
- meerk40t/gui/toolwidgets/toolribbon.py +598 -113
- meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
- meerk40t/gui/toolwidgets/tooltext.py +98 -89
- meerk40t/gui/toolwidgets/toolvector.py +213 -204
- meerk40t/gui/toolwidgets/toolwidget.py +39 -39
- meerk40t/gui/usbconnect.py +98 -91
- meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
- meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
- meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
- meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
- meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
- meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
- meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
- meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
- meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
- meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
- meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
- meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
- meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
- meerk40t/gui/wordlisteditor.py +985 -931
- meerk40t/gui/wxmeerk40t.py +1444 -1169
- meerk40t/gui/wxmmain.py +5578 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1635 -1453
- meerk40t/gui/wxmtree.py +2410 -2089
- meerk40t/gui/wxutils.py +1769 -1099
- meerk40t/gui/zmatrix.py +102 -102
- meerk40t/image/__init__.py +1 -1
- meerk40t/image/dither.py +429 -0
- meerk40t/image/imagetools.py +2778 -2269
- meerk40t/internal_plugins.py +150 -130
- meerk40t/kernel/__init__.py +63 -12
- meerk40t/kernel/channel.py +259 -212
- meerk40t/kernel/context.py +538 -538
- meerk40t/kernel/exceptions.py +41 -41
- meerk40t/kernel/functions.py +463 -414
- meerk40t/kernel/jobs.py +100 -100
- meerk40t/kernel/kernel.py +3809 -3571
- meerk40t/kernel/lifecycles.py +71 -71
- meerk40t/kernel/module.py +49 -49
- meerk40t/kernel/service.py +147 -147
- meerk40t/kernel/settings.py +383 -343
- meerk40t/lihuiyu/controller.py +883 -876
- meerk40t/lihuiyu/device.py +1181 -1069
- meerk40t/lihuiyu/driver.py +1466 -1372
- meerk40t/lihuiyu/gui/gui.py +127 -106
- meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
- meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
- meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
- meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
- meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
- meerk40t/lihuiyu/interpreter.py +53 -53
- meerk40t/lihuiyu/laserspeed.py +450 -450
- meerk40t/lihuiyu/loader.py +90 -90
- meerk40t/lihuiyu/parser.py +404 -404
- meerk40t/lihuiyu/plugin.py +101 -102
- meerk40t/lihuiyu/tcp_connection.py +111 -109
- meerk40t/main.py +231 -165
- meerk40t/moshi/builder.py +788 -781
- meerk40t/moshi/controller.py +505 -499
- meerk40t/moshi/device.py +495 -442
- meerk40t/moshi/driver.py +862 -696
- meerk40t/moshi/gui/gui.py +78 -76
- meerk40t/moshi/gui/moshicontrollergui.py +538 -522
- meerk40t/moshi/gui/moshidrivergui.py +87 -75
- meerk40t/moshi/plugin.py +43 -43
- meerk40t/network/console_server.py +102 -57
- meerk40t/network/kernelserver.py +10 -9
- meerk40t/network/tcp_server.py +142 -140
- meerk40t/network/udp_server.py +103 -77
- meerk40t/network/web_server.py +390 -0
- meerk40t/newly/controller.py +1158 -1144
- meerk40t/newly/device.py +874 -732
- meerk40t/newly/driver.py +540 -412
- meerk40t/newly/gui/gui.py +219 -188
- meerk40t/newly/gui/newlyconfig.py +116 -101
- meerk40t/newly/gui/newlycontroller.py +193 -186
- meerk40t/newly/gui/operationproperties.py +51 -51
- meerk40t/newly/mock_connection.py +82 -82
- meerk40t/newly/newly_params.py +56 -56
- meerk40t/newly/plugin.py +1214 -1246
- meerk40t/newly/usb_connection.py +322 -322
- meerk40t/rotary/gui/gui.py +52 -46
- meerk40t/rotary/gui/rotarysettings.py +240 -232
- meerk40t/rotary/rotary.py +202 -98
- meerk40t/ruida/control.py +291 -91
- meerk40t/ruida/controller.py +138 -1088
- meerk40t/ruida/device.py +672 -231
- meerk40t/ruida/driver.py +534 -472
- meerk40t/ruida/emulator.py +1494 -1491
- meerk40t/ruida/exceptions.py +4 -4
- meerk40t/ruida/gui/gui.py +71 -76
- meerk40t/ruida/gui/ruidaconfig.py +239 -72
- meerk40t/ruida/gui/ruidacontroller.py +187 -184
- meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
- meerk40t/ruida/loader.py +54 -52
- meerk40t/ruida/mock_connection.py +57 -109
- meerk40t/ruida/plugin.py +124 -87
- meerk40t/ruida/rdjob.py +2084 -945
- meerk40t/ruida/serial_connection.py +116 -0
- meerk40t/ruida/tcp_connection.py +146 -0
- meerk40t/ruida/udp_connection.py +73 -0
- meerk40t/svgelements.py +9671 -9669
- meerk40t/tools/driver_to_path.py +584 -579
- meerk40t/tools/geomstr.py +5583 -4680
- meerk40t/tools/jhfparser.py +357 -292
- meerk40t/tools/kerftest.py +904 -890
- meerk40t/tools/livinghinges.py +1168 -1033
- meerk40t/tools/pathtools.py +987 -949
- meerk40t/tools/pmatrix.py +234 -0
- meerk40t/tools/pointfinder.py +942 -942
- meerk40t/tools/polybool.py +940 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +989 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/METADATA +150 -139
- meerk40t-0.9.7010.dist-info/RECORD +445 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/zip-safe +1 -1
- meerk40t/balormk/elementlightjob.py +0 -159
- meerk40t-0.9.3001.dist-info/RECORD +0 -437
- test/bootstrap.py +0 -63
- test/test_cli.py +0 -12
- test/test_core_cutcode.py +0 -418
- test/test_core_elements.py +0 -144
- test/test_core_plotplanner.py +0 -397
- test/test_core_viewports.py +0 -312
- test/test_drivers_grbl.py +0 -108
- test/test_drivers_lihuiyu.py +0 -443
- test/test_drivers_newly.py +0 -113
- test/test_element_degenerate_points.py +0 -43
- test/test_elements_classify.py +0 -97
- test/test_elements_penbox.py +0 -22
- test/test_file_svg.py +0 -176
- test/test_fill.py +0 -155
- test/test_geomstr.py +0 -1523
- test/test_geomstr_nodes.py +0 -18
- test/test_imagetools_actualize.py +0 -306
- test/test_imagetools_wizard.py +0 -258
- test/test_kernel.py +0 -200
- test/test_laser_speeds.py +0 -3303
- test/test_length.py +0 -57
- test/test_lifecycle.py +0 -66
- test/test_operations.py +0 -251
- test/test_operations_hatch.py +0 -57
- test/test_ruida.py +0 -19
- test/test_spooler.py +0 -22
- test/test_tools_rasterplotter.py +0 -29
- test/test_wobble.py +0 -133
- test/test_zingl.py +0 -124
- {test → meerk40t/cylinder}/__init__.py +0 -0
- /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7010.dist-info}/entry_points.txt +0 -0
meerk40t/kernel/settings.py
CHANGED
@@ -1,343 +1,383 @@
|
|
1
|
-
import ast
|
2
|
-
|
3
|
-
|
4
|
-
from
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
section
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
`
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
):
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
@param section:
|
201
|
-
@param
|
202
|
-
@
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
if
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
def
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
@
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
@param
|
243
|
-
@
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
if
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
"""
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
@
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
"""
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
@return:
|
333
|
-
"""
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
@return:
|
342
|
-
"""
|
343
|
-
|
1
|
+
import ast
|
2
|
+
import os
|
3
|
+
import configparser
|
4
|
+
from pathlib import Path
|
5
|
+
from typing import Any, Dict, Generator, Optional, Union
|
6
|
+
|
7
|
+
from .functions import get_safe_path
|
8
|
+
|
9
|
+
|
10
|
+
class Settings:
|
11
|
+
"""
|
12
|
+
Settings are thin interface with the configparser within python. Conceptually it's a
|
13
|
+
dictionary of dictionaries. The first dictionary key are called sections, and the sub-
|
14
|
+
section are attributes. To save a list of related settings we add a space within the
|
15
|
+
section name. E.g. `operation 0001` or `operation 0002` etc. The first element can be
|
16
|
+
divided up with various layers of `/` to make path-like subdirectories of settings.
|
17
|
+
|
18
|
+
Reading/writing and deleting are performed on the config_dict which stores a set of values
|
19
|
+
these are loaded during the `read_configuration` step and are committed to disk when
|
20
|
+
`write_configuration` is called.
|
21
|
+
"""
|
22
|
+
|
23
|
+
def __init__(self, directory, filename, ignore_settings=False, create_backup=False):
|
24
|
+
if directory:
|
25
|
+
self._config_file = Path(get_safe_path(directory, create=True)).joinpath(filename)
|
26
|
+
else:
|
27
|
+
self._config_file = filename
|
28
|
+
self._config_dict = {}
|
29
|
+
self.create_backup = create_backup
|
30
|
+
self.prevent_persisting = False
|
31
|
+
if not ignore_settings:
|
32
|
+
self.read_configuration()
|
33
|
+
|
34
|
+
def __contains__(self, item):
|
35
|
+
return item in self._config_dict
|
36
|
+
|
37
|
+
def read_configuration(self, targetfile=None):
|
38
|
+
"""
|
39
|
+
Read configuration reads the self._config_file to get the parsed config file data.
|
40
|
+
|
41
|
+
Circa 0.8.0 this uses ConfigParser() in python rather than FileConfig in wxPython
|
42
|
+
|
43
|
+
@return:
|
44
|
+
"""
|
45
|
+
if targetfile is None:
|
46
|
+
targetfile = self._config_file
|
47
|
+
try:
|
48
|
+
parser = configparser.ConfigParser()
|
49
|
+
parser.read(targetfile, encoding="utf-8")
|
50
|
+
except (
|
51
|
+
PermissionError,
|
52
|
+
configparser.NoSectionError,
|
53
|
+
configparser.MissingSectionHeaderError,
|
54
|
+
FileNotFoundError,
|
55
|
+
):
|
56
|
+
return
|
57
|
+
except (configparser.DuplicateOptionError, configparser.DuplicateSectionError) as e:
|
58
|
+
print (f"We had a duplication error in the config, try to recover from {e}")
|
59
|
+
for section in parser.sections():
|
60
|
+
for option in parser.options(section):
|
61
|
+
try:
|
62
|
+
config_section = self._config_dict[section]
|
63
|
+
except KeyError:
|
64
|
+
config_section = {}
|
65
|
+
self._config_dict[section] = config_section
|
66
|
+
config_section[option] = parser.get(section, option)
|
67
|
+
|
68
|
+
def write_configuration(self, targetfile=None):
|
69
|
+
"""
|
70
|
+
Write configuration writes the config file to disk. This is typically done during the shutdown process.
|
71
|
+
|
72
|
+
This uses the python ConfigParser to save data from the _config_dict.
|
73
|
+
@return:
|
74
|
+
"""
|
75
|
+
if self.prevent_persisting:
|
76
|
+
return
|
77
|
+
if targetfile is None:
|
78
|
+
targetfile = self._config_file
|
79
|
+
try:
|
80
|
+
parser = configparser.ConfigParser()
|
81
|
+
for section_key in self._config_dict:
|
82
|
+
section = self._config_dict[section_key]
|
83
|
+
for key in section:
|
84
|
+
value = section[key]
|
85
|
+
try:
|
86
|
+
if "%" in value:
|
87
|
+
value = value.replace("%", "%%")
|
88
|
+
parser.set(section_key, key, value)
|
89
|
+
except configparser.NoSectionError:
|
90
|
+
parser.add_section(section_key)
|
91
|
+
parser.set(section_key, key, value)
|
92
|
+
except (configparser.DuplicateOptionError, configparser.DuplicateSectionError) as e:
|
93
|
+
print (f"We had a duplication error in the config, try to recover from {e}")
|
94
|
+
|
95
|
+
if self.create_backup:
|
96
|
+
VERSIONS = 5
|
97
|
+
try:
|
98
|
+
if os.path.exists(targetfile):
|
99
|
+
base_name, base_ext = os.path.splitext(targetfile)
|
100
|
+
for history in range(VERSIONS - 1, -1, -1):
|
101
|
+
if history == 0:
|
102
|
+
v0 = ".bak"
|
103
|
+
else:
|
104
|
+
v0 = f".ba{history}"
|
105
|
+
v1 = f".ba{history + 1}"
|
106
|
+
v0_file = base_name + v0
|
107
|
+
v1_file = base_name + v1
|
108
|
+
if os.path.exists(v0_file):
|
109
|
+
if os.path.exists(v1_file):
|
110
|
+
os.remove(v1_file)
|
111
|
+
os.rename(v0_file, v1_file)
|
112
|
+
|
113
|
+
v1_file = base_name + ".bak"
|
114
|
+
os.rename(targetfile, v1_file)
|
115
|
+
except (
|
116
|
+
PermissionError,
|
117
|
+
OSError,
|
118
|
+
RuntimeError,
|
119
|
+
FileExistsError,
|
120
|
+
FileNotFoundError,
|
121
|
+
):
|
122
|
+
# print (f"Error happened: {e}")
|
123
|
+
pass
|
124
|
+
with open(targetfile, "w", encoding="utf-8") as fp:
|
125
|
+
parser.write(fp)
|
126
|
+
except (PermissionError, FileNotFoundError):
|
127
|
+
return
|
128
|
+
|
129
|
+
def literal_dict(self):
|
130
|
+
literal_dict = dict()
|
131
|
+
import warnings
|
132
|
+
|
133
|
+
with warnings.catch_warnings():
|
134
|
+
warnings.simplefilter("error")
|
135
|
+
for section in self._config_dict:
|
136
|
+
section_dict = self._config_dict[section]
|
137
|
+
literal_section_dict = dict()
|
138
|
+
literal_dict[section] = literal_section_dict
|
139
|
+
for key in section_dict:
|
140
|
+
value = section_dict[key]
|
141
|
+
try:
|
142
|
+
value = ast.literal_eval(value)
|
143
|
+
except (ValueError, SyntaxError):
|
144
|
+
pass
|
145
|
+
literal_section_dict[key] = value
|
146
|
+
|
147
|
+
return literal_dict
|
148
|
+
|
149
|
+
def set_dict(self, literal_dict):
|
150
|
+
self._config_dict.clear()
|
151
|
+
for section in literal_dict:
|
152
|
+
section_dict = dict()
|
153
|
+
self._config_dict[section] = section_dict
|
154
|
+
for key in literal_dict[section]:
|
155
|
+
section_dict[key] = str(literal_dict[section][key])
|
156
|
+
|
157
|
+
def read_persistent(
|
158
|
+
self,
|
159
|
+
t: type,
|
160
|
+
section: str,
|
161
|
+
key: str,
|
162
|
+
default: Union[str, int, float, bool, list, tuple] = None,
|
163
|
+
) -> Any:
|
164
|
+
"""
|
165
|
+
Directly read from persistent storage the value of an item.
|
166
|
+
|
167
|
+
@param t: datatype.
|
168
|
+
@param section: storing section
|
169
|
+
@param key: reference item
|
170
|
+
@param default: default value if item does not exist.
|
171
|
+
@return: value
|
172
|
+
"""
|
173
|
+
|
174
|
+
try:
|
175
|
+
value = self._config_dict[section][key]
|
176
|
+
if t == bool:
|
177
|
+
return value == "True"
|
178
|
+
elif t in (list, tuple):
|
179
|
+
if ";" in value:
|
180
|
+
# This is backwards compatibility code. And may be removed at a later date.
|
181
|
+
value = value.replace(";", ", ").replace("'", "")
|
182
|
+
try:
|
183
|
+
return ast.literal_eval(value)
|
184
|
+
except (ValueError, SyntaxError):
|
185
|
+
return default
|
186
|
+
|
187
|
+
return t(value)
|
188
|
+
except (KeyError, ValueError):
|
189
|
+
return default
|
190
|
+
except AttributeError as e:
|
191
|
+
raise AttributeError(
|
192
|
+
"Something is attempting to load a persistent setting after kernel is terminated."
|
193
|
+
) from e
|
194
|
+
|
195
|
+
def read_persistent_attributes(self, section: str, obj: Any):
|
196
|
+
"""
|
197
|
+
Reads persistent settings for any value found set on the object so long as the object type is int, float, str
|
198
|
+
or bool.
|
199
|
+
|
200
|
+
@param section:
|
201
|
+
@param obj:
|
202
|
+
@return:
|
203
|
+
"""
|
204
|
+
for key, value in obj.__dict__.items():
|
205
|
+
if key.startswith("_"):
|
206
|
+
continue
|
207
|
+
t = type(value) if value is not None else str
|
208
|
+
read_value = self.read_persistent(t, section, key)
|
209
|
+
if read_value is None:
|
210
|
+
continue
|
211
|
+
try:
|
212
|
+
setattr(obj, key, read_value)
|
213
|
+
except AttributeError:
|
214
|
+
pass
|
215
|
+
|
216
|
+
def read_persistent_object(self, section: str, obj: object) -> None:
|
217
|
+
"""
|
218
|
+
Updates the objects instance dictionary with literal read values.
|
219
|
+
|
220
|
+
@param section: section to load into string dict
|
221
|
+
@param obj: object to apply read values.
|
222
|
+
@return: object
|
223
|
+
"""
|
224
|
+
for k in list(self.keylist(section)):
|
225
|
+
item = self._config_dict[section][k]
|
226
|
+
try:
|
227
|
+
item = ast.literal_eval(item)
|
228
|
+
except (ValueError, SyntaxError):
|
229
|
+
pass
|
230
|
+
obj.__dict__[k] = item
|
231
|
+
|
232
|
+
def read_persistent_string_dict(
|
233
|
+
self, section: str, dictionary: Optional[Dict] = None, suffix: bool = False
|
234
|
+
) -> Dict:
|
235
|
+
"""
|
236
|
+
Updates the given dictionary with the key values at the given section.
|
237
|
+
|
238
|
+
Reads string values and provides no typing information to convert the setting values.
|
239
|
+
|
240
|
+
@param section: section to load into string dict
|
241
|
+
@param dictionary: optional dictionary to update values
|
242
|
+
@param suffix: provide only the keys or section/key combination.
|
243
|
+
@return:
|
244
|
+
"""
|
245
|
+
if dictionary is None:
|
246
|
+
dictionary = dict()
|
247
|
+
for k in list(self.keylist(section)):
|
248
|
+
item = self._config_dict[section][k]
|
249
|
+
if not suffix:
|
250
|
+
k = f"{section}/{k}"
|
251
|
+
dictionary[k] = item
|
252
|
+
return dictionary
|
253
|
+
|
254
|
+
load_persistent_string_dict = read_persistent_string_dict
|
255
|
+
|
256
|
+
def write_persistent(
|
257
|
+
self, section: str, key: str, value: Union[str, int, float, bool, list, tuple]
|
258
|
+
):
|
259
|
+
"""
|
260
|
+
Directly write the value to persistent storage.
|
261
|
+
|
262
|
+
@param section: section to write key value
|
263
|
+
@param key: The item key being written
|
264
|
+
@param value: the value of the item.
|
265
|
+
"""
|
266
|
+
try:
|
267
|
+
config_section = self._config_dict[section]
|
268
|
+
except KeyError:
|
269
|
+
config_section = dict()
|
270
|
+
self._config_dict[section] = config_section
|
271
|
+
|
272
|
+
if isinstance(value, (str, int, float, bool)):
|
273
|
+
config_section[str(key)] = str(value)
|
274
|
+
elif isinstance(value, (list, tuple)):
|
275
|
+
s = str(value)
|
276
|
+
config_section[str(key)] = s
|
277
|
+
|
278
|
+
def write_persistent_dict(self, section, write_dict):
|
279
|
+
"""
|
280
|
+
Write all valid attribute values of this object to the section provided.
|
281
|
+
|
282
|
+
@param section: section to write to
|
283
|
+
@param write_dict: dict whose attributes should be written
|
284
|
+
@return:
|
285
|
+
"""
|
286
|
+
for key, value in write_dict.items():
|
287
|
+
if key.startswith("_"):
|
288
|
+
continue
|
289
|
+
if isinstance(value, (str, int, float, bool, list, tuple)):
|
290
|
+
self.write_persistent(section, key, value)
|
291
|
+
|
292
|
+
def write_persistent_attributes(self, section, obj):
|
293
|
+
"""
|
294
|
+
Write all valid attribute values of this object to the section provided.
|
295
|
+
|
296
|
+
@param section: section to write to
|
297
|
+
@param obj: object whose attributes should be written
|
298
|
+
@return:
|
299
|
+
"""
|
300
|
+
self.write_persistent_dict(section, obj.__dict__)
|
301
|
+
|
302
|
+
def clear_persistent(self, section: str):
|
303
|
+
"""
|
304
|
+
Clears a section of the persistent settings, all subsections are also cleared.
|
305
|
+
|
306
|
+
@param section:
|
307
|
+
@return:
|
308
|
+
"""
|
309
|
+
try:
|
310
|
+
for section_name in list(self._config_dict):
|
311
|
+
if section_name == section:
|
312
|
+
del self._config_dict[section_name]
|
313
|
+
except KeyError:
|
314
|
+
pass
|
315
|
+
|
316
|
+
def delete_persistent(self, section: str, key: str):
|
317
|
+
"""
|
318
|
+
Deletes a key within a section of the persistent settings.
|
319
|
+
|
320
|
+
@param section: section to delete key from
|
321
|
+
@param key: key to delete
|
322
|
+
@return:
|
323
|
+
"""
|
324
|
+
try:
|
325
|
+
del self._config_dict[section][key]
|
326
|
+
except KeyError:
|
327
|
+
pass
|
328
|
+
|
329
|
+
def delete_all_persistent(self):
|
330
|
+
"""
|
331
|
+
Deletes all persistent settings.
|
332
|
+
@return:
|
333
|
+
"""
|
334
|
+
self._config_dict.clear()
|
335
|
+
|
336
|
+
def keylist(self, section: str) -> Generator[str, None, None]:
|
337
|
+
"""
|
338
|
+
Get all keys located at the given path location. The keys are listed in absolute path locations.
|
339
|
+
|
340
|
+
@param section: Path to check for keys.
|
341
|
+
@return:
|
342
|
+
"""
|
343
|
+
try:
|
344
|
+
yield from self._config_dict[section]
|
345
|
+
except KeyError:
|
346
|
+
return
|
347
|
+
|
348
|
+
def derivable(self, section: str) -> Generator[str, None, None]:
|
349
|
+
"""
|
350
|
+
Finds all derivable paths within the config from the set path location.
|
351
|
+
|
352
|
+
This would find:
|
353
|
+
`camera/1 000001`
|
354
|
+
`camera/1 000002`
|
355
|
+
|
356
|
+
It `derivable(camera)` would only find paths of the form `camera *`
|
357
|
+
|
358
|
+
@param section:
|
359
|
+
@return:
|
360
|
+
"""
|
361
|
+
for section_name in self._config_dict:
|
362
|
+
ss = section_name.split(" ")
|
363
|
+
|
364
|
+
if ss[0] == section:
|
365
|
+
yield section_name
|
366
|
+
|
367
|
+
def section_startswith(self, prefix: str) -> Generator[str, None, None]:
|
368
|
+
"""
|
369
|
+
Finds all paths within the config that starts with the given prefix.
|
370
|
+
|
371
|
+
@param prefix:
|
372
|
+
@return:
|
373
|
+
"""
|
374
|
+
for section_name in self._config_dict:
|
375
|
+
if section_name.startswith(prefix):
|
376
|
+
yield section_name
|
377
|
+
|
378
|
+
def section_set(self) -> Generator[str, None, None]:
|
379
|
+
"""
|
380
|
+
Finds all derivable paths within the config from the set path location.
|
381
|
+
@return:
|
382
|
+
"""
|
383
|
+
yield from {s.split(" ")[0] for s in self._config_dict}
|