From 3cb15abfc5721ed553e93aa92ad3e53155ff6402 Mon Sep 17 00:00:00 2001 From: Milo <50248166+Milo123459@users.noreply.github.com> Date: Thu, 15 Apr 2021 06:22:12 -0700 Subject: feat(deno): create module (#2565) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add deno module * Update docs * Update src/utils.rs Co-authored-by: Dario Vladović * Update src/modules/deno.rs Co-authored-by: Dario Vladović * Update src/modules/deno.rs Co-authored-by: Dario Vladović * Update src/modules/deno.rs Co-authored-by: Dario Vladović * Update src/modules/deno.rs Co-authored-by: Dario Vladović * run rust fmt * Use deno -V * fmt * Fix deno module * do clippy * Update src/configs/deno.rs Co-authored-by: David Knaack * Update src/modules/deno.rs Co-authored-by: David Knaack * Update docs/config/README.md Co-authored-by: David Knaack * Fix test and docs * Remove unused code * fmt * update configs * Add more tests * Update docs/config/README.md Co-authored-by: Dario Vladović Co-authored-by: Dario Vladović Co-authored-by: David Knaack --- src/modules/deno.rs | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/modules/mod.rs | 3 ++ 2 files changed, 128 insertions(+) create mode 100644 src/modules/deno.rs (limited to 'src/modules') diff --git a/src/modules/deno.rs b/src/modules/deno.rs new file mode 100644 index 000000000..8b1fac5fe --- /dev/null +++ b/src/modules/deno.rs @@ -0,0 +1,125 @@ +use super::{Context, Module, RootModuleConfig}; + +use crate::configs::deno::DenoConfig; +use crate::formatter::StringFormatter; + +/// Creates a module with the current Deno version +pub fn module<'a>(context: &'a Context) -> Option> { + let mut module = context.new_module("deno"); + let config = DenoConfig::try_load(module.config); + let is_deno_project = context + .try_begin_scan()? + .set_files(&config.detect_files) + .is_match(); + + if !is_deno_project { + return None; + } + + let parsed = StringFormatter::new(config.format).and_then(|formatter| { + formatter + .map_meta(|var, _| match var { + "symbol" => Some(config.symbol), + _ => None, + }) + .map_style(|variable| match variable { + "style" => Some(Ok(config.style)), + _ => None, + }) + .map(|variable| match variable { + "version" => context + .exec_cmd("deno", &["-V"]) + .and_then(|output| parse_deno_version(output.stdout.trim())) + .map(Ok), + _ => None, + }) + .parse(None) + }); + + module.set_segments(match parsed { + Ok(segments) => segments, + Err(error) => { + log::warn!("Error in module `deno`:\n{}", error); + return None; + } + }); + + Some(module) +} + +fn parse_deno_version(deno_version: &str) -> Option { + let version = deno_version + // split into ["deno", "1.8.3"] + .split_whitespace() + // return "1.8.3" + .nth(1)?; + + Some(format!("v{}", version)) +} + +#[cfg(test)] +mod tests { + use super::parse_deno_version; + use crate::test::ModuleRenderer; + use ansi_term::Color; + use std::fs::File; + use std::io; + + #[test] + fn test_parse_deno_version() { + const OUTPUT: &str = "deno 1.8.3\n"; + assert_eq!( + parse_deno_version(OUTPUT.trim()), + Some("v1.8.3".to_string()) + ) + } + + #[test] + fn folder_without_deno_files() -> io::Result<()> { + let dir = tempfile::tempdir()?; + let actual = ModuleRenderer::new("deno").path(dir.path()).collect(); + let expected = None; + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn folder_with_mod_ts() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("mod.ts"))?.sync_all()?; + let actual = ModuleRenderer::new("deno").path(dir.path()).collect(); + let expected = Some(format!("via {}", Color::Green.bold().paint("🦕 v1.8.3 "))); + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn folder_with_mod_js() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("mod.js"))?.sync_all()?; + let actual = ModuleRenderer::new("deno").path(dir.path()).collect(); + let expected = Some(format!("via {}", Color::Green.bold().paint("🦕 v1.8.3 "))); + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn folder_with_deps_ts() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("deps.ts"))?.sync_all()?; + let actual = ModuleRenderer::new("deno").path(dir.path()).collect(); + let expected = Some(format!("via {}", Color::Green.bold().paint("🦕 v1.8.3 "))); + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn folder_with_deps_js() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("deps.js"))?.sync_all()?; + let actual = ModuleRenderer::new("deno").path(dir.path()).collect(); + let expected = Some(format!("via {}", Color::Green.bold().paint("🦕 v1.8.3 "))); + assert_eq!(expected, actual); + dir.close() + } +} diff --git a/src/modules/mod.rs b/src/modules/mod.rs index 39e3b86d1..c3fd6e658 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -7,6 +7,7 @@ mod conda; mod crystal; pub(crate) mod custom; mod dart; +mod deno; mod directory; mod docker_context; mod dotnet; @@ -80,6 +81,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option> { "cmd_duration" => cmd_duration::module(context), "conda" => conda::module(context), "dart" => dart::module(context), + "deno" => deno::module(context), "directory" => directory::module(context), "docker_context" => docker_context::module(context), "dotnet" => dotnet::module(context), @@ -162,6 +164,7 @@ pub fn description(module: &str) -> &'static str { "conda" => "The current conda environment, if $CONDA_DEFAULT_ENV is set", "crystal" => "The currently installed version of Crystal", "dart" => "The currently installed version of Dart", + "deno" => "The currently installed version of Deno", "directory" => "The current working directory", "docker_context" => "The current docker context", "dotnet" => "The relevant version of the .NET Core SDK for the current directory", -- cgit v1.2.3