mirror of
https://github.com/0xrsydn/idx-cli.git
synced 2026-11-07 09:45:36 +00:00
feat(cli): agent-native output, stdin symbols, and exit-code classes
Phase 1 of docs/DESIGN.md: - Output format resolves -o > IDX_OUTPUT > general.output > auto; auto is a table on a terminal and JSON when stdout is piped or captured. `config init` now writes output = "auto". - JSON is pretty only on a terminal and compact otherwise. New `-o jsonl` prints one array item per line with the same key order. - No ANSI color when stdout is not a terminal (direct owo-colors calls now go through output::style). - `stocks quote -` and `stocks compare -` read symbols from stdin. - Exit codes by class: 2 invalid input/config, 3 not found or cache miss, 4 upstream unavailable, 5 unsupported, 1 other. Golden changes are limited to those documented kinds and were verified mechanically: JSON goldens are semantically identical, tables differ only by removed ANSI codes and the column padding comfy-table had reserved for them (cell contents identical), exit codes match each error's class, and help/completions only gain the new --output values. 17 new golden cases cover auto, jsonl, stdin, and the new errors. tests/cli.rs now pins IDX_OUTPUT=table in its harness (its tests assert table text and run piped) and parses discover JSON instead of matching pretty-printed whitespace. Live A/B against main: 16/16 stocks cases identical; ownership discover got IDX 403 on both binaries, now exiting 4 instead of 1 as intended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
fe627496dd
commit
22b6dabaeb
119 changed files with 920 additions and 1896 deletions
33
tests/cli.rs
33
tests/cli.rs
|
|
@ -73,7 +73,10 @@ fn candidate_is_idx_binary(path: &Path) -> bool {
|
|||
return false;
|
||||
}
|
||||
|
||||
let Ok(output) = std::process::Command::new(path).arg("version").output() else {
|
||||
let Ok(output) = std::process::Command::new(path)
|
||||
.args(["-o", "table", "version"])
|
||||
.output()
|
||||
else {
|
||||
return false;
|
||||
};
|
||||
|
||||
|
|
@ -111,6 +114,10 @@ fn bin_with_root(root: &Path) -> Command {
|
|||
|
||||
let mut cmd = bin();
|
||||
cmd.current_dir(env!("CARGO_MANIFEST_DIR"));
|
||||
// Tests run with piped stdout, where the default (auto) format is JSON.
|
||||
// Pin table so tests that assert table text keep doing so; `-o` and
|
||||
// per-test IDX_OUTPUT still override this.
|
||||
cmd.env("IDX_OUTPUT", "table");
|
||||
cmd.env("XDG_CONFIG_HOME", &config_home);
|
||||
cmd.env("XDG_CACHE_HOME", &cache_home);
|
||||
cmd
|
||||
|
|
@ -1271,18 +1278,18 @@ fn ownership_discover_json_includes_status() {
|
|||
}"#;
|
||||
let json_url = spawn_single_response_server("application/json", body.to_string());
|
||||
|
||||
test_bin("ownership-discover-json-status")
|
||||
.env("IDX_CURL_IMPERSONATE_BIN", "curl")
|
||||
.env("IDX_OWNERSHIP_ANNOUNCEMENT_API_URL", &json_url)
|
||||
.env("IDX_OWNERSHIP_DATA_PAGE_URL", UNREACHABLE_DATA_PAGE_URL)
|
||||
.env(
|
||||
"IDX_OWNERSHIP_ANNOUNCEMENT_PAGE_URL",
|
||||
"http://127.0.0.1/pengumuman",
|
||||
)
|
||||
.args(["-o", "json", "ownership", "discover", "--limit", "1"])
|
||||
.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("\"status\": \"supported\""));
|
||||
let discovered = run_success_json(
|
||||
test_bin("ownership-discover-json-status")
|
||||
.env("IDX_CURL_IMPERSONATE_BIN", "curl")
|
||||
.env("IDX_OWNERSHIP_ANNOUNCEMENT_API_URL", &json_url)
|
||||
.env("IDX_OWNERSHIP_DATA_PAGE_URL", UNREACHABLE_DATA_PAGE_URL)
|
||||
.env(
|
||||
"IDX_OWNERSHIP_ANNOUNCEMENT_PAGE_URL",
|
||||
"http://127.0.0.1/pengumuman",
|
||||
)
|
||||
.args(["-o", "json", "ownership", "discover", "--limit", "1"]),
|
||||
);
|
||||
assert_eq!(discovered[0]["status"], "supported");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
|
|
@ -10,8 +10,9 @@
|
|||
|
||||
use std::collections::{BTreeMap, BTreeSet};
|
||||
use std::fs;
|
||||
use std::io::Write;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::process::Command;
|
||||
use std::process::{Command, Stdio};
|
||||
use std::sync::OnceLock;
|
||||
|
||||
use serde::Deserialize;
|
||||
|
|
@ -40,6 +41,9 @@ struct Case {
|
|||
/// Commands run first in the same environment; their output is ignored.
|
||||
#[serde(default)]
|
||||
before: Vec<Vec<String>>,
|
||||
/// Text piped to the command's stdin.
|
||||
#[serde(default)]
|
||||
stdin: Option<String>,
|
||||
}
|
||||
|
||||
fn default_formats() -> Vec<String> {
|
||||
|
|
@ -56,6 +60,15 @@ fn work_dir() -> PathBuf {
|
|||
|
||||
/// Runs idx with an isolated home under `root` and only the given IDX_* env.
|
||||
fn idx(root: &Path, args: &[String], env: &BTreeMap<String, String>) -> std::process::Output {
|
||||
idx_with_stdin(root, args, env, None)
|
||||
}
|
||||
|
||||
fn idx_with_stdin(
|
||||
root: &Path,
|
||||
args: &[String],
|
||||
env: &BTreeMap<String, String>,
|
||||
stdin: Option<&str>,
|
||||
) -> std::process::Output {
|
||||
let mut cmd = Command::new(IDX);
|
||||
cmd.current_dir(REPO).args(args);
|
||||
for (key, _) in std::env::vars_os() {
|
||||
|
|
@ -68,8 +81,17 @@ fn idx(root: &Path, args: &[String], env: &BTreeMap<String, String>) -> std::pro
|
|||
.env("XDG_CACHE_HOME", root.join("cache"))
|
||||
.env("XDG_DATA_HOME", root.join("data"))
|
||||
.env("IDX_USE_MOCK_PROVIDER", "1")
|
||||
.envs(env);
|
||||
cmd.output().expect("run idx")
|
||||
.envs(env)
|
||||
.stdin(Stdio::piped())
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::piped());
|
||||
let mut child = cmd.spawn().expect("spawn idx");
|
||||
let mut pipe = child.stdin.take().expect("stdin pipe");
|
||||
if let Some(input) = stdin {
|
||||
pipe.write_all(input.as_bytes()).expect("write stdin");
|
||||
}
|
||||
drop(pipe);
|
||||
child.wait_with_output().expect("run idx")
|
||||
}
|
||||
|
||||
/// Fixture ownership DB: the above-1% XLSX (2026-08-31) plus two KSEI archive
|
||||
|
|
@ -161,7 +183,8 @@ fn cli_output_matches_golden_files() {
|
|||
idx(&root, before, &case.env);
|
||||
}
|
||||
|
||||
let actual = render(&root, &idx(&root, &args, &case.env));
|
||||
let output = idx_with_stdin(&root, &args, &case.env, case.stdin.as_deref());
|
||||
let actual = render(&root, &output);
|
||||
let path = golden_dir().join(format!("{name}.golden"));
|
||||
if update {
|
||||
fs::write(&path, &actual).expect("write golden");
|
||||
|
|
|
|||
8
tests/golden/auto-format-env-table.golden
Normal file
8
tests/golden/auto-format-env-table.golden
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
┌─────────┬───────┬──────┬────────┬────────────┬───────────────────────┬────────────┐
|
||||
│ SYMBOL ┆ PRICE ┆ CHG ┆ CHG% ┆ VOLUME ┆ MKT CAP ┆ 52W RANGE │
|
||||
╞═════════╪═══════╪══════╪════════╪════════════╪═══════════════════════╪════════════╡
|
||||
│ BBCA.JK ┆ 9,875 ┆ +117 ┆ +1.20% ┆ 12,300,000 ┆ 1,215,200,000,000,000 ┆ ████████░░ │
|
||||
└─────────┴───────┴──────┴────────┴────────────┴───────────────────────┴────────────┘
|
||||
--- stderr
|
||||
4
tests/golden/auto-format-piped.golden
Normal file
4
tests/golden/auto-format-piped.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null},{"symbol":"BBRI.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}]
|
||||
--- stderr
|
||||
|
|
@ -1,7 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"failed": [],
|
||||
"removed": 0
|
||||
}
|
||||
{"failed":[],"removed":0}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,10 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"files": 0,
|
||||
"newest": null,
|
||||
"oldest": null,
|
||||
"path": "<ROOT>/cache/idx",
|
||||
"size_bytes": 0
|
||||
}
|
||||
{"files":0,"newest":null,"oldest":null,"path":"<ROOT>/cache/idx","size_bytes":0}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
# Golden output cases for tests/golden.rs.
|
||||
#
|
||||
# Each case runs once per entry in `formats` (default: table and json) with
|
||||
# `-o <format>` prepended; `formats = []` runs the args as given. Every run uses
|
||||
# the mock provider (IDX_USE_MOCK_PROVIDER=1) and an isolated home directory.
|
||||
# `ownership = true` seeds the fixture DB; `before` runs setup commands first.
|
||||
# `-o <format>` prepended; `formats = []` runs the args as given, which means
|
||||
# the auto format: stdout is a pipe here, so auto resolves to compact JSON.
|
||||
# Every run uses the mock provider (IDX_USE_MOCK_PROVIDER=1) and an isolated
|
||||
# home directory. `ownership = true` seeds the fixture DB; `before` runs setup
|
||||
# commands first; `stdin` is piped to the command.
|
||||
#
|
||||
# `idx version` is excluded on purpose: its output changes with every release.
|
||||
|
||||
|
|
@ -62,6 +64,22 @@ name = "config-set"
|
|||
args = ["config", "set", "general.provider", "yahoo"]
|
||||
formats = []
|
||||
|
||||
[[case]]
|
||||
name = "config-set-output-jsonl"
|
||||
args = ["config", "set", "general.output", "jsonl"]
|
||||
formats = []
|
||||
|
||||
[[case]]
|
||||
name = "config-set-output-invalid"
|
||||
args = ["config", "set", "general.output", "yaml"]
|
||||
formats = []
|
||||
|
||||
[[case]]
|
||||
name = "config-output-table-pins-format"
|
||||
args = ["stocks", "quote", "BBCA"]
|
||||
formats = []
|
||||
before = [["config", "set", "general.output", "table"]]
|
||||
|
||||
[[case]]
|
||||
name = "cache-info-empty"
|
||||
args = ["cache", "info"]
|
||||
|
|
@ -78,10 +96,12 @@ args = ["stocks", "quote", "BBCA"]
|
|||
|
||||
[[case]]
|
||||
name = "stocks-quote-multi"
|
||||
formats = ["table", "json", "jsonl"]
|
||||
args = ["stocks", "quote", "BBCA,BBRI"]
|
||||
|
||||
[[case]]
|
||||
name = "stocks-history"
|
||||
formats = ["table", "json", "jsonl"]
|
||||
args = ["stocks", "history", "BBCA"]
|
||||
|
||||
[[case]]
|
||||
|
|
@ -111,6 +131,7 @@ args = ["stocks", "risk", "BBCA"]
|
|||
|
||||
[[case]]
|
||||
name = "stocks-fundamental"
|
||||
formats = ["table", "json", "jsonl"]
|
||||
args = ["stocks", "fundamental", "BBCA"]
|
||||
|
||||
[[case]]
|
||||
|
|
@ -169,6 +190,38 @@ args = ["stocks", "screen", "--filter", "high-volume"]
|
|||
name = "stocks-screen-large-cap"
|
||||
args = ["stocks", "screen", "--filter", "large-cap"]
|
||||
|
||||
[[case]]
|
||||
name = "auto-format-piped"
|
||||
args = ["stocks", "quote", "BBCA,BBRI"]
|
||||
formats = []
|
||||
|
||||
[[case]]
|
||||
name = "auto-format-env-table"
|
||||
args = ["stocks", "quote", "BBCA"]
|
||||
formats = []
|
||||
env = { IDX_OUTPUT = "table" }
|
||||
|
||||
[[case]]
|
||||
name = "stocks-quote-stdin"
|
||||
args = ["stocks", "quote", "-"]
|
||||
stdin = "BBCA\nBBRI\n"
|
||||
|
||||
[[case]]
|
||||
name = "stocks-compare-stdin"
|
||||
args = ["stocks", "compare", "-"]
|
||||
stdin = "BBCA, BBRI"
|
||||
|
||||
[[case]]
|
||||
name = "error-stdin-empty"
|
||||
args = ["stocks", "quote", "-"]
|
||||
stdin = ""
|
||||
|
||||
[[case]]
|
||||
name = "error-invalid-output-env"
|
||||
args = ["stocks", "quote", "BBCA"]
|
||||
formats = []
|
||||
env = { IDX_OUTPUT = "yaml" }
|
||||
|
||||
[[case]]
|
||||
name = "stocks-quote-offline-warm"
|
||||
args = ["--offline", "stocks", "quote", "BBCA"]
|
||||
|
|
@ -214,6 +267,7 @@ env = { IDX_MOCK_MSN_KEYRATIOS_FIXTURE = "tests/fixtures/msn_keyratios_industry_
|
|||
|
||||
[[case]]
|
||||
name = "error-screen-region"
|
||||
formats = ["table", "json", "jsonl"]
|
||||
args = ["stocks", "screen", "--region", "eu"]
|
||||
|
||||
[[case]]
|
||||
|
|
@ -298,6 +352,7 @@ ownership = true
|
|||
|
||||
[[case]]
|
||||
name = "ownership-changes"
|
||||
formats = ["table", "json", "jsonl"]
|
||||
args = ["ownership", "changes", "--from", "2026-01-30", "--to", "2026-02-27"]
|
||||
ownership = true
|
||||
|
||||
|
|
|
|||
|
|
@ -446,11 +446,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -468,11 +468,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -490,11 +490,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -568,11 +568,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -590,11 +590,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -612,11 +612,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -634,11 +634,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -740,11 +740,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -762,11 +762,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -784,11 +784,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1436,11 +1436,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1466,11 +1466,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1496,11 +1496,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1526,11 +1526,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1556,11 +1556,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1578,11 +1578,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1600,11 +1600,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1630,11 +1630,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1916,11 +1916,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1938,11 +1938,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -1960,11 +1960,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2052,11 +2052,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2074,11 +2074,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2100,11 +2100,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2126,11 +2126,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2152,11 +2152,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2178,11 +2178,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2200,11 +2200,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2222,11 +2222,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2244,11 +2244,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2270,11 +2270,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2292,11 +2292,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2314,11 +2314,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2586,11 +2586,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2608,11 +2608,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2634,11 +2634,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2656,11 +2656,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2678,11 +2678,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2700,11 +2700,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2734,11 +2734,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2756,11 +2756,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2782,11 +2782,11 @@ _idx() {
|
|||
return 0
|
||||
;;
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2804,11 +2804,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
@ -2826,11 +2826,11 @@ _idx() {
|
|||
fi
|
||||
case "${prev}" in
|
||||
--output)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
-o)
|
||||
COMPREPLY=($(compgen -W "table json" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "auto table json jsonl" -- "${cur}"))
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
|
|
|
|||
8
tests/golden/config-output-table-pins-format.golden
Normal file
8
tests/golden/config-output-table-pins-format.golden
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
┌─────────┬───────┬──────┬────────┬────────────┬───────────────────────┬────────────┐
|
||||
│ SYMBOL ┆ PRICE ┆ CHG ┆ CHG% ┆ VOLUME ┆ MKT CAP ┆ 52W RANGE │
|
||||
╞═════════╪═══════╪══════╪════════╪════════════╪═══════════════════════╪════════════╡
|
||||
│ BBCA.JK ┆ 9,875 ┆ +117 ┆ +1.20% ┆ 12,300,000 ┆ 1,215,200,000,000,000 ┆ ████████░░ │
|
||||
└─────────┴───────┴──────┴────────┴────────────┴───────────────────────┴────────────┘
|
||||
--- stderr
|
||||
4
tests/golden/config-set-output-invalid.golden
Normal file
4
tests/golden/config-set-output-invalid.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
{"code":"INVALIDINPUT","error":true,"message":"invalid input: invalid output format 'yaml': expected 'auto', 'table', 'json', or 'jsonl'"}
|
||||
4
tests/golden/config-set-output-jsonl.golden
Normal file
4
tests/golden/config-set-output-jsonl.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
ok
|
||||
--- stderr
|
||||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 4
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "PROVIDERUNAVAILABLE",
|
||||
"error": true,
|
||||
"message": "provider unavailable"
|
||||
}
|
||||
{"code":"PROVIDERUNAVAILABLE","error":true,"message":"provider unavailable"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 4
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: provider unavailable
|
||||
|
|
|
|||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 5
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "UNSUPPORTED",
|
||||
"error": true,
|
||||
"message": "unsupported: --fetch-bing import is not implemented yet"
|
||||
}
|
||||
{"code":"UNSUPPORTED","error":true,"message":"unsupported: --fetch-bing import is not implemented yet"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 5
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: unsupported: --fetch-bing import is not implemented yet
|
||||
|
|
|
|||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "PARSEERROR",
|
||||
"error": true,
|
||||
"message": "parse error: unsupported: company fundamentals unavailable from MSN; industry fallback is disabled"
|
||||
}
|
||||
{"code":"PARSEERROR","error":true,"message":"parse error: unsupported: company fundamentals unavailable from MSN; industry fallback is disabled"}
|
||||
|
|
|
|||
4
tests/golden/error-invalid-output-env.golden
Normal file
4
tests/golden/error-invalid-output-env.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
{"code":"CONFIGERROR","error":true,"message":"config error: invalid IDX_OUTPUT value: 'yaml', expected 'auto', 'table', 'json', or 'jsonl'"}
|
||||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "CONFIGERROR",
|
||||
"error": true,
|
||||
"message": "config error: invalid provider 'bogus' (expected yahoo or msn)"
|
||||
}
|
||||
{"code":"CONFIGERROR","error":true,"message":"config error: invalid provider 'bogus' (expected yahoo or msn)"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: config error: invalid provider 'bogus' (expected yahoo or msn)
|
||||
|
|
|
|||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 3
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "CACHEMISS",
|
||||
"error": true,
|
||||
"message": "cache miss: msn-quote/BBCA.JK"
|
||||
}
|
||||
{"code":"CACHEMISS","error":true,"message":"cache miss: msn-quote/BBCA.JK"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 3
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: cache miss: msn-quote/BBCA.JK
|
||||
|
|
|
|||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "INVALIDINPUT",
|
||||
"error": true,
|
||||
"message": "invalid input: cannot combine --offline with --no-cache"
|
||||
}
|
||||
{"code":"INVALIDINPUT","error":true,"message":"invalid input: cannot combine --offline with --no-cache"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: invalid input: cannot combine --offline with --no-cache
|
||||
|
|
|
|||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 4
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "PROVIDERUNAVAILABLE",
|
||||
"error": true,
|
||||
"message": "provider unavailable"
|
||||
}
|
||||
{"code":"PROVIDERUNAVAILABLE","error":true,"message":"provider unavailable"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 4
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: provider unavailable
|
||||
|
|
|
|||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "INVALIDINPUT",
|
||||
"error": true,
|
||||
"message": "invalid input: invalid screener region 'eu' (expected one of: id, us, sg, hk, jp)"
|
||||
}
|
||||
{"code":"INVALIDINPUT","error":true,"message":"invalid input: invalid screener region 'eu' (expected one of: id, us, sg, hk, jp)"}
|
||||
|
|
|
|||
4
tests/golden/error-screen-region.jsonl.golden
Normal file
4
tests/golden/error-screen-region.jsonl.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
{"code":"INVALIDINPUT","error":true,"message":"invalid input: invalid screener region 'eu' (expected one of: id, us, sg, hk, jp)"}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: invalid input: invalid screener region 'eu' (expected one of: id, us, sg, hk, jp)
|
||||
|
|
|
|||
4
tests/golden/error-stdin-empty.json.golden
Normal file
4
tests/golden/error-stdin-empty.json.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
{"code":"INVALIDINPUT","error":true,"message":"invalid input: no symbols read from stdin"}
|
||||
4
tests/golden/error-stdin-empty.table.golden
Normal file
4
tests/golden/error-stdin-empty.table.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 2
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: invalid input: no symbols read from stdin
|
||||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 5
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "UNSUPPORTED",
|
||||
"error": true,
|
||||
"message": "unsupported: BBCA.JK: command requires --provider msn"
|
||||
}
|
||||
{"code":"UNSUPPORTED","error":true,"message":"unsupported: BBCA.JK: command requires --provider msn"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 5
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: unsupported: BBCA.JK: command requires --provider msn
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ Commands:
|
|||
help Print this message or the help of the given subcommand(s)
|
||||
|
||||
Options:
|
||||
-o, --output <OUTPUT> Output format [possible values: table, json]
|
||||
-o, --output <OUTPUT> Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl]
|
||||
--no-color Disable colored output
|
||||
-q, --quiet Suppress non-essential output
|
||||
-v, --verbose... Increase verbosity (-v, -vv)
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ Commands:
|
|||
help Print this message or the help of the given subcommand(s)
|
||||
|
||||
Options:
|
||||
-o, --output <OUTPUT> Output format [possible values: table, json]
|
||||
-o, --output <OUTPUT> Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl]
|
||||
--no-color Disable colored output
|
||||
-q, --quiet Suppress non-essential output
|
||||
-v, --verbose... Increase verbosity (-v, -vv)
|
||||
|
|
|
|||
|
|
@ -27,9 +27,9 @@ Commands:
|
|||
|
||||
Options:
|
||||
-o, --output <OUTPUT>
|
||||
Output format
|
||||
Output format [default: auto = table on a terminal, json when piped]
|
||||
|
||||
[possible values: table, json]
|
||||
[possible values: auto, table, json, jsonl]
|
||||
|
||||
--no-color
|
||||
Disable colored output
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@ Commands:
|
|||
|
||||
Options:
|
||||
-o, --output <OUTPUT>
|
||||
Output format
|
||||
Output format [default: auto = table on a terminal, json when piped]
|
||||
|
||||
[possible values: table, json]
|
||||
[possible values: auto, table, json, jsonl]
|
||||
|
||||
--no-color
|
||||
Disable colored output
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ Commands:
|
|||
help Print this message or the help of the given subcommand(s)
|
||||
|
||||
Options:
|
||||
-o, --output <OUTPUT> Output format [possible values: table, json]
|
||||
-o, --output <OUTPUT> Output format [default: auto = table on a terminal, json when piped] [possible values: auto, table, json, jsonl]
|
||||
--no-color Disable colored output
|
||||
-q, --quiet Suppress non-essential output
|
||||
-v, --verbose... Increase verbosity (-v, -vv)
|
||||
|
|
|
|||
|
|
@ -1,109 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE LOCAL ID",
|
||||
"change_type": "decreased",
|
||||
"old_bps": 2400,
|
||||
"new_bps": 2334,
|
||||
"delta_bps": -66
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE LOCAL IS",
|
||||
"change_type": "increased",
|
||||
"old_bps": 75,
|
||||
"new_bps": 129,
|
||||
"delta_bps": 54
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE LOCAL MF",
|
||||
"change_type": "increased",
|
||||
"old_bps": 117,
|
||||
"new_bps": 152,
|
||||
"delta_bps": 35
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE FOREIGN MF",
|
||||
"change_type": "increased",
|
||||
"old_bps": 307,
|
||||
"new_bps": 337,
|
||||
"delta_bps": 30
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE FOREIGN OT",
|
||||
"change_type": "decreased",
|
||||
"old_bps": 91,
|
||||
"new_bps": 64,
|
||||
"delta_bps": -27
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE FOREIGN PF",
|
||||
"change_type": "decreased",
|
||||
"old_bps": 76,
|
||||
"new_bps": 56,
|
||||
"delta_bps": -20
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE FOREIGN CP",
|
||||
"change_type": "increased",
|
||||
"old_bps": 72,
|
||||
"new_bps": 86,
|
||||
"delta_bps": 14
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE LOCAL CP",
|
||||
"change_type": "decreased",
|
||||
"old_bps": 6481,
|
||||
"new_bps": 6467,
|
||||
"delta_bps": -14
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE LOCAL SC",
|
||||
"change_type": "decreased",
|
||||
"old_bps": 36,
|
||||
"new_bps": 29,
|
||||
"delta_bps": -7
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE FOREIGN IB",
|
||||
"change_type": "decreased",
|
||||
"old_bps": 267,
|
||||
"new_bps": 263,
|
||||
"delta_bps": -4
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE FOREIGN SC",
|
||||
"change_type": "increased",
|
||||
"old_bps": 51,
|
||||
"new_bps": 55,
|
||||
"delta_bps": 4
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE LOCAL PF",
|
||||
"change_type": "increased",
|
||||
"old_bps": 17,
|
||||
"new_bps": 20,
|
||||
"delta_bps": 3
|
||||
},
|
||||
{
|
||||
"ticker_code": "AADI",
|
||||
"entity_name": "KSEI AGGREGATE FOREIGN ID",
|
||||
"change_type": "decreased",
|
||||
"old_bps": 3,
|
||||
"new_bps": 2,
|
||||
"delta_bps": -1
|
||||
}
|
||||
]
|
||||
[{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL ID","change_type":"decreased","old_bps":2400,"new_bps":2334,"delta_bps":-66},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL IS","change_type":"increased","old_bps":75,"new_bps":129,"delta_bps":54},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL MF","change_type":"increased","old_bps":117,"new_bps":152,"delta_bps":35},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN MF","change_type":"increased","old_bps":307,"new_bps":337,"delta_bps":30},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN OT","change_type":"decreased","old_bps":91,"new_bps":64,"delta_bps":-27},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN PF","change_type":"decreased","old_bps":76,"new_bps":56,"delta_bps":-20},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN CP","change_type":"increased","old_bps":72,"new_bps":86,"delta_bps":14},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL CP","change_type":"decreased","old_bps":6481,"new_bps":6467,"delta_bps":-14},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL SC","change_type":"decreased","old_bps":36,"new_bps":29,"delta_bps":-7},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN IB","change_type":"decreased","old_bps":267,"new_bps":263,"delta_bps":-4},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN SC","change_type":"increased","old_bps":51,"new_bps":55,"delta_bps":4},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL PF","change_type":"increased","old_bps":17,"new_bps":20,"delta_bps":3},{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN ID","change_type":"decreased","old_bps":3,"new_bps":2,"delta_bps":-1}]
|
||||
--- stderr
|
||||
|
|
|
|||
16
tests/golden/ownership-changes.jsonl.golden
Normal file
16
tests/golden/ownership-changes.jsonl.golden
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL ID","change_type":"decreased","old_bps":2400,"new_bps":2334,"delta_bps":-66}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL IS","change_type":"increased","old_bps":75,"new_bps":129,"delta_bps":54}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL MF","change_type":"increased","old_bps":117,"new_bps":152,"delta_bps":35}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN MF","change_type":"increased","old_bps":307,"new_bps":337,"delta_bps":30}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN OT","change_type":"decreased","old_bps":91,"new_bps":64,"delta_bps":-27}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN PF","change_type":"decreased","old_bps":76,"new_bps":56,"delta_bps":-20}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN CP","change_type":"increased","old_bps":72,"new_bps":86,"delta_bps":14}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL CP","change_type":"decreased","old_bps":6481,"new_bps":6467,"delta_bps":-14}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL SC","change_type":"decreased","old_bps":36,"new_bps":29,"delta_bps":-7}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN IB","change_type":"decreased","old_bps":267,"new_bps":263,"delta_bps":-4}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN SC","change_type":"increased","old_bps":51,"new_bps":55,"delta_bps":4}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE LOCAL PF","change_type":"increased","old_bps":17,"new_bps":20,"delta_bps":3}
|
||||
{"ticker_code":"AADI","entity_name":"KSEI AGGREGATE FOREIGN ID","change_type":"decreased","old_bps":3,"new_bps":2,"delta_bps":-1}
|
||||
--- stderr
|
||||
|
|
@ -1,32 +1,32 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
┌────────┬───────────────────────────┬─────────────────────┬────────┬────────┬────────┐
|
||||
│ TICKER ┆ ENTITY ┆ CHANGE ┆ OLD% ┆ NEW% ┆ DELTA% │
|
||||
╞════════╪═══════════════════════════╪═════════════════════╪════════╪════════╪════════╡
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL ID ┆ [31mDECREASED[39m ┆ 24.00% ┆ 23.34% ┆ -0.66% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL IS ┆ [32mINCREASED[39m ┆ 0.75% ┆ 1.29% ┆ +0.54% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL MF ┆ [32mINCREASED[39m ┆ 1.17% ┆ 1.52% ┆ +0.35% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN MF ┆ [32mINCREASED[39m ┆ 3.07% ┆ 3.37% ┆ +0.30% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN OT ┆ [31mDECREASED[39m ┆ 0.91% ┆ 0.64% ┆ -0.27% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN PF ┆ [31mDECREASED[39m ┆ 0.76% ┆ 0.56% ┆ -0.20% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN CP ┆ [32mINCREASED[39m ┆ 0.72% ┆ 0.86% ┆ +0.14% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL CP ┆ [31mDECREASED[39m ┆ 64.81% ┆ 64.67% ┆ -0.14% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL SC ┆ [31mDECREASED[39m ┆ 0.36% ┆ 0.29% ┆ -0.07% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN IB ┆ [31mDECREASED[39m ┆ 2.67% ┆ 2.63% ┆ -0.04% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN SC ┆ [32mINCREASED[39m ┆ 0.51% ┆ 0.55% ┆ +0.04% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL PF ┆ [32mINCREASED[39m ┆ 0.17% ┆ 0.20% ┆ +0.03% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN ID ┆ [31mDECREASED[39m ┆ 0.03% ┆ 0.02% ┆ -0.01% │
|
||||
└────────┴───────────────────────────┴─────────────────────┴────────┴────────┴────────┘
|
||||
┌────────┬───────────────────────────┬───────────┬────────┬────────┬────────┐
|
||||
│ TICKER ┆ ENTITY ┆ CHANGE ┆ OLD% ┆ NEW% ┆ DELTA% │
|
||||
╞════════╪═══════════════════════════╪═══════════╪════════╪════════╪════════╡
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL ID ┆ DECREASED ┆ 24.00% ┆ 23.34% ┆ -0.66% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL IS ┆ INCREASED ┆ 0.75% ┆ 1.29% ┆ +0.54% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL MF ┆ INCREASED ┆ 1.17% ┆ 1.52% ┆ +0.35% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN MF ┆ INCREASED ┆ 3.07% ┆ 3.37% ┆ +0.30% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN OT ┆ DECREASED ┆ 0.91% ┆ 0.64% ┆ -0.27% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN PF ┆ DECREASED ┆ 0.76% ┆ 0.56% ┆ -0.20% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN CP ┆ INCREASED ┆ 0.72% ┆ 0.86% ┆ +0.14% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL CP ┆ DECREASED ┆ 64.81% ┆ 64.67% ┆ -0.14% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL SC ┆ DECREASED ┆ 0.36% ┆ 0.29% ┆ -0.07% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN IB ┆ DECREASED ┆ 2.67% ┆ 2.63% ┆ -0.04% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN SC ┆ INCREASED ┆ 0.51% ┆ 0.55% ┆ +0.04% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE LOCAL PF ┆ INCREASED ┆ 0.17% ┆ 0.20% ┆ +0.03% │
|
||||
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ AADI ┆ KSEI AGGREGATE FOREIGN ID ┆ DECREASED ┆ 0.03% ┆ 0.02% ┆ -0.01% │
|
||||
└────────┴───────────────────────────┴───────────┴────────┴────────┴────────┘
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,45 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
[
|
||||
"AALI",
|
||||
{
|
||||
"top1_bps": 7968,
|
||||
"top3_bps": 7968,
|
||||
"hhi": 6348,
|
||||
"free_float_bps": 2032,
|
||||
"holder_count": 1
|
||||
}
|
||||
],
|
||||
[
|
||||
"BBCA",
|
||||
{
|
||||
"top1_bps": 5494,
|
||||
"top3_bps": 5716,
|
||||
"hhi": 3021,
|
||||
"free_float_bps": 4182,
|
||||
"holder_count": 4
|
||||
}
|
||||
],
|
||||
[
|
||||
"AADI",
|
||||
{
|
||||
"top1_bps": 4110,
|
||||
"top3_bps": 6230,
|
||||
"hhi": 2009,
|
||||
"free_float_bps": 2030,
|
||||
"holder_count": 10
|
||||
}
|
||||
],
|
||||
[
|
||||
"ABBA",
|
||||
{
|
||||
"top1_bps": 283,
|
||||
"top3_bps": 418,
|
||||
"hhi": 9,
|
||||
"free_float_bps": 9582,
|
||||
"holder_count": 2
|
||||
}
|
||||
]
|
||||
]
|
||||
[["AALI",{"top1_bps":7968,"top3_bps":7968,"hhi":6348,"free_float_bps":2032,"holder_count":1}],["BBCA",{"top1_bps":5494,"top3_bps":5716,"hhi":3021,"free_float_bps":4182,"holder_count":4}],["AADI",{"top1_bps":4110,"top3_bps":6230,"hhi":2009,"free_float_bps":2030,"holder_count":10}],["ABBA",{"top1_bps":283,"top3_bps":418,"hhi":9,"free_float_bps":9582,"holder_count":2}]]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,175 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"entity": {
|
||||
"id": 11,
|
||||
"canonical_name": "ASTRA INTERNATIONAL",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 7968
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 14,
|
||||
"canonical_name": "DWIMURIA INVESTAMA ANDALAN",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 5494
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 4,
|
||||
"canonical_name": "ADARO STRATEGIC INVESTMENTS",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 4110
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 5,
|
||||
"canonical_name": "ALAMTRI RESOURCES INDONESIA TBK PT",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 1537
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 7,
|
||||
"canonical_name": "GARIBALDI THOHIR",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 583
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 2,
|
||||
"canonical_name": "SARATOGA INVESTAMA SEDAYA",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 438
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 9,
|
||||
"canonical_name": "EDWIN SOERYADJAYA",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 352
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 8,
|
||||
"canonical_name": "IR. T. PERMADI RACHMAT",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 348
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 13,
|
||||
"canonical_name": "YAYASAN ABDI BANGSA",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 283
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 10,
|
||||
"canonical_name": "SANDIAGA SALAHUDDIN UNO",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 204
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 1,
|
||||
"canonical_name": "PERSADA CAPITAL INVESTAMA",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 154
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 12,
|
||||
"canonical_name": "YAYASAN BINA SEJAHTERA WARGA BULOG",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 135
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 6,
|
||||
"canonical_name": "FTAG INVESTMENT BANK",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 129
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 17,
|
||||
"canonical_name": "ANTHONI SALIM",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 115
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 3,
|
||||
"canonical_name": "TRINUGRAHA THOHIR",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 115
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 16,
|
||||
"canonical_name": "TRICIPTA MANDHALA GUMILANG",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 107
|
||||
},
|
||||
{
|
||||
"entity": {
|
||||
"id": 15,
|
||||
"canonical_name": "CATURGUWIRATNA SUMAPALA",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"total_bps": 102
|
||||
}
|
||||
]
|
||||
[{"entity":{"id":11,"canonical_name":"ASTRA INTERNATIONAL","entity_type":null,"country":null},"ticker_count":1,"total_bps":7968},{"entity":{"id":14,"canonical_name":"DWIMURIA INVESTAMA ANDALAN","entity_type":null,"country":null},"ticker_count":1,"total_bps":5494},{"entity":{"id":4,"canonical_name":"ADARO STRATEGIC INVESTMENTS","entity_type":null,"country":null},"ticker_count":1,"total_bps":4110},{"entity":{"id":5,"canonical_name":"ALAMTRI RESOURCES INDONESIA TBK PT","entity_type":null,"country":null},"ticker_count":1,"total_bps":1537},{"entity":{"id":7,"canonical_name":"GARIBALDI THOHIR","entity_type":null,"country":null},"ticker_count":1,"total_bps":583},{"entity":{"id":2,"canonical_name":"SARATOGA INVESTAMA SEDAYA","entity_type":null,"country":null},"ticker_count":1,"total_bps":438},{"entity":{"id":9,"canonical_name":"EDWIN SOERYADJAYA","entity_type":null,"country":null},"ticker_count":1,"total_bps":352},{"entity":{"id":8,"canonical_name":"IR. T. PERMADI RACHMAT","entity_type":null,"country":null},"ticker_count":1,"total_bps":348},{"entity":{"id":13,"canonical_name":"YAYASAN ABDI BANGSA","entity_type":null,"country":null},"ticker_count":1,"total_bps":283},{"entity":{"id":10,"canonical_name":"SANDIAGA SALAHUDDIN UNO","entity_type":null,"country":null},"ticker_count":1,"total_bps":204},{"entity":{"id":1,"canonical_name":"PERSADA CAPITAL INVESTAMA","entity_type":null,"country":null},"ticker_count":1,"total_bps":154},{"entity":{"id":12,"canonical_name":"YAYASAN BINA SEJAHTERA WARGA BULOG","entity_type":null,"country":null},"ticker_count":1,"total_bps":135},{"entity":{"id":6,"canonical_name":"FTAG INVESTMENT BANK","entity_type":null,"country":null},"ticker_count":1,"total_bps":129},{"entity":{"id":17,"canonical_name":"ANTHONI SALIM","entity_type":null,"country":null},"ticker_count":1,"total_bps":115},{"entity":{"id":3,"canonical_name":"TRINUGRAHA THOHIR","entity_type":null,"country":null},"ticker_count":1,"total_bps":115},{"entity":{"id":16,"canonical_name":"TRICIPTA MANDHALA GUMILANG","entity_type":null,"country":null},"ticker_count":1,"total_bps":107},{"entity":{"id":15,"canonical_name":"CATURGUWIRATNA SUMAPALA","entity_type":null,"country":null},"ticker_count":1,"total_bps":102}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,26 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"entity": {
|
||||
"id": 17,
|
||||
"canonical_name": "ANTHONI SALIM",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
},
|
||||
"ticker_count": 1,
|
||||
"holdings": [
|
||||
{
|
||||
"ticker": {
|
||||
"id": 4,
|
||||
"code": "BBCA",
|
||||
"name": "BANK CENTRAL ASIA Tbk",
|
||||
"sector": null
|
||||
},
|
||||
"source": "ksei",
|
||||
"shares": 1416306835,
|
||||
"percentage_bps": 115,
|
||||
"report_date": "2026-08-31"
|
||||
}
|
||||
]
|
||||
}
|
||||
{"entity":{"id":17,"canonical_name":"ANTHONI SALIM","entity_type":null,"country":null},"ticker_count":1,"holdings":[{"ticker":{"id":4,"code":"BBCA","name":"BANK CENTRAL ASIA Tbk","sector":null},"source":"ksei","shares":1416306835,"percentage_bps":115,"report_date":"2026-08-31"}]}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mEntity:[0m [1mANTHONI SALIM[0m
|
||||
Entity: ANTHONI SALIM
|
||||
┌────────┬────────┬───────────────┬───────┬─────────────┐
|
||||
│ TICKER ┆ SOURCE ┆ SHARES ┆ % ┆ REPORT_DATE │
|
||||
╞════════╪════════╪═══════════════╪═══════╪═════════════╡
|
||||
│ BBCA ┆ KSEI ┆ 1,416,306,835 ┆ 1.15% ┆ 2026-08-31 │
|
||||
└────────┴────────┴───────────────┴───────┴─────────────┘
|
||||
[1mTotal tickers:[0m 1
|
||||
Total tickers: 1
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,58 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"nodes": [
|
||||
{
|
||||
"id": "entity:14",
|
||||
"label": "DWIMURIA INVESTAMA ANDALAN",
|
||||
"node_type": "entity"
|
||||
},
|
||||
{
|
||||
"id": "entity:15",
|
||||
"label": "CATURGUWIRATNA SUMAPALA",
|
||||
"node_type": "entity"
|
||||
},
|
||||
{
|
||||
"id": "entity:16",
|
||||
"label": "TRICIPTA MANDHALA GUMILANG",
|
||||
"node_type": "entity"
|
||||
},
|
||||
{
|
||||
"id": "entity:17",
|
||||
"label": "ANTHONI SALIM",
|
||||
"node_type": "entity"
|
||||
},
|
||||
{
|
||||
"id": "ticker:BBCA",
|
||||
"label": "BBCA",
|
||||
"node_type": "ticker"
|
||||
}
|
||||
],
|
||||
"edges": [
|
||||
{
|
||||
"from": "entity:17",
|
||||
"to": "ticker:BBCA",
|
||||
"percentage_bps": 115,
|
||||
"source": "ksei"
|
||||
},
|
||||
{
|
||||
"from": "entity:15",
|
||||
"to": "ticker:BBCA",
|
||||
"percentage_bps": 102,
|
||||
"source": "ksei"
|
||||
},
|
||||
{
|
||||
"from": "entity:14",
|
||||
"to": "ticker:BBCA",
|
||||
"percentage_bps": 5494,
|
||||
"source": "ksei"
|
||||
},
|
||||
{
|
||||
"from": "entity:16",
|
||||
"to": "ticker:BBCA",
|
||||
"percentage_bps": 107,
|
||||
"source": "ksei"
|
||||
}
|
||||
]
|
||||
}
|
||||
{"nodes":[{"id":"entity:14","label":"DWIMURIA INVESTAMA ANDALAN","node_type":"entity"},{"id":"entity:15","label":"CATURGUWIRATNA SUMAPALA","node_type":"entity"},{"id":"entity:16","label":"TRICIPTA MANDHALA GUMILANG","node_type":"entity"},{"id":"entity:17","label":"ANTHONI SALIM","node_type":"entity"},{"id":"ticker:BBCA","label":"BBCA","node_type":"ticker"}],"edges":[{"from":"entity:17","to":"ticker:BBCA","percentage_bps":115,"source":"ksei"},{"from":"entity:15","to":"ticker:BBCA","percentage_bps":102,"source":"ksei"},{"from":"entity:14","to":"ticker:BBCA","percentage_bps":5494,"source":"ksei"},{"from":"entity:16","to":"ticker:BBCA","percentage_bps":107,"source":"ksei"}]}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,58 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"nodes": [
|
||||
{
|
||||
"id": "entity:14",
|
||||
"label": "DWIMURIA INVESTAMA ANDALAN",
|
||||
"node_type": "entity"
|
||||
},
|
||||
{
|
||||
"id": "entity:15",
|
||||
"label": "CATURGUWIRATNA SUMAPALA",
|
||||
"node_type": "entity"
|
||||
},
|
||||
{
|
||||
"id": "entity:16",
|
||||
"label": "TRICIPTA MANDHALA GUMILANG",
|
||||
"node_type": "entity"
|
||||
},
|
||||
{
|
||||
"id": "entity:17",
|
||||
"label": "ANTHONI SALIM",
|
||||
"node_type": "entity"
|
||||
},
|
||||
{
|
||||
"id": "ticker:BBCA",
|
||||
"label": "BBCA",
|
||||
"node_type": "ticker"
|
||||
}
|
||||
],
|
||||
"edges": [
|
||||
{
|
||||
"from": "entity:17",
|
||||
"to": "ticker:BBCA",
|
||||
"percentage_bps": 115,
|
||||
"source": "ksei"
|
||||
},
|
||||
{
|
||||
"from": "entity:15",
|
||||
"to": "ticker:BBCA",
|
||||
"percentage_bps": 102,
|
||||
"source": "ksei"
|
||||
},
|
||||
{
|
||||
"from": "entity:14",
|
||||
"to": "ticker:BBCA",
|
||||
"percentage_bps": 5494,
|
||||
"source": "ksei"
|
||||
},
|
||||
{
|
||||
"from": "entity:16",
|
||||
"to": "ticker:BBCA",
|
||||
"percentage_bps": 107,
|
||||
"source": "ksei"
|
||||
}
|
||||
]
|
||||
}
|
||||
{"nodes":[{"id":"entity:14","label":"DWIMURIA INVESTAMA ANDALAN","node_type":"entity"},{"id":"entity:15","label":"CATURGUWIRATNA SUMAPALA","node_type":"entity"},{"id":"entity:16","label":"TRICIPTA MANDHALA GUMILANG","node_type":"entity"},{"id":"entity:17","label":"ANTHONI SALIM","node_type":"entity"},{"id":"ticker:BBCA","label":"BBCA","node_type":"ticker"}],"edges":[{"from":"entity:17","to":"ticker:BBCA","percentage_bps":115,"source":"ksei"},{"from":"entity:15","to":"ticker:BBCA","percentage_bps":102,"source":"ksei"},{"from":"entity:14","to":"ticker:BBCA","percentage_bps":5494,"source":"ksei"},{"from":"entity:16","to":"ticker:BBCA","percentage_bps":107,"source":"ksei"}]}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,11 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"action": "imported",
|
||||
"inserted_rows": 18,
|
||||
"ticker_count": 1,
|
||||
"as_of_date": "2026-02-27",
|
||||
"sha256": "7b8da1d820f67062410c48988bb6c70fec2088c24961d481d1c0fce8b9372547",
|
||||
"source_url": null
|
||||
}
|
||||
{"action":"imported","inserted_rows":18,"ticker_count":1,"as_of_date":"2026-02-27","sha256":"7b8da1d820f67062410c48988bb6c70fec2088c24961d481d1c0fce8b9372547","source_url":null}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,11 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"action": "imported",
|
||||
"inserted_rows": 17,
|
||||
"ticker_count": 4,
|
||||
"as_of_date": "2026-08-31",
|
||||
"sha256": "7c1a4c209b8ce5bde9112436a0c64d66b042915995b584d2bbf7ca7b15ce81e3",
|
||||
"source_url": null
|
||||
}
|
||||
{"action":"imported","inserted_rows":17,"ticker_count":4,"as_of_date":"2026-08-31","sha256":"7c1a4c209b8ce5bde9112436a0c64d66b042915995b584d2bbf7ca7b15ce81e3","source_url":null}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,29 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"source_url": null,
|
||||
"sha256": "7c1a4c209b8ce5bde9112436a0c64d66b042915995b584d2bbf7ca7b15ce81e3",
|
||||
"as_of_date": "2026-08-31",
|
||||
"row_count": 17,
|
||||
"imported_at": 0
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"source_url": null,
|
||||
"sha256": "7b8da1d820f67062410c48988bb6c70fec2088c24961d481d1c0fce8b9372547",
|
||||
"as_of_date": "2026-02-27",
|
||||
"row_count": 18,
|
||||
"imported_at": 0
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"source_url": null,
|
||||
"sha256": "efb3d8fb19c9e0d803dc1b1734c8389356605d0f78d73db6729fb76d3d75753d",
|
||||
"as_of_date": "2026-01-30",
|
||||
"row_count": 18,
|
||||
"imported_at": 0
|
||||
}
|
||||
]
|
||||
[{"id":1,"source_url":null,"sha256":"7c1a4c209b8ce5bde9112436a0c64d66b042915995b584d2bbf7ca7b15ce81e3","as_of_date":"2026-08-31","row_count":17,"imported_at":0},{"id":3,"source_url":null,"sha256":"7b8da1d820f67062410c48988bb6c70fec2088c24961d481d1c0fce8b9372547","as_of_date":"2026-02-27","row_count":18,"imported_at":0},{"id":2,"source_url":null,"sha256":"efb3d8fb19c9e0d803dc1b1734c8389356605d0f78d73db6729fb76d3d75753d","as_of_date":"2026-01-30","row_count":18,"imported_at":0}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"action": "mapped",
|
||||
"alias": "SALIM ANTHONI",
|
||||
"entity": "ANTHONI SALIM"
|
||||
}
|
||||
{"action":"mapped","alias":"SALIM ANTHONI","entity":"ANTHONI SALIM"}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,11 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"action": "merged",
|
||||
"alias_updates": 1,
|
||||
"bing_holdings_updates": 0,
|
||||
"keep": 1,
|
||||
"ksei_holdings_updates": 1,
|
||||
"merge": 2
|
||||
}
|
||||
{"action":"merged","alias_updates":1,"bing_holdings_updates":0,"keep":1,"ksei_holdings_updates":1,"merge":2}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,11 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"id": 17,
|
||||
"canonical_name": "ANTHONI SALIM",
|
||||
"entity_type": null,
|
||||
"country": null
|
||||
}
|
||||
]
|
||||
[{"id":17,"canonical_name":"ANTHONI SALIM","entity_type":null,"country":null}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,8 +1,4 @@
|
|||
exit: 1
|
||||
exit: 3
|
||||
--- stdout
|
||||
--- stderr
|
||||
{
|
||||
"code": "SYMBOLNOTFOUND",
|
||||
"error": true,
|
||||
"message": "symbol not found: BBCA"
|
||||
}
|
||||
{"code":"SYMBOLNOTFOUND","error":true,"message":"symbol not found: BBCA"}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
exit: 1
|
||||
exit: 3
|
||||
--- stdout
|
||||
--- stderr
|
||||
Error: symbol not found: BBCA
|
||||
|
|
|
|||
|
|
@ -1,67 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"ticker": {
|
||||
"id": 4,
|
||||
"code": "BBCA",
|
||||
"name": "BANK CENTRAL ASIA Tbk",
|
||||
"sector": null
|
||||
},
|
||||
"ksei_as_of": "2026-08-31",
|
||||
"bing_as_of": null,
|
||||
"holders": [
|
||||
{
|
||||
"rank": 1,
|
||||
"source": "ksei",
|
||||
"name": "DWIMURIA INVESTAMA ANDALAN",
|
||||
"entity_id": 14,
|
||||
"investor_type": "CORPORATE",
|
||||
"locality": "Local",
|
||||
"shares": 67729950000,
|
||||
"percentage_bps": 5494,
|
||||
"signal": null
|
||||
},
|
||||
{
|
||||
"rank": 2,
|
||||
"source": "ksei",
|
||||
"name": "ANTHONI SALIM",
|
||||
"entity_id": 17,
|
||||
"investor_type": "INDIVIDUAL",
|
||||
"locality": "Local",
|
||||
"shares": 1416306835,
|
||||
"percentage_bps": 115,
|
||||
"signal": null
|
||||
},
|
||||
{
|
||||
"rank": 3,
|
||||
"source": "ksei",
|
||||
"name": "TRICIPTA MANDHALA GUMILANG",
|
||||
"entity_id": 16,
|
||||
"investor_type": "CORPORATE",
|
||||
"locality": "Local",
|
||||
"shares": 1313250000,
|
||||
"percentage_bps": 107,
|
||||
"signal": null
|
||||
},
|
||||
{
|
||||
"rank": 4,
|
||||
"source": "ksei",
|
||||
"name": "CATURGUWIRATNA SUMAPALA",
|
||||
"entity_id": 15,
|
||||
"investor_type": "CORPORATE",
|
||||
"locality": "Local",
|
||||
"shares": 1261750000,
|
||||
"percentage_bps": 102,
|
||||
"signal": null
|
||||
}
|
||||
],
|
||||
"concentration": {
|
||||
"top1_bps": 5494,
|
||||
"top3_bps": 5716,
|
||||
"hhi": 3021,
|
||||
"free_float_bps": 4182,
|
||||
"holder_count": 4
|
||||
},
|
||||
"flow": null
|
||||
}
|
||||
{"ticker":{"id":4,"code":"BBCA","name":"BANK CENTRAL ASIA Tbk","sector":null},"ksei_as_of":"2026-08-31","bing_as_of":null,"holders":[{"rank":1,"source":"ksei","name":"DWIMURIA INVESTAMA ANDALAN","entity_id":14,"investor_type":"CORPORATE","locality":"Local","shares":67729950000,"percentage_bps":5494,"signal":null},{"rank":2,"source":"ksei","name":"ANTHONI SALIM","entity_id":17,"investor_type":"INDIVIDUAL","locality":"Local","shares":1416306835,"percentage_bps":115,"signal":null},{"rank":3,"source":"ksei","name":"TRICIPTA MANDHALA GUMILANG","entity_id":16,"investor_type":"CORPORATE","locality":"Local","shares":1313250000,"percentage_bps":107,"signal":null},{"rank":4,"source":"ksei","name":"CATURGUWIRATNA SUMAPALA","entity_id":15,"investor_type":"CORPORATE","locality":"Local","shares":1261750000,"percentage_bps":102,"signal":null}],"concentration":{"top1_bps":5494,"top3_bps":5716,"hhi":3021,"free_float_bps":4182,"holder_count":4},"flow":null}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mOwnership:[0m [1mBBCA[0m KSEI=2026-08-31 Bing=-
|
||||
Ownership: BBCA KSEI=2026-08-31 Bing=-
|
||||
┌──────┬────────┬────────────────────────────┬────────────┬─────┬────────────────┬────────┬────────┐
|
||||
│ RANK ┆ SOURCE ┆ INVESTOR ┆ TYPE ┆ L/F ┆ SHARES ┆ % ┆ SIGNAL │
|
||||
╞══════╪════════╪════════════════════════════╪════════════╪═════╪════════════════╪════════╪════════╡
|
||||
|
|
@ -12,5 +12,5 @@ exit: 0
|
|||
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ 4 ┆ KSEI ┆ CATURGUWIRATNA SUMAPALA ┆ CORPORATE ┆ L ┆ 1,261,750,000 ┆ 1.02% ┆ - │
|
||||
└──────┴────────┴────────────────────────────┴────────────┴─────┴────────────────┴────────┴────────┘
|
||||
[1mConcentration:[0m top1=54.94% top3=57.16% hhi=3021 free_float=41.82% holders=4
|
||||
Concentration: top1=54.94% top3=57.16% hhi=3021 free_float=41.82% holders=4
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,67 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"ticker": {
|
||||
"id": 4,
|
||||
"code": "BBCA",
|
||||
"name": "BANK CENTRAL ASIA Tbk",
|
||||
"sector": null
|
||||
},
|
||||
"ksei_as_of": "2026-08-31",
|
||||
"bing_as_of": null,
|
||||
"holders": [
|
||||
{
|
||||
"rank": 1,
|
||||
"source": "ksei",
|
||||
"name": "DWIMURIA INVESTAMA ANDALAN",
|
||||
"entity_id": 14,
|
||||
"investor_type": "CORPORATE",
|
||||
"locality": "Local",
|
||||
"shares": 67729950000,
|
||||
"percentage_bps": 5494,
|
||||
"signal": null
|
||||
},
|
||||
{
|
||||
"rank": 2,
|
||||
"source": "ksei",
|
||||
"name": "ANTHONI SALIM",
|
||||
"entity_id": 17,
|
||||
"investor_type": "INDIVIDUAL",
|
||||
"locality": "Local",
|
||||
"shares": 1416306835,
|
||||
"percentage_bps": 115,
|
||||
"signal": null
|
||||
},
|
||||
{
|
||||
"rank": 3,
|
||||
"source": "ksei",
|
||||
"name": "TRICIPTA MANDHALA GUMILANG",
|
||||
"entity_id": 16,
|
||||
"investor_type": "CORPORATE",
|
||||
"locality": "Local",
|
||||
"shares": 1313250000,
|
||||
"percentage_bps": 107,
|
||||
"signal": null
|
||||
},
|
||||
{
|
||||
"rank": 4,
|
||||
"source": "ksei",
|
||||
"name": "CATURGUWIRATNA SUMAPALA",
|
||||
"entity_id": 15,
|
||||
"investor_type": "CORPORATE",
|
||||
"locality": "Local",
|
||||
"shares": 1261750000,
|
||||
"percentage_bps": 102,
|
||||
"signal": null
|
||||
}
|
||||
],
|
||||
"concentration": {
|
||||
"top1_bps": 5494,
|
||||
"top3_bps": 5716,
|
||||
"hhi": 3021,
|
||||
"free_float_bps": 4182,
|
||||
"holder_count": 4
|
||||
},
|
||||
"flow": null
|
||||
}
|
||||
{"ticker":{"id":4,"code":"BBCA","name":"BANK CENTRAL ASIA Tbk","sector":null},"ksei_as_of":"2026-08-31","bing_as_of":null,"holders":[{"rank":1,"source":"ksei","name":"DWIMURIA INVESTAMA ANDALAN","entity_id":14,"investor_type":"CORPORATE","locality":"Local","shares":67729950000,"percentage_bps":5494,"signal":null},{"rank":2,"source":"ksei","name":"ANTHONI SALIM","entity_id":17,"investor_type":"INDIVIDUAL","locality":"Local","shares":1416306835,"percentage_bps":115,"signal":null},{"rank":3,"source":"ksei","name":"TRICIPTA MANDHALA GUMILANG","entity_id":16,"investor_type":"CORPORATE","locality":"Local","shares":1313250000,"percentage_bps":107,"signal":null},{"rank":4,"source":"ksei","name":"CATURGUWIRATNA SUMAPALA","entity_id":15,"investor_type":"CORPORATE","locality":"Local","shares":1261750000,"percentage_bps":102,"signal":null}],"concentration":{"top1_bps":5494,"top3_bps":5716,"hhi":3021,"free_float_bps":4182,"holder_count":4},"flow":null}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mOwnership:[0m [1mBBCA[0m KSEI=2026-08-31 Bing=-
|
||||
Ownership: BBCA KSEI=2026-08-31 Bing=-
|
||||
┌──────┬────────┬────────────────────────────┬────────────┬─────┬────────────────┬────────┬────────┐
|
||||
│ RANK ┆ SOURCE ┆ INVESTOR ┆ TYPE ┆ L/F ┆ SHARES ┆ % ┆ SIGNAL │
|
||||
╞══════╪════════╪════════════════════════════╪════════════╪═════╪════════════════╪════════╪════════╡
|
||||
|
|
@ -12,5 +12,5 @@ exit: 0
|
|||
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
|
||||
│ 4 ┆ KSEI ┆ CATURGUWIRATNA SUMAPALA ┆ CORPORATE ┆ L ┆ 1,261,750,000 ┆ 1.02% ┆ - │
|
||||
└──────┴────────┴────────────────────────────┴────────────┴─────┴────────────────┴────────┴────────┘
|
||||
[1mConcentration:[0m top1=54.94% top3=57.16% hhi=3021 free_float=41.82% holders=4
|
||||
Concentration: top1=54.94% top3=57.16% hhi=3021 free_float=41.82% holders=4
|
||||
--- stderr
|
||||
|
|
|
|||
4
tests/golden/stocks-compare-stdin.json.golden
Normal file
4
tests/golden/stocks-compare-stdin.json.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[{"symbol":"BBCA.JK","growth":{"revenue_growth":0.081,"earnings_growth":0.121,"revenue_growth_pct":8.1,"earnings_growth_pct":12.1,"revenue_signal":"slow","earnings_signal":"moderate","overall_signal":"mixed"},"valuation":{"pe_trailing":25.4,"pe_forward":null,"pb":4.6,"roe":0.198,"roe_pct":19.8,"net_margin":0.324,"net_margin_pct":32.4,"ev_ebitda":null,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"strong","margin_signal":"excellent","ev_ebitda_signal":"no data","overall_signal":"expensive"},"risk":{"debt_to_equity":0.42,"current_ratio":1.18,"roa":0.031,"roa_pct":3.1,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"},"overall_signal":"mixed"},{"symbol":"BBRI.JK","growth":{"revenue_growth":0.081,"earnings_growth":0.121,"revenue_growth_pct":8.1,"earnings_growth_pct":12.1,"revenue_signal":"slow","earnings_signal":"moderate","overall_signal":"mixed"},"valuation":{"pe_trailing":25.4,"pe_forward":null,"pb":4.6,"roe":0.198,"roe_pct":19.8,"net_margin":0.324,"net_margin_pct":32.4,"ev_ebitda":null,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"strong","margin_signal":"excellent","ev_ebitda_signal":"no data","overall_signal":"expensive"},"risk":{"debt_to_equity":0.42,"current_ratio":1.18,"roa":0.031,"roa_pct":3.1,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"},"overall_signal":"mixed"}]
|
||||
--- stderr
|
||||
23
tests/golden/stocks-compare-stdin.table.golden
Normal file
23
tests/golden/stocks-compare-stdin.table.golden
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
Fundamental Comparison
|
||||
┌────────────────┬───────────────┬───────────────┐
|
||||
│ METRIC ┆ BBCA.JK ┆ BBRI.JK │
|
||||
╞════════════════╪═══════════════╪═══════════════╡
|
||||
│ Symbol ┆ BBCA.JK ┆ BBRI.JK │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ mixed ┆ mixed │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Growth ┆ mixed ┆ mixed │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Valuation ┆ expensive ┆ expensive │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Risk ┆ moderate risk ┆ moderate risk │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E ┆ 25.40 ┆ 25.40 │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ +19.80% │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Revenue Growth ┆ +8.10% ┆ +8.10% │
|
||||
└────────────────┴───────────────┴───────────────┘
|
||||
--- stderr
|
||||
|
|
@ -1,81 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"growth": {
|
||||
"revenue_growth": 0.081,
|
||||
"earnings_growth": 0.121,
|
||||
"revenue_growth_pct": 8.1,
|
||||
"earnings_growth_pct": 12.1,
|
||||
"revenue_signal": "slow",
|
||||
"earnings_signal": "moderate",
|
||||
"overall_signal": "mixed"
|
||||
},
|
||||
"valuation": {
|
||||
"pe_trailing": 25.4,
|
||||
"pe_forward": null,
|
||||
"pb": 4.6,
|
||||
"roe": 0.198,
|
||||
"roe_pct": 19.8,
|
||||
"net_margin": 0.324,
|
||||
"net_margin_pct": 32.4,
|
||||
"ev_ebitda": null,
|
||||
"pe_signal": "premium",
|
||||
"pb_signal": "expensive",
|
||||
"roe_signal": "strong",
|
||||
"margin_signal": "excellent",
|
||||
"ev_ebitda_signal": "no data",
|
||||
"overall_signal": "expensive"
|
||||
},
|
||||
"risk": {
|
||||
"debt_to_equity": 0.42,
|
||||
"current_ratio": 1.18,
|
||||
"roa": 0.031,
|
||||
"roa_pct": 3.1,
|
||||
"de_signal": "conservative",
|
||||
"current_ratio_signal": "tight",
|
||||
"overall_signal": "moderate risk"
|
||||
},
|
||||
"overall_signal": "mixed"
|
||||
},
|
||||
{
|
||||
"symbol": "BBRI.JK",
|
||||
"growth": {
|
||||
"revenue_growth": 0.081,
|
||||
"earnings_growth": 0.121,
|
||||
"revenue_growth_pct": 8.1,
|
||||
"earnings_growth_pct": 12.1,
|
||||
"revenue_signal": "slow",
|
||||
"earnings_signal": "moderate",
|
||||
"overall_signal": "mixed"
|
||||
},
|
||||
"valuation": {
|
||||
"pe_trailing": 25.4,
|
||||
"pe_forward": null,
|
||||
"pb": 4.6,
|
||||
"roe": 0.198,
|
||||
"roe_pct": 19.8,
|
||||
"net_margin": 0.324,
|
||||
"net_margin_pct": 32.4,
|
||||
"ev_ebitda": null,
|
||||
"pe_signal": "premium",
|
||||
"pb_signal": "expensive",
|
||||
"roe_signal": "strong",
|
||||
"margin_signal": "excellent",
|
||||
"ev_ebitda_signal": "no data",
|
||||
"overall_signal": "expensive"
|
||||
},
|
||||
"risk": {
|
||||
"debt_to_equity": 0.42,
|
||||
"current_ratio": 1.18,
|
||||
"roa": 0.031,
|
||||
"roa_pct": 3.1,
|
||||
"de_signal": "conservative",
|
||||
"current_ratio_signal": "tight",
|
||||
"overall_signal": "moderate risk"
|
||||
},
|
||||
"overall_signal": "mixed"
|
||||
}
|
||||
]
|
||||
[{"symbol":"BBCA.JK","growth":{"revenue_growth":0.081,"earnings_growth":0.121,"revenue_growth_pct":8.1,"earnings_growth_pct":12.1,"revenue_signal":"slow","earnings_signal":"moderate","overall_signal":"mixed"},"valuation":{"pe_trailing":25.4,"pe_forward":null,"pb":4.6,"roe":0.198,"roe_pct":19.8,"net_margin":0.324,"net_margin_pct":32.4,"ev_ebitda":null,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"strong","margin_signal":"excellent","ev_ebitda_signal":"no data","overall_signal":"expensive"},"risk":{"debt_to_equity":0.42,"current_ratio":1.18,"roa":0.031,"roa_pct":3.1,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"},"overall_signal":"mixed"},{"symbol":"BBRI.JK","growth":{"revenue_growth":0.081,"earnings_growth":0.121,"revenue_growth_pct":8.1,"earnings_growth_pct":12.1,"revenue_signal":"slow","earnings_signal":"moderate","overall_signal":"mixed"},"valuation":{"pe_trailing":25.4,"pe_forward":null,"pb":4.6,"roe":0.198,"roe_pct":19.8,"net_margin":0.324,"net_margin_pct":32.4,"ev_ebitda":null,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"strong","margin_signal":"excellent","ev_ebitda_signal":"no data","overall_signal":"expensive"},"risk":{"debt_to_equity":0.42,"current_ratio":1.18,"roa":0.031,"roa_pct":3.1,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"},"overall_signal":"mixed"}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,23 +1,23 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mFundamental Comparison[0m
|
||||
┌────────────────┬─────────────────────────┬─────────────────────────┐
|
||||
│ METRIC ┆ BBCA.JK ┆ BBRI.JK │
|
||||
╞════════════════╪═════════════════════════╪═════════════════════════╡
|
||||
│ Symbol ┆ BBCA.JK ┆ BBRI.JK │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ [33mmixed[39m ┆ [33mmixed[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Growth ┆ [33mmixed[39m ┆ [33mmixed[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Valuation ┆ [31mexpensive[39m ┆ [31mexpensive[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Risk ┆ [33mmoderate risk[39m ┆ [33mmoderate risk[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E ┆ 25.40 ┆ 25.40 │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ +19.80% │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Revenue Growth ┆ +8.10% ┆ +8.10% │
|
||||
└────────────────┴─────────────────────────┴─────────────────────────┘
|
||||
Fundamental Comparison
|
||||
┌────────────────┬───────────────┬───────────────┐
|
||||
│ METRIC ┆ BBCA.JK ┆ BBRI.JK │
|
||||
╞════════════════╪═══════════════╪═══════════════╡
|
||||
│ Symbol ┆ BBCA.JK ┆ BBRI.JK │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ mixed ┆ mixed │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Growth ┆ mixed ┆ mixed │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Valuation ┆ expensive ┆ expensive │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Risk ┆ moderate risk ┆ moderate risk │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E ┆ 25.40 ┆ 25.40 │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ +19.80% │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Revenue Growth ┆ +8.10% ┆ +8.10% │
|
||||
└────────────────┴───────────────┴───────────────┘
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,22 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"eps_last_year": 1200.0,
|
||||
"revenue_last_year": 100000000000.0,
|
||||
"forecast": [
|
||||
{
|
||||
"eps_actual": null,
|
||||
"eps_forecast": 1300.0,
|
||||
"eps_surprise": null,
|
||||
"eps_surprise_pct": null,
|
||||
"revenue_actual": null,
|
||||
"revenue_forecast": 110000000000.0,
|
||||
"revenue_surprise": null,
|
||||
"earning_release_date": "2026-03-15",
|
||||
"period_type": "2026"
|
||||
}
|
||||
],
|
||||
"history": []
|
||||
}
|
||||
{"symbol":"BBCA.JK","eps_last_year":1200.0,"revenue_last_year":100000000000.0,"forecast":[{"eps_actual":null,"eps_forecast":1300.0,"eps_surprise":null,"eps_surprise_pct":null,"revenue_actual":null,"revenue_forecast":110000000000.0,"revenue_surprise":null,"earning_release_date":"2026-03-15","period_type":"2026"}],"history":[]}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,22 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"eps_last_year": 1200.0,
|
||||
"revenue_last_year": 100000000000.0,
|
||||
"forecast": [],
|
||||
"history": [
|
||||
{
|
||||
"eps_actual": 320.0,
|
||||
"eps_forecast": null,
|
||||
"eps_surprise": 5.0,
|
||||
"eps_surprise_pct": 1.5,
|
||||
"revenue_actual": 27000000000.0,
|
||||
"revenue_forecast": null,
|
||||
"revenue_surprise": 200000000.0,
|
||||
"earning_release_date": "2025-11-20",
|
||||
"period_type": "Q42025"
|
||||
}
|
||||
]
|
||||
}
|
||||
{"symbol":"BBCA.JK","eps_last_year":1200.0,"revenue_last_year":100000000000.0,"forecast":[],"history":[{"eps_actual":320.0,"eps_forecast":null,"eps_surprise":5.0,"eps_surprise_pct":1.5,"revenue_actual":27000000000.0,"revenue_forecast":null,"revenue_surprise":200000000.0,"earning_release_date":"2025-11-20","period_type":"Q42025"}]}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,56 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"eps_last_year": 1200.0,
|
||||
"revenue_last_year": 100000000000.0,
|
||||
"forecast": [
|
||||
{
|
||||
"eps_actual": null,
|
||||
"eps_forecast": 1300.0,
|
||||
"eps_surprise": null,
|
||||
"eps_surprise_pct": null,
|
||||
"revenue_actual": null,
|
||||
"revenue_forecast": 110000000000.0,
|
||||
"revenue_surprise": null,
|
||||
"earning_release_date": "2026-03-15",
|
||||
"period_type": "2026"
|
||||
},
|
||||
{
|
||||
"eps_actual": null,
|
||||
"eps_forecast": 330.0,
|
||||
"eps_surprise": null,
|
||||
"eps_surprise_pct": null,
|
||||
"revenue_actual": null,
|
||||
"revenue_forecast": 28000000000.0,
|
||||
"revenue_surprise": null,
|
||||
"earning_release_date": "2026-04-20",
|
||||
"period_type": "Q12026"
|
||||
}
|
||||
],
|
||||
"history": [
|
||||
{
|
||||
"eps_actual": 1250.0,
|
||||
"eps_forecast": null,
|
||||
"eps_surprise": 20.0,
|
||||
"eps_surprise_pct": 1.6,
|
||||
"revenue_actual": 105000000000.0,
|
||||
"revenue_forecast": null,
|
||||
"revenue_surprise": 500000000.0,
|
||||
"earning_release_date": "2025-03-15",
|
||||
"period_type": "2025"
|
||||
},
|
||||
{
|
||||
"eps_actual": 320.0,
|
||||
"eps_forecast": null,
|
||||
"eps_surprise": 5.0,
|
||||
"eps_surprise_pct": 1.5,
|
||||
"revenue_actual": 27000000000.0,
|
||||
"revenue_forecast": null,
|
||||
"revenue_surprise": 200000000.0,
|
||||
"earning_release_date": "2025-11-20",
|
||||
"period_type": "Q42025"
|
||||
}
|
||||
]
|
||||
}
|
||||
{"symbol":"BBCA.JK","eps_last_year":1200.0,"revenue_last_year":100000000000.0,"forecast":[{"eps_actual":null,"eps_forecast":1300.0,"eps_surprise":null,"eps_surprise_pct":null,"revenue_actual":null,"revenue_forecast":110000000000.0,"revenue_surprise":null,"earning_release_date":"2026-03-15","period_type":"2026"},{"eps_actual":null,"eps_forecast":330.0,"eps_surprise":null,"eps_surprise_pct":null,"revenue_actual":null,"revenue_forecast":28000000000.0,"revenue_surprise":null,"earning_release_date":"2026-04-20","period_type":"Q12026"}],"history":[{"eps_actual":1250.0,"eps_forecast":null,"eps_surprise":20.0,"eps_surprise_pct":1.6,"revenue_actual":105000000000.0,"revenue_forecast":null,"revenue_surprise":500000000.0,"earning_release_date":"2025-03-15","period_type":"2025"},{"eps_actual":320.0,"eps_forecast":null,"eps_surprise":5.0,"eps_surprise_pct":1.5,"revenue_actual":27000000000.0,"revenue_forecast":null,"revenue_surprise":200000000.0,"earning_release_date":"2025-11-20","period_type":"Q42025"}]}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,21 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"instrument": {
|
||||
"id": "bn91jc",
|
||||
"symbol": "BBCA.JK",
|
||||
"name": "Bank Central Asia Tbk PT"
|
||||
},
|
||||
"balance_sheet": null,
|
||||
"cash_flow": null,
|
||||
"income_statement": {
|
||||
"values": {
|
||||
"netIncome": 400000000.0,
|
||||
"totalRevenue": 1000000000.0
|
||||
},
|
||||
"currency": "IDR",
|
||||
"report_date": "2025-12-31",
|
||||
"end_date": "2025-12-31"
|
||||
}
|
||||
}
|
||||
{"instrument":{"id":"bn91jc","symbol":"BBCA.JK","name":"Bank Central Asia Tbk PT"},"balance_sheet":null,"cash_flow":null,"income_statement":{"values":{"netIncome":400000000.0,"totalRevenue":1000000000.0},"currency":"IDR","report_date":"2025-12-31","end_date":"2025-12-31"}}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,36 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"instrument": {
|
||||
"id": "bn91jc",
|
||||
"symbol": "BBCA.JK",
|
||||
"name": "Bank Central Asia Tbk PT"
|
||||
},
|
||||
"balance_sheet": {
|
||||
"values": {
|
||||
"cashAndShortTermInvestments": 500000000.0,
|
||||
"totalEquity": 900000000.0
|
||||
},
|
||||
"currency": "IDR",
|
||||
"report_date": "2025-12-31",
|
||||
"end_date": "2025-12-31"
|
||||
},
|
||||
"cash_flow": {
|
||||
"values": {
|
||||
"operatingCashFlow": 600000000.0
|
||||
},
|
||||
"currency": "IDR",
|
||||
"report_date": "2025-12-31",
|
||||
"end_date": "2025-12-31"
|
||||
},
|
||||
"income_statement": {
|
||||
"values": {
|
||||
"netIncome": 400000000.0,
|
||||
"totalRevenue": 1000000000.0
|
||||
},
|
||||
"currency": "IDR",
|
||||
"report_date": "2025-12-31",
|
||||
"end_date": "2025-12-31"
|
||||
}
|
||||
}
|
||||
{"instrument":{"id":"bn91jc","symbol":"BBCA.JK","name":"Bank Central Asia Tbk PT"},"balance_sheet":{"values":{"cashAndShortTermInvestments":500000000.0,"totalEquity":900000000.0},"currency":"IDR","report_date":"2025-12-31","end_date":"2025-12-31"},"cash_flow":{"values":{"operatingCashFlow":600000000.0},"currency":"IDR","report_date":"2025-12-31","end_date":"2025-12-31"},"income_statement":{"values":{"netIncome":400000000.0,"totalRevenue":1000000000.0},"currency":"IDR","report_date":"2025-12-31","end_date":"2025-12-31"}}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,41 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"growth": {
|
||||
"revenue_growth": 0.081,
|
||||
"earnings_growth": 0.121,
|
||||
"revenue_growth_pct": 8.1,
|
||||
"earnings_growth_pct": 12.1,
|
||||
"revenue_signal": "slow",
|
||||
"earnings_signal": "moderate",
|
||||
"overall_signal": "mixed"
|
||||
},
|
||||
"valuation": {
|
||||
"pe_trailing": 25.4,
|
||||
"pe_forward": null,
|
||||
"pb": 4.6,
|
||||
"roe": 0.198,
|
||||
"roe_pct": 19.8,
|
||||
"net_margin": 0.324,
|
||||
"net_margin_pct": 32.4,
|
||||
"ev_ebitda": null,
|
||||
"pe_signal": "premium",
|
||||
"pb_signal": "expensive",
|
||||
"roe_signal": "strong",
|
||||
"margin_signal": "excellent",
|
||||
"ev_ebitda_signal": "no data",
|
||||
"overall_signal": "expensive"
|
||||
},
|
||||
"risk": {
|
||||
"debt_to_equity": 0.42,
|
||||
"current_ratio": 1.18,
|
||||
"roa": 0.031,
|
||||
"roa_pct": 3.1,
|
||||
"de_signal": "conservative",
|
||||
"current_ratio_signal": "tight",
|
||||
"overall_signal": "moderate risk"
|
||||
},
|
||||
"overall_signal": "mixed"
|
||||
}
|
||||
{"symbol":"BBCA.JK","growth":{"revenue_growth":0.081,"earnings_growth":0.121,"revenue_growth_pct":8.1,"earnings_growth_pct":12.1,"revenue_signal":"slow","earnings_signal":"moderate","overall_signal":"mixed"},"valuation":{"pe_trailing":25.4,"pe_forward":null,"pb":4.6,"roe":0.198,"roe_pct":19.8,"net_margin":0.324,"net_margin_pct":32.4,"ev_ebitda":null,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"strong","margin_signal":"excellent","ev_ebitda_signal":"no data","overall_signal":"expensive"},"risk":{"debt_to_equity":0.42,"current_ratio":1.18,"roa":0.031,"roa_pct":3.1,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"},"overall_signal":"mixed"}
|
||||
--- stderr
|
||||
|
|
|
|||
4
tests/golden/stocks-fundamental.jsonl.golden
Normal file
4
tests/golden/stocks-fundamental.jsonl.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{"symbol":"BBCA.JK","growth":{"revenue_growth":0.081,"earnings_growth":0.121,"revenue_growth_pct":8.1,"earnings_growth_pct":12.1,"revenue_signal":"slow","earnings_signal":"moderate","overall_signal":"mixed"},"valuation":{"pe_trailing":25.4,"pe_forward":null,"pb":4.6,"roe":0.198,"roe_pct":19.8,"net_margin":0.324,"net_margin_pct":32.4,"ev_ebitda":null,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"strong","margin_signal":"excellent","ev_ebitda_signal":"no data","overall_signal":"expensive"},"risk":{"debt_to_equity":0.42,"current_ratio":1.18,"roa":0.031,"roa_pct":3.1,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"},"overall_signal":"mixed"}
|
||||
--- stderr
|
||||
|
|
@ -1,49 +1,49 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mFundamental Analysis for BBCA.JK[0m
|
||||
Fundamental Analysis for BBCA.JK
|
||||
|
||||
[1mGrowth Analysis for BBCA.JK[0m
|
||||
┌─────────────────┬─────────┬────────────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═════════════════╪═════════╪════════════════════╡
|
||||
│ Revenue Growth ┆ +8.10% ┆ [33mslow[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Earnings Growth ┆ +12.10% ┆ [32mmoderate[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ [33mmixed[39m │
|
||||
└─────────────────┴─────────┴────────────────────┘
|
||||
Growth Analysis for BBCA.JK
|
||||
┌─────────────────┬─────────┬──────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═════════════════╪═════════╪══════════╡
|
||||
│ Revenue Growth ┆ +8.10% ┆ slow │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Earnings Growth ┆ +12.10% ┆ moderate │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ mixed │
|
||||
└─────────────────┴─────────┴──────────┘
|
||||
|
||||
[1mValuation Analysis for BBCA.JK[0m
|
||||
┌────────────────┬─────────┬─────────────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞════════════════╪═════════╪═════════════════════╡
|
||||
│ P/E (Trailing) ┆ 25.40 ┆ [33mpremium[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E (Forward) ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Price/Book ┆ 4.60 ┆ [31mexpensive[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ [32mstrong[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Net Margin ┆ +32.40% ┆ [32mexcellent[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ EV/EBITDA ┆ - ┆ [33mno data[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ [31mexpensive[39m │
|
||||
└────────────────┴─────────┴─────────────────────┘
|
||||
Valuation Analysis for BBCA.JK
|
||||
┌────────────────┬─────────┬───────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞════════════════╪═════════╪═══════════╡
|
||||
│ P/E (Trailing) ┆ 25.40 ┆ premium │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E (Forward) ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Price/Book ┆ 4.60 ┆ expensive │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ strong │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Net Margin ┆ +32.40% ┆ excellent │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ EV/EBITDA ┆ - ┆ no data │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ expensive │
|
||||
└────────────────┴─────────┴───────────┘
|
||||
|
||||
[1mRisk Analysis for BBCA.JK[0m
|
||||
┌───────────────┬────────┬─────────────────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═══════════════╪════════╪═════════════════════════╡
|
||||
│ Debt/Equity ┆ 0.42 ┆ [32mconservative[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Current Ratio ┆ 1.18 ┆ [33mtight[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROA ┆ +3.10% ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ [33mmoderate risk[39m │
|
||||
└───────────────┴────────┴─────────────────────────┘
|
||||
Risk Analysis for BBCA.JK
|
||||
┌───────────────┬────────┬───────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═══════════════╪════════╪═══════════════╡
|
||||
│ Debt/Equity ┆ 0.42 ┆ conservative │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Current Ratio ┆ 1.18 ┆ tight │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROA ┆ +3.10% ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ moderate risk │
|
||||
└───────────────┴────────┴───────────────┘
|
||||
|
||||
[1mOverall Signal:[0m [33mmixed[39m
|
||||
Overall Signal: mixed
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,12 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"revenue_growth": 0.081,
|
||||
"earnings_growth": 0.121,
|
||||
"revenue_growth_pct": 8.1,
|
||||
"earnings_growth_pct": 12.1,
|
||||
"revenue_signal": "slow",
|
||||
"earnings_signal": "moderate",
|
||||
"overall_signal": "mixed"
|
||||
}
|
||||
{"revenue_growth":0.081,"earnings_growth":0.121,"revenue_growth_pct":8.1,"earnings_growth_pct":12.1,"revenue_signal":"slow","earnings_signal":"moderate","overall_signal":"mixed"}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mGrowth Analysis for BBCA.JK[0m
|
||||
┌─────────────────┬─────────┬────────────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═════════════════╪═════════╪════════════════════╡
|
||||
│ Revenue Growth ┆ +8.10% ┆ [33mslow[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Earnings Growth ┆ +12.10% ┆ [32mmoderate[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ [33mmixed[39m │
|
||||
└─────────────────┴─────────┴────────────────────┘
|
||||
Growth Analysis for BBCA.JK
|
||||
┌─────────────────┬─────────┬──────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═════════════════╪═════════╪══════════╡
|
||||
│ Revenue Growth ┆ +8.10% ┆ slow │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Earnings Growth ┆ +12.10% ┆ moderate │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ mixed │
|
||||
└─────────────────┴─────────┴──────────┘
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,29 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"date": "2026-01-14",
|
||||
"open": 8000,
|
||||
"high": 8000,
|
||||
"low": 8000,
|
||||
"close": 8000,
|
||||
"volume": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-01-15",
|
||||
"open": 8075,
|
||||
"high": 8075,
|
||||
"low": 8075,
|
||||
"close": 8075,
|
||||
"volume": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-01-16",
|
||||
"open": 8025,
|
||||
"high": 8025,
|
||||
"low": 8025,
|
||||
"close": 8025,
|
||||
"volume": 0
|
||||
}
|
||||
]
|
||||
[{"date":"2026-01-14","open":8000,"high":8000,"low":8000,"close":8000,"volume":0},{"date":"2026-01-15","open":8075,"high":8075,"low":8075,"close":8075,"volume":0},{"date":"2026-01-16","open":8025,"high":8025,"low":8025,"close":8025,"volume":0}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mHistory for BBCA.JK[0m
|
||||
History for BBCA.JK
|
||||
┌────────────┬───────┬───────┬───────┬───────┬────────┐
|
||||
│ DATE ┆ OPEN ┆ HIGH ┆ LOW ┆ CLOSE ┆ VOLUME │
|
||||
╞════════════╪═══════╪═══════╪═══════╪═══════╪════════╡
|
||||
|
|
|
|||
|
|
@ -1,29 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"date": "2024-03-01",
|
||||
"open": 9800,
|
||||
"high": 9900,
|
||||
"low": 9750,
|
||||
"close": 9875,
|
||||
"volume": 12300000
|
||||
},
|
||||
{
|
||||
"date": "2024-03-02",
|
||||
"open": 9850,
|
||||
"high": 9920,
|
||||
"low": 9800,
|
||||
"close": 9880,
|
||||
"volume": 11000000
|
||||
},
|
||||
{
|
||||
"date": "2024-03-03",
|
||||
"open": 9860,
|
||||
"high": 9950,
|
||||
"low": 9820,
|
||||
"close": 9925,
|
||||
"volume": 14000000
|
||||
}
|
||||
]
|
||||
[{"date":"2024-03-01","open":9800,"high":9900,"low":9750,"close":9875,"volume":12300000},{"date":"2024-03-02","open":9850,"high":9920,"low":9800,"close":9880,"volume":11000000},{"date":"2024-03-03","open":9860,"high":9950,"low":9820,"close":9925,"volume":14000000}]
|
||||
--- stderr
|
||||
|
|
|
|||
6
tests/golden/stocks-history.jsonl.golden
Normal file
6
tests/golden/stocks-history.jsonl.golden
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{"date":"2024-03-01","open":9800,"high":9900,"low":9750,"close":9875,"volume":12300000}
|
||||
{"date":"2024-03-02","open":9850,"high":9920,"low":9800,"close":9880,"volume":11000000}
|
||||
{"date":"2024-03-03","open":9860,"high":9950,"low":9820,"close":9925,"volume":14000000}
|
||||
--- stderr
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mHistory for BBCA.JK[0m
|
||||
History for BBCA.JK
|
||||
┌────────────┬───────┬───────┬───────┬───────┬────────────┐
|
||||
│ DATE ┆ OPEN ┆ HIGH ┆ LOW ┆ CLOSE ┆ VOLUME │
|
||||
╞════════════╪═══════╪═══════╪═══════╪═══════╪════════════╡
|
||||
|
|
|
|||
|
|
@ -1,16 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"id": "bn91jc",
|
||||
"symbol": "BBCA.JK",
|
||||
"summary": "Mixed analyst signals for Bank Central Asia Tbk PT: 1 positive, 1 negative, 1 neutral.",
|
||||
"highlights": [
|
||||
"P/E ratio: Earnings data unavailable, can't compare P/E ratio with peers",
|
||||
"Analyst price target: Analysts forecast more than 20% upside for 12-month price target"
|
||||
],
|
||||
"risks": [
|
||||
"Quarterly Revenue YoY Growth: Revenue grew worse than peers"
|
||||
],
|
||||
"last_updated": "2026-03-26T04:14:57.9197955Z"
|
||||
}
|
||||
{"id":"bn91jc","symbol":"BBCA.JK","summary":"Mixed analyst signals for Bank Central Asia Tbk PT: 1 positive, 1 negative, 1 neutral.","highlights":["P/E ratio: Earnings data unavailable, can't compare P/E ratio with peers","Analyst price target: Analysts forecast more than 20% upside for 12-month price target"],"risks":["Quarterly Revenue YoY Growth: Revenue grew worse than peers"],"last_updated":"2026-03-26T04:14:57.9197955Z"}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,15 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"id": "news-1",
|
||||
"symbol": "BBCA.JK",
|
||||
"title": "BCA reports steady growth",
|
||||
"url": "https://example.com/news/bca-growth",
|
||||
"description": "BCA delivered steady quarterly growth across lending and deposits.",
|
||||
"provider": "Contoso News",
|
||||
"published_at": "2026-03-20T10:00:00Z",
|
||||
"read_time_min": 3
|
||||
}
|
||||
]
|
||||
[{"id":"news-1","symbol":"BBCA.JK","title":"BCA reports steady growth","url":"https://example.com/news/bca-growth","description":"BCA delivered steady quarterly growth across lending and deposits.","provider":"Contoso News","published_at":"2026-03-20T10:00:00Z","read_time_min":3}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,27 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"id": "feee16af-c94c-465d-a59d-a9727c22bd0e",
|
||||
"symbol": "BBCA",
|
||||
"short_name": "Bank Cntrl Asia",
|
||||
"long_name": "PT Bank Central Asia Tbk",
|
||||
"description": "PT Bank Central Asia Tbk (the Bank) is an Indonesia-based commercial bank.",
|
||||
"sector": "Financials",
|
||||
"industry": "Banking Services",
|
||||
"website": "https://www.bca.co.id/",
|
||||
"employees": 27937,
|
||||
"address": "Menara BCA, Grand, Jl. MH Thamrin No. 1",
|
||||
"city": "JAKARTA PUSAT",
|
||||
"country": "Indonesia",
|
||||
"phone": "+62 21 23588000",
|
||||
"officers": [
|
||||
{
|
||||
"name": "Jahja Setiaatmadja",
|
||||
"title": "President Director",
|
||||
"age": 69,
|
||||
"year_born": 1955,
|
||||
"total_pay": 12000000000
|
||||
}
|
||||
]
|
||||
}
|
||||
{"id":"feee16af-c94c-465d-a59d-a9727c22bd0e","symbol":"BBCA","short_name":"Bank Cntrl Asia","long_name":"PT Bank Central Asia Tbk","description":"PT Bank Central Asia Tbk (the Bank) is an Indonesia-based commercial bank.","sector":"Financials","industry":"Banking Services","website":"https://www.bca.co.id/","employees":27937,"address":"Menara BCA, Grand, Jl. MH Thamrin No. 1","city":"JAKARTA PUSAT","country":"Indonesia","phone":"+62 21 23588000","officers":[{"name":"Jahja Setiaatmadja","title":"President Director","age":69,"year_born":1955,"total_pay":12000000000}]}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,35 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"price": 9875,
|
||||
"change": 117,
|
||||
"change_pct": 1.2,
|
||||
"volume": 12300000,
|
||||
"market_cap": 1215200000000000,
|
||||
"week52_high": 10250,
|
||||
"week52_low": 7800,
|
||||
"week52_position": 0.8469387755102041,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 9758,
|
||||
"avg_volume": 10000000,
|
||||
"as_of": null
|
||||
},
|
||||
{
|
||||
"symbol": "BBRI.JK",
|
||||
"price": 9875,
|
||||
"change": 117,
|
||||
"change_pct": 1.2,
|
||||
"volume": 12300000,
|
||||
"market_cap": 1215200000000000,
|
||||
"week52_high": 10250,
|
||||
"week52_low": 7800,
|
||||
"week52_position": 0.8469387755102041,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 9758,
|
||||
"avg_volume": 10000000,
|
||||
"as_of": null
|
||||
}
|
||||
]
|
||||
[{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null},{"symbol":"BBRI.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}]
|
||||
--- stderr
|
||||
|
|
|
|||
5
tests/golden/stocks-quote-multi.jsonl.golden
Normal file
5
tests/golden/stocks-quote-multi.jsonl.golden
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}
|
||||
{"symbol":"BBRI.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}
|
||||
--- stderr
|
||||
|
|
@ -1,20 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"price": 9875,
|
||||
"change": 117,
|
||||
"change_pct": 1.2,
|
||||
"volume": 12300000,
|
||||
"market_cap": 1215200000000000,
|
||||
"week52_high": 10250,
|
||||
"week52_low": 7800,
|
||||
"week52_position": 0.8469387755102041,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 9758,
|
||||
"avg_volume": 10000000,
|
||||
"as_of": null
|
||||
}
|
||||
]
|
||||
[{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}]
|
||||
--- stderr
|
||||
|
|
|
|||
4
tests/golden/stocks-quote-stdin.json.golden
Normal file
4
tests/golden/stocks-quote-stdin.json.golden
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null},{"symbol":"BBRI.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}]
|
||||
--- stderr
|
||||
10
tests/golden/stocks-quote-stdin.table.golden
Normal file
10
tests/golden/stocks-quote-stdin.table.golden
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
┌─────────┬───────┬──────┬────────┬────────────┬───────────────────────┬────────────┐
|
||||
│ SYMBOL ┆ PRICE ┆ CHG ┆ CHG% ┆ VOLUME ┆ MKT CAP ┆ 52W RANGE │
|
||||
╞═════════╪═══════╪══════╪════════╪════════════╪═══════════════════════╪════════════╡
|
||||
│ BBCA.JK ┆ 9,875 ┆ +117 ┆ +1.20% ┆ 12,300,000 ┆ 1,215,200,000,000,000 ┆ ████████░░ │
|
||||
├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ BBRI.JK ┆ 9,875 ┆ +117 ┆ +1.20% ┆ 12,300,000 ┆ 1,215,200,000,000,000 ┆ ████████░░ │
|
||||
└─────────┴───────┴──────┴────────┴────────────┴───────────────────────┴────────────┘
|
||||
--- stderr
|
||||
|
|
@ -1,20 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"price": 9875,
|
||||
"change": 117,
|
||||
"change_pct": 1.2,
|
||||
"volume": 12300000,
|
||||
"market_cap": 1215200000000000,
|
||||
"week52_high": 10250,
|
||||
"week52_low": 7800,
|
||||
"week52_position": 0.8469387755102041,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 9758,
|
||||
"avg_volume": 10000000,
|
||||
"as_of": null
|
||||
}
|
||||
]
|
||||
[{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10250,"week52_low":7800,"week52_position":0.8469387755102041,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,12 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"debt_to_equity": 0.42,
|
||||
"current_ratio": 1.18,
|
||||
"roa": 0.031,
|
||||
"roa_pct": 3.1,
|
||||
"de_signal": "conservative",
|
||||
"current_ratio_signal": "tight",
|
||||
"overall_signal": "moderate risk"
|
||||
}
|
||||
{"debt_to_equity":0.42,"current_ratio":1.18,"roa":0.031,"roa_pct":3.1,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,15 +1,15 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mRisk Analysis for BBCA.JK[0m
|
||||
┌───────────────┬────────┬─────────────────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═══════════════╪════════╪═════════════════════════╡
|
||||
│ Debt/Equity ┆ 0.42 ┆ [32mconservative[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Current Ratio ┆ 1.18 ┆ [33mtight[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROA ┆ +3.10% ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ [33mmoderate risk[39m │
|
||||
└───────────────┴────────┴─────────────────────────┘
|
||||
Risk Analysis for BBCA.JK
|
||||
┌───────────────┬────────┬───────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═══════════════╪════════╪═══════════════╡
|
||||
│ Debt/Equity ┆ 0.42 ┆ conservative │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Current Ratio ┆ 1.18 ┆ tight │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROA ┆ +3.10% ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ moderate risk │
|
||||
└───────────────┴────────┴───────────────┘
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,35 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"symbol": "BBRI.JK",
|
||||
"price": 5100,
|
||||
"change": 210,
|
||||
"change_pct": 4.3,
|
||||
"volume": 22200000,
|
||||
"market_cap": 780000000000000,
|
||||
"week52_high": 5400,
|
||||
"week52_low": 3900,
|
||||
"week52_position": 0.8,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 4890,
|
||||
"avg_volume": 18000000,
|
||||
"as_of": null
|
||||
},
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"price": 9875,
|
||||
"change": 117,
|
||||
"change_pct": 1.2,
|
||||
"volume": 12300000,
|
||||
"market_cap": 1215200000000000,
|
||||
"week52_high": 10500,
|
||||
"week52_low": 8000,
|
||||
"week52_position": 0.75,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 9758,
|
||||
"avg_volume": 10000000,
|
||||
"as_of": null
|
||||
}
|
||||
]
|
||||
[{"symbol":"BBRI.JK","price":5100,"change":210,"change_pct":4.3,"volume":22200000,"market_cap":780000000000000,"week52_high":5400,"week52_low":3900,"week52_position":0.8,"range_signal":"upper","prev_close":4890,"avg_volume":18000000,"as_of":null},{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10500,"week52_low":8000,"week52_position":0.75,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,35 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"price": 9875,
|
||||
"change": 117,
|
||||
"change_pct": 1.2,
|
||||
"volume": 12300000,
|
||||
"market_cap": 1215200000000000,
|
||||
"week52_high": 10500,
|
||||
"week52_low": 8000,
|
||||
"week52_position": 0.75,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 9758,
|
||||
"avg_volume": 10000000,
|
||||
"as_of": null
|
||||
},
|
||||
{
|
||||
"symbol": "BBRI.JK",
|
||||
"price": 5100,
|
||||
"change": 210,
|
||||
"change_pct": 4.3,
|
||||
"volume": 22200000,
|
||||
"market_cap": 780000000000000,
|
||||
"week52_high": 5400,
|
||||
"week52_low": 3900,
|
||||
"week52_position": 0.8,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 4890,
|
||||
"avg_volume": 18000000,
|
||||
"as_of": null
|
||||
}
|
||||
]
|
||||
[{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10500,"week52_low":8000,"week52_position":0.75,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null},{"symbol":"BBRI.JK","price":5100,"change":210,"change_pct":4.3,"volume":22200000,"market_cap":780000000000000,"week52_high":5400,"week52_low":3900,"week52_position":0.8,"range_signal":"upper","prev_close":4890,"avg_volume":18000000,"as_of":null}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,35 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"price": 9875,
|
||||
"change": 117,
|
||||
"change_pct": 1.2,
|
||||
"volume": 12300000,
|
||||
"market_cap": 1215200000000000,
|
||||
"week52_high": 10500,
|
||||
"week52_low": 8000,
|
||||
"week52_position": 0.75,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 9758,
|
||||
"avg_volume": 10000000,
|
||||
"as_of": null
|
||||
},
|
||||
{
|
||||
"symbol": "BBRI.JK",
|
||||
"price": 5100,
|
||||
"change": 210,
|
||||
"change_pct": 4.3,
|
||||
"volume": 22200000,
|
||||
"market_cap": 780000000000000,
|
||||
"week52_high": 5400,
|
||||
"week52_low": 3900,
|
||||
"week52_position": 0.8,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 4890,
|
||||
"avg_volume": 18000000,
|
||||
"as_of": null
|
||||
}
|
||||
]
|
||||
[{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10500,"week52_low":8000,"week52_position":0.75,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null},{"symbol":"BBRI.JK","price":5100,"change":210,"change_pct":4.3,"volume":22200000,"market_cap":780000000000000,"week52_high":5400,"week52_low":3900,"week52_position":0.8,"range_signal":"upper","prev_close":4890,"avg_volume":18000000,"as_of":null}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,35 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[
|
||||
{
|
||||
"symbol": "BBRI.JK",
|
||||
"price": 5100,
|
||||
"change": 210,
|
||||
"change_pct": 4.3,
|
||||
"volume": 22200000,
|
||||
"market_cap": 780000000000000,
|
||||
"week52_high": 5400,
|
||||
"week52_low": 3900,
|
||||
"week52_position": 0.8,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 4890,
|
||||
"avg_volume": 18000000,
|
||||
"as_of": null
|
||||
},
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"price": 9875,
|
||||
"change": 117,
|
||||
"change_pct": 1.2,
|
||||
"volume": 12300000,
|
||||
"market_cap": 1215200000000000,
|
||||
"week52_high": 10500,
|
||||
"week52_low": 8000,
|
||||
"week52_position": 0.75,
|
||||
"range_signal": "upper",
|
||||
"prev_close": 9758,
|
||||
"avg_volume": 10000000,
|
||||
"as_of": null
|
||||
}
|
||||
]
|
||||
[{"symbol":"BBRI.JK","price":5100,"change":210,"change_pct":4.3,"volume":22200000,"market_cap":780000000000000,"week52_high":5400,"week52_low":3900,"week52_position":0.8,"range_signal":"upper","prev_close":4890,"avg_volume":18000000,"as_of":null},{"symbol":"BBCA.JK","price":9875,"change":117,"change_pct":1.2,"volume":12300000,"market_cap":1215200000000000,"week52_high":10500,"week52_low":8000,"week52_position":0.75,"range_signal":"upper","prev_close":9758,"avg_volume":10000000,"as_of":null}]
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,20 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"statistics": [
|
||||
{
|
||||
"time_range": "1D",
|
||||
"bullish": 10,
|
||||
"bearish": 2,
|
||||
"neutral": 3
|
||||
},
|
||||
{
|
||||
"time_range": "1W",
|
||||
"bullish": 25,
|
||||
"bearish": 5,
|
||||
"neutral": 7
|
||||
}
|
||||
]
|
||||
}
|
||||
{"symbol":"BBCA.JK","statistics":[{"time_range":"1D","bullish":10,"bearish":2,"neutral":3},{"time_range":"1W","bullish":25,"bearish":5,"neutral":7}]}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,28 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"as_of": "2024-03-03",
|
||||
"current_price": 9925,
|
||||
"sma20": null,
|
||||
"sma50": null,
|
||||
"sma200": null,
|
||||
"rsi14": null,
|
||||
"macd": {
|
||||
"line": null,
|
||||
"signal": null,
|
||||
"histogram": null
|
||||
},
|
||||
"volume": {
|
||||
"current": 14000000,
|
||||
"average20": null,
|
||||
"ratio20": null
|
||||
},
|
||||
"signals": {
|
||||
"rsi": "Neutral",
|
||||
"macd": "Neutral",
|
||||
"trend": "Neutral",
|
||||
"overall": "Neutral"
|
||||
}
|
||||
}
|
||||
{"symbol":"BBCA.JK","as_of":"2024-03-03","current_price":9925,"sma20":null,"sma50":null,"sma200":null,"rsi14":null,"macd":{"line":null,"signal":null,"histogram":null},"volume":{"current":14000000,"average20":null,"ratio20":null},"signals":{"rsi":"Neutral","macd":"Neutral","trend":"Neutral","overall":"Neutral"}}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,26 +1,26 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mTechnical Analysis for BBCA.JK (2024-03-03)[0m
|
||||
┌───────────────────┬─────────────────────────────────────────────────────┬───────────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═══════════════════╪═════════════════════════════════════════════════════╪═══════════════════╡
|
||||
│ Current Price ┆ 9,925 ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ SMA 20 ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ SMA 50 ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ SMA 200 ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ RSI (14) ┆ - ┆ [33mNeutral[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ MACD (12,26,9) ┆ -/-/- ┆ [33mNeutral[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Trend ┆ Trend unavailable (need at least 200 daily candles) ┆ [33mNeutral[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Volume Ratio (20) ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall Signal ┆ - ┆ [33mNEUTRAL[39m │
|
||||
└───────────────────┴─────────────────────────────────────────────────────┴───────────────────┘
|
||||
Technical Analysis for BBCA.JK (2024-03-03)
|
||||
┌───────────────────┬─────────────────────────────────────────────────────┬─────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞═══════════════════╪═════════════════════════════════════════════════════╪═════════╡
|
||||
│ Current Price ┆ 9,925 ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
|
||||
│ SMA 20 ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
|
||||
│ SMA 50 ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
|
||||
│ SMA 200 ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
|
||||
│ RSI (14) ┆ - ┆ Neutral │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
|
||||
│ MACD (12,26,9) ┆ -/-/- ┆ Neutral │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
|
||||
│ Trend ┆ Trend unavailable (need at least 200 daily candles) ┆ Neutral │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
|
||||
│ Volume Ratio (20) ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall Signal ┆ - ┆ NEUTRAL │
|
||||
└───────────────────┴─────────────────────────────────────────────────────┴─────────┘
|
||||
--- stderr
|
||||
info: history provider fallback active (msn -> yahoo)
|
||||
|
|
|
|||
|
|
@ -1,19 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"pe_trailing": null,
|
||||
"pe_forward": null,
|
||||
"pb": 4.6,
|
||||
"roe": 0.198,
|
||||
"roe_pct": 19.8,
|
||||
"net_margin": 0.442,
|
||||
"net_margin_pct": 44.2,
|
||||
"ev_ebitda": null,
|
||||
"pe_signal": "no data",
|
||||
"pb_signal": "expensive",
|
||||
"roe_signal": "strong",
|
||||
"margin_signal": "excellent",
|
||||
"ev_ebitda_signal": "no data",
|
||||
"overall_signal": "expensive"
|
||||
}
|
||||
{"pe_trailing":null,"pe_forward":null,"pb":4.6,"roe":0.198,"roe_pct":19.8,"net_margin":0.442,"net_margin_pct":44.2,"ev_ebitda":null,"pe_signal":"no data","pb_signal":"expensive","roe_signal":"strong","margin_signal":"excellent","ev_ebitda_signal":"no data","overall_signal":"expensive"}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,21 +1,21 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mValuation Analysis for BBCA.JK[0m
|
||||
┌────────────────┬─────────┬─────────────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞════════════════╪═════════╪═════════════════════╡
|
||||
│ P/E (Trailing) ┆ - ┆ [33mno data[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E (Forward) ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Price/Book ┆ 4.60 ┆ [31mexpensive[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ [32mstrong[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Net Margin ┆ +44.20% ┆ [32mexcellent[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ EV/EBITDA ┆ - ┆ [33mno data[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ [31mexpensive[39m │
|
||||
└────────────────┴─────────┴─────────────────────┘
|
||||
Valuation Analysis for BBCA.JK
|
||||
┌────────────────┬─────────┬───────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞════════════════╪═════════╪═══════════╡
|
||||
│ P/E (Trailing) ┆ - ┆ no data │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E (Forward) ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Price/Book ┆ 4.60 ┆ expensive │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ strong │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Net Margin ┆ +44.20% ┆ excellent │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ EV/EBITDA ┆ - ┆ no data │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ expensive │
|
||||
└────────────────┴─────────┴───────────┘
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,19 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"pe_trailing": 25.4,
|
||||
"pe_forward": null,
|
||||
"pb": 4.6,
|
||||
"roe": 0.198,
|
||||
"roe_pct": 19.8,
|
||||
"net_margin": 0.324,
|
||||
"net_margin_pct": 32.4,
|
||||
"ev_ebitda": null,
|
||||
"pe_signal": "premium",
|
||||
"pb_signal": "expensive",
|
||||
"roe_signal": "strong",
|
||||
"margin_signal": "excellent",
|
||||
"ev_ebitda_signal": "no data",
|
||||
"overall_signal": "expensive"
|
||||
}
|
||||
{"pe_trailing":25.4,"pe_forward":null,"pb":4.6,"roe":0.198,"roe_pct":19.8,"net_margin":0.324,"net_margin_pct":32.4,"ev_ebitda":null,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"strong","margin_signal":"excellent","ev_ebitda_signal":"no data","overall_signal":"expensive"}
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,21 +1,21 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
[1mValuation Analysis for BBCA.JK[0m
|
||||
┌────────────────┬─────────┬─────────────────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞════════════════╪═════════╪═════════════════════╡
|
||||
│ P/E (Trailing) ┆ 25.40 ┆ [33mpremium[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E (Forward) ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Price/Book ┆ 4.60 ┆ [31mexpensive[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ [32mstrong[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Net Margin ┆ +32.40% ┆ [32mexcellent[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ EV/EBITDA ┆ - ┆ [33mno data[39m │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ [31mexpensive[39m │
|
||||
└────────────────┴─────────┴─────────────────────┘
|
||||
Valuation Analysis for BBCA.JK
|
||||
┌────────────────┬─────────┬───────────┐
|
||||
│ METRIC ┆ VALUE ┆ SIGNAL │
|
||||
╞════════════════╪═════════╪═══════════╡
|
||||
│ P/E (Trailing) ┆ 25.40 ┆ premium │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ P/E (Forward) ┆ - ┆ - │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Price/Book ┆ 4.60 ┆ expensive │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ ROE ┆ +19.80% ┆ strong │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Net Margin ┆ +32.40% ┆ excellent │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ EV/EBITDA ┆ - ┆ no data │
|
||||
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
|
||||
│ Overall ┆ - ┆ expensive │
|
||||
└────────────────┴─────────┴───────────┘
|
||||
--- stderr
|
||||
|
|
|
|||
|
|
@ -1,41 +1,4 @@
|
|||
exit: 0
|
||||
--- stdout
|
||||
{
|
||||
"symbol": "BBCA.JK",
|
||||
"growth": {
|
||||
"revenue_growth": 0.118,
|
||||
"earnings_growth": 0.121,
|
||||
"revenue_growth_pct": 11.8,
|
||||
"earnings_growth_pct": 12.1,
|
||||
"revenue_signal": "moderate",
|
||||
"earnings_signal": "moderate",
|
||||
"overall_signal": "growing"
|
||||
},
|
||||
"valuation": {
|
||||
"pe_trailing": 25.4,
|
||||
"pe_forward": 23.1,
|
||||
"pb": 4.6,
|
||||
"roe": 0.202,
|
||||
"roe_pct": 20.2,
|
||||
"net_margin": 0.385,
|
||||
"net_margin_pct": 38.5,
|
||||
"ev_ebitda": 21.28,
|
||||
"pe_signal": "premium",
|
||||
"pb_signal": "expensive",
|
||||
"roe_signal": "excellent",
|
||||
"margin_signal": "excellent",
|
||||
"ev_ebitda_signal": "expensive",
|
||||
"overall_signal": "expensive"
|
||||
},
|
||||
"risk": {
|
||||
"debt_to_equity": 18.5,
|
||||
"current_ratio": 1.21,
|
||||
"roa": 0.038,
|
||||
"roa_pct": 3.8,
|
||||
"de_signal": "conservative",
|
||||
"current_ratio_signal": "tight",
|
||||
"overall_signal": "moderate risk"
|
||||
},
|
||||
"overall_signal": "mixed"
|
||||
}
|
||||
{"symbol":"BBCA.JK","growth":{"revenue_growth":0.118,"earnings_growth":0.121,"revenue_growth_pct":11.8,"earnings_growth_pct":12.1,"revenue_signal":"moderate","earnings_signal":"moderate","overall_signal":"growing"},"valuation":{"pe_trailing":25.4,"pe_forward":23.1,"pb":4.6,"roe":0.202,"roe_pct":20.2,"net_margin":0.385,"net_margin_pct":38.5,"ev_ebitda":21.28,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"excellent","margin_signal":"excellent","ev_ebitda_signal":"expensive","overall_signal":"expensive"},"risk":{"debt_to_equity":18.5,"current_ratio":1.21,"roa":0.038,"roa_pct":3.8,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"},"overall_signal":"mixed"}
|
||||
--- stderr
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue