diff options
67 files changed, 2735 insertions, 1338 deletions
@@ -29,6 +29,7 @@ members = [ "lib/entry/libimagentrydatetime", "lib/entry/libimagentryedit", "lib/entry/libimagentryfilter", + "lib/entry/libimagentrygps", "lib/entry/libimagentrylink", "lib/entry/libimagentrylist", "lib/entry/libimagentrymarkdown", diff --git a/bin/core/imag-link/Cargo.toml b/bin/core/imag-link/Cargo.toml index ce87acaf..15b7cc0e 100644 --- a/bin/core/imag-link/Cargo.toml +++ b/bin/core/imag-link/Cargo.toml @@ -33,3 +33,9 @@ path = "../../../lib/etc/libimagutil" default-features = false features = ["testing"] +[dev-dependencies.libimagrt] +version = "0.4.0" +path = "../../../lib/core/libimagrt" +default-features = false +features = ["testing"] + diff --git a/bin/core/imag-link/src/main.rs b/bin/core/imag-link/src/main.rs index 0acbf710..72b9498c 100644 --- a/bin/core/imag-link/src/main.rs +++ b/bin/core/imag-link/src/main.rs @@ -108,40 +108,39 @@ fn handle_internal_linking(rt: &Runtime) { } } - match cmd.value_of("list") { - Some(list) => handle_internal_linking_list_call(rt, cmd, list), - None => { - match cmd.subcommand_name() { - Some("add") => { - let (mut from, to) = get_from_to_entry(&rt, "add"); - for mut to_entry in to { - if let Err(e) = to_entry.add_internal_link(&mut from) { - trace_error_exit(&e, 1); - } - } - }, - - Some("remove") => { - let (mut from, to) = get_from_to_entry(&rt, "remove"); - for mut to_entry in to { - if let Err(e) = to_entry.remove_internal_link(&mut from) { - trace_error_exit(&e, 1); - } - } - }, + match cmd.subcommand_name() { + Some("list") => { + cmd.subcommand_matches("list") + .map(|matches| handle_internal_linking_list_call(rt, cmd, matches)); + }, + Some("add") => { + let (mut from, to) = get_from_to_entry(&rt, "add"); + for mut to_entry in to { + if let Err(e) = to_entry.add_internal_link(&mut from) { + trace_error_exit(&e, 1); + } + }; + }, - _ => unreachable!(), + Some("remove") => { + let (mut from, to) = get_from_to_entry(&rt, "remove"); + for mut to_entry in to { + if let Err(e) = to_entry.remove_internal_link(&mut from) { + trace_error_exit(&e, 1); + } }; - } + }, + + _ => unreachable!(), } } #[inline] -fn handle_internal_linking_list_call(rt: &Runtime, cmd: &ArgMatches, list: &str) { +fn handle_internal_linking_list_call(rt: &Runtime, cmd: &ArgMatches, list: &ArgMatches) { use libimagentrylink::external::is_external_link_storeid; debug!("List..."); - for entry in list.split(',') { + for entry in list.values_of("entries").unwrap() { // clap has our back debug!("Listing for '{}'", entry); match get_entry_by_name(rt, entry) { Ok(Some(e)) => { @@ -362,6 +361,7 @@ mod tests { with help "imag-link mocking app"; } use self::mock::generate_test_runtime; + use self::mock::reset_test_runtime; use libimagutil::testing::DEFAULT_ENTRY; fn create_test_default_entry<'a, S: AsRef<OsStr>>(rt: &'a Runtime, name: S) -> StoreResult<StoreId> { @@ -392,7 +392,7 @@ mod tests { #[test] fn test_link_modificates() { - let rt = generate_test_runtime(vec!["internal", "add", "--from", "test1", "--to", "test2"]) + let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2"]) .unwrap(); let test_id1 = create_test_default_entry(&rt, "test1").unwrap(); @@ -412,7 +412,7 @@ mod tests { #[test] fn test_linking_links() { - let rt = generate_test_runtime(vec!["internal", "add", "--from", "test1", "--to", "test2"]) + let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2"]) .unwrap(); let test_id1 = create_test_default_entry(&rt, "test1").unwrap(); @@ -432,7 +432,7 @@ mod tests { #[test] fn test_multilinking() { - let rt = generate_test_runtime(vec!["internal", "add", "--from", "test1", "--to", "test2"]) + let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2"]) .unwrap(); let test_id1 = create_test_default_entry(&rt, "test1").unwrap(); @@ -450,4 +450,87 @@ mod tests { assert_eq!(*test_links1, links_toml_value(vec!["test2"])); assert_eq!(*test_links2, links_toml_value(vec!["test1"])); } + + #[test] + fn test_linking_more_than_two() { + let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2", "test3"]) + .unwrap(); + + let test_id1 = create_test_default_entry(&rt, "test1").unwrap(); + let test_id2 = create_test_default_entry(&rt, "test2").unwrap(); + let test_id3 = create_test_default_entry(&rt, "test3").unwrap(); + + handle_internal_linking(&rt); + handle_internal_linking(&rt); + + let test_entry1 = rt.store().get(test_id1).unwrap().unwrap(); + let test_links1 = get_entry_links(&test_entry1).unwrap(); + + let test_entry2 = rt.store().get(test_id2).unwrap().unwrap(); + let test_links2 = get_entry_links(&test_entry2).unwrap(); + + let test_entry3 = rt.store().get(test_id3).unwrap().unwrap(); + let test_links3 = get_entry_links(&test_entry3).unwrap(); + + assert_eq!(*test_links1, links_toml_value(vec!["test2", "test3"])); + assert_eq!(*test_links2, links_toml_value(vec!["test1"])); + assert_eq!(*test_links3, links_toml_value(vec!["test1"])); + } + + // Remove tests + + #[test] + fn test_linking_links_unlinking_removes_links() { + let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2"]) + .unwrap(); + + let test_id1 = create_test_default_entry(&rt, "test1").unwrap(); + let test_id2 = create_test_default_entry(&rt, "test2").unwrap(); + + handle_internal_linking(&rt); + + let rt = reset_test_runtime(vec!["internal", "remove", "test1", "test2"], rt) + .unwrap(); + + handle_internal_linking(&rt); + + let test_entry1 = rt.store().get(test_id1).unwrap().unwrap(); + let test_links1 = get_entry_links(&test_entry1).unwrap(); + + let test_entry2 = rt.store().get(test_id2).unwrap().unwrap(); + let test_links2 = get_entry_links(&test_entry2).unwrap(); + + assert_eq!(*test_links1, links_toml_value(vec![])); + assert_eq!(*test_links2, links_toml_value(vec![])); + } + + #[test] + fn test_linking_and_unlinking_more_than_two() { + let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2", "test3"]) + .unwrap(); + + let test_id1 = create_test_default_entry(&rt, "test1").unwrap(); + let test_id2 = create_test_default_entry(&rt, "test2").unwrap(); + let test_id3 = create_test_default_entry(&rt, "test3").unwrap(); + + handle_internal_linking(&rt); + + let rt = reset_test_runtime(vec!["internal", "remove", "test1", "test2", "test3"], rt) + .unwrap(); + + handle_internal_linking(&rt); + + let test_entry1 = rt.store().get(test_id1).unwrap().unwrap(); + let test_links1 = get_entry_links(&test_entry1).unwrap(); + + let test_entry2 = rt.store().get(test_id2).unwrap().unwrap(); + let test_links2 = get_entry_links(&test_entry2).unwrap(); + + let test_entry3 = rt.store().get(test_id3).unwrap().unwrap(); + let test_links3 = get_entry_links(&test_entry3).unwrap(); + + assert_eq!(*test_links1, links_toml_value(vec![])); + assert_eq!(*test_links2, links_toml_value(vec![])); + assert_eq!(*test_links3, links_toml_value(vec![])); + } } diff --git a/bin/core/imag-link/src/ui.rs b/bin/core/imag-link/src/ui.rs index 2b83fb1e..7459a25d 100644 --- a/bin/core/imag-link/src/ui.rs +++ b/bin/core/imag-link/src/ui.rs @@ -28,15 +28,14 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> { .about("Add link from one entry to another (and vice-versa)") .version("0.1") .arg(Arg::with_name("from") - .long("from") - .short("f") + .index(1) .takes_value(true) .required(true) + .multiple(false) .help("Link from this entry") .value_name("ENTRY")) .arg(Arg::with_name("to") - .long("to") - .short("t") + .index(2) .takes_value(true) .required(true) .multiple(true) @@ -48,15 +47,14 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> { .about("Remove a link between two or more entries") .version("0.1") .arg(Arg::with_name("from") - .long("from") - .short("f") + .index(1) .takes_value(true) .required(true) + .multiple(false) .help("Remove Link from this entry") .value_name("ENTRY")) .arg(Arg::with_name("to") - .long("to") - .short("t") + .index(2) .takes_value(true) .required(true) .multiple(true) @@ -64,20 +62,23 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> { .value_name("ENTRIES")) ) - .arg(Arg::with_name("list") - .long("list") - .short("l") - .takes_value(true) - .required(false) - .help("List links to this entry") - .value_name("ENTRY")) - + .subcommand(SubCommand::with_name("list") + .about("List links to this entry") + .version("0.1") + .arg(Arg::with_name("entries") + .index(1) + .takes_value(true) + .multiple(true) + .required(true) + .help("List these entries, seperate by comma") + .value_name("ENTRIES")) - .arg(Arg::with_name("list-externals-too") - .long("list-external") - .takes_value(false) - .required(false) - .help("If --list is provided, also list external links (debugging helper that might be removed at some point")) + .arg(Arg::with_name("list-externals-too") + .long("list-external") + .takes_value(false) + .required(false) + .help("If --list is provided, also list external links (debugging helper that might be removed at some point")) + ) .arg(Arg::with_name("check-consistency") .long("check-consistency") diff --git a/bin/core/imag-ref/src/main.rs b/bin/core/imag-ref/src/main.rs index 092ca762..1420f5f8 100644 --- a/bin/core/imag-ref/src/main.rs +++ b/bin/core/imag-ref/src/main.rs @@ -48,7 +48,7 @@ use ui::build_ui; use std::path::PathBuf; -use libimagentryref::reference::Ref; +use libimagentryref::refstore::RefStore; use libimagentryref::flags::RefFlags; use libimagerror::trace::trace_error; use libimagrt::setup::generate_runtime_setup; @@ -82,7 +82,7 @@ fn add(rt: &Runtime) { .with_content_hashing(cmd.is_present("track-content")) .with_permission_tracking(cmd.is_present("track-permissions")); - match Ref::create(rt.store(), path, flags) { + match RefStore::create(rt.store(), path, flags) { Ok(r) => { debug!("Reference created: {:?}", r); info!("Ok"); @@ -102,7 +102,7 @@ fn remove(rt: &Runtime) { let yes = cmd.is_present("yes"); if yes || ask_bool(&format!("Delete Ref with hash '{}'", hash)[..], None) { - match Ref::delete_by_hash(rt.store(), hash) { + match rt.store().delete_by_hash(hash) { Err(e) => trace_error(&e), Ok(_) => info!("Ok"), } @@ -126,7 +126,7 @@ fn list(rt: &Runtime) { let iter = match rt.store().retrieve_for_module("ref") { Ok(iter) => iter.filter_map(|id| { - match Ref::get(rt.store(), id) { + match rt.store().get(id) { Ok(r) => Some(r), Err(e) => { trace_error(&e); @@ -145,7 +145,7 @@ fn list(rt: &Runtime) { .check_changed(do_check_changed) .check_changed_content(do_check_changed_content) .check_changed_permiss(do_check_changed_permiss) - .list(iter.map(|e| e.into())) + .list(iter.filter_map(Into::into)) .ok(); } diff --git a/bin/core/imag-store/Cargo.toml b/bin/core/imag-store/Cargo.toml index be5b1521..55aac2ed 100644 --- a/bin/core/imag-store/Cargo.toml +++ b/bin/core/imag-store/Cargo.toml @@ -28,3 +28,18 @@ libimagutil = { version = "0.4.0", path = "../../../lib/etc/libimagutil" } [features] early-panic = [ "libimagstore/early-panic" ] +[dev-dependencies.libimagutil] +version = "0.4.0" +path = "../../../lib/etc/libimagutil" +default-features = false +features = ["testing"] + +[dev-dependencies.libimagrt] +version = "0.4.0" +path = "../../../lib/core/libimagrt" +default-features = false +features = ["testing"] + +[dev-dependencies.toml-query] +version = "0.3" + diff --git a/bin/core/imag-store/src/create.rs b/bin/core/imag-store/src/create.rs index d4fb9421..74ffbec9 100644 --- a/bin/core/imag-store/src/create.rs +++ b/bin/core/imag-store/src/create.rs @@ -178,3 +178,39 @@ fn string_from_raw_src(raw_src: &str) -> String { } content } + +#[cfg(test)] +mod tests { + use super::create; + + use std::path::PathBuf; + use toml_query::read::TomlValueReadExt; + use toml::Value; + + make_mock_app! { + app "imag-link"; + modulename mock; + version "0.4.0"; + with help "imag-link mocking app"; + } + use self::mock::generate_test_runtime; + + #[test] + fn test_create_simple() { + let test_name = "test_create_simple"; + let rt = generate_test_runtime(vec!["create", "-p", "test_create_simple"]).unwrap(); + + create(&rt); + + let e = rt.store().get(PathBuf::from(test_name)); + assert!(e.is_ok()); + let e = e.unwrap(); + assert!(e.is_some()); + let e = e.unwrap(); + + let version = e.get_header().read("imag.version").map(Option::unwrap).unwrap(); + assert_eq!(Value::String(String::from("0.4.0")), *version); + } + +} + diff --git a/bin/core/imag-store/src/delete.rs b/bin/core/imag-store/src/delete.rs index 1413de77..7b9e56ed 100644 --- a/bin/core/imag-store/src/delete.rs +++ b/bin/core/imag-store/src/delete.rs @@ -46,3 +46,38 @@ pub fn delete(rt: &Runtime) { .or_else(|| warn_exit("No subcommand 'delete'. Will exit now", 1)); } +#[cfg(test)] +mod tests { + use create::create; + use super::delete; + + use std::path::PathBuf; + + make_mock_app! { + app "imag-link"; + modulename mock; + version "0.4.0"; + with help "imag-link mocking app"; + } + use self::mock::generate_test_runtime; + use self::mock::reset_test_runtime; + + #[test] + fn test_create_simple() { + let test_name = "test_create_simple"; + let rt = generate_test_runtime(vec!["create", "-p", "test_create_simple"]).unwrap(); + + create(&rt); + + let rt = reset_test_runtime(vec!["delete", "--id", "test_create_simple"], rt).unwrap(); + + delete(&rt); + + let e = rt.store().get(PathBuf::from(test_name)); + assert!(e.is_ok()); + let e = e.unwrap(); + assert!(e.is_none()); + } + +} + diff --git a/bin/core/imag-store/src/main.rs b/bin/core/imag-store/src/main.rs index 434c84a8..572f9e0d 100644 --- a/bin/core/imag-store/src/main.rs +++ b/bin/core/imag-store/src/main.rs @@ -35,14 +35,21 @@ extern crate clap; #[macro_use] extern crate log; extern crate toml; +#[cfg(test)] extern crate toml_query; #[macro_use] extern crate version; #[macro_use] extern crate error_chain; extern crate libimagrt; extern crate libimagstore; -extern crate libimagutil; extern crate libimagerror; +#[cfg(test)] +#[macro_use] +extern crate libimagutil; + +#[cfg(not(test))] +extern crate libimagutil; + use libimagrt::setup::generate_runtime_setup; mod create; diff --git a/bin/core/imag-tag/Cargo.toml b/bin/core/imag-tag/Cargo.toml index bb00f889..e1bf382a 100644 --- a/bin/core/imag-tag/Cargo.toml +++ b/ |