Skip to content

Commit 9fc988b

Browse files
committed
test: long (--help) help message and default values l10n
1 parent 7a8145d commit 9fc988b

File tree

6 files changed

+127
-43
lines changed

6 files changed

+127
-43
lines changed

locales/build.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,45 +66,45 @@ pub fn generate_consts(out: &String) -> Result<(), Box<dyn std::error::Error>> {
6666
for key in &keys {
6767
let parts: Vec<&str> = key.split('-').collect();
6868
let const_name = parts.last().unwrap().to_uppercase();
69-
69+
7070
let mut current = &mut root;
71-
71+
7272
// Проходим по всем частям пути (кроме последней)
7373
for part in parts.iter().take(parts.len() - 1) {
7474
current = current
7575
.submodules
7676
.entry(part.to_string())
7777
.or_insert_with(Module::default);
7878
}
79-
79+
8080
// Добавляем константу
8181
current.constants.push((const_name, key.clone()));
8282
}
8383

8484
// Рекурсивная генерация кода
8585
fn generate_tree(module: &Module) -> proc_macro2::TokenStream {
8686
let mut items = Vec::new();
87-
87+
8888
// Добавляем константы текущего модуля
8989
for (const_name, const_value) in &module.constants {
9090
let const_ident = format_ident!("{}", const_name);
9191
items.push(quote! {
9292
pub const #const_ident: &str = #const_value;
9393
});
9494
}
95-
95+
9696
// Добавляем подмодули
9797
for (mod_name, submodule) in &module.submodules {
9898
let mod_ident = format_ident!("{}", mod_name);
9999
let submodule_code = generate_tree(submodule);
100-
100+
101101
items.push(quote! {
102102
pub mod #mod_ident {
103103
#submodule_code
104104
}
105105
});
106106
}
107-
107+
108108
quote! { #(#items)* }
109109
}
110110

locales/en-US/cli.ftl

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ cli-usage-header = Usage
44
cli-arguments-header = Arguments
55
cli-arguments-input = Run as if onefetch was started in <input> instead of the current working directory
66
cli-options-header = Options
7-
cli-options-help = Print help (see more with '--help', see a summary with '-h')
7+
cli-options-help = Print help { $short ->
8+
[true] (see more with '--help')
9+
*[false] (see a summary with '-h')
10+
}
811
cli-options-version = Print version
912

1013
# Value name
@@ -28,10 +31,23 @@ cli-value-shell = SHELL
2831
cli-info-heading = INFO
2932
cli-info-disabled_fields = Allows you to disable FIELD(s) from appearing in the output
3033
cli-info-no_title = Hides the title
31-
cli-info-number_of_authors = Maximum NUM of authors to be shown
32-
cli-info-number_of_languages = Maximum NUM of languages to be shown
33-
cli-info-number_of_file_churns = Maximum NUM of file churns to be shown
34-
cli-info-churn_pool_size =
34+
cli-info-number_of_authors-short = Maximum NUM of authors to be shown (default: {$def})
35+
cli-info-number_of_authors-long =
36+
Maximum NUM of authors to be shown
37+
38+
(default: {$def})
39+
cli-info-number_of_languages-short = Maximum NUM of languages to be shown (default: {$def})
40+
cli-info-number_of_languages-long =
41+
Maximum NUM of languages to be shown
42+
43+
(default: {$def})
44+
cli-info-number_of_file_churns-short = Maximum NUM of file churns to be shown (default: {$def})
45+
cli-info-number_of_file_churns-long =
46+
Maximum NUM of file churns to be shown
47+
48+
(default: {$def})
49+
cli-info-churn_pool_size-short = Minimum NUM of commits from HEAD used to compute the churn summary
50+
cli-info-churn_pool_size-long =
3551
Minimum NUM of commits from HEAD used to compute the churn summary
3652

3753
By default, the actual value is non-deterministic due to time-based computation
@@ -43,7 +59,12 @@ cli-info-email = Show the email address of each author
4359
cli-info-http_url = Display repository URL as HTTP
4460
cli-info-hide_token = Hide token in repository URL
4561
cli-info-include_hidden = Count hidden files and directories
46-
cli-info-type = Filters output by language type
62+
cli-info-tipe-short = Filters output by language type (default: ${def}) (possible values: {$pos})
63+
cli-info-tipe-long =
64+
Filters output by language type
65+
66+
(default: ${def})
67+
(possible values: {$pos})
4768

4869
# TEXT FORMATTING
4970
cli-text-heading = TEXT FORMATTING

locales/ru-RU/cli.ftl

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ cli-usage-header = Использование
44
cli-arguments-header = Аргументы
55
cli-arguments-input = Запустить так, как будто onefetch был запущен в <ввод> вместо текущего рабочего каталога
66
cli-options-header = Опции
7-
cli-options-help = Показать помощь (подробнее с '--help', кратко с '-h')
7+
cli-options-help = Показать помощь { $short ->
8+
[true] (подробнее с '--help')
9+
*[false] (кратко с '-h')
10+
}
811
cli-options-version = Показать версию
912
1013
# Value name
@@ -28,10 +31,23 @@ cli-value-shell = ОБОЛОЧКА
2831
cli-info-heading = ИНФОРМАЦИЯ
2932
cli-info-disabled_fields = Позволяет отключить отображение ПОЛЯ(ПОЛЕЙ) в выводе
3033
cli-info-no_title = Скрывает заголовок
31-
cli-info-number_of_authors = Максимальное КОЛ-ВО авторов для отображения
32-
cli-info-number_of_languages = Максимальное КОЛ-ВО языков для отображения
33-
cli-info-number_of_file-churns = Максимальное КОЛ-ВО изменений файлов для отображения
34-
cli-info-churn_pool_size =
34+
cli-info-number_of_authors-short = Максимальное КОЛ-ВО авторов для отображения (по умолчанию: {$def})
35+
cli-info-number_of_authors-long =
36+
Максимальное КОЛ-ВО авторов для отображения
37+
38+
(по умолчанию: {$def})
39+
cli-info-number_of_languages-short = Максимальное КОЛ-ВО языков для отображения (по умолчанию: {$def})
40+
cli-info-number_of_languages-long =
41+
Максимальное КОЛ-ВО языков для отображения
42+
43+
(по умолчанию: {$def})
44+
cli-info-number_of_file_churns-short = Максимальное КОЛ-ВО изменений файлов для отображения (по умолчанию: {$def})
45+
cli-info-number_of_file_churns-long =
46+
Максимальное КОЛ-ВО изменений файлов для отображения
47+
48+
(по умолчанию: {$def})
49+
cli-info-churn_pool_size-short = Минимальное КОЛ-ВО коммитов от HEAD, используемых для вычисления сводки изменений
50+
cli-info-churn_pool_size-long =
3551
Минимальное КОЛ-ВО коммитов от HEAD, используемых для вычисления сводки изменений
3652
3753
По умолчанию фактическое значение недетерминировано из-за вычислений на основе времени
@@ -43,7 +59,12 @@ cli-info-email = Показать адрес электронной почты
4359
cli-info-http_url = Отображать URL репозитория как HTTP
4460
cli-info-hide_token = Скрыть токен в URL репозитория
4561
cli-info-include_hidden = Учитывать скрытые файлы и каталоги
46-
cli-info-type = Фильтровать вывод по типу языка
62+
cli-info-tipe-short = Фильтровать вывод по типу языка (по умолчанию: {$def}) (возможные значения: {$pos})
63+
cli-info-tipe-long =
64+
Фильтровать вывод по типу языка
65+
66+
(по умолчанию: {$def})
67+
(возможные значения: {$pos})
4768
4869
# TEXT FORMATTING
4970
cli-text-heading = ФОРМАТИРОВАНИЕ ТЕКСТА

src/cli.rs

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
use crate::tr;
1+
use crate::i18n::locale_keys::cli::*;
22
use crate::info::langs::language::{Language, LanguageType};
33
use crate::info::utils::info_field::InfoType;
4+
use crate::tr;
45
use crate::ui::printer::SerializationFormat;
56
use anyhow::Result;
6-
use clap::builder::{PossibleValuesParser, Styles};
77
use clap::builder::TypedValueParser as _;
8+
use clap::builder::{PossibleValuesParser, Styles};
89
use clap::{value_parser, Args, Command, Parser, ValueHint};
910
use clap_complete::{generate, Generator, Shell};
1011
use num_format::CustomFormat;
@@ -17,11 +18,27 @@ use std::io;
1718
use std::path::PathBuf;
1819
use std::str::FromStr;
1920
use strum::IntoEnumIterator;
20-
use crate::i18n::locale_keys::cli::*;
2121

2222
const COLOR_RESOLUTIONS: [&str; 5] = ["16", "32", "64", "128", "256"];
2323
pub const NO_BOTS_DEFAULT_REGEX_PATTERN: &str = r"(?:-|\s)[Bb]ot$|\[[Bb]ot\]";
2424

25+
// TODO: check if short help requested more efficiently
26+
use std::sync::LazyLock;
27+
static IS_SHORT: LazyLock<bool> = LazyLock::new(|| {
28+
let args = std::env::args();
29+
let mut v = false;
30+
for value in args {
31+
if value == "-h" {
32+
v = true;
33+
break;
34+
} else if value == "--help" {
35+
break;
36+
} else {
37+
}
38+
}
39+
v
40+
});
41+
2542
#[derive(Clone, Debug, Parser, PartialEq, Eq)]
2643
#[command(
2744
about = tr!(ABOUT),
@@ -33,7 +50,7 @@ pub const NO_BOTS_DEFAULT_REGEX_PATTERN: &str = r"(?:-|\s)[Bb]ot$|\[[Bb]ot\]";
3350
\n{}{}:{} {{usage}}
3451
\n{{all-args}}{{after-help}}\
3552
",
36-
Styles::default().get_usage().render(),
53+
Styles::default().get_usage().render(),
3754
tr!(usage::HEADER),
3855
Styles::default().get_usage().render_reset()
3956
),
@@ -43,25 +60,25 @@ pub const NO_BOTS_DEFAULT_REGEX_PATTERN: &str = r"(?:-|\s)[Bb]ot$|\[[Bb]ot\]";
4360
pub struct CliOptions {
4461
#[arg(
4562
default_value = ".",
46-
hide_default_value = true,
63+
hide_default_value = true,
4764
value_hint = ValueHint::DirPath,
4865
help = tr!(arguments::INPUT),
4966
value_name = tr!(value::INPUT)
5067
)]
5168
pub input: PathBuf,
5269
#[arg(
53-
action = clap::ArgAction::Help,
70+
action = if *IS_SHORT { clap::ArgAction::HelpShort } else { clap::ArgAction::HelpLong },
5471
long,
55-
short,
56-
help = tr!(options::HELP),
72+
short,
73+
help = tr!(options::HELP, short => &*IS_SHORT),
5774
help_heading = tr!(options::HEADER)
5875
)]
5976
pub help: Option<bool>,
6077
#[arg(
6178
action = clap::ArgAction::Version,
62-
long,
63-
short = 'V',
64-
help = tr!(options::VERSION),
79+
long,
80+
short = 'V',
81+
help = tr!(options::VERSION),
6582
help_heading = tr!(options::HEADER)
6683
)]
6784
pub version: Option<bool>,
@@ -96,13 +113,32 @@ pub struct InfoCliOptions {
96113
pub disabled_fields: Vec<InfoType>,
97114
#[arg(long, help = tr!(info::NO_TITLE))]
98115
pub no_title: bool,
99-
#[arg(long, default_value_t = 3usize, value_name = tr!(value::NUM), help = tr!(info::NUMBER_OF_AUTHORS))]
116+
#[arg(long, default_value_t = 3usize, value_name = tr!(value::NUM), hide_default_value = true)]
117+
#[arg(
118+
help = tr!(info::number_of_authors::SHORT, def => 3),
119+
long_help = tr!(info::number_of_authors::LONG, def => 3),
120+
hide_default_value = true
121+
)]
100122
pub number_of_authors: usize,
101-
#[arg(long, default_value_t = 6usize, value_name = tr!(value::NUM), help = tr!(info::NUMBER_OF_LANGUAGES))]
123+
#[arg(long, default_value_t = 6usize, value_name = tr!(value::NUM))]
124+
#[arg(
125+
help = tr!(info::number_of_languages::SHORT, def => 6),
126+
long_help = tr!(info::number_of_languages::LONG, def => 6),
127+
hide_default_value = true
128+
)]
102129
pub number_of_languages: usize,
103-
#[arg(long, default_value_t = 3usize, value_name = tr!(value::NUM), help = tr!(info::NUMBER_OF_FILE_CHURNS))]
130+
#[arg(long, default_value_t = 3usize, value_name = tr!(value::NUM))]
131+
#[arg(
132+
help = tr!(info::number_of_file_churns::SHORT, def => 3),
133+
long_help = tr!(info::number_of_file_churns::LONG, def => 3),
134+
hide_default_value = true
135+
)]
104136
pub number_of_file_churns: usize,
105-
#[arg(long, value_name = tr!(value::NUM), help = tr!(info::CHURN_POOL_SIZE))]
137+
#[arg(long, value_name = tr!(value::NUM))]
138+
#[arg(
139+
help = tr!(info::churn_pool_size::SHORT),
140+
long_help = tr!(info::churn_pool_size::LONG)
141+
)]
106142
pub churn_pool_size: Option<usize>,
107143
#[arg(long, short, num_args = 1.., help = tr!(info::EXCLUDE), value_name = tr!(value::EXCLUDE))]
108144
pub exclude: Vec<String>,
@@ -132,7 +168,12 @@ pub struct InfoCliOptions {
132168
default_values = &["programming", "markup"],
133169
short = 'T',
134170
value_enum,
135-
help = tr!(info::TYPE)
171+
)]
172+
#[arg(
173+
help = tr!(info::tipe::SHORT, def => "programming, markup", pos => "programming, markup, prose, data"),
174+
long_help = tr!(info::tipe::LONG, def => "programming, markup", pos => "programming, markup, prose, data"),
175+
hide_default_value = true,
176+
hide_possible_values = true,
136177
)]
137178
pub r#type: Vec<LanguageType>,
138179
}
@@ -165,7 +206,7 @@ pub struct AsciiCliOptions {
165206
}
166207

167208
#[derive(Clone, Debug, Args, PartialEq, Eq)]
168-
#[command(next_help_heading = image::HEADING)]
209+
#[command(next_help_heading = tr!(image::HEADING))]
169210
pub struct ImageCliOptions {
170211
#[arg(long, short, value_name = tr!(value::IMAGE), value_hint = ValueHint::FilePath, help = tr!(image::IMAGE))]
171212
pub image: Option<PathBuf>,
@@ -177,7 +218,7 @@ pub struct ImageCliOptions {
177218
requires = "image",
178219
default_value_t = 16usize,
179220
value_parser = PossibleValuesParser::new(COLOR_RESOLUTIONS)
180-
.map(|s| s.parse::<usize>().unwrap()),
221+
.map(|s| s.parse::<usize>().unwrap()),
181222
help = tr!(image::COLOR_RESOLUTION)
182223
)]
183224
pub color_resolution: usize,
@@ -186,7 +227,6 @@ pub struct ImageCliOptions {
186227
#[derive(Clone, Debug, Args, PartialEq, Eq)]
187228
#[command(next_help_heading = tr!(text::HEADING))]
188229
pub struct TextForamttingCliOptions {
189-
190230
#[arg(
191231
long,
192232
short,

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Lib is present to allow for benchmarks and integration tests
22
pub mod cli;
3+
pub mod i18n;
34
pub mod info;
45
pub mod ui;
5-
pub mod i18n;

src/main.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ fn main() -> Result<()> {
1717
#[cfg(windows)]
1818
enable_ansi_support::enable_ansi_support()?;
1919

20-
let cli_options = cli::CliOptions::try_parse().map_err(|e| {
21-
let e = e.apply::<ClapI18nRichFormatter>();
22-
e.exit()
23-
}).unwrap();
20+
let cli_options = cli::CliOptions::try_parse()
21+
.map_err(|e| {
22+
let e = e.apply::<ClapI18nRichFormatter>();
23+
e.exit()
24+
})
25+
.unwrap();
2426

2527
if cli_options.other.languages {
2628
return cli::print_supported_languages();

0 commit comments

Comments
 (0)