meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7020__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 +1194 -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 +1858 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4595 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4315 -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 +934 -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/testcases.py +105 -0
- 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 +463 -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 +204 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +834 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +628 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +283 -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 +1084 -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 +232 -133
- meerk40t/gui/choicepropertypanel.py +1662 -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 +1440 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +897 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2944 -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 +500 -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 +2471 -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 +592 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2958 -2756
- meerk40t/gui/simpleui.py +362 -333
- meerk40t/gui/simulation.py +2451 -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 +590 -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 +163 -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 +1447 -1169
- meerk40t/gui/wxmmain.py +5644 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1631 -1453
- meerk40t/gui/wxmtree.py +2416 -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 +2793 -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 +3828 -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 +140 -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 +404 -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 +676 -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 +941 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +1047 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/METADATA +150 -139
- meerk40t-0.9.7020.dist-info/RECORD +446 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.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.7020.dist-info}/entry_points.txt +0 -0
meerk40t/kernel/functions.py
CHANGED
@@ -1,414 +1,463 @@
|
|
1
|
-
import functools
|
2
|
-
import os
|
3
|
-
import os.path
|
4
|
-
import platform
|
5
|
-
import re
|
6
|
-
from math import isinf
|
7
|
-
from typing import Callable, Generator, List, Optional, Tuple, Union
|
8
|
-
|
9
|
-
from .exceptions import CommandSyntaxError, MalformedCommandRegistration
|
10
|
-
|
11
|
-
_cmd_parse = [
|
12
|
-
("OPT", r"-([a-zA-Z]+)"),
|
13
|
-
("LONG", r"--([^ ,\t\n\x09\x0A\x0C\x0D]+)"),
|
14
|
-
("QPARAM", r"\"(.*?)\""),
|
15
|
-
("PARAM", r"([^ ,\t\n\x09\x0A\x0C\x0D]+)"),
|
16
|
-
("SKIP", r"[ ,\t\n\x09\x0A\x0C\x0D]+"),
|
17
|
-
]
|
18
|
-
_CMD_RE = re.compile("|".join("(?P<%s>%s)" % pair for pair in _cmd_parse))
|
19
|
-
|
20
|
-
|
21
|
-
def get_safe_path(
|
22
|
-
name: str, create: Optional[bool] = False, system: Optional[str] = None
|
23
|
-
) -> str:
|
24
|
-
"""
|
25
|
-
Get a path which should have valid user permissions in an OS dependent method.
|
26
|
-
|
27
|
-
@param name: directory name within the safe OS dependent userdirectory
|
28
|
-
@param create: Should this directory be created if needed.
|
29
|
-
@param system: Override the system value determination
|
30
|
-
@return:
|
31
|
-
"""
|
32
|
-
if not system:
|
33
|
-
system = platform.system()
|
34
|
-
|
35
|
-
if system == "Darwin":
|
36
|
-
directory = os.path.join(
|
37
|
-
os.path.expanduser("~"),
|
38
|
-
"Library",
|
39
|
-
"Application Support",
|
40
|
-
name,
|
41
|
-
)
|
42
|
-
elif system == "Windows":
|
43
|
-
directory = os.path.join(os.path.expandvars("%LOCALAPPDATA%"), name)
|
44
|
-
else:
|
45
|
-
directory = os.path.join(os.path.expanduser("~"), ".config", name)
|
46
|
-
if directory is not None and create:
|
47
|
-
os.makedirs(directory, exist_ok=True)
|
48
|
-
return directory
|
49
|
-
|
50
|
-
|
51
|
-
def console_option(name: str, short: str = None, **kwargs) -> Callable:
|
52
|
-
"""
|
53
|
-
Adds an option for a console_command.
|
54
|
-
|
55
|
-
@param name: option name
|
56
|
-
@param short: short flag of option name.
|
57
|
-
@param kwargs:
|
58
|
-
@return:
|
59
|
-
"""
|
60
|
-
try:
|
61
|
-
if short.startswith("-"):
|
62
|
-
short = short[1:]
|
63
|
-
except Exception:
|
64
|
-
pass
|
65
|
-
|
66
|
-
def decor(func):
|
67
|
-
kwargs["name"] = name
|
68
|
-
kwargs["short"] = short
|
69
|
-
if "action" in kwargs:
|
70
|
-
kwargs["type"] = bool
|
71
|
-
elif "type" not in kwargs:
|
72
|
-
kwargs["type"] = str
|
73
|
-
func.options.insert(0, kwargs)
|
74
|
-
return func
|
75
|
-
|
76
|
-
return decor
|
77
|
-
|
78
|
-
|
79
|
-
def console_argument(name: str, **kwargs) -> Callable:
|
80
|
-
"""
|
81
|
-
Adds an argument for the console_command. These are non-optional values and are expected to be provided when the
|
82
|
-
command is called from console.
|
83
|
-
|
84
|
-
@param name:
|
85
|
-
@param kwargs:
|
86
|
-
@return:
|
87
|
-
"""
|
88
|
-
|
89
|
-
def decor(func):
|
90
|
-
kwargs["name"] = name
|
91
|
-
if "type" not in kwargs:
|
92
|
-
kwargs["type"] = str
|
93
|
-
func.arguments.insert(0, kwargs)
|
94
|
-
return func
|
95
|
-
|
96
|
-
return decor
|
97
|
-
|
98
|
-
|
99
|
-
def console_command(
|
100
|
-
registration,
|
101
|
-
path: Union[str, Tuple[str, ...]] = None,
|
102
|
-
regex: bool = False,
|
103
|
-
hidden: bool = False,
|
104
|
-
help: str = None,
|
105
|
-
input_type: Union[str, Tuple[str, ...]] = None,
|
106
|
-
output_type: str = None,
|
107
|
-
all_arguments_required: bool = False,
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
@param
|
120
|
-
@param
|
121
|
-
@param
|
122
|
-
@param
|
123
|
-
@param
|
124
|
-
@param
|
125
|
-
@param
|
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
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
kwargs[name] =
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
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
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
if
|
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
|
-
inner
|
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
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
1
|
+
import functools
|
2
|
+
import os
|
3
|
+
import os.path
|
4
|
+
import platform
|
5
|
+
import re
|
6
|
+
from math import isinf
|
7
|
+
from typing import Callable, Generator, List, Optional, Tuple, Union
|
8
|
+
|
9
|
+
from .exceptions import CommandSyntaxError, MalformedCommandRegistration
|
10
|
+
|
11
|
+
_cmd_parse = [
|
12
|
+
("OPT", r"-([a-zA-Z]+)"),
|
13
|
+
("LONG", r"--([^ ,\t\n\x09\x0A\x0C\x0D]+)"),
|
14
|
+
("QPARAM", r"\"(.*?)\""),
|
15
|
+
("PARAM", r"([^ ,\t\n\x09\x0A\x0C\x0D]+)"),
|
16
|
+
("SKIP", r"[ ,\t\n\x09\x0A\x0C\x0D]+"),
|
17
|
+
]
|
18
|
+
_CMD_RE = re.compile("|".join("(?P<%s>%s)" % pair for pair in _cmd_parse))
|
19
|
+
|
20
|
+
|
21
|
+
def get_safe_path(
|
22
|
+
name: str, create: Optional[bool] = False, system: Optional[str] = None
|
23
|
+
) -> str:
|
24
|
+
"""
|
25
|
+
Get a path which should have valid user permissions in an OS dependent method.
|
26
|
+
|
27
|
+
@param name: directory name within the safe OS dependent userdirectory
|
28
|
+
@param create: Should this directory be created if needed.
|
29
|
+
@param system: Override the system value determination
|
30
|
+
@return:
|
31
|
+
"""
|
32
|
+
if not system:
|
33
|
+
system = platform.system()
|
34
|
+
|
35
|
+
if system == "Darwin":
|
36
|
+
directory = os.path.join(
|
37
|
+
os.path.expanduser("~"),
|
38
|
+
"Library",
|
39
|
+
"Application Support",
|
40
|
+
name,
|
41
|
+
)
|
42
|
+
elif system == "Windows":
|
43
|
+
directory = os.path.join(os.path.expandvars("%LOCALAPPDATA%"), name)
|
44
|
+
else:
|
45
|
+
directory = os.path.join(os.path.expanduser("~"), ".config", name)
|
46
|
+
if directory is not None and create:
|
47
|
+
os.makedirs(directory, exist_ok=True)
|
48
|
+
return directory
|
49
|
+
|
50
|
+
|
51
|
+
def console_option(name: str, short: str = None, **kwargs) -> Callable:
|
52
|
+
"""
|
53
|
+
Adds an option for a console_command.
|
54
|
+
|
55
|
+
@param name: option name
|
56
|
+
@param short: short flag of option name.
|
57
|
+
@param kwargs:
|
58
|
+
@return:
|
59
|
+
"""
|
60
|
+
try:
|
61
|
+
if short.startswith("-"):
|
62
|
+
short = short[1:]
|
63
|
+
except Exception:
|
64
|
+
pass
|
65
|
+
|
66
|
+
def decor(func):
|
67
|
+
kwargs["name"] = name
|
68
|
+
kwargs["short"] = short
|
69
|
+
if "action" in kwargs:
|
70
|
+
kwargs["type"] = bool
|
71
|
+
elif "type" not in kwargs:
|
72
|
+
kwargs["type"] = str
|
73
|
+
func.options.insert(0, kwargs)
|
74
|
+
return func
|
75
|
+
|
76
|
+
return decor
|
77
|
+
|
78
|
+
|
79
|
+
def console_argument(name: str, **kwargs) -> Callable:
|
80
|
+
"""
|
81
|
+
Adds an argument for the console_command. These are non-optional values and are expected to be provided when the
|
82
|
+
command is called from console.
|
83
|
+
|
84
|
+
@param name:
|
85
|
+
@param kwargs:
|
86
|
+
@return:
|
87
|
+
"""
|
88
|
+
|
89
|
+
def decor(func):
|
90
|
+
kwargs["name"] = name
|
91
|
+
if "type" not in kwargs:
|
92
|
+
kwargs["type"] = str
|
93
|
+
func.arguments.insert(0, kwargs)
|
94
|
+
return func
|
95
|
+
|
96
|
+
return decor
|
97
|
+
|
98
|
+
|
99
|
+
def console_command(
|
100
|
+
registration,
|
101
|
+
path: Union[str, Tuple[str, ...]] = None,
|
102
|
+
regex: bool = False,
|
103
|
+
hidden: bool = False,
|
104
|
+
help: str = None,
|
105
|
+
input_type: Union[str, Tuple[str, ...]] = None,
|
106
|
+
output_type: str = None,
|
107
|
+
all_arguments_required: bool = False,
|
108
|
+
force: str = None,
|
109
|
+
):
|
110
|
+
"""
|
111
|
+
Console Command registers is a decorator that registers a command to the kernel. Any commands that execute
|
112
|
+
within the console are registered with this decorator. It varies attributes that define how the decorator
|
113
|
+
should be treated. Commands work with named contexts in a pipelined architecture. So "element" commands output
|
114
|
+
must be followed by "element" command inputs. The input_type and output_type do not have to match and can be
|
115
|
+
a tuple of different types. None refers to the base context.
|
116
|
+
|
117
|
+
The long_help is the docstring of the actual function itself.
|
118
|
+
|
119
|
+
@param registration: the kernel or service this is being registered to
|
120
|
+
@param path: command name of the command being registered
|
121
|
+
@param regex: Should this command name match regex command values.
|
122
|
+
@param hidden: Whether this command shows up in `help` or not.
|
123
|
+
@param help: What should the help for this command be.
|
124
|
+
@param input_type: What is the incoming context for the command
|
125
|
+
@param output_type: What is the outgoing context for the command
|
126
|
+
@param all_arguments_required: Should raise a syntax error if any argument is unfilled
|
127
|
+
@param force: force registration destination.
|
128
|
+
@return:
|
129
|
+
"""
|
130
|
+
|
131
|
+
def decorator(func: Callable):
|
132
|
+
@functools.wraps(func)
|
133
|
+
def inner(command: str, remainder: str, channel: "Channel", **ik):
|
134
|
+
options = inner.options
|
135
|
+
arguments = inner.arguments
|
136
|
+
|
137
|
+
# Stack are the opts which require values.
|
138
|
+
stack = list()
|
139
|
+
stack.extend(arguments)
|
140
|
+
|
141
|
+
# To be passed to the console_command
|
142
|
+
kwargs = dict()
|
143
|
+
|
144
|
+
argument_index = 0
|
145
|
+
opt_index = 0
|
146
|
+
pos = 0
|
147
|
+
nargs = 0
|
148
|
+
|
149
|
+
for kind, value, start, pos in _cmd_parser(remainder):
|
150
|
+
if kind == "PARAM":
|
151
|
+
# is a parameter-option
|
152
|
+
if argument_index == len(stack):
|
153
|
+
pos = start
|
154
|
+
break # Nothing else is expected.
|
155
|
+
# Set option qualities
|
156
|
+
k = stack[argument_index]
|
157
|
+
|
158
|
+
# Get key name.
|
159
|
+
key = k["name"]
|
160
|
+
|
161
|
+
if key not in kwargs:
|
162
|
+
# Set default key for unset key.
|
163
|
+
kwargs[key] = []
|
164
|
+
|
165
|
+
# Set nargs
|
166
|
+
nargs = k.get("nargs", 1)
|
167
|
+
if nargs == "*":
|
168
|
+
nargs = float("inf")
|
169
|
+
|
170
|
+
# Attempt cast to type.
|
171
|
+
if (
|
172
|
+
"type" in k
|
173
|
+
and value is not None
|
174
|
+
and not k.get("parallel_cast", False)
|
175
|
+
):
|
176
|
+
try:
|
177
|
+
value = k["type"](value)
|
178
|
+
except ValueError:
|
179
|
+
# Failed cast, if nargs="*" this is end of list.
|
180
|
+
if isinf(nargs):
|
181
|
+
pos = start
|
182
|
+
break
|
183
|
+
raise CommandSyntaxError(
|
184
|
+
f"'{str(value)}' does not cast to {str(k['type'])}"
|
185
|
+
)
|
186
|
+
|
187
|
+
kwargs[key].append(value)
|
188
|
+
|
189
|
+
if nargs == len(kwargs[key]):
|
190
|
+
# We have satisfied the nargs, next values.
|
191
|
+
argument_index += nargs
|
192
|
+
opt_index = argument_index
|
193
|
+
elif kind == "LONG" or kind == "OPT":
|
194
|
+
# is a --option or -o type option.
|
195
|
+
for pk in options:
|
196
|
+
# check all options for this one to match
|
197
|
+
name = pk["name"]
|
198
|
+
if (value == pk["name"] and kind == "LONG") or (
|
199
|
+
value == pk["short"] and kind == "OPT"
|
200
|
+
):
|
201
|
+
nargs = pk.get("nargs", 1)
|
202
|
+
# matching option.
|
203
|
+
action = pk.get("action")
|
204
|
+
if action == "store_true":
|
205
|
+
kwargs[name] = True
|
206
|
+
elif action == "store_const":
|
207
|
+
kwargs[name] = pk.get("const")
|
208
|
+
else:
|
209
|
+
for n in range(nargs):
|
210
|
+
stack.insert(opt_index, pk)
|
211
|
+
opt_index += 1
|
212
|
+
nargs = 0
|
213
|
+
break
|
214
|
+
opt_index = argument_index
|
215
|
+
if isinf(nargs):
|
216
|
+
# If the final number_args was infinite.
|
217
|
+
argument_index += 1
|
218
|
+
if inner.all_arguments_required:
|
219
|
+
if argument_index != len(stack):
|
220
|
+
raise CommandSyntaxError("Required arguments were not present.")
|
221
|
+
|
222
|
+
# Any unprocessed positional arguments get default values (even None)
|
223
|
+
for idx in range(argument_index, len(stack)):
|
224
|
+
k = stack[idx]
|
225
|
+
value = k.get("default")
|
226
|
+
if "type" in k and value is not None:
|
227
|
+
try:
|
228
|
+
value = k["type"](value)
|
229
|
+
except (TypeError, ValueError):
|
230
|
+
pass
|
231
|
+
key = k["name"]
|
232
|
+
current = kwargs.get(key)
|
233
|
+
if current is None:
|
234
|
+
kwargs[key] = [value]
|
235
|
+
else:
|
236
|
+
kwargs[key].append(value)
|
237
|
+
|
238
|
+
# Unset uncalled options with default values are added to kwargs.
|
239
|
+
for pk in options:
|
240
|
+
key = pk["name"]
|
241
|
+
if "default" in pk and key not in kwargs:
|
242
|
+
value = pk.get("default")
|
243
|
+
if "type" in pk and value is not None:
|
244
|
+
try:
|
245
|
+
value = pk["type"](value)
|
246
|
+
except (TypeError, ValueError):
|
247
|
+
pass
|
248
|
+
kwargs[key] = value
|
249
|
+
|
250
|
+
# Any parallel_cast opts should be cast in parallel
|
251
|
+
for k in options + arguments:
|
252
|
+
if not k.get("parallel_cast", False):
|
253
|
+
continue
|
254
|
+
key = k["name"]
|
255
|
+
current = kwargs.get(key)
|
256
|
+
if "type" in k and isinstance(current, list):
|
257
|
+
try:
|
258
|
+
kwargs[key] = k["type"](*current)
|
259
|
+
except TypeError:
|
260
|
+
raise CommandSyntaxError(f"Not enough values given for {key}.")
|
261
|
+
|
262
|
+
# Any singleton list arguments should become their only element, unless nargs is set.
|
263
|
+
for k in stack:
|
264
|
+
if k.get("nargs") is not None:
|
265
|
+
continue
|
266
|
+
key = k["name"]
|
267
|
+
current = kwargs.get(key)
|
268
|
+
if isinstance(current, list):
|
269
|
+
if len(current) == 1:
|
270
|
+
kwargs[key] = current[0]
|
271
|
+
|
272
|
+
# Process any remainder and args to include into kwargs
|
273
|
+
remainder = remainder[pos:]
|
274
|
+
if len(remainder) > 0:
|
275
|
+
kwargs["remainder"] = remainder
|
276
|
+
try:
|
277
|
+
kwargs["args"] = remainder.split()
|
278
|
+
except AttributeError:
|
279
|
+
kwargs["args"] = remainder
|
280
|
+
|
281
|
+
command_return_context = inner.output_type
|
282
|
+
# If function does not chain, we should unset remainder
|
283
|
+
if command_return_context is None:
|
284
|
+
remainder = "" # not chaining
|
285
|
+
|
286
|
+
# Call the function.
|
287
|
+
if inner.object:
|
288
|
+
returned = func(
|
289
|
+
inner.object, command=command, channel=channel, **ik, **kwargs
|
290
|
+
)
|
291
|
+
else:
|
292
|
+
returned = func(command=command, channel=channel, **ik, **kwargs)
|
293
|
+
|
294
|
+
# Process return values.
|
295
|
+
if returned is None:
|
296
|
+
value = None
|
297
|
+
command_return_context = None
|
298
|
+
else:
|
299
|
+
if not isinstance(returned, tuple) or len(returned) != 2:
|
300
|
+
raise ValueError(
|
301
|
+
f'"{str(returned)}" from command "{command}" returned improper values. "{str(kwargs)}"'
|
302
|
+
)
|
303
|
+
command_return_context, value = returned
|
304
|
+
return value, remainder, command_return_context
|
305
|
+
|
306
|
+
if hasattr(inner, "arguments"):
|
307
|
+
# Console_command() was called twice.
|
308
|
+
raise MalformedCommandRegistration(
|
309
|
+
"Applying console_command() to console_command()"
|
310
|
+
)
|
311
|
+
|
312
|
+
# Main Decorator
|
313
|
+
cmds = path if isinstance(path, tuple) else (path,)
|
314
|
+
ins = input_type if isinstance(input_type, tuple) else (input_type,)
|
315
|
+
inner.long_help = func.__doc__
|
316
|
+
inner.help = help
|
317
|
+
inner.regex = regex
|
318
|
+
inner.hidden = hidden
|
319
|
+
inner.input_type = input_type
|
320
|
+
inner.output_type = output_type
|
321
|
+
inner.all_arguments_required = all_arguments_required
|
322
|
+
|
323
|
+
inner.arguments = list()
|
324
|
+
inner.options = list()
|
325
|
+
inner.object = None
|
326
|
+
|
327
|
+
# Process registration.
|
328
|
+
def unregister(reg, obj=None):
|
329
|
+
"""
|
330
|
+
Unregister into registration.
|
331
|
+
"""
|
332
|
+
if force == "kernel" and hasattr(reg, "kernel"):
|
333
|
+
reg = reg.kernel
|
334
|
+
console_command_remove(reg, path, input_type)
|
335
|
+
|
336
|
+
def register(reg, obj=None):
|
337
|
+
"""
|
338
|
+
Register in the service or kernel.
|
339
|
+
"""
|
340
|
+
if force == "service":
|
341
|
+
if not hasattr(reg, "kernel"):
|
342
|
+
# Force service reg, but kernel registration given. Abort.
|
343
|
+
return
|
344
|
+
if force == "kernel" and hasattr(reg, "kernel"):
|
345
|
+
# force kernel reg, and given service. Use kernel.
|
346
|
+
reg = reg.kernel
|
347
|
+
for cmd in cmds:
|
348
|
+
for i in ins:
|
349
|
+
p = f"command/{i}/{cmd}"
|
350
|
+
reg.register(p, inner)
|
351
|
+
inner.object = obj
|
352
|
+
inner.unreg = unregister
|
353
|
+
|
354
|
+
inner.reg = register
|
355
|
+
if registration:
|
356
|
+
register(registration)
|
357
|
+
|
358
|
+
return inner
|
359
|
+
|
360
|
+
return decorator
|
361
|
+
|
362
|
+
|
363
|
+
def kernel_console_command(*args, **kwargs):
|
364
|
+
return console_command(None, *args, **kwargs, force="kernel")
|
365
|
+
|
366
|
+
|
367
|
+
def service_console_command(*args, **kwargs):
|
368
|
+
return console_command(None, *args, **kwargs, force="service")
|
369
|
+
|
370
|
+
|
371
|
+
def console_command_remove(
|
372
|
+
registration,
|
373
|
+
path: Union[str, Tuple[str, ...]] = None,
|
374
|
+
input_type: Union[str, Tuple[str, ...]] = None,
|
375
|
+
):
|
376
|
+
"""
|
377
|
+
Removes a console command with the given input_type at the given path.
|
378
|
+
|
379
|
+
@param registration: the kernel or service this is being registered to
|
380
|
+
@param path: path or tuple of paths to delete.
|
381
|
+
@param input_type: type or tuple of types to delete
|
382
|
+
@return:
|
383
|
+
"""
|
384
|
+
cmds = path if isinstance(path, tuple) else (path,)
|
385
|
+
ins = input_type if isinstance(input_type, tuple) else (input_type,)
|
386
|
+
for cmd in cmds:
|
387
|
+
for i in ins:
|
388
|
+
p = f"command/{i}/{cmd}"
|
389
|
+
registration.unregister(p)
|
390
|
+
|
391
|
+
|
392
|
+
def _cmd_cli_parser(
|
393
|
+
argv: List[str],
|
394
|
+
) -> Generator[Tuple[str, str, int, int], None, None]:
|
395
|
+
"""
|
396
|
+
Parser for console command events.
|
397
|
+
|
398
|
+
@param argv:
|
399
|
+
@return:
|
400
|
+
"""
|
401
|
+
for text in argv:
|
402
|
+
pos = 0
|
403
|
+
limit = len(text)
|
404
|
+
while pos < limit:
|
405
|
+
match = _CMD_RE.match(text, pos)
|
406
|
+
if match is None:
|
407
|
+
break # No more matches.
|
408
|
+
kind = match.lastgroup
|
409
|
+
start = pos
|
410
|
+
pos = match.end()
|
411
|
+
if kind == "SKIP":
|
412
|
+
pass
|
413
|
+
elif kind == "PARAM":
|
414
|
+
value = match.group()
|
415
|
+
yield kind, value, start, pos
|
416
|
+
elif kind == "QPARAM":
|
417
|
+
value = match.group()
|
418
|
+
yield "PARAM", value[1:-1], start, pos
|
419
|
+
elif kind == "LONG":
|
420
|
+
value = match.group()
|
421
|
+
yield kind, value[2:], start, pos
|
422
|
+
elif kind == "OPT":
|
423
|
+
value = match.group()
|
424
|
+
for letter in value[1:]:
|
425
|
+
yield kind, letter, start, pos
|
426
|
+
start += 1
|
427
|
+
|
428
|
+
|
429
|
+
def _cmd_parser(text: str) -> Generator[Tuple[str, str, int, int], None, None]:
|
430
|
+
"""
|
431
|
+
Parser for console command events.
|
432
|
+
|
433
|
+
@param text:
|
434
|
+
@return:
|
435
|
+
"""
|
436
|
+
if isinstance(text, list):
|
437
|
+
yield from _cmd_cli_parser(text)
|
438
|
+
return
|
439
|
+
pos = 0
|
440
|
+
limit = len(text)
|
441
|
+
while pos < limit:
|
442
|
+
match = _CMD_RE.match(text, pos)
|
443
|
+
if match is None:
|
444
|
+
break # No more matches.
|
445
|
+
kind = match.lastgroup
|
446
|
+
start = pos
|
447
|
+
pos = match.end()
|
448
|
+
if kind == "SKIP":
|
449
|
+
continue
|
450
|
+
elif kind == "PARAM":
|
451
|
+
value = match.group()
|
452
|
+
yield kind, value, start, pos
|
453
|
+
elif kind == "QPARAM":
|
454
|
+
value = match.group()
|
455
|
+
yield "PARAM", value[1:-1], start, pos
|
456
|
+
elif kind == "LONG":
|
457
|
+
value = match.group()
|
458
|
+
yield kind, value[2:], start, pos
|
459
|
+
elif kind == "OPT":
|
460
|
+
value = match.group()
|
461
|
+
for letter in value[1:]:
|
462
|
+
yield kind, letter, start, pos
|
463
|
+
start += 1
|