docs: add more details about date parsing in the stats command (#579)
* docs: add more details about date parsing in the stats command * chore: Replace chrono-english crate with interim
This commit is contained in:
parent
2dd9f2f9f5
commit
8b9aae7076
7 changed files with 71 additions and 39 deletions
59
Cargo.lock
generated
59
Cargo.lock
generated
|
@ -87,7 +87,6 @@ dependencies = [
|
||||||
"atuin-server",
|
"atuin-server",
|
||||||
"base64",
|
"base64",
|
||||||
"chrono",
|
"chrono",
|
||||||
"chrono-english",
|
|
||||||
"clap",
|
"clap",
|
||||||
"clap_complete",
|
"clap_complete",
|
||||||
"cli-table",
|
"cli-table",
|
||||||
|
@ -96,6 +95,7 @@ dependencies = [
|
||||||
"eyre",
|
"eyre",
|
||||||
"fs-err",
|
"fs-err",
|
||||||
"indicatif",
|
"indicatif",
|
||||||
|
"interim",
|
||||||
"itertools",
|
"itertools",
|
||||||
"log",
|
"log",
|
||||||
"pretty_env_logger",
|
"pretty_env_logger",
|
||||||
|
@ -119,12 +119,12 @@ dependencies = [
|
||||||
"atuin-common",
|
"atuin-common",
|
||||||
"base64",
|
"base64",
|
||||||
"chrono",
|
"chrono",
|
||||||
"chrono-english",
|
|
||||||
"config",
|
"config",
|
||||||
"directories",
|
"directories",
|
||||||
"eyre",
|
"eyre",
|
||||||
"fs-err",
|
"fs-err",
|
||||||
"hex",
|
"hex",
|
||||||
|
"interim",
|
||||||
"itertools",
|
"itertools",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
|
@ -243,6 +243,12 @@ version = "0.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
|
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "beef"
|
||||||
|
version = "0.5.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "1.3.2"
|
version = "1.3.2"
|
||||||
|
@ -310,16 +316,6 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "chrono-english"
|
|
||||||
version = "0.1.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f73d909da7eb4a7d88c679c3f5a1bc09d965754e0adb2e7627426cef96a00d6f"
|
|
||||||
dependencies = [
|
|
||||||
"chrono",
|
|
||||||
"scanlex",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chronoutil"
|
name = "chronoutil"
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
|
@ -944,6 +940,16 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "interim"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9ffd2ac8397b9574daa4ffa7ede4427dd249cadaa900719d4b01154a5631d38b"
|
||||||
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
|
"logos",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ipnet"
|
name = "ipnet"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
|
@ -1028,6 +1034,29 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "logos"
|
||||||
|
version = "0.12.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1"
|
||||||
|
dependencies = [
|
||||||
|
"logos-derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "logos-derive"
|
||||||
|
version = "0.12.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c"
|
||||||
|
dependencies = [
|
||||||
|
"beef",
|
||||||
|
"fnv",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"regex-syntax",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "matchers"
|
name = "matchers"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -1613,12 +1642,6 @@ dependencies = [
|
||||||
"winapi-util",
|
"winapi-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "scanlex"
|
|
||||||
version = "0.1.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "088c5d71572124929ea7549a8ce98e1a6fd33d0a38367b09027b382e67c033db"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "schannel"
|
name = "schannel"
|
||||||
version = "0.1.20"
|
version = "0.1.20"
|
||||||
|
|
|
@ -62,7 +62,7 @@ unicode-width = "0.1"
|
||||||
itertools = "0.10.5"
|
itertools = "0.10.5"
|
||||||
tokio = { version = "1", features = ["full"] }
|
tokio = { version = "1", features = ["full"] }
|
||||||
async-trait = "0.1.58"
|
async-trait = "0.1.58"
|
||||||
chrono-english = "0.1.4"
|
interim = { version = "0.1.0", features = ["chrono"] }
|
||||||
cli-table = { version = "0.4", default-features = false }
|
cli-table = { version = "0.4", default-features = false }
|
||||||
base64 = "0.13.0"
|
base64 = "0.13.0"
|
||||||
crossbeam-channel = "0.5.1"
|
crossbeam-channel = "0.5.1"
|
||||||
|
|
|
@ -31,7 +31,7 @@ eyre = "0.6"
|
||||||
directories = "4"
|
directories = "4"
|
||||||
uuid = { version = "1.2", features = ["v4"] }
|
uuid = { version = "1.2", features = ["v4"] }
|
||||||
whoami = "1.1.2"
|
whoami = "1.1.2"
|
||||||
chrono-english = "0.1.4"
|
interim = { version = "0.1.0", features = ["chrono"] }
|
||||||
config = { version = "0.13", default-features = false, features = ["toml"] }
|
config = { version = "0.13", default-features = false, features = ["toml"] }
|
||||||
serde = { version = "1.0.145", features = ["derive"] }
|
serde = { version = "1.0.145", features = ["derive"] }
|
||||||
serde_json = "1.0.86"
|
serde_json = "1.0.86"
|
||||||
|
|
|
@ -55,6 +55,7 @@ impl FilterMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Can use upstream Dialect enum if https://github.com/stevedonovan/chrono-english/pull/16 is merged
|
// FIXME: Can use upstream Dialect enum if https://github.com/stevedonovan/chrono-english/pull/16 is merged
|
||||||
|
// FIXME: Above PR was merged, but dependency was changed to interim (fork of chrono-english) in the ... interim
|
||||||
#[derive(Clone, Debug, Deserialize, Copy)]
|
#[derive(Clone, Debug, Deserialize, Copy)]
|
||||||
pub enum Dialect {
|
pub enum Dialect {
|
||||||
#[serde(rename = "us")]
|
#[serde(rename = "us")]
|
||||||
|
@ -64,11 +65,11 @@ pub enum Dialect {
|
||||||
Uk,
|
Uk,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Dialect> for chrono_english::Dialect {
|
impl From<Dialect> for interim::Dialect {
|
||||||
fn from(d: Dialect) -> chrono_english::Dialect {
|
fn from(d: Dialect) -> interim::Dialect {
|
||||||
match d {
|
match d {
|
||||||
Dialect::Uk => chrono_english::Dialect::Uk,
|
Dialect::Uk => interim::Dialect::Uk,
|
||||||
Dialect::Us => chrono_english::Dialect::Us,
|
Dialect::Us => interim::Dialect::Us,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,18 @@
|
||||||
# `atuin stats`
|
# `atuin stats`
|
||||||
|
|
||||||
Atuin can also calculate stats based on your history - this is currently a
|
Atuin can also calculate stats based on your history - this is currently a
|
||||||
little basic, but more features to come
|
little basic, but more features to come.
|
||||||
|
|
||||||
|
## 1-day stats
|
||||||
|
|
||||||
|
You provide the starting point, and Atuin computes the stats for 24h from that point.
|
||||||
|
Date parsing is provided by `interim`, which supports different formats
|
||||||
|
for full or relative dates. Certain formats rely on the dialect option in your
|
||||||
|
[configuration](config.md#dialect) to differentiate day from month.
|
||||||
|
Refer to [the module's documentation](https://docs.rs/interim/0.1.0/interim/#supported-formats) for more details on the supported date formats.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ atuin stats day last friday
|
$ atuin stats last friday
|
||||||
|
|
||||||
+---------------------+------------+
|
+---------------------+------------+
|
||||||
| Statistic | Value |
|
| Statistic | Value |
|
||||||
|
@ -16,12 +24,18 @@ $ atuin stats day last friday
|
||||||
| Unique commands ran | 213 |
|
| Unique commands ran | 213 |
|
||||||
+---------------------+------------+
|
+---------------------+------------+
|
||||||
|
|
||||||
$ atuin stats day 01/01/21 # also accepts absolute dates
|
# A few more examples:
|
||||||
|
$ atuin stats 2018-04-01
|
||||||
|
$ atuin stats April 1
|
||||||
|
$ atuin stats 01/04/22
|
||||||
|
$ atuin stats last thursday 3pm # between last thursday 3:00pm and the following friday 3:00pm
|
||||||
```
|
```
|
||||||
|
|
||||||
It can also calculate statistics for all of known history:
|
## Full history stats
|
||||||
|
|
||||||
```
|
```
|
||||||
|
$ atuin stats
|
||||||
|
# or
|
||||||
$ atuin stats all
|
$ atuin stats all
|
||||||
|
|
||||||
+---------------------+-------+
|
+---------------------+-------+
|
||||||
|
|
|
@ -154,11 +154,8 @@ async fn run_non_interactive(
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(before) = &before {
|
if let Some(before) = &before {
|
||||||
let before = chrono_english::parse_date_string(
|
let before =
|
||||||
before.as_str(),
|
interim::parse_date_string(before.as_str(), Utc::now(), interim::Dialect::Uk);
|
||||||
Utc::now(),
|
|
||||||
chrono_english::Dialect::Uk,
|
|
||||||
);
|
|
||||||
|
|
||||||
if before.is_err() || h.timestamp.gt(&before.unwrap()) {
|
if before.is_err() || h.timestamp.gt(&before.unwrap()) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -166,11 +163,8 @@ async fn run_non_interactive(
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(after) = &after {
|
if let Some(after) = &after {
|
||||||
let after = chrono_english::parse_date_string(
|
let after =
|
||||||
after.as_str(),
|
interim::parse_date_string(after.as_str(), Utc::now(), interim::Dialect::Uk);
|
||||||
Utc::now(),
|
|
||||||
chrono_english::Dialect::Uk,
|
|
||||||
);
|
|
||||||
|
|
||||||
if after.is_err() || h.timestamp.lt(&after.unwrap()) {
|
if after.is_err() || h.timestamp.lt(&after.unwrap()) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use chrono::{prelude::*, Duration};
|
use chrono::{prelude::*, Duration};
|
||||||
use chrono_english::parse_date_string;
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use cli_table::{format::Justify, print_stdout, Cell, Style, Table};
|
use cli_table::{format::Justify, print_stdout, Cell, Style, Table};
|
||||||
use eyre::{bail, Result};
|
use eyre::{bail, Result};
|
||||||
|
use interim::parse_date_string;
|
||||||
|
|
||||||
use atuin_client::{
|
use atuin_client::{
|
||||||
database::{current_context, Database},
|
database::{current_context, Database},
|
||||||
|
|
Loading…
Reference in a new issue