rp 0.1.1390__tar.gz → 0.1.1392__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.
- {rp-0.1.1390 → rp-0.1.1392}/PKG-INFO +1 -1
- {rp-0.1.1390 → rp-0.1.1392}/rp/documentation.py +8 -1
- rp-0.1.1392/rp/libs/kitten_tts_server.py +106 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/powerpoint/media_to_slides.py +92 -36
- rp-0.1.1392/rp/libs/supertonic_tts_server.py +315 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/claude_bash.sh +3 -2
- {rp-0.1.1390 → rp-0.1.1392}/rp/r.py +960 -102
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/bash_completer.py +35 -9
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/completer.py +30 -8
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/completion_schema.py +291 -25
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/key_bindings.py +15 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/path_completer_utils.py +96 -52
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/refactor_move_bash.py +68 -19
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/unreachable_detector.py +3 -3
- rp-0.1.1392/rp/version.py +1 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp.egg-info/PKG-INFO +1 -1
- {rp-0.1.1390 → rp-0.1.1392}/rp.egg-info/SOURCES.txt +2 -0
- rp-0.1.1392/version.py +1 -0
- rp-0.1.1390/rp/version.py +0 -1
- rp-0.1.1390/version.py +0 -1
- {rp-0.1.1390 → rp-0.1.1392}/.gitignore +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.idea/QuickPython.iml +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.idea/QuickPython.time +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.idea/encodings.xml +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.idea/inspectionProfiles/Project_Default.xml +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.idea/misc.xml +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.idea/modules.xml +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.idea/vcs.xml +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.idea/workspace.xml +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.publish.sh.un~ +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.setup.py.un~ +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/.update_module_paths.py.un~ +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/LICENSE.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/README +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/Scrap +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/aoisdasd +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/increment_version.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/oijio +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/publish.sh +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/pyqtconsoletest.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/__main__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/Pyperclip.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/debug_comment.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/draw_code_minimap.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/graveyard.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/_compatibility.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/cache.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/file_io.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/grammar.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/normalizer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/parser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/pgen2/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/pgen2/generator.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/pgen2/grammar_parser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/diff.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/errors.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar26.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar27.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar310.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar311.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar312.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar33.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar34.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar35.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar36.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar37.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar38.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/grammar39.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/parser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/pep8.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/prefix.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/token.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/tokenize.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/python/tree.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/tree.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/parso/utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/peepdis/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/peepdis/core.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/peepdis/datastructures.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/peepdis/legacy.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/peepdis/preferences.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/powerpoint/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/powerpoint/__main__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/powerpoint/convert_pptx_videos_to_gifs.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/powerpoint/convert_tmux.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/powerpoint/google_slides_upload.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/powerpoint/pptx_utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/powerpoint_converter.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/profile_vim_plugins.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pw_crypt.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/bindings/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/bindings/flann_ctypes.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/exceptions.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/index.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/io/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/io/binary_dataset.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/io/dat_dataset.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/io/dataset.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/io/hdf5_dataset.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/io/npy_dataset.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/util/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyflann/util/weave_tools.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/__version__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/app.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/cli.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/cli_utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/config/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/config/config.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/config/config_error.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/config/config_parser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/config/config_transformer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/config/validators/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/config/validators/options.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/logging.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/autocomplete/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/autocomplete/autocomplete_listener.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/common/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/common/jsonpath/JSONPathLexer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/common/jsonpath/JSONPathListener.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/common/jsonpath/JSONPathParser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/common/jsonpath/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/io/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/io/datasource.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/model/model.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/service/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/service/client.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/service/dispatcher.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/common/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/common/popup.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/common/selectable_text.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/autocomplete_popup/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/autocomplete_popup/autocomplete_popup.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/autocomplete_popup/autocomplete_popup_keymapper.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/help_bar/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/help_bar/help_bar.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/help_page/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/help_page/detailed_help_page.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/json_browser/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/json_browser/json_browser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/json_browser/json_browser_keymapper.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/query_bar/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/query_bar/query_bar.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/components/query_bar/query_bar_keymapper.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/array/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/array/array_end_node.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/array/array_end_widget.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/array/array_node.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/array/array_start_widget.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/array/array_unexpanded_widget.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/json_composite_end_node.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/json_composite_node.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/json_listbox.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/json_listwalker.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/json_simple_node.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/json_widget.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/node_factory.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/object/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/object/object_end_node.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/object/object_end_widget.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/object/object_node.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/object/object_start_widget.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/object/object_unexpanded_widget.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/primitive/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/primitive/base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/primitive/boolean.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/primitive/generic.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/primitive/integer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/primitive/null.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/primitive/numeric.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/primitive/string.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/json_lib/selector/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/keymapper/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/keymapper/abstract_component_keymapper.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/keymapper/keymapper.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/keymapper/keymapper_config.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/keymapper/keymapper_config_parser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/theme/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/theme/theme.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/theme/theme_config.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/theme/theme_config_parser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/view_config.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/view_frame.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pyfx/view/view_manager.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pynput_recorder.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pypi_inspection.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/pytorch_module_explorer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/refactor/string_format/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/refactor/string_format/format_to_fstring_converter.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/refactor/string_format/fstring_converter.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/refactor/string_format/test_format_to_fstring_converter.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/refactor/string_format/test_fstring_converter.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/rp_black_macchiato.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/stamp_tensor.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/stdin_python_highlighter.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/__main__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/graphics/graphics/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/graphics/graphics/canvas.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/graphics/graphics/colors.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/graphics/graphics/console.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/graphics/graphics/funcs.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/graphics/graphics/nbinput.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/graphics/graphics/shapes.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/graphics/graphics/sprite.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/letters.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tetris/tetrisShapes.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/__main__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/argparser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/meta.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/methods/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/methods/ansi.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/methods/ansi_methods.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/methods/ascii.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/methods/method.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/methods/sixel.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/timg/renderer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/torch_hooks.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/torch_tools.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tracetraptest.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/tweenline.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/libs/webeval_dataset.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/list_of_modules.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/Todo +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/blm.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/chainsaw.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/claude_panel.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/death_of_the_mind.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/flappy.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/mario.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/matrix.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/mpi_untitled.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/py2048.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/pychess.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/rp_logo.svg +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/rp_mpi.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/ryan_zshrc.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/shotgun.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/skia_trail_interactive_paint_demo.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/snake.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/sudoku.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/tetris.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/misc/trans.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/application.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/auto_suggest.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/buffer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/buffer_mapping.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/cache.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/clipboard/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/clipboard/base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/clipboard/in_memory.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/clipboard/pyperclip.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/completion.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/completers/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/completers/base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/completers/filesystem.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/completers/system.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/regular_languages/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/regular_languages/compiler.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/regular_languages/completion.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/regular_languages/lexer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/regular_languages/regex_parser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/regular_languages/validation.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/telnet/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/telnet/application.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/telnet/log.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/telnet/protocol.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/telnet/server.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/validators/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/contrib/validators/base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/document.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/enums.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/asyncio_base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/asyncio_posix.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/asyncio_win32.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/callbacks.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/inputhook.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/posix.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/posix_utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/select.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/eventloop/win32.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/filters/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/filters/base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/filters/cli.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/filters/types.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/filters/utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/history.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/input.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/interface.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/bindings/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/bindings/basic.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/bindings/completion.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/bindings/emacs.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/bindings/named_commands.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/bindings/scroll.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/bindings/vi.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/defaults.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/digraphs.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/input_processor.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/manager.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/registry.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/key_binding/vi_state.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/keys.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/containers.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/controls.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/dimension.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/lexers.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/margins.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/menus.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/mouse_handlers.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/processors.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/prompt.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/screen.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/toolbars.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/untitled.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/layout/utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/mouse_events.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/output.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/reactive.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/renderer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/search_state.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/selection.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/shortcuts.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/styles/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/styles/base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/styles/defaults.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/styles/from_dict.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/styles/from_pygments.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/styles/utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/terminal/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/terminal/conemu_output.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/terminal/vt100_input.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/terminal/vt100_output.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/terminal/win32_input.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/terminal/win32_output.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/token.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/validation.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/prompt_toolkit/win32_types.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/__main__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/ast_selection.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/async_analyzer_base.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/async_jedi_highlighter.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/backslash_commands.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/bash_extract.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/bash_inline.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/bash_rename.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/bash_selection.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/completer_old.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/completion_ranker.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/completion_types.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/eventloop.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/filters.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/history_browser.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/ipython.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/jedi_highlighter.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/jedi_lexer.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/jedi_utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/layout.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/patch_linecache.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/prompt_style.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/python_input.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/r_iterm_comm.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/refactor_extract.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/refactor_inline.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/refactor_move.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/refactor_rename.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/repl.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/__init__.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/commands.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/completers.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/completion_hints.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/grammar.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/key_bindings.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/layout.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/style.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/rp_ptpdb/toolbars.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/selection_utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/style.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/testable_keybindings.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/treesitter_selection.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/treesitter_semantic.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/utils.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/rp_ptpython/validator.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/ryan_vimrc.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp/web_evaluator.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp.egg-info/dependency_links.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp.egg-info/entry_points.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp.egg-info/requires.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/rp.egg-info/top_level.txt +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/setup.cfg +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/setup.py +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/untitled.c +0 -0
- {rp-0.1.1390 → rp-0.1.1392}/update_module_paths.py +0 -0
|
@@ -97,6 +97,14 @@ KEYBOARD SHORTCUTS:
|
|
|
97
97
|
⌃ z undo last action
|
|
98
98
|
⌃ y redo last undone action
|
|
99
99
|
⌥ ⌃ e Edit code with AI
|
|
100
|
+
REFACTORING:
|
|
101
|
+
⌃ r extract variable (requires selection: select expression, press ⌃r, type name, Enter)
|
|
102
|
+
⌃ n rename variable at cursor (place cursor on variable name, press ⌃n, type new name, Enter)
|
|
103
|
+
⌃ p inline variable at cursor (place cursor on assignment or usage, press ⌃p to inline)
|
|
104
|
+
< move element left in syntax tree (requires selection: select arg/element, press <)
|
|
105
|
+
> move element right in syntax tree (requires selection: select arg/element, press >)
|
|
106
|
+
⌥ ⇧ ↑ expand selection to larger AST node (select text, press to expand to parent node)
|
|
107
|
+
⌥ ⇧ ↓ contract selection to smaller AST node (select text, press to shrink to child node)
|
|
100
108
|
F1 enable/disable mouse mode
|
|
101
109
|
F4 toggle between Vi and Emacs mode
|
|
102
110
|
F5 save F2 menu settings (when sidebar is visible)
|
|
@@ -106,7 +114,6 @@ KEYBOARD SHORTCUTS:
|
|
|
106
114
|
LESS IMPORTANT AND MAYBE REMOVED IN FUTURE:
|
|
107
115
|
//While these keyboard shortcuts are kind of silly, I do find myself using them quite often
|
|
108
116
|
⌃ h inserts 'HISTORY'
|
|
109
|
-
⌃ p inserts 'PREV' (then 'NEXT', if pressed again)
|
|
110
117
|
⌃ u inserts 'UNDO'
|
|
111
118
|
⌥ m inserts 'MORE' (then 'MMORE', if pressed again)
|
|
112
119
|
⌥ s inserts 'self'
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Kitten TTS server.
|
|
3
|
+
Usage: python -m rp.libs.kitten_tts_server run_server [--port=32462]
|
|
4
|
+
python -m rp.libs.kitten_tts_server ensure_server [--port=32462]
|
|
5
|
+
"""
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
TMUX_SESSION = 'KittenTTS'
|
|
9
|
+
DEFAULT_PORT = 32462
|
|
10
|
+
|
|
11
|
+
def _get_port_from_tmux():
|
|
12
|
+
"""Get port from tmux window name if session exists and server is responding."""
|
|
13
|
+
import rp
|
|
14
|
+
if TMUX_SESSION not in rp.tmux_get_all_session_names():
|
|
15
|
+
return None
|
|
16
|
+
# Window name contains port
|
|
17
|
+
window_name = rp.shell_command('tmux list-windows -t ' + TMUX_SESSION + ' -F "#{window_name}" 2>/dev/null').strip().split('\n')[0]
|
|
18
|
+
try:
|
|
19
|
+
port = int(window_name)
|
|
20
|
+
except (ValueError, IndexError):
|
|
21
|
+
return None
|
|
22
|
+
# Check if responding
|
|
23
|
+
if rp.shell_command('curl -s -o /dev/null -w "%{http_code}" http://localhost:' + str(port) + '/ 2>/dev/null').strip() == '200':
|
|
24
|
+
return port
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
def ensure_server(port=DEFAULT_PORT):
|
|
28
|
+
"""Ensure server is running. Returns port."""
|
|
29
|
+
import rp
|
|
30
|
+
|
|
31
|
+
# Check if already running
|
|
32
|
+
existing_port = _get_port_from_tmux()
|
|
33
|
+
if existing_port:
|
|
34
|
+
return existing_port
|
|
35
|
+
|
|
36
|
+
# Kill stale session
|
|
37
|
+
if TMUX_SESSION in rp.tmux_get_all_session_names():
|
|
38
|
+
rp.tmux_kill_session(TMUX_SESSION)
|
|
39
|
+
|
|
40
|
+
# Find free port
|
|
41
|
+
port = rp.get_next_free_port(port)
|
|
42
|
+
|
|
43
|
+
# Start in tmux with window name = port
|
|
44
|
+
cmd = sys.executable + ' -m rp.libs.kitten_tts_server run_server --port=' + str(port)
|
|
45
|
+
rp.shell_command('tmux new-session -d -s ' + TMUX_SESSION + ' -n ' + str(port) + ' ' + rp.shlex.quote(cmd))
|
|
46
|
+
|
|
47
|
+
# Wait for ready
|
|
48
|
+
for _ in range(60):
|
|
49
|
+
if rp.shell_command('curl -s -o /dev/null -w "%{http_code}" http://localhost:' + str(port) + '/ 2>/dev/null').strip() == '200':
|
|
50
|
+
return port
|
|
51
|
+
rp.sleep(0.5)
|
|
52
|
+
|
|
53
|
+
raise RuntimeError('Kitten TTS server failed to start on port ' + str(port))
|
|
54
|
+
|
|
55
|
+
def run_server(port=DEFAULT_PORT):
|
|
56
|
+
"""Run the server (blocking)."""
|
|
57
|
+
import subprocess
|
|
58
|
+
# Install deps - need specific onnxruntime version for opset compatibility
|
|
59
|
+
subprocess.run([sys.executable, '-m', 'pip', 'install', '-q',
|
|
60
|
+
'https://github.com/KittenML/KittenTTS/releases/download/0.1/kittentts-0.1.0-py3-none-any.whl',
|
|
61
|
+
'fastapi', 'uvicorn', 'websockets', 'numpy', 'onnxruntime>=1.20'], stderr=subprocess.DEVNULL)
|
|
62
|
+
|
|
63
|
+
from fastapi import FastAPI, WebSocket, Query
|
|
64
|
+
from fastapi.responses import HTMLResponse
|
|
65
|
+
import uvicorn
|
|
66
|
+
from kittentts import KittenTTS
|
|
67
|
+
import numpy as np
|
|
68
|
+
|
|
69
|
+
app = FastAPI()
|
|
70
|
+
model = None
|
|
71
|
+
|
|
72
|
+
@app.on_event("startup")
|
|
73
|
+
async def load_model():
|
|
74
|
+
nonlocal model
|
|
75
|
+
print('[kitten_tts] Loading model...')
|
|
76
|
+
model = KittenTTS('KittenML/kitten-tts-nano-0.1')
|
|
77
|
+
print('[kitten_tts] Ready on port ' + str(port))
|
|
78
|
+
|
|
79
|
+
@app.get("/")
|
|
80
|
+
async def root():
|
|
81
|
+
return HTMLResponse('<h1>Kitten TTS</h1>')
|
|
82
|
+
|
|
83
|
+
@app.websocket("/stream")
|
|
84
|
+
async def stream_tts(
|
|
85
|
+
websocket: WebSocket,
|
|
86
|
+
text: str = Query(...),
|
|
87
|
+
voice: str = Query(default='expr-voice-3-f'),
|
|
88
|
+
speed: float = Query(default=1.0)
|
|
89
|
+
):
|
|
90
|
+
await websocket.accept()
|
|
91
|
+
try:
|
|
92
|
+
audio = model.generate(text, voice=voice, speed=speed)
|
|
93
|
+
audio_bytes = (audio * 32767).astype(np.int16).tobytes()
|
|
94
|
+
for i in range(0, len(audio_bytes), 9600):
|
|
95
|
+
await websocket.send_bytes(audio_bytes[i:i + 9600])
|
|
96
|
+
except Exception:
|
|
97
|
+
pass
|
|
98
|
+
await websocket.close()
|
|
99
|
+
|
|
100
|
+
uvicorn.run(app, host='0.0.0.0', port=port)
|
|
101
|
+
|
|
102
|
+
if __name__ == '__main__':
|
|
103
|
+
import rp
|
|
104
|
+
rp.pip_import('fire')
|
|
105
|
+
import fire
|
|
106
|
+
fire.Fire()
|
|
@@ -116,6 +116,9 @@ FOLDER_URL = "https://drive.google.com/drive/folders/{}"
|
|
|
116
116
|
# Upload cache path (same folder as token.json)
|
|
117
117
|
UPLOAD_CACHE_PATH = rp.with_file_name(TOKEN_PATH, "upload_cache.json", keep_extension=False)
|
|
118
118
|
|
|
119
|
+
# Cache modes: "off" (no cache), "copy" (server-side copy), "reuse" (direct URL reuse)
|
|
120
|
+
CACHE_MODES = {"off", "copy", "reuse"}
|
|
121
|
+
|
|
119
122
|
|
|
120
123
|
def _load_upload_cache() -> dict:
|
|
121
124
|
"""Load the upload cache from disk. Returns empty dict if not found."""
|
|
@@ -383,7 +386,7 @@ def upload_media_sequential(
|
|
|
383
386
|
service,
|
|
384
387
|
file_paths: list[str],
|
|
385
388
|
folder_id: str = None,
|
|
386
|
-
|
|
389
|
+
cache_mode: str = "copy",
|
|
387
390
|
) -> list[dict]:
|
|
388
391
|
"""Upload multiple media files sequentially with progress bars.
|
|
389
392
|
|
|
@@ -391,20 +394,30 @@ def upload_media_sequential(
|
|
|
391
394
|
service: Google Drive API service instance
|
|
392
395
|
file_paths: List of file paths to upload
|
|
393
396
|
folder_id: Destination folder ID on Google Drive
|
|
394
|
-
|
|
397
|
+
cache_mode: Cache behavior - "off", "copy", or "reuse" (bool also accepted)
|
|
395
398
|
|
|
396
399
|
Returns:
|
|
397
400
|
List of dicts with 'id', 'name', 'webViewLink', 'webContentLink', 'is_image'
|
|
398
401
|
"""
|
|
402
|
+
if cache_mode is True: cache_mode = "copy"
|
|
403
|
+
if cache_mode is False: cache_mode = "off"
|
|
404
|
+
if cache_mode not in CACHE_MODES:
|
|
405
|
+
raise ValueError(f"cache_mode must be one of {CACHE_MODES}, got {cache_mode!r}")
|
|
406
|
+
|
|
399
407
|
results = []
|
|
400
408
|
total_bytes = sum(rp.get_file_size(fp) for fp in file_paths)
|
|
401
409
|
uploaded_bytes = 0
|
|
402
410
|
start_time = time.time()
|
|
403
411
|
|
|
412
|
+
use_cache = cache_mode in ("copy", "reuse")
|
|
413
|
+
|
|
404
414
|
# Load cache if using it
|
|
405
415
|
cache = _load_upload_cache() if use_cache else {}
|
|
406
416
|
cache_modified = False
|
|
407
417
|
|
|
418
|
+
if cache_mode == "reuse":
|
|
419
|
+
rp.fansi_print(" [reuse mode] Using cached URLs directly (no copy)", "yellow", "bold")
|
|
420
|
+
|
|
408
421
|
for i, fp in enumerate(file_paths):
|
|
409
422
|
size = rp.get_file_size(fp)
|
|
410
423
|
elapsed = time.time() - start_time
|
|
@@ -417,23 +430,29 @@ def upload_media_sequential(
|
|
|
417
430
|
# Check cache for this file
|
|
418
431
|
if use_cache and file_hash in cache:
|
|
419
432
|
cached = cache[file_hash]
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
433
|
+
if cache_mode == "reuse":
|
|
434
|
+
# Reuse cached entry directly - no copy, no API call
|
|
435
|
+
rp.fansi_print(f" {file_name}: reusing cached URL", "yellow")
|
|
436
|
+
cache_result = cached
|
|
437
|
+
rp.fansi_print(f" Reused: {result['webViewLink']}", "green")
|
|
438
|
+
else:
|
|
439
|
+
# Copy mode - server-side copy to new folder
|
|
440
|
+
rp.fansi_print(f" {file_name}: cache hit, copying...", "yellow")
|
|
441
|
+
copy_result = copy_drive_file(
|
|
442
|
+
service,
|
|
443
|
+
cached["id"],
|
|
444
|
+
folder_id,
|
|
445
|
+
new_name=file_name,
|
|
446
|
+
)
|
|
447
|
+
cache_result=copy_result
|
|
448
|
+
rp.fansi_print(f" Copied: {result['webViewLink']}", "green")
|
|
429
449
|
result = {
|
|
430
|
-
"id":
|
|
431
|
-
"name":
|
|
432
|
-
"webViewLink":
|
|
433
|
-
"webContentLink":
|
|
450
|
+
"id": cache_result["id"],
|
|
451
|
+
"name": cache_result["name"],
|
|
452
|
+
"webViewLink": cache_result["webViewLink"],
|
|
453
|
+
"webContentLink": cache_result["webContentLink"],
|
|
434
454
|
"is_image": cached["is_image"],
|
|
435
455
|
}
|
|
436
|
-
rp.fansi_print(f" Copied: {result['webViewLink']}", "green")
|
|
437
456
|
else:
|
|
438
457
|
# Upload normally
|
|
439
458
|
pbar = tqdm(
|
|
@@ -455,8 +474,8 @@ def upload_media_sequential(
|
|
|
455
474
|
pbar.close()
|
|
456
475
|
rp.fansi_print(f" Uploaded: {result['webViewLink']}", "green")
|
|
457
476
|
|
|
458
|
-
# Add to cache
|
|
459
|
-
if
|
|
477
|
+
# Add to cache (only for copy/reuse modes, not off)
|
|
478
|
+
if cache_mode != "off" and file_hash:
|
|
460
479
|
cache[file_hash] = {
|
|
461
480
|
"id": result["id"],
|
|
462
481
|
"name": result["name"],
|
|
@@ -953,7 +972,7 @@ def create_slides_with_media_grid(
|
|
|
953
972
|
}
|
|
954
973
|
)
|
|
955
974
|
|
|
956
|
-
if labels and media_idx < len(labels):
|
|
975
|
+
if labels and media_idx < len(labels) and labels[media_idx]:
|
|
957
976
|
requests.extend(
|
|
958
977
|
_text_element_requests(
|
|
959
978
|
f"label_{media_counter}",
|
|
@@ -1036,7 +1055,8 @@ def media_to_slides(
|
|
|
1036
1055
|
label_color=None,
|
|
1037
1056
|
autoplay: bool = True,
|
|
1038
1057
|
navbar: bool = False,
|
|
1039
|
-
|
|
1058
|
+
cache_mode: str = "copy",
|
|
1059
|
+
show_folder_size: bool = True,
|
|
1040
1060
|
) -> dict:
|
|
1041
1061
|
"""
|
|
1042
1062
|
Upload media files (videos/images) and create a Google Slides presentation.
|
|
@@ -1065,7 +1085,12 @@ def media_to_slides(
|
|
|
1065
1085
|
label_color: Label color. Default: same as text_color.
|
|
1066
1086
|
autoplay (bool): Whether videos autoplay when the slide is shown. Default: True.
|
|
1067
1087
|
navbar (bool): Whether to add prev/next navigation buttons. Default: False.
|
|
1068
|
-
|
|
1088
|
+
cache_mode (str): How to handle previously uploaded files. Default: "copy".
|
|
1089
|
+
- "off": Always upload fresh (no caching)
|
|
1090
|
+
- "copy": Server-side copy of cached files to new folder (safe, isolated)
|
|
1091
|
+
- "reuse": Directly reuse cached URLs (fastest, but shared references)
|
|
1092
|
+
show_folder_size (bool): If True (default), append total file size to folder name.
|
|
1093
|
+
Useful because Google Drive doesn't show folder sizes. Default: True.
|
|
1069
1094
|
|
|
1070
1095
|
Returns:
|
|
1071
1096
|
dict: {'folder_id', 'folder_url', 'media', 'presentation': {'id', 'url', 'public_url', 'name'}}
|
|
@@ -1112,9 +1137,22 @@ def media_to_slides(
|
|
|
1112
1137
|
|
|
1113
1138
|
# Create folder if we have media files OR navbar (need to upload nav button images)
|
|
1114
1139
|
if media_paths or navbar:
|
|
1115
|
-
|
|
1140
|
+
# Append total file size to folder name (Google Drive doesn't show folder sizes)
|
|
1141
|
+
# In reuse mode, only count files that will actually be uploaded (cache misses)
|
|
1142
|
+
display_folder_name = folder_name
|
|
1143
|
+
if show_folder_size and media_paths:
|
|
1144
|
+
if cache_mode == "reuse":
|
|
1145
|
+
cache = _load_upload_cache()
|
|
1146
|
+
sizes = [rp.get_file_size(p) for p in media_paths if rp.get_sha256_hash(p) not in cache]
|
|
1147
|
+
else:
|
|
1148
|
+
sizes = rp.get_file_sizes(*media_paths)
|
|
1149
|
+
if sizes:
|
|
1150
|
+
total_size = sum(sizes)
|
|
1151
|
+
size_str = rp.human_readable_file_size(total_size, mib=False)
|
|
1152
|
+
display_folder_name = f"{folder_name} ({size_str})"
|
|
1153
|
+
rp.fansi_print(f"\nCreating folder: rp/generated_slides/{display_folder_name}", "cyan")
|
|
1116
1154
|
parent_id = get_rp_slides_folder(drive_service)
|
|
1117
|
-
folder_id = create_folder(drive_service,
|
|
1155
|
+
folder_id = create_folder(drive_service, display_folder_name, parent_id)
|
|
1118
1156
|
folder_url = FOLDER_URL.format(folder_id)
|
|
1119
1157
|
rp.fansi_print(f" {folder_url}", "white")
|
|
1120
1158
|
|
|
@@ -1129,17 +1167,19 @@ def media_to_slides(
|
|
|
1129
1167
|
rp.fansi_print(f" {rp.get_file_name(p)}", "white")
|
|
1130
1168
|
|
|
1131
1169
|
rp.fansi_print("\nUploading media...", "cyan")
|
|
1132
|
-
media = upload_media_sequential(drive_service, media_paths, folder_id,
|
|
1170
|
+
media = upload_media_sequential(drive_service, media_paths, folder_id, cache_mode=cache_mode)
|
|
1133
1171
|
|
|
1134
1172
|
path_to_media = dict(zip(media_paths, media))
|
|
1135
1173
|
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1174
|
+
# Skip permissions for reuse mode - cached files are already public
|
|
1175
|
+
if cache_mode != "reuse":
|
|
1176
|
+
rp.fansi_print("\nMaking files publicly accessible...", "cyan")
|
|
1177
|
+
start_time = time.time()
|
|
1178
|
+
for i, m in enumerate(media):
|
|
1179
|
+
elapsed = time.time() - start_time
|
|
1180
|
+
progress_str = _format_progress(i + 1, len(media), i, len(media), elapsed, use_bytes=False)
|
|
1181
|
+
rp.fansi_print(f" {progress_str} {m['name']}", "cyan")
|
|
1182
|
+
make_file_public(drive_service, m["id"])
|
|
1143
1183
|
|
|
1144
1184
|
# Build slides_data - each content item becomes either media or text box
|
|
1145
1185
|
slides_data = []
|
|
@@ -1270,7 +1310,8 @@ def cli(
|
|
|
1270
1310
|
per_slide: int = None,
|
|
1271
1311
|
autoplay: bool = True,
|
|
1272
1312
|
navbar: bool = False,
|
|
1273
|
-
|
|
1313
|
+
cache_mode: str = "copy",
|
|
1314
|
+
show_folder_size: bool = True,
|
|
1274
1315
|
):
|
|
1275
1316
|
"""Upload media to Google Drive and create a Google Slides presentation.
|
|
1276
1317
|
|
|
@@ -1295,11 +1336,24 @@ def cli(
|
|
|
1295
1336
|
--label_size SIZE Label font size in pt (default: same as --text_size)
|
|
1296
1337
|
--label_font FONT Label font family (default: same as --text_font)
|
|
1297
1338
|
--label_color COLOR Label color (default: same as --text_color)
|
|
1298
|
-
--sort_by METHOD Sort files by: 'name' (default), 'date', 'size', 'number'
|
|
1339
|
+
--sort_by METHOD Sort files by: 'name' (default), 'date', 'size', 'number'.
|
|
1340
|
+
Only applies to folders and glob patterns; individual files
|
|
1341
|
+
keep the order you specify them.
|
|
1299
1342
|
--per_slide N Items per slide (optional, default: 1)
|
|
1300
1343
|
--autoplay Enable video autoplay (default: True). Use --noautoplay to disable.
|
|
1301
1344
|
--navbar Add prev/next navigation buttons (default: False)
|
|
1302
|
-
--
|
|
1345
|
+
--cache_mode MODE How to handle previously uploaded files (default: 'copy'):
|
|
1346
|
+
'off' - No caching, always upload fresh
|
|
1347
|
+
'copy' - Copy cached files to new folder (safe, each presentation isolated)
|
|
1348
|
+
'reuse' - Reuse cached URLs directly (fastest, saves Drive storage)
|
|
1349
|
+
Benefits of 'reuse': Faster uploads, reduced Google Drive storage usage.
|
|
1350
|
+
Risks of 'reuse': If the cached file's source folder is deleted, this
|
|
1351
|
+
presentation's media will break. Only use for temporary presentations
|
|
1352
|
+
or when you're sure the source media won't be deleted.
|
|
1353
|
+
--show_folder_size Append total file size to folder name (default: True).
|
|
1354
|
+
Google Drive doesn't show folder sizes, so this helps track storage.
|
|
1355
|
+
In 'reuse' mode, only counts cache misses (files actually uploaded).
|
|
1356
|
+
Use --noshow_folder_size to disable.
|
|
1303
1357
|
|
|
1304
1358
|
Supported formats:
|
|
1305
1359
|
Videos: .mp4, .mov, .avi, .mkv, .webm
|
|
@@ -1315,7 +1369,8 @@ def cli(
|
|
|
1315
1369
|
rp run ppt media_to_slides "Big text" --text_size 36 # larger text
|
|
1316
1370
|
rp run ppt media_to_slides videos/ --noautoplay # disable video autoplay
|
|
1317
1371
|
rp run ppt media_to_slides videos/ --navbar # add prev/next buttons
|
|
1318
|
-
rp run ppt media_to_slides videos/ --
|
|
1372
|
+
rp run ppt media_to_slides videos/ --cache_mode off # force re-upload all files
|
|
1373
|
+
rp run ppt media_to_slides videos/ --cache_mode reuse # fastest, reuse cached URLs
|
|
1319
1374
|
|
|
1320
1375
|
Note: First run opens browser for Google OAuth authentication.
|
|
1321
1376
|
"""
|
|
@@ -1378,7 +1433,8 @@ def cli(
|
|
|
1378
1433
|
text_color=text_color,
|
|
1379
1434
|
autoplay=autoplay,
|
|
1380
1435
|
navbar=navbar,
|
|
1381
|
-
|
|
1436
|
+
cache_mode=cache_mode,
|
|
1437
|
+
show_folder_size=show_folder_size,
|
|
1382
1438
|
)
|
|
1383
1439
|
print(f"\nPresentation URL: {result['presentation']['url']}")
|
|
1384
1440
|
return result
|