Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 38 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,21 +135,23 @@ pre-commit install
### Plugin architecture
```mermaid
classDiagram
TCodeRunner "1" o--> "1" IConfigManager : aggregates
TCodeRunner "1" o--> "1" IConfig : aggregates
TCodeRunner "1" o--> "1" ICommandsExecutor : aggregates
TCodeRunner "1" o--> "1" IMessagePrinter : aggregates
TCodeRunner "1" o--> "1" TBasicEditorServiceForCodeRunner : aggregates
TCodeRunner "1" o--> "1" TBasicCommandDispatcherStrategySelector : aggregates
IConfigManager "1" o--> "1" IConfigGetter : aggregates
IConfigManager "1" o--> "1" TBasicConfigValidator : aggregates
TBasicConfig ..|> IConfig : implements
TBasicConfig "1" o--> "n" TConfigField : aggregates
TConfigField "1" o--> "1" IConfigValueGetter : aggregates
TConfigField "1" o--> "1" IValidator : aggregates
TBasicEditorServiceForCodeRunner "1" o--> "1" IEditor : aggregates
TBasicEditorServiceForCodeRunner "1" o--> "1" IConfigManager : aggregates
ICommandsExecutor "1" o--> "1" IConfigManager : aggregates
TBasicEditorServiceForCodeRunner "1" o--> "1" IConfig : aggregates
ICommandsExecutor "1" o--> "1" IConfig : aggregates
TBasicCommandDispatcherStrategySelector "1" o--> "1" TShebangCommandBuildersDispatcher : aggregates
TBasicCommandDispatcherStrategySelector "1" o--> "1" TGlobCommandBuildersDispatcher : aggregates
TBasicCommandDispatcherStrategySelector "1" o--> "1" TFileExtCommandBuildersDispatcher : aggregates
TBasicCommandDispatcherStrategySelector "1" o--> "1" TFileTypeCommandBuildersDispatcher : aggregates
TBasicCommandDispatcherStrategySelector "1" o--> "1" IConfigManager : aggregates
TBasicCommandDispatcherStrategySelector "1" o--> "1" IConfig : aggregates
TShebangCommandBuildersDispatcher ..|> ICommandBuildersDispatcher : implements
TShebangCommandBuildersDispatcher "1" o--> "1" IFileInfoExtractor : aggregates
TGlobCommandBuildersDispatcher ..|> ICommandBuildersDispatcher : implements
Expand All @@ -166,7 +168,7 @@ TBaseFileInfoExtractor ..|> IFileInfoExtractor : implements


class TCodeRunner {
# config_manager: IConfigManager
# config: IConfig
# editor_service: TBasicEditorServiceForCodeRunner
# command_dispatcher_strategy_selector: TBasicCommandDispatcherStrategySelector
# commands_executor: ICommandsExecutor
Expand All @@ -180,40 +182,48 @@ class TCodeRunner {
}



class IConfigManager {
class IConfig {
<<interface>>
+ get_dispatchers_order() list[str]
+ get_by_file_ext() Dict[str, str]
+ get_by_file_type() Dict[str, str]
+ get_by_glob() Dict[str, str]
+ get_dispatchers_order() List[EDispatchersTypes]
+ get_coderunner_tempfile_prefix() str
+ get_executor() str
+ get_ignore_selection() bool
+ get_respect_shebang() bool
+ get_save_all_files() bool
+ get_save_file() bool
+ get_remove_coderunner_tempfiles_on_exit() bool
+ get_save_all_files_before_run() bool
+ get_save_file_before_run() bool
}


class IConfigGetter {
<<interface>>
+ get_dispatchers_order() Any
+ get_executor() Any
+ get_ignore_selection() Any
+ get_respect_shebang() Any
+ get_save_all_files() Any
+ get_save_file() Any
class TConfigField {
# name: str
# getter: IConfigValueGetter
# validator: IValidator
# allowed_values_description: str
+ get() ValueType
}


class IConfigValueGetter {
<<interface>>
+ __call__() Any
}


class TBasicConfigValidator {
+ validate_bool() bool
+ validate_str() str
+ validate_dispatcher() Dict[str, str]
+ validate_dispatchers_order() List[EDispatchersTypes]
class IValidator {
<<interface>>
+ __call__(value: Any) ValueType

}


class TBasicEditorServiceForCodeRunner {
# editor: IEditor
# config_manager: IConfigManager
# config:IConfig
# file_info_extractor: IFileInfoExtractor
Creates context which will delete file if it's temporary
+ get_file_for_run() Context[str]
Runs save_file or save_all_files if the command_builder is found,
Expand All @@ -240,13 +250,14 @@ class ICommandsExecutor {


class IMessagePrinter {
<<interface>>
+ info(text: str) None
+ error(text: str) None
}


class TBasicCommandDispatcherStrategySelector {
# config_manager: IConfigManager
# config: IConfig
# shebang_dispatcher: TShebangCommandBuildersDispatcher
# file_type_dispatcher: TFileExtCommandBuildersDispatcher
# file_ext_dispatcher: TFileTypeCommandBuildersDispatcher
Expand Down
1 change: 1 addition & 0 deletions python_coderunner/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ disable = [
"too-few-public-methods",
"too-many-arguments",
"too-many-positional-arguments",
"too-many-instance-attributes",
"raise-missing-from",
"line-too-long",
]
Expand Down
8 changes: 4 additions & 4 deletions python_coderunner/src/coderunner/coderunner.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
TBasicCommandDispatcherStrategySelector,
)
from ..commands_executor import ICommandsExecutor
from ..config_manager import TBasicConfigManager
from ..config import IConfig
from ..editor_service_for_coderunner import TBasicEditorServiceForCodeRunner
from ..message_printer import IMessagePrinter

Expand All @@ -14,13 +14,13 @@ class TCodeRunner:
def __init__(
self,
*,
config_manager: TBasicConfigManager,
config: IConfig,
editor_service: TBasicEditorServiceForCodeRunner,
command_dispatcher_strategy_selector: TBasicCommandDispatcherStrategySelector,
commands_executor: ICommandsExecutor,
message_printer: IMessagePrinter,
):
self._config_manager: TBasicConfigManager = config_manager
self._config: IConfig = config
self._editor_service: TBasicEditorServiceForCodeRunner = editor_service
self._command_dispatcher_strategy_selector: TBasicCommandDispatcherStrategySelector = (
command_dispatcher_strategy_selector
Expand Down Expand Up @@ -53,5 +53,5 @@ def remove_coderunner_tempfiles(self) -> None:
self._editor_service.remove_coderunner_tempfiles()

def on_exit(self) -> None:
if self._config_manager.get_remove_coderunner_tempfiles_on_exit():
if self._config.get_remove_coderunner_tempfiles_on_exit():
self.remove_coderunner_tempfiles()
131 changes: 105 additions & 26 deletions python_coderunner/src/coderunner_factory/vim_coderunner_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,25 @@
TBasicCommandDispatcherStrategySelector,
)
from ..commands_executor import TVimCommandsExecutor
from ..config_manager import (
TBasicConfigValidator,
TVimConfigGetter,
TVimConfigManager,
from ..config import EDispatchersTypes, TConfigField, TVimConfig
from ..config.getter import (
TVimByFileExtConfigValueGetter,
TVimByFileTypeConfigValueGetter,
TVimByGlobConfigValueGetter,
TVimCoderunnerTempfilePrefixConfigValueGetter,
TVimDispatchersOrderConfigValueGetter,
TVimExecutorConfigValueGetter,
TVimIgnoreSelectionConfigValueGetter,
TVimRemoveCoderunnerTempfilesOnExitConfigValueGetter,
TVimRespectShebangConfigValueGetter,
TVimSaveAllFilesBeforeRunConfigValueGetter,
TVimSaveFileBeforeRunConfigValueGetter,
)
from ..config.validator import (
TBoolValidator,
TDispatchersOrderValidator,
TDispatchersValidator,
TStrValidator,
)
from ..editor import TVimEditor
from ..editor_service_for_coderunner import TBasicEditorServiceForCodeRunner
Expand All @@ -29,7 +44,7 @@

class TVimCodeRunnerFactory(ICodeRunnerFactory):
def create(self) -> Optional[TCodeRunner]:
config_manager: TVimConfigManager = TVimConfigManager(TVimConfigGetter(), TBasicConfigValidator())
config: TVimConfig = self._create_config()
message_printer: TVimMessagePrinter = TVimMessagePrinter()

try:
Expand All @@ -38,18 +53,16 @@ def create(self) -> Optional[TCodeRunner]:

editor: TVimEditor = TVimEditor()
editor_service_for_coderunner: TBasicEditorServiceForCodeRunner = TBasicEditorServiceForCodeRunner(
config_manager, editor, file_info_extractor
config, editor, file_info_extractor
)

command_dispatcher_strategy_selector: TBasicCommandDispatcherStrategySelector = (
self._create_command_dispatcher_strategy_selector(
config_manager, file_info_extractor, project_info_extractor
)
self._create_command_dispatcher_strategy_selector(config, file_info_extractor, project_info_extractor)
)
commands_executor: TVimCommandsExecutor = TVimCommandsExecutor(config_manager)
commands_executor: TVimCommandsExecutor = TVimCommandsExecutor(config)

return TCodeRunner(
config_manager=config_manager,
config=config,
editor_service=editor_service_for_coderunner,
command_dispatcher_strategy_selector=command_dispatcher_strategy_selector,
commands_executor=commands_executor,
Expand All @@ -61,72 +74,138 @@ def create(self) -> Optional[TCodeRunner]:

return None

def _create_config(self) -> TVimConfig:
return TVimConfig(
by_file_ext_field=TConfigField(
name="g:coderunner_by_file_ext",
getter=TVimByFileExtConfigValueGetter(),
validator=TDispatchersValidator(),
allowed_values_description="Dict[str, str] value",
),
by_file_type_field=TConfigField(
name="g:coderunner_by_file_type",
getter=TVimByFileTypeConfigValueGetter(),
validator=TDispatchersValidator(),
allowed_values_description="Dict[str, str] value",
),
by_glob_field=TConfigField(
name="g:coderunner_by_glob",
getter=TVimByGlobConfigValueGetter(),
validator=TDispatchersValidator(),
allowed_values_description="Dict[str, str] value",
),
dispatchers_order_field=TConfigField(
name="g:coderunner_runners_order",
getter=TVimDispatchersOrderConfigValueGetter(),
validator=TDispatchersOrderValidator(),
allowed_values_description=", ".join(dispatcher_type.value for dispatcher_type in EDispatchersTypes),
),
coderunner_tempfile_prefix_field=TConfigField(
name="g:coderunner_tempfile_prefix",
getter=TVimCoderunnerTempfilePrefixConfigValueGetter(),
validator=TStrValidator(),
allowed_values_description="str value",
),
executor_field=TConfigField(
name="g:coderunner_executor",
getter=TVimExecutorConfigValueGetter(),
validator=TStrValidator(),
allowed_values_description="str value",
),
ignore_selection_field=TConfigField(
name="g:coderunner_ignore_selection",
getter=TVimIgnoreSelectionConfigValueGetter(),
validator=TBoolValidator(),
allowed_values_description="0 or 1",
),
respect_shebang_field=TConfigField(
name="g:coderunner_respect_shebang",
getter=TVimRespectShebangConfigValueGetter(),
validator=TBoolValidator(),
allowed_values_description="0 or 1",
),
remove_coderunner_tempfiles_on_exit_field=TConfigField(
name="g:coderunner_remove_coderunner_tempfiles_on_exit",
getter=TVimRemoveCoderunnerTempfilesOnExitConfigValueGetter(),
validator=TBoolValidator(),
allowed_values_description="0 or 1",
),
save_all_files_before_run_field=TConfigField(
name="g:coderunner_save_all_files_before_run",
getter=TVimSaveAllFilesBeforeRunConfigValueGetter(),
validator=TBoolValidator(),
allowed_values_description="0 or 1",
),
save_file_before_run_field=TConfigField(
name="g:coderunner_save_file_before_run",
getter=TVimSaveFileBeforeRunConfigValueGetter(),
validator=TBoolValidator(),
allowed_values_description="0 or 1",
),
)

def _create_command_dispatcher_strategy_selector(
self,
config_manager: TVimConfigManager,
config: TVimConfig,
file_info_extractor: TVimFileInfoExtractor,
project_info_extractor: TVimProjectInfoExtractor,
) -> TBasicCommandDispatcherStrategySelector:
shebang_command_builders_dispatcher: TShebangCommandBuildersDispatcher = TShebangCommandBuildersDispatcher(
file_info_extractor
)
file_ext_command_builders_dispatcher: TFileExtCommandBuildersDispatcher = (
self._create_file_ext_command_builders_dispatcher(
config_manager, file_info_extractor, project_info_extractor
)
self._create_file_ext_command_builders_dispatcher(config, file_info_extractor, project_info_extractor)
)
file_type_command_builders_dispatcher: TFileTypeCommandBuildersDispatcher = (
self._create_file_type_command_builders_dispatcher(
config_manager, file_info_extractor, project_info_extractor
)
self._create_file_type_command_builders_dispatcher(config, file_info_extractor, project_info_extractor)
)
glob_command_builders_dispatcher: TGlobCommandBuildersDispatcher = (
self._create_glob_command_builders_dispatcher(config_manager, file_info_extractor, project_info_extractor)
self._create_glob_command_builders_dispatcher(config, file_info_extractor, project_info_extractor)
)

return TBasicCommandDispatcherStrategySelector(
config=config,
shebang_command_builders_dispatcher=shebang_command_builders_dispatcher,
glob_command_builders_dispatcher=glob_command_builders_dispatcher,
file_ext_command_builders_dispatcher=file_ext_command_builders_dispatcher,
file_type_command_builders_dispatcher=file_type_command_builders_dispatcher,
config_manager=config_manager,
)

def _create_file_ext_command_builders_dispatcher(
self,
config_manager: TVimConfigManager,
config: TVimConfig,
file_info_extractor: TVimFileInfoExtractor,
project_info_extractor: TVimProjectInfoExtractor,
) -> TFileExtCommandBuildersDispatcher:
return TFileExtCommandBuildersDispatcher(
{
key: TInterpolatorCommandBuilder(val, project_info_extractor, file_info_extractor)
for key, val in config_manager.get_by_file_ext().items()
for key, val in config.get_by_file_ext().items()
},
file_info_extractor,
)

def _create_file_type_command_builders_dispatcher(
self,
config_manager: TVimConfigManager,
config: TVimConfig,
file_info_extractor: TVimFileInfoExtractor,
project_info_extractor: TVimProjectInfoExtractor,
) -> TFileTypeCommandBuildersDispatcher:
return TFileTypeCommandBuildersDispatcher(
{
key: TInterpolatorCommandBuilder(val, project_info_extractor, file_info_extractor)
for key, val in config_manager.get_by_file_type().items()
for key, val in config.get_by_file_type().items()
},
file_info_extractor,
)

def _create_glob_command_builders_dispatcher(
self,
config_manager: TVimConfigManager,
config: TVimConfig,
file_info_extractor: TVimFileInfoExtractor,
project_info_extractor: TVimProjectInfoExtractor,
) -> TGlobCommandBuildersDispatcher:
dict_with_commands: Dict[str, str] = config_manager.get_by_glob()
dict_with_commands: Dict[str, str] = config.get_by_glob()
return TGlobCommandBuildersDispatcher(
tuple(
(
Expand Down
Loading