feat(migrate): progress in the migration implementation

This commit is contained in:
Federico Terzi 2021-05-29 10:14:42 +02:00
parent b5786b6530
commit ec73edba24
8 changed files with 129 additions and 11 deletions

View File

@ -55,7 +55,9 @@ pub fn convert(input_files: HashMap<String, Hash>) -> HashMap<String, Hash> {
config_names_to_path.insert(name.to_string(), match_output_path.clone()); config_names_to_path.insert(name.to_string(), match_output_path.clone());
} }
let output_yaml = output_files.entry(match_output_path.clone()).or_insert(Hash::new()); let output_yaml = output_files
.entry(match_output_path.clone())
.or_insert(Hash::new());
if let Some(global_vars) = yaml_global_vars { if let Some(global_vars) = yaml_global_vars {
let output_global_vars = output_yaml let output_global_vars = output_yaml
@ -106,6 +108,39 @@ pub fn convert(input_files: HashMap<String, Hash>) -> HashMap<String, Hash> {
copy_field_if_present(yaml, "filter_class", &mut output_yaml, "filter_class"); copy_field_if_present(yaml, "filter_class", &mut output_yaml, "filter_class");
copy_field_if_present(yaml, "filter_exec", &mut output_yaml, "filter_exec"); copy_field_if_present(yaml, "filter_exec", &mut output_yaml, "filter_exec");
copy_field_if_present(yaml, "enable_active", &mut output_yaml, "enable"); copy_field_if_present(yaml, "enable_active", &mut output_yaml, "enable");
copy_field_if_present(yaml, "backend", &mut output_yaml, "backend");
map_field_if_present(
yaml,
"paste_shortcut",
&mut output_yaml,
"paste_shortcut",
|val| match val {
Yaml::String(shortcut) if shortcut == "CtrlV" => Some(Yaml::String("CTRL+V".to_string())),
Yaml::String(shortcut) if shortcut == "CtrlShiftV" => Some(Yaml::String("CTRL+SHIFT+V".to_string())),
Yaml::String(shortcut) if shortcut == "ShiftInsert" => Some(Yaml::String("SHIFT+INSERT".to_string())),
Yaml::String(shortcut) if shortcut == "CtrlAltV" => Some(Yaml::String("CTRL+ALT+V".to_string())),
Yaml::String(shortcut) if shortcut == "MetaV" => Some(Yaml::String("META+V".to_string())),
Yaml::String(_) => None,
_ => None,
},
);
copy_field_if_present(yaml, "secure_input_watcher_enabled", &mut output_yaml, "secure_input_watcher_enabled");
copy_field_if_present(yaml, "secure_input_watcher_interval", &mut output_yaml, "secure_input_watcher_interval");
copy_field_if_present(yaml, "secure_input_notification", &mut output_yaml, "secure_input_notification");
copy_field_if_present(yaml, "config_caching_interval", &mut output_yaml, "config_caching_interval");
copy_field_if_present(yaml, "toggle_interval", &mut output_yaml, "toggle_interval");
copy_field_if_present(yaml, "toggle_key", &mut output_yaml, "toggle_key");
copy_field_if_present(yaml, "preserve_clipboard", &mut output_yaml, "preserve_clipboard");
copy_field_if_present(yaml, "backspace_limit", &mut output_yaml, "backspace_limit");
copy_field_if_present(yaml, "fast_inject", &mut output_yaml, "x11_fast_inject");
copy_field_if_present(yaml, "auto_restart", &mut output_yaml, "auto_restart");
copy_field_if_present(yaml, "undo_backspace", &mut output_yaml, "undo_backspace");
copy_field_if_present(yaml, "show_icon", &mut output_yaml, "show_icon");
copy_field_if_present(yaml, "show_notifications", &mut output_yaml, "show_notifications");
copy_field_if_present(yaml, "inject_delay", &mut output_yaml, "inject_delay");
copy_field_if_present(yaml, "restore_clipboard_delay", &mut output_yaml, "restore_clipboard_delay");
copy_field_if_present(yaml, "use_system_agent", &mut output_yaml, "use_system_agent");
copy_field_if_present(yaml, "word_separators", &mut output_yaml, "word_separators");
// TODO: warn if passive mode parameters are used // TODO: warn if passive mode parameters are used
@ -114,8 +149,13 @@ pub fn convert(input_files: HashMap<String, Hash>) -> HashMap<String, Hash> {
// Link any unlisted match file (the ones starting with the _ underscore, which are excluded by the // Link any unlisted match file (the ones starting with the _ underscore, which are excluded by the
// default.yml config) explicitly, if present. // default.yml config) explicitly, if present.
if let Some(match_file_path) = match_file_path_if_unlisted { if let Some(match_file_path) = match_file_path_if_unlisted {
let yaml_exclude_default_entries = yaml_get_bool(yaml, "exclude_default_entries").unwrap_or(false); let yaml_exclude_default_entries =
let key_name = if yaml_exclude_default_entries { "includes" } else { "extra_includes" }; yaml_get_bool(yaml, "exclude_default_entries").unwrap_or(false);
let key_name = if yaml_exclude_default_entries {
"includes"
} else {
"extra_includes"
};
let includes = vec![Yaml::String(format!("../{}", match_file_path))]; let includes = vec![Yaml::String(format!("../{}", match_file_path))];
@ -222,3 +262,20 @@ fn copy_field_if_present(
output_yaml.insert(Yaml::String(output_field_name.to_string()), value.clone()); output_yaml.insert(Yaml::String(output_field_name.to_string()), value.clone());
} }
} }
fn map_field_if_present(
input_yaml: &Hash,
input_field_name: &str,
output_yaml: &mut Hash,
output_field_name: &str,
transform: impl FnOnce(&Yaml) -> Option<Yaml>,
) {
if let Some(value) = input_yaml.get(&Yaml::String(input_field_name.to_string())) {
let transformed = transform(value);
if let Some(transformed) = transformed {
output_yaml.insert(Yaml::String(output_field_name.to_string()), transformed);
} else {
eprintln!("could not convert value for field: {}", input_field_name);
}
}
}

View File

@ -74,6 +74,7 @@ mod tests {
use test_case::test_case; use test_case::test_case;
use pretty_assertions::{assert_eq as assert_peq}; use pretty_assertions::{assert_eq as assert_peq};
use yaml_rust::{yaml::Hash, Yaml};
fn run_with_temp_dir(test_data: &Dir, action: impl FnOnce(&Path, &Path)) { fn run_with_temp_dir(test_data: &Dir, action: impl FnOnce(&Path, &Path)) {
let tmp_dir = TempDir::new("espanso-migration").unwrap(); let tmp_dir = TempDir::new("espanso-migration").unwrap();
@ -107,11 +108,19 @@ mod tests {
tuples tuples
} }
fn to_sorted_hash(hash: &Hash) -> Vec<(String, &Yaml)> {
let mut tuples: Vec<(String, &Yaml)> = hash.into_iter().map(|(k, v)| (k.as_str().unwrap().to_string(), v)).collect();
tuples.sort_by_key(|(k, _)| k.clone());
tuples
}
static SIMPLE_CASE: Dir = include_dir!("test/simple"); static SIMPLE_CASE: Dir = include_dir!("test/simple");
static BASE_CASE: Dir = include_dir!("test/base"); static BASE_CASE: Dir = include_dir!("test/base");
static ALL_PARAMS_CASE: Dir = include_dir!("test/all_params");
#[test_case(&SIMPLE_CASE; "simple case")] #[test_case(&SIMPLE_CASE; "simple case")]
#[test_case(&BASE_CASE; "base case")] #[test_case(&BASE_CASE; "base case")]
#[test_case(&ALL_PARAMS_CASE; "all config parameters case")]
fn test_migration(test_data: &Dir) { fn test_migration(test_data: &Dir) {
run_with_temp_dir(test_data, |legacy, expected| { run_with_temp_dir(test_data, |legacy, expected| {
let legacy_files = load::load(legacy).unwrap(); let legacy_files = load::load(legacy).unwrap();
@ -122,7 +131,7 @@ mod tests {
assert_eq!(converted_files.len(), expected_files.len()); assert_eq!(converted_files.len(), expected_files.len());
for (file, content) in to_sorted_list(converted_files) { for (file, content) in to_sorted_list(converted_files) {
assert_peq!(&content, expected_files.get(&file).unwrap()); assert_peq!(to_sorted_hash(&content), to_sorted_hash(&expected_files.get(&file).unwrap()));
} }
}); });
} }

View File

@ -0,0 +1,30 @@
config_caching_interval: 1200
toggle_interval: 500
toggle_key: "RIGHT_CTRL"
preserve_clipboard: false
backspace_limit: 5
inject_delay: 10
restore_clipboard_delay: 400
secure_input_watcher_enabled: false
secure_input_notification: false
secure_input_watcher_interval: 3000
show_notifications: false
show_icon: false
auto_restart: false
undo_backspace: false
x11_fast_inject: false
paste_shortcut: "CTRL+ALT+V"
backend: Clipboard
use_system_agent: false
word_separators: ['.']

View File

@ -0,0 +1,12 @@
global_vars:
- name: "name"
type: "dummy"
params:
echo: "John"
matches:
- name: ":hi"
trigger: "Hello"
- name: ":greet"
trigger: "Hi {{name}}"

View File

@ -1,7 +1,7 @@
config_caching_interval: 1200 config_caching_interval: 1200
toggle_interval: 500 toggle_interval: 500
toggle_key: "CTRL" toggle_key: "RIGHT_CTRL"
preserve_clipboard: false preserve_clipboard: false
@ -24,10 +24,13 @@ fast_inject: false
post_inject_delay: 200 post_inject_delay: 200
paste_shortcut: # TODO paste_shortcut: CtrlAltV
backend: Clipboard backend: Clipboard
use_system_agent: false
word_separators: ['.']
global_vars: global_vars:
- name: "name" - name: "name"
type: "dummy" type: "dummy"

View File

@ -0,0 +1,4 @@
matches:
- trigger: "jon"
replace: "snow"

View File

@ -1,5 +1,3 @@
parent: default
filter_exec: "Executable" filter_exec: "Executable"
global_vars: global_vars:

View File

@ -0,0 +1,5 @@
parent: default
matches:
- trigger: "jon"
replace: "snow"