diff --git a/src/project.cc b/src/project.cc index e07f6db..a0da6bb 100644 --- a/src/project.cc +++ b/src/project.cc @@ -141,10 +141,10 @@ std::shared_ptr Project::create() { auto language_id = view->language->get_id(); if(language_id == "markdown") return std::shared_ptr(new Project::Markdown(std::move(build))); - if(language_id == "python") - return std::shared_ptr(new Project::Python(std::move(build))); if(language_id == "js") return std::shared_ptr(new Project::JavaScript(std::move(build))); + if(language_id == "python") + return std::shared_ptr(new Project::Python(std::move(build))); if(language_id == "html") return std::shared_ptr(new Project::HTML(std::move(build))); } @@ -154,12 +154,13 @@ std::shared_ptr Project::create() { if(dynamic_cast(build.get()) || dynamic_cast(build.get())) return std::shared_ptr(new Project::Clang(std::move(build))); - else if(dynamic_cast(build.get())) + if(dynamic_cast(build.get())) return std::shared_ptr(new Project::Rust(std::move(build))); - else if(dynamic_cast(build.get())) + if(dynamic_cast(build.get())) return std::shared_ptr(new Project::JavaScript(std::move(build))); - else - return std::shared_ptr(new Project::Base(std::move(build))); + if(dynamic_cast(build.get())) + return std::shared_ptr(new Project::Python(std::move(build))); + return std::shared_ptr(new Project::Base(std::move(build))); } std::pair Project::Base::get_run_arguments() { @@ -965,12 +966,27 @@ void Project::Markdown::compile_and_run() { } void Project::Python::compile_and_run() { + std::string command = Config::get().project.python_command + ' '; + boost::filesystem::path path; + if(!build->project_path.empty()) { + command += filesystem::get_short_path(build->project_path).string(); + path = build->project_path; + } + else { + auto view = Notebook::get().get_current_view(); + if(!view) { + Info::get().print("No executable found"); + return; + } + command += filesystem::escape_argument(filesystem::get_short_path(view->file_path).string()); + path = view->file_path.parent_path(); + } + if(Config::get().project.clear_terminal_on_compile) Terminal::get().clear(); - auto command = Config::get().project.python_command + ' ' + filesystem::escape_argument(filesystem::get_short_path(Notebook::get().get_current_view()->file_path).string()); Terminal::get().print("Running " + command + "\n"); - Terminal::get().async_process(command, Notebook::get().get_current_view()->file_path.parent_path(), [command](int exit_status) { + Terminal::get().async_process(command, path, [command](int exit_status) { Terminal::get().async_print(command + " returned: " + std::to_string(exit_status) + '\n'); }); } diff --git a/src/project_build.cc b/src/project_build.cc index 60fbf56..7ed2dfe 100644 --- a/src/project_build.cc +++ b/src/project_build.cc @@ -32,6 +32,12 @@ std::unique_ptr Project::Build::create(const boost::filesystem:: return build; } + if(boost::filesystem::exists(search_path / "__main__.py")) { + std::unique_ptr build(new PythonMain()); + build->project_path = search_path; + return build; + } + if(search_path == search_path.root_directory()) break; search_path = search_path.parent_path(); diff --git a/src/project_build.h b/src/project_build.h index b2b356b..4a08e5e 100644 --- a/src/project_build.h +++ b/src/project_build.h @@ -59,4 +59,6 @@ namespace Project { }; class NpmBuild : public Build {}; + + class PythonMain : public Build {}; } // namespace Project