opensignalbox-macro 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- opensignalbox_macro-0.1.0/.gitignore +182 -0
- opensignalbox_macro-0.1.0/.python-version +1 -0
- opensignalbox_macro-0.1.0/CHANGELOG.md +10 -0
- opensignalbox_macro-0.1.0/PKG-INFO +29 -0
- opensignalbox_macro-0.1.0/README.md +1 -0
- opensignalbox_macro-0.1.0/pyproject.toml +48 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/__init__.py +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/__init__.py +23 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/base.py +268 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/block_working.py +178 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/inputs.py +418 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/logic.py +117 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/loops.py +115 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/macros.py +140 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/relays.py +62 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/sound.py +39 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/actions/timing.py +148 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/assets/favicon.ico +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/macros.py +580 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/main.py +112 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/models.py +143 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/routes.py +491 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/shared_variables.py +41 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/sv_types.py +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/version.py +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/.gitignore +26 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/.vscode/extensions.json +3 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/README.md +9 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/components.json +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/android-chrome-192x192.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/android-chrome-512x512.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/apple-touch-icon.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/assets/index-C95a6Gjt.js +63201 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/assets/index-C95a6Gjt.js.map +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/assets/index-DuU9TAU0.css +2349 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/favicon-16x16.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/favicon-32x32.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/favicon.ico +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/icon.svg +65 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/index.html +17 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/menu-icon.svg +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/dist/site.webmanifest +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/index.html +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/package-lock.json +3790 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/package.json +42 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/android-chrome-192x192.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/android-chrome-512x512.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/apple-touch-icon.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/favicon-16x16.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/favicon-32x32.png +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/favicon.ico +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/icon.svg +65 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/menu-icon.svg +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/public/site.webmanifest +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/App.vue +32 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/assets/favicon.ico +0 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/assets/index.css +79 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/blockWorking.ts +199 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/index.ts +43 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/logic.ts +164 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/loops.ts +15 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/macros.ts +83 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/misc.ts +31 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/number.ts +159 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/relay.ts +52 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/sound.ts +31 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/text.ts +148 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/timetable.ts +97 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/blocks/timing.ts +94 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/BlocklyComponent.vue +209 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacroEditGeneralDetails.vue +118 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacroEditLocalVariables.vue +144 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacroEditor.vue +34 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacroInstanceControls.vue +74 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacroInstanceGeneralDetails.vue +84 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacroInstanceLocalVariables.vue +121 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacroInstanceViewer.vue +101 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacrosHelp.vue +31 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacrosLibraryList.vue +475 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/MacrosRunningList.vue +187 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/Picker.vue +199 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/accordion/Accordion.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/accordion/AccordionContent.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/accordion/AccordionItem.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/accordion/AccordionTrigger.vue +39 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/accordion/index.ts +4 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialog.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialogAction.vue +20 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialogCancel.vue +27 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialogContent.vue +42 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialogDescription.vue +25 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialogFooter.vue +21 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialogHeader.vue +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialogTitle.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/alert-dialog/index.ts +9 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/badge/Badge.vue +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/badge/index.ts +25 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/button/Button.vue +28 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/button/index.ts +35 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/card/Card.vue +21 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/card/CardContent.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/card/CardDescription.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/card/CardFooter.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/card/CardHeader.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/card/CardTitle.vue +18 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/card/index.ts +6 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/checkbox/Checkbox.vue +33 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/checkbox/index.ts +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/collapsible/Collapsible.vue +15 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/collapsible/CollapsibleContent.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/collapsible/CollapsibleTrigger.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/collapsible/index.ts +3 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/Dialog.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/DialogClose.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/DialogContent.vue +50 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/DialogDescription.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/DialogFooter.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/DialogHeader.vue +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/DialogScrollContent.vue +59 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/DialogTitle.vue +29 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/DialogTrigger.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dialog/index.ts +9 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/drawer/Drawer.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/drawer/DrawerContent.vue +28 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/drawer/DrawerDescription.vue +20 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/drawer/DrawerFooter.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/drawer/DrawerHeader.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/drawer/DrawerOverlay.vue +18 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/drawer/DrawerTitle.vue +20 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/drawer/index.ts +8 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenu.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuContent.vue +38 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuItem.vue +28 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +41 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +30 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +33 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/dropdown-menu/index.ts +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/input/Input.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/input/index.ts +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/label/Label.vue +27 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/label/index.ts +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/Pagination.vue +26 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/PaginationContent.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/PaginationEllipsis.vue +25 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/PaginationFirst.vue +33 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/PaginationItem.vue +34 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/PaginationLast.vue +33 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/PaginationNext.vue +33 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/PaginationPrevious.vue +33 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/pagination/index.ts +8 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/scroll-area/ScrollArea.vue +29 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/scroll-area/ScrollBar.vue +30 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/scroll-area/index.ts +2 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/Select.vue +15 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectContent.vue +53 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectGroup.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectItem.vue +44 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectItemText.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectLabel.vue +13 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectScrollDownButton.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectScrollUpButton.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectSeparator.vue +17 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectTrigger.vue +31 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/SelectValue.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/select/index.ts +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/separator/Separator.vue +20 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/separator/index.ts +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/Sheet.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/SheetClose.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/SheetContent.vue +56 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/SheetDescription.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/SheetFooter.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/SheetHeader.vue +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/SheetTitle.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/SheetTrigger.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/sheet/index.ts +31 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/Table.vue +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/TableBody.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/TableCaption.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/TableCell.vue +21 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/TableEmpty.vue +37 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/TableFooter.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/TableHead.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/TableHeader.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/TableRow.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/table/index.ts +8 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tabs/Tabs.vue +15 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tabs/TabsContent.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tabs/TabsList.vue +25 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tabs/TabsTrigger.vue +27 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tabs/index.ts +4 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tags-input/TagsInput.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tags-input/TagsInputInput.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tags-input/TagsInputItem.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tags-input/TagsInputItemDelete.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tags-input/TagsInputItemText.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tags-input/index.ts +5 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/textarea/Textarea.vue +24 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/textarea/index.ts +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/Toast.vue +28 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/ToastAction.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/ToastClose.vue +22 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/ToastDescription.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/ToastProvider.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/ToastTitle.vue +19 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/ToastViewport.vue +17 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/Toaster.vue +30 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/index.ts +38 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/toast/use-toast.ts +165 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tooltip/Tooltip.vue +14 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tooltip/TooltipContent.vue +31 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tooltip/TooltipProvider.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/components/ui/tooltip/index.ts +4 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/libs/utils.ts +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/main.ts +41 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/types.ts +16 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/views/GlobalVariables.vue +728 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/views/MacroEdit.vue +200 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/views/MacroInstanceView.vue +87 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/views/MacrosLibrary.vue +9 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/views/MacrosRunning.vue +9 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/views/UserShortcuts.vue +288 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/src/vite-env.d.ts +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/tailwind.config.js +93 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/tsconfig.json +30 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/tsconfig.node.json +11 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/tsconfig.node.tsbuildinfo +1 -0
- opensignalbox_macro-0.1.0/src/opensignalbox/macro/web_ui/vite.config.ts +62 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Created by https://www.toptal.com/developers/gitignore/api/python
|
|
2
|
+
# Edit at https://www.toptal.com/developers/gitignore?templates=python
|
|
3
|
+
|
|
4
|
+
### opensignalbox ###
|
|
5
|
+
tests/**/settings.toml
|
|
6
|
+
tests/workspace/boxes/*/resources/*
|
|
7
|
+
tests/workspace/boxes/Lowdham
|
|
8
|
+
opensignalbox/trainplanning/ltsv/icons
|
|
9
|
+
|
|
10
|
+
### Python ###
|
|
11
|
+
# Byte-compiled / optimized / DLL files
|
|
12
|
+
__pycache__/
|
|
13
|
+
*.py[cod]
|
|
14
|
+
*$py.class
|
|
15
|
+
|
|
16
|
+
# C extensions
|
|
17
|
+
*.so
|
|
18
|
+
|
|
19
|
+
# Distribution / packaging
|
|
20
|
+
.Python
|
|
21
|
+
build/
|
|
22
|
+
develop-eggs/
|
|
23
|
+
#dist/
|
|
24
|
+
downloads/
|
|
25
|
+
eggs/
|
|
26
|
+
.eggs/
|
|
27
|
+
lib/
|
|
28
|
+
lib64/
|
|
29
|
+
parts/
|
|
30
|
+
sdist/
|
|
31
|
+
var/
|
|
32
|
+
wheels/
|
|
33
|
+
share/python-wheels/
|
|
34
|
+
*.egg-info/
|
|
35
|
+
.installed.cfg
|
|
36
|
+
*.egg
|
|
37
|
+
MANIFEST
|
|
38
|
+
|
|
39
|
+
# PyInstaller
|
|
40
|
+
# Usually these files are written by a python script from a template
|
|
41
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
42
|
+
*.manifest
|
|
43
|
+
*.spec
|
|
44
|
+
|
|
45
|
+
# Installer logs
|
|
46
|
+
pip-log.txt
|
|
47
|
+
pip-delete-this-directory.txt
|
|
48
|
+
|
|
49
|
+
# Unit test / coverage reports
|
|
50
|
+
htmlcov/
|
|
51
|
+
.tox/
|
|
52
|
+
.nox/
|
|
53
|
+
.coverage
|
|
54
|
+
.coverage.*
|
|
55
|
+
.cache
|
|
56
|
+
nosetests.xml
|
|
57
|
+
coverage.xml
|
|
58
|
+
*.cover
|
|
59
|
+
*.py,cover
|
|
60
|
+
.hypothesis/
|
|
61
|
+
.pytest_cache/
|
|
62
|
+
cover/
|
|
63
|
+
|
|
64
|
+
# Translations
|
|
65
|
+
*.mo
|
|
66
|
+
*.pot
|
|
67
|
+
|
|
68
|
+
# Django stuff:
|
|
69
|
+
*.log
|
|
70
|
+
local_settings.py
|
|
71
|
+
db.sqlite3
|
|
72
|
+
db.sqlite3-journal
|
|
73
|
+
|
|
74
|
+
# Flask stuff:
|
|
75
|
+
instance/
|
|
76
|
+
.webassets-cache
|
|
77
|
+
|
|
78
|
+
# Scrapy stuff:
|
|
79
|
+
.scrapy
|
|
80
|
+
|
|
81
|
+
# Sphinx documentation
|
|
82
|
+
docs/_build/
|
|
83
|
+
|
|
84
|
+
# PyBuilder
|
|
85
|
+
.pybuilder/
|
|
86
|
+
target/
|
|
87
|
+
|
|
88
|
+
# Jupyter Notebook
|
|
89
|
+
.ipynb_checkpoints
|
|
90
|
+
|
|
91
|
+
# IPython
|
|
92
|
+
profile_default/
|
|
93
|
+
ipython_config.py
|
|
94
|
+
|
|
95
|
+
# pyenv
|
|
96
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
97
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
98
|
+
# .python-version
|
|
99
|
+
|
|
100
|
+
# pipenv
|
|
101
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
102
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
103
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
104
|
+
# install all needed dependencies.
|
|
105
|
+
#Pipfile.lock
|
|
106
|
+
|
|
107
|
+
# poetry
|
|
108
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
109
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
110
|
+
# commonly ignored for libraries.
|
|
111
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
112
|
+
#poetry.lock
|
|
113
|
+
|
|
114
|
+
# pdm
|
|
115
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
116
|
+
#pdm.lock
|
|
117
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
118
|
+
# in version control.
|
|
119
|
+
# https://pdm.fming.dev/#use-with-ide
|
|
120
|
+
.pdm.toml
|
|
121
|
+
|
|
122
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
123
|
+
__pypackages__/
|
|
124
|
+
|
|
125
|
+
# Celery stuff
|
|
126
|
+
celerybeat-schedule
|
|
127
|
+
celerybeat.pid
|
|
128
|
+
|
|
129
|
+
# SageMath parsed files
|
|
130
|
+
*.sage.py
|
|
131
|
+
|
|
132
|
+
# Environments
|
|
133
|
+
.env
|
|
134
|
+
.venv
|
|
135
|
+
env/
|
|
136
|
+
venv/
|
|
137
|
+
ENV/
|
|
138
|
+
env.bak/
|
|
139
|
+
venv.bak/
|
|
140
|
+
|
|
141
|
+
# Spyder project settings
|
|
142
|
+
.spyderproject
|
|
143
|
+
.spyproject
|
|
144
|
+
|
|
145
|
+
# Rope project settings
|
|
146
|
+
.ropeproject
|
|
147
|
+
|
|
148
|
+
# mkdocs documentation
|
|
149
|
+
/site
|
|
150
|
+
|
|
151
|
+
# mypy
|
|
152
|
+
.mypy_cache/
|
|
153
|
+
.dmypy.json
|
|
154
|
+
dmypy.json
|
|
155
|
+
|
|
156
|
+
# Pyre type checker
|
|
157
|
+
.pyre/
|
|
158
|
+
|
|
159
|
+
# pytype static type analyzer
|
|
160
|
+
.pytype/
|
|
161
|
+
|
|
162
|
+
# Cython debug symbols
|
|
163
|
+
cython_debug/
|
|
164
|
+
|
|
165
|
+
# PyCharm
|
|
166
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
167
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
168
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
169
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
170
|
+
#.idea/
|
|
171
|
+
|
|
172
|
+
### Python Patch ###
|
|
173
|
+
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
|
|
174
|
+
poetry.toml
|
|
175
|
+
|
|
176
|
+
# ruff
|
|
177
|
+
.ruff_cache/
|
|
178
|
+
|
|
179
|
+
# LSP config files
|
|
180
|
+
pyrightconfig.json
|
|
181
|
+
|
|
182
|
+
# End of https://www.toptal.com/developers/gitignore/api/python
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12.2
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
- WIP
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: opensignalbox-macro
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: The official macro scripting module for the opensignalbox simulation framework.
|
|
5
|
+
Project-URL: Homepage, https://opensignalbox.org/
|
|
6
|
+
Project-URL: Repository, https://github.com/opensignalbox/opensignalbox
|
|
7
|
+
Author-email: The openSignalBox project <info@opensignalbox.org>
|
|
8
|
+
Maintainer-email: Laurence Stant <laurence@stant.phd>
|
|
9
|
+
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Requires-Python: >=3.8
|
|
13
|
+
Requires-Dist: anyio>=4.3.0
|
|
14
|
+
Requires-Dist: email-validator>=2.1.1
|
|
15
|
+
Requires-Dist: fastapi>=0.108.0
|
|
16
|
+
Requires-Dist: hypercorn>=0.16.0
|
|
17
|
+
Requires-Dist: jinja2>=3.1.3
|
|
18
|
+
Requires-Dist: opensignalbox-common>=0.1.0
|
|
19
|
+
Requires-Dist: playsound3>=3.3.1
|
|
20
|
+
Requires-Dist: pydantic-settings>=2.1.0
|
|
21
|
+
Requires-Dist: pyhumps>=3.8.0
|
|
22
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
23
|
+
Requires-Dist: requests>=2.31.0
|
|
24
|
+
Requires-Dist: sqlmodel>=0.0.21
|
|
25
|
+
Requires-Dist: trio>=0.23.2
|
|
26
|
+
Requires-Dist: zmq>=0.0.0
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
openSignalBox package code repo.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
openSignalBox package code repo.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "opensignalbox-macro"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "The official macro scripting module for the opensignalbox simulation framework."
|
|
5
|
+
authors = [
|
|
6
|
+
{ name = "The openSignalBox project", email = "info@opensignalbox.org" },
|
|
7
|
+
]
|
|
8
|
+
maintainers = [{ name = "Laurence Stant", email = "laurence@stant.phd" }]
|
|
9
|
+
dependencies = [
|
|
10
|
+
"fastapi>=0.108.0",
|
|
11
|
+
"email-validator>=2.1.1",
|
|
12
|
+
"hypercorn>=0.16.0",
|
|
13
|
+
"trio>=0.23.2",
|
|
14
|
+
"pyyaml>=6.0.1",
|
|
15
|
+
"jinja2>=3.1.3",
|
|
16
|
+
"pydantic-settings>=2.1.0",
|
|
17
|
+
"zmq>=0.0.0",
|
|
18
|
+
"requests>=2.31.0",
|
|
19
|
+
"anyio>=4.3.0",
|
|
20
|
+
"opensignalbox-common>=0.1.0",
|
|
21
|
+
"sqlmodel>=0.0.21",
|
|
22
|
+
"pyhumps>=3.8.0",
|
|
23
|
+
"playsound3>=3.3.1",
|
|
24
|
+
]
|
|
25
|
+
readme = "README.md"
|
|
26
|
+
requires-python = ">= 3.8"
|
|
27
|
+
classifiers = [
|
|
28
|
+
"Programming Language :: Python :: 3",
|
|
29
|
+
"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
|
|
30
|
+
"Operating System :: OS Independent",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[project.urls]
|
|
34
|
+
"Homepage" = "https://opensignalbox.org/"
|
|
35
|
+
"Repository" = "https://github.com/opensignalbox/opensignalbox"
|
|
36
|
+
|
|
37
|
+
[build-system]
|
|
38
|
+
requires = ["hatchling"]
|
|
39
|
+
build-backend = "hatchling.build"
|
|
40
|
+
|
|
41
|
+
[project.scripts]
|
|
42
|
+
opensignalbox-macro = 'opensignalbox.macro.main:entry_point'
|
|
43
|
+
|
|
44
|
+
[tool.hatch.build.targets.wheel]
|
|
45
|
+
packages = ["src/opensignalbox"]
|
|
46
|
+
|
|
47
|
+
[project.entry-points."opensignalbox.shared_variable_types"]
|
|
48
|
+
sv_types = "opensignalbox.macro.sv_types:get_sv_type_specs"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__doc__ = "openSignalBox macro module."
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from . import (
|
|
2
|
+
base,
|
|
3
|
+
block_working,
|
|
4
|
+
inputs,
|
|
5
|
+
logic,
|
|
6
|
+
loops,
|
|
7
|
+
macros,
|
|
8
|
+
relays,
|
|
9
|
+
sound,
|
|
10
|
+
timing,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"base",
|
|
15
|
+
"block_working",
|
|
16
|
+
"inputs",
|
|
17
|
+
"logic",
|
|
18
|
+
"loops",
|
|
19
|
+
"macros",
|
|
20
|
+
"relays",
|
|
21
|
+
"sound",
|
|
22
|
+
"timing",
|
|
23
|
+
]
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Type, TypeVar
|
|
6
|
+
|
|
7
|
+
from opensignalbox.macro.actions.inputs import inputs_from_blocks
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from opensignalbox.macro.macros import MacroController
|
|
11
|
+
|
|
12
|
+
from opensignalbox.common.variables import (
|
|
13
|
+
VariableType,
|
|
14
|
+
get_pubbed_shared_variables,
|
|
15
|
+
get_subbed_shared_variables,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
pubbed_shared_variables = get_pubbed_shared_variables()
|
|
19
|
+
subbed_shared_variables = get_subbed_shared_variables()
|
|
20
|
+
|
|
21
|
+
T = TypeVar("T", bound="Action")
|
|
22
|
+
|
|
23
|
+
input_shared_variable_suffix = "_sv"
|
|
24
|
+
input_local_variable_suffix = "_lv"
|
|
25
|
+
input_global_variable_suffix = "_gv"
|
|
26
|
+
input_parameter_suffix = "_param"
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
_action_registry = {}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def register_action(block_type: str, action_class: Type[Action]):
|
|
34
|
+
"""Register an action class for a block type."""
|
|
35
|
+
_action_registry[block_type] = action_class
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def action(block_type: str):
|
|
39
|
+
"""Decorator to register action classes for a block type."""
|
|
40
|
+
|
|
41
|
+
def decorator(cls: Type[Action]) -> Type[Action]:
|
|
42
|
+
register_action(block_type, cls)
|
|
43
|
+
return cls
|
|
44
|
+
|
|
45
|
+
return decorator
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def actions_from_blocks(
|
|
49
|
+
block_parent: dict[str, Any],
|
|
50
|
+
subs: set[str] | None = None,
|
|
51
|
+
pubs: set[str] | None = None,
|
|
52
|
+
return_action: str | None = None,
|
|
53
|
+
) -> tuple[dict[str, Action], set[str], set[str]]:
|
|
54
|
+
subs = subs or set()
|
|
55
|
+
pubs = pubs or set()
|
|
56
|
+
block = block_parent.get("block", {})
|
|
57
|
+
action_class = _action_registry.get(block.get("type"))
|
|
58
|
+
if not action_class:
|
|
59
|
+
logger.warning(f"Unknown action type: {block.get('type')}")
|
|
60
|
+
return {}, set(), set()
|
|
61
|
+
actions, action_subs, action_pubs = action_class.from_block(block, return_action)
|
|
62
|
+
|
|
63
|
+
subs.update(action_subs)
|
|
64
|
+
pubs.update(action_pubs)
|
|
65
|
+
|
|
66
|
+
# Handle next block
|
|
67
|
+
if next_block := block.get("next", {}):
|
|
68
|
+
next_actions, next_subs, next_pubs = actions_from_blocks(
|
|
69
|
+
next_block, return_action=return_action, subs=subs, pubs=pubs
|
|
70
|
+
)
|
|
71
|
+
actions.update(next_actions)
|
|
72
|
+
subs.update(next_subs)
|
|
73
|
+
pubs.update(next_pubs)
|
|
74
|
+
|
|
75
|
+
return actions, subs, pubs
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class MacroError(Exception):
|
|
79
|
+
def __init__(self, message: str):
|
|
80
|
+
super().__init__(message)
|
|
81
|
+
logger.debug("MacroError raised: {}".format(message))
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class Action(ABC):
|
|
85
|
+
def __init__(
|
|
86
|
+
self, block_id: str | None = None, next_action: str | None = None, **kwargs
|
|
87
|
+
) -> None:
|
|
88
|
+
self.block_id = block_id
|
|
89
|
+
self.next_action = next_action
|
|
90
|
+
self.action_params: dict[str, Any] = {}
|
|
91
|
+
self.action_params.update(kwargs["action_params"])
|
|
92
|
+
self.waitable = False
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
@abstractmethod
|
|
96
|
+
def from_block(
|
|
97
|
+
cls: Type[T], block: dict[str, Any], return_action: str | None
|
|
98
|
+
) -> tuple[dict[str, T], set[str], set[str]]:
|
|
99
|
+
return {"": cls()}, set(), set()
|
|
100
|
+
|
|
101
|
+
@abstractmethod
|
|
102
|
+
def evaluate(
|
|
103
|
+
self, macro_controller: MacroController, macro_instance_name: str
|
|
104
|
+
) -> str | None:
|
|
105
|
+
"""
|
|
106
|
+
Returns the action id for the next cycle.
|
|
107
|
+
Reset the action at the end, otherwise loops won't work!
|
|
108
|
+
"""
|
|
109
|
+
pass
|
|
110
|
+
|
|
111
|
+
@classmethod
|
|
112
|
+
def _extract_block_info(
|
|
113
|
+
cls, block: dict[str, Any], return_action: str | None
|
|
114
|
+
) -> tuple[str, str | None]:
|
|
115
|
+
"""Extract common block ID and next action."""
|
|
116
|
+
block_id = block.get("id", "")
|
|
117
|
+
next_action = block.get("next", {}).get("block", {}).get("id", return_action)
|
|
118
|
+
return block_id, next_action
|
|
119
|
+
|
|
120
|
+
@classmethod
|
|
121
|
+
def _extract_field(
|
|
122
|
+
cls, block: dict[str, Any], field_name: str, default: str = ""
|
|
123
|
+
) -> str:
|
|
124
|
+
"""Extract field value with default."""
|
|
125
|
+
value = block.get("fields", {}).get(field_name, "")
|
|
126
|
+
return value if value else default
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def _extract_input(cls, block: dict[str, Any], input_name: str) -> dict[str, Any]:
|
|
130
|
+
"""Extract input value from block."""
|
|
131
|
+
return block.get("inputs", {}).get(input_name, {})
|
|
132
|
+
|
|
133
|
+
def _validate_required_params(self, *param_names: str) -> None:
|
|
134
|
+
"""Validate that required parameters exist and are not empty."""
|
|
135
|
+
for param in param_names:
|
|
136
|
+
value = self.action_params.get(param)
|
|
137
|
+
if not value or value == "":
|
|
138
|
+
raise ValueError(
|
|
139
|
+
f"Missing or invalid '{param}' parameter for {self.__class__.__name__}"
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@action("entry")
|
|
144
|
+
class ActionEntry(Action):
|
|
145
|
+
@classmethod
|
|
146
|
+
def from_block(
|
|
147
|
+
cls: Type[T], block: dict[str, Any], return_action: str | None
|
|
148
|
+
) -> tuple[dict[str, Action], set[str], set[str]]:
|
|
149
|
+
block_id, next_action = cls._extract_block_info(block, return_action)
|
|
150
|
+
instance = cls(block_id=block_id, next_action=next_action, action_params={})
|
|
151
|
+
return {block_id: instance}, set(), set()
|
|
152
|
+
|
|
153
|
+
def evaluate(
|
|
154
|
+
self, macro_controller: MacroController, macro_instance_name: str
|
|
155
|
+
) -> str | None:
|
|
156
|
+
return self.next_action
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
@action("set_logic_local_variable")
|
|
160
|
+
@action("set_number_local_variable")
|
|
161
|
+
@action("set_text_local_variable")
|
|
162
|
+
@action("set_logic_global_variable")
|
|
163
|
+
@action("set_number_global_variable")
|
|
164
|
+
@action("set_text_global_variable")
|
|
165
|
+
@action("set_logic_shared_variable")
|
|
166
|
+
@action("set_number_shared_variable")
|
|
167
|
+
@action("set_text_shared_variable")
|
|
168
|
+
class ActionSetVariable(Action):
|
|
169
|
+
@classmethod
|
|
170
|
+
def from_block(
|
|
171
|
+
cls: Type[T], block: dict[str, Any], return_action: str | None
|
|
172
|
+
) -> tuple[dict[str, Action], set[str], set[str]]:
|
|
173
|
+
block_id, next_action = cls._extract_block_info(block, return_action)
|
|
174
|
+
if "local" in block.get("type", ""):
|
|
175
|
+
scope = "local"
|
|
176
|
+
variable = cls._extract_field(block, "LOCALVARIABLE")
|
|
177
|
+
elif "global" in block.get("type", ""):
|
|
178
|
+
scope = "global"
|
|
179
|
+
variable = cls._extract_field(block, "GLOBALVARIABLE")
|
|
180
|
+
elif "shared" in block.get("type", ""):
|
|
181
|
+
scope = "shared"
|
|
182
|
+
variable = cls._extract_field(block, "SHAREDVARIABLE")
|
|
183
|
+
else:
|
|
184
|
+
raise MacroError(
|
|
185
|
+
f"Unknown variable scope type: {block['type']} for block {block_id} of type {cls.__name__}"
|
|
186
|
+
)
|
|
187
|
+
if "logic" in block.get("type", ""):
|
|
188
|
+
typestring = VariableType.LOGIC
|
|
189
|
+
elif "number" in block.get("type", ""):
|
|
190
|
+
typestring = VariableType.NUMBER
|
|
191
|
+
elif "text" in block.get("type", ""):
|
|
192
|
+
typestring = VariableType.TEXT
|
|
193
|
+
else:
|
|
194
|
+
raise MacroError(
|
|
195
|
+
f"Unknown variable type: {block['type']} for block {block_id} of type {cls.__name__}"
|
|
196
|
+
)
|
|
197
|
+
input = cls._extract_input(block, "VALUE")
|
|
198
|
+
value_input, subs = inputs_from_blocks(input)
|
|
199
|
+
action_params = {
|
|
200
|
+
"variable": variable,
|
|
201
|
+
"scope": scope,
|
|
202
|
+
"typestring": typestring,
|
|
203
|
+
"value_input": value_input,
|
|
204
|
+
}
|
|
205
|
+
instance = cls(
|
|
206
|
+
block_id=block_id, next_action=next_action, action_params=action_params
|
|
207
|
+
)
|
|
208
|
+
return {block_id: instance}, subs, set()
|
|
209
|
+
|
|
210
|
+
def evaluate(
|
|
211
|
+
self, macro_controller: "MacroController", macro_instance_name: str
|
|
212
|
+
) -> str | None:
|
|
213
|
+
self._validate_required_params("variable", "typestring", "value_input")
|
|
214
|
+
value = self.action_params["value_input"].evaluate(
|
|
215
|
+
macro_controller, macro_instance_name
|
|
216
|
+
)
|
|
217
|
+
if self.action_params["typestring"] == VariableType.LOGIC:
|
|
218
|
+
# Handle logic variable
|
|
219
|
+
value = bool(value) # Ensure value is boolean
|
|
220
|
+
elif self.action_params["typestring"] == VariableType.NUMBER:
|
|
221
|
+
# Handle number variable
|
|
222
|
+
value = float(value) # Ensure value is float
|
|
223
|
+
elif self.action_params["typestring"] == VariableType.TEXT:
|
|
224
|
+
# Handle text variable
|
|
225
|
+
value = str(value) # Ensure value is string
|
|
226
|
+
if self.action_params["scope"] == "local":
|
|
227
|
+
instance = macro_controller.macro_instances[macro_instance_name]
|
|
228
|
+
if self.action_params["variable"] in instance.local_variables:
|
|
229
|
+
macro_controller.set_local_variable(
|
|
230
|
+
macro_instance_name, self.action_params["variable"], value
|
|
231
|
+
)
|
|
232
|
+
elif self.action_params["scope"] == "global":
|
|
233
|
+
macro_controller.set_global_variable(self.action_params["variable"], value)
|
|
234
|
+
elif self.action_params["scope"] == "shared":
|
|
235
|
+
pubbed_shared_variables[self.action_params["variable"]].update(
|
|
236
|
+
{"value": value}
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
return self.next_action
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
@action("notification")
|
|
243
|
+
class ActionNotification(Action):
|
|
244
|
+
@classmethod
|
|
245
|
+
def from_block(
|
|
246
|
+
cls: Type[T], block: dict[str, Any], return_action: str | None
|
|
247
|
+
) -> tuple[dict[str, Action], set[str], set[str]]:
|
|
248
|
+
block_id, next_action = cls._extract_block_info(block, return_action)
|
|
249
|
+
input = cls._extract_input(block, "MESSAGE")
|
|
250
|
+
message_input, subs = inputs_from_blocks(input)
|
|
251
|
+
instance = cls(
|
|
252
|
+
block_id=block_id,
|
|
253
|
+
next_action=next_action,
|
|
254
|
+
action_params={"message_input": message_input},
|
|
255
|
+
)
|
|
256
|
+
return {block_id: instance}, set(), subs
|
|
257
|
+
|
|
258
|
+
def evaluate(
|
|
259
|
+
self, macro_controller: "MacroController", macro_instance_name: str
|
|
260
|
+
) -> str | None:
|
|
261
|
+
self._validate_required_params("message_input")
|
|
262
|
+
message = self.action_params["message_input"].evaluate(
|
|
263
|
+
macro_controller, macro_instance_name
|
|
264
|
+
)
|
|
265
|
+
macro_controller.send_notification(
|
|
266
|
+
"Notification from Macro", macro_instance_name + ": " + message
|
|
267
|
+
)
|
|
268
|
+
return self.next_action
|