def test_create_new_project_creates_project_directory() -> None: project_path = Path.cwd() / "Python Project" project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(project_path, QCLanguage.Python) assert project_path.is_dir()
def test_create_new_project_copies_ssh_keys_to_global_config_dir() -> None: project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(Path.cwd() / "CSharp Project", QCLanguage.CSharp) for name in ["key", "key.pub", "README.md"]: assert Path(f"~/.lean/ssh/{name}").expanduser().is_file()
def test_create_new_project_does_not_update_pycharm_jdk_table_when_jdk_entry_already_set( system: mock.Mock, editor: str, os: str, path: str) -> None: system.return_value = os jdk_table = """ <application> <component name="ProjectJdkTable"> <jdk version="2"> <name value="Lean CLI" /> </jdk> </component> </application> """ jdk_table_file = Path( path).expanduser() / f"{editor}2020.3" / "options" / "jdk.table.xml" jdk_table_file.parent.mkdir(parents=True, exist_ok=True) with jdk_table_file.open("w+", encoding="utf-8") as file: file.write(jdk_table) project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(Path.cwd() / "Python Project", QCLanguage.Python) assert jdk_table_file.read_text(encoding="utf-8") == jdk_table
def test_find_algorithm_file_returns_main_cs_when_input_directory_contains_it( ) -> None: create_fake_lean_cli_directory() project_manager = ProjectManager(ProjectConfigManager()) result = project_manager.find_algorithm_file(Path.cwd() / "CSharp Project") assert result == Path.cwd() / "CSharp Project" / "Main.cs"
def test_find_algorithm_file_returns_input_when_input_is_file() -> None: create_fake_lean_cli_directory() project_manager = ProjectManager(ProjectConfigManager()) result = project_manager.find_algorithm_file(Path.cwd() / "Python Project" / "main.py") assert result == Path.cwd() / "Python Project" / "main.py"
def test_create_new_project_sets_description_in_project_config() -> None: project_path = Path.cwd() / "Python Project" project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(project_path, QCLanguage.Python) config = Storage(str(project_path / "config.json")) assert config.get("description") == ""
def test_find_algorithm_file_raises_error_when_no_algorithm_file_exists( ) -> None: create_fake_lean_cli_directory() (Path.cwd() / "Empty Project").mkdir() project_manager = ProjectManager(ProjectConfigManager()) with pytest.raises(Exception): project_manager.find_algorithm_file(Path.cwd() / "Empty Project")
def test_create_new_project_sets_language_in_project_config( language: QCLanguage) -> None: project_path = Path.cwd() / f"{language.name} Project" project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(project_path, language) config = Storage(str(project_path / "config.json")) assert config.get("algorithm-language") == language.name
def test_create_new_project_creates_valid_csharp_editor_configs( file: str, validator: Callable[[str], bool]) -> None: project_path = Path.cwd() / "CSharp Project" project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(project_path, QCLanguage.CSharp) assert (project_path / file).is_file() with open(project_path / file) as f: assert validator(f.read())
def test_update_last_modified_time_updates_file_properties() -> None: local_file = Path.cwd() / "file.txt" local_file.touch() new_timestamp = datetime(2020, 1, 1, 1, 1, 1) project_manager = ProjectManager(ProjectConfigManager()) project_manager.update_last_modified_time(local_file, new_timestamp) timestamp = local_file.stat().st_mtime_ns / 1e9 timestamp = datetime.fromtimestamp(timestamp) assert timestamp.astimezone(tz=timezone.utc).replace( tzinfo=None) == new_timestamp
def test_get_files_to_sync_ignores_generated_source_files( directory: str) -> None: project_path = Path.cwd() / "My Project" project_path.mkdir() files = [project_path / "main.py", project_path / directory / "main.py"] for file in files: file.mkdir(parents=True, exist_ok=True) file.touch() project_manager = ProjectManager(ProjectConfigManager()) files_to_sync = project_manager.get_files_to_sync(project_path) assert files_to_sync == [files[0]]
def test_create_new_project_creates_pycharm_jdk_entry_when_pycharm_not_installed_yet( system: mock.Mock, editor: str, os: str, path: str) -> None: system.return_value = os project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(Path.cwd() / "Python Project", QCLanguage.Python) jdk_table_file = Path( path).expanduser() / editor / "options" / "jdk.table.xml" assert jdk_table_file.is_file() jdk_table = ElementTree.fromstring( jdk_table_file.read_text(encoding="utf-8")) assert jdk_table.find(".//jdk/name[@value='Lean CLI']") is not None
def create_lean_runner(docker_manager: mock.Mock) -> LeanRunner: logger = mock.Mock() logger.debug_logging_enabled = False cli_config_manager = mock.Mock() cli_config_manager.user_id.get_value.return_value = "123" cli_config_manager.api_token.get_value.return_value = "456" project_config_manager = ProjectConfigManager(XMLManager()) cache_storage = Storage(str(Path("~/.lean/cache").expanduser())) lean_config_manager = LeanConfigManager(logger, cli_config_manager, project_config_manager, mock.Mock(), cache_storage) output_config_manager = OutputConfigManager(lean_config_manager) module_manager = mock.Mock() module_manager.get_installed_packages.return_value = [ NuGetPackage(name="QuantConnect.Brokerages", version="1.0.0") ] xml_manager = XMLManager() project_manager = ProjectManager(project_config_manager, lean_config_manager, xml_manager, PlatformManager()) return LeanRunner(logger, project_config_manager, lean_config_manager, output_config_manager, docker_manager, module_manager, project_manager, TempManager(), xml_manager)
def test_get_files_to_sync_returns_all_source_files() -> None: project_path = Path.cwd() / "My Project" project_path.mkdir() files = [ "Main.cs", "main.py", "research.ipynb", "path/to/Alpha.cs", "path/to/alpha.py" ] files = [project_path / file for file in files] for file in files: file.mkdir(parents=True, exist_ok=True) file.touch() project_manager = ProjectManager(ProjectConfigManager()) files_to_sync = project_manager.get_files_to_sync(project_path) assert sorted(files_to_sync) == sorted(files)
def _create_project_manager() -> ProjectManager: xml_manager = XMLManager() project_config_manager = ProjectConfigManager(xml_manager) cache_storage = Storage(str(Path("~/.lean/cache").expanduser())) return ProjectManager( project_config_manager, LeanConfigManager(mock.Mock(), mock.Mock(), project_config_manager, mock.Mock(), cache_storage), xml_manager, PlatformManager())
def test_create_new_project_creates_rider_debugger_config_when_rider_not_installed_yet( system: mock.Mock, os: str, path: str) -> None: system.return_value = os key_path = Path("~/.lean/ssh/key").expanduser() project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(Path.cwd() / "CSharp Project", QCLanguage.CSharp) debugger_file = Path( path).expanduser() / "Rider" / "options" / "debugger.xml" assert debugger_file.is_file() debugger_root = ElementTree.fromstring( debugger_file.read_text(encoding="utf-8")) assert debugger_root.find( f".//option/option[@value='<credentials HOST=\"localhost\" PORT=\"2222\" USERNAME=\"root\" PRIVATE_KEY_FILE=\"{key_path.as_posix()}\" USE_KEY_PAIR=\"true\" USE_AUTH_AGENT=\"false\" />']" ) is not None
def test_create_new_project_creates_pycharm_jdk_entry_when_not_set_yet( system: mock.Mock, editor: str, os: str, path: str) -> None: system.return_value = os jdk_table_file = Path( path).expanduser() / f"{editor}2020.3" / "options" / "jdk.table.xml" jdk_table_file.parent.mkdir(parents=True, exist_ok=True) with jdk_table_file.open("w+", encoding="utf-8") as file: file.write(""" <application> <component name="ProjectJdkTable"> </component> </application> """) project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(Path.cwd() / "Python Project", QCLanguage.Python) jdk_table = ElementTree.fromstring( jdk_table_file.read_text(encoding="utf-8")) assert jdk_table.find(".//jdk/name[@value='Lean CLI']") is not None
def test_create_new_project_creates_rider_debugger_entry_when_not_set_yet( system: mock.Mock, os: str, path: str) -> None: system.return_value = os key_path = Path("~/.lean/ssh/key").expanduser() debugger_file = Path( path).expanduser() / "Rider" / "options" / "debugger.xml" debugger_file.parent.mkdir(parents=True, exist_ok=True) with debugger_file.open("w+", encoding="utf-8") as file: file.write(f""" <application> <component name="XDebuggerSettings"> <data-views /> <general /> <debuggers> <debugger id="dotnet_debugger"> <configuration> <option name="needNotifyWhenStoppedInExternalCode" value="false" /> <option name="sshCredentials"> <option value="<credentials HOST="localhost" PORT="2222" USERNAME="root" PRIVATE_KEY_FILE="{key_path.as_posix()}" USE_KEY_PAIR="true" USE_AUTH_AGENT="false" />" /> </option> </configuration> </debugger> </debuggers> </component> </application> """) project_manager = ProjectManager(ProjectConfigManager()) project_manager.create_new_project(Path.cwd() / "CSharp Project", QCLanguage.CSharp) debugger_root = ElementTree.fromstring( debugger_file.read_text(encoding="utf-8")) assert debugger_root.find( f".//option/option[@value='<credentials HOST=\"localhost\" PORT=\"2222\" USERNAME=\"root\" PRIVATE_KEY_FILE=\"{key_path.as_posix()}\" USE_KEY_PAIR=\"true\" USE_AUTH_AGENT=\"false\" />']" ) is not None