diff --git a/cli-e2e/spec/non_sync_cases.edn b/cli-e2e/spec/non_sync_cases.edn index 025e57289d..119fcf3b51 100644 --- a/cli-e2e/spec/non_sync_cases.edn +++ b/cli-e2e/spec/non_sync_cases.edn @@ -559,13 +559,13 @@ {:id "remove-page-json" :setup ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json graph create --graph {{graph-arg}} >/dev/null" "{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json upsert page --graph {{graph-arg}} --page Home >/dev/null"] - :cmds ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json remove page --graph {{graph-arg}} --name Home"] + :cmds ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json remove page --graph {{graph-arg}} --page Home"] :expect {:exit 0 :stdout-json-paths {[:status] "ok" [:data :result] true}} :covers {:commands ["remove page"] :options {:global ["--config" "--graph" "--data-dir" "--output"] - :remove ["--name"]}} + :remove ["--page"]}} :cleanup ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json server stop --graph {{graph-arg}}"] :tags [:remove]} @@ -593,16 +593,16 @@ :cleanup ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json server stop --graph {{graph-arg}}"] :tags [:remove]} - {:id "remove-tag-id-json" + {:id "remove-tag-name-json" :setup ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json graph create --graph {{graph-arg}} >/dev/null" "{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json upsert tag --graph {{graph-arg}} --name TagOne >/dev/null"] - :cmds ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json remove tag --graph {{graph-arg}} --id \"$({{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json list tag --graph {{graph-arg}} --fields title,id --limit 200 --sort updated-at --order desc | python3 -c 'import sys,json; print(next(item[\"db/id\"] for item in json.load(sys.stdin)[\"data\"][\"items\"] if item[\"block/title\"] == \"TagOne\"))')\" >/dev/null" + :cmds ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json remove tag --graph {{graph-arg}} --name TagOne >/dev/null" "{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json list tag --graph {{graph-arg}} --fields title,id"] :expect {:exit 0 :stdout-not-contains ["TagOne"]} :covers {:commands ["remove tag"] :options {:global ["--config" "--graph" "--data-dir" "--output"] - :remove ["--id"]}} + :remove ["--name"]}} :cleanup ["{{cli}} --data-dir {{data-dir-arg}} --config {{config-path-arg}} --output json server stop --graph {{graph-arg}}"] :tags [:remove]} diff --git a/src/main/logseq/cli/command/graph.cljs b/src/main/logseq/cli/command/graph.cljs index 14664f232b..f1cf5ac93b 100644 --- a/src/main/logseq/cli/command/graph.cljs +++ b/src/main/logseq/cli/command/graph.cljs @@ -18,6 +18,7 @@ :alias :t :validate #{"edn" "sqlite"}} :file {:desc "Export file path" + :coerce common-graph/expand-home :complete :file}}) (def ^:private graph-import-spec @@ -31,6 +32,7 @@ (def ^:private graph-validate-spec {:fix {:desc "Attempt to fix validation errors" :alias :f + :coerce :boolean :default false}}) (def ^:private graph-backup-create-spec diff --git a/src/main/logseq/cli/command/remove.cljs b/src/main/logseq/cli/command/remove.cljs index 2f302fa3ab..9d9c5d5b6b 100644 --- a/src/main/logseq/cli/command/remove.cljs +++ b/src/main/logseq/cli/command/remove.cljs @@ -15,7 +15,7 @@ :ex-msg (constantly "Option uuid must be a valid UUID string")}}}) (def ^:private remove-page-spec - {:name {:desc "Page name" + {:page {:desc "Page name" :complete :pages}}) (def ^:private remove-tag-spec @@ -36,7 +36,7 @@ "logseq remove block --graph my-graph --id '[123,456]'" "logseq remove block --graph my-graph --uuid 7f0f4bb3-2e48-4b46-ae0f-18f52ef0f8be"]}) (core/command-entry ["remove" "page"] :remove-page "Remove page" remove-page-spec - {:examples ["logseq remove page --graph my-graph --name Home"]}) + {:examples ["logseq remove page --graph my-graph --page Home"]}) (core/command-entry ["remove" "tag"] :remove-tag "Remove tag" remove-tag-spec {:examples ["logseq remove tag --graph my-graph --name project"]}) (core/command-entry ["remove" "property"] :remove-property "Remove property" remove-property-spec @@ -59,6 +59,15 @@ :else nil)) + :remove-page + (cond + (and (contains? opts :page) + (string/blank? (or (:page opts) ""))) + "page must be non-empty" + + :else + nil) + (:remove-tag :remove-property) (let [name (some-> (:name opts) string/trim) selectors (filter some? [(:id opts) name])] @@ -359,13 +368,13 @@ :uuid uuid}})) :remove-page - (let [name (some-> (:name options) string/trim)] - (if (seq name) + (let [page (some-> (:page options) string/trim)] + (if (seq page) {:ok? true :action {:type :remove-page :repo repo :graph (core/repo->graph repo) - :name name}} + :page page}} {:ok? false :error {:code :missing-page-name :message "page name is required"}})) @@ -408,7 +417,7 @@ (defn execute-remove-page [action config] (-> (p/let [cfg (cli-server/ensure-server! config (:repo action)) - entity (resolve-page-by-name cfg (:repo action) (:name action))] + entity (resolve-page-by-name cfg (:repo action) (:page action))] (if-let [page-uuid (:block/uuid entity)] (p/let [result (delete-page-by-uuid cfg (:repo action) page-uuid)] {:status :ok diff --git a/src/main/logseq/cli/command/server.cljs b/src/main/logseq/cli/command/server.cljs index 13e0877576..f1a0310fc6 100644 --- a/src/main/logseq/cli/command/server.cljs +++ b/src/main/logseq/cli/command/server.cljs @@ -5,18 +5,15 @@ [logseq.cli.version :as version] [promesa.core :as p])) -(def ^:private server-spec - {:graph {:desc "Graph name"}}) - (def entries [(core/command-entry ["server" "list"] :server-list "List db-worker-node servers" {}) - (core/command-entry ["server" "status"] :server-status "Show server status for a graph" server-spec + (core/command-entry ["server" "status"] :server-status "Show server status for a graph" {} {:examples ["logseq server status --graph my-graph"]}) - (core/command-entry ["server" "start"] :server-start "Start db-worker-node for a graph" server-spec + (core/command-entry ["server" "start"] :server-start "Start db-worker-node for a graph" {} {:examples ["logseq server start --graph my-graph"]}) - (core/command-entry ["server" "stop"] :server-stop "Stop db-worker-node for a graph" server-spec + (core/command-entry ["server" "stop"] :server-stop "Stop db-worker-node for a graph" {} {:examples ["logseq server stop --graph my-graph"]}) - (core/command-entry ["server" "restart"] :server-restart "Restart db-worker-node for a graph" server-spec + (core/command-entry ["server" "restart"] :server-restart "Restart db-worker-node for a graph" {} {:examples ["logseq server restart --graph my-graph"]})]) (defn build-action diff --git a/src/main/logseq/cli/commands.cljs b/src/main/logseq/cli/commands.cljs index ad01762272..32ff78ba35 100644 --- a/src/main/logseq/cli/commands.cljs +++ b/src/main/logseq/cli/commands.cljs @@ -256,7 +256,7 @@ (and (= command :remove-block) (empty? (filter some? [(:id opts) (some-> (:uuid opts) string/trim)]))) (missing-target-result summary) - (and (= command :remove-page) (not (seq (some-> (:name opts) string/trim)))) + (and (= command :remove-page) (not (seq (some-> (:page opts) string/trim)))) (missing-page-name-result summary) (and (#{:remove-tag :remove-property} command) diff --git a/src/main/logseq/cli/format.cljs b/src/main/logseq/cli/format.cljs index ef1e8f7440..e44ebd9ebc 100644 --- a/src/main/logseq/cli/format.cljs +++ b/src/main/logseq/cli/format.cljs @@ -649,8 +649,8 @@ :else (str "Removed block (repo: " repo ")"))) (defn- format-remove-page - [{:keys [repo name]}] - (str "Removed page: " name " (repo: " repo ")")) + [{:keys [repo page]}] + (str "Removed page: " page " (repo: " repo ")")) (defn- format-remove-tag [{:keys [repo name id]}] diff --git a/src/test/logseq/cli/commands_test.cljs b/src/test/logseq/cli/commands_test.cljs index 9324f0b4cc..0bd6972e0c 100644 --- a/src/test/logseq/cli/commands_test.cljs +++ b/src/test/logseq/cli/commands_test.cljs @@ -1214,11 +1214,16 @@ (is (= :remove-block (:command result))) (is (= 10 (get-in result [:options :id]))))) - (testing "remove page parses with name" - (let [result (commands/parse-args ["remove" "page" "--name" "Home"])] + (testing "remove page parses with page" + (let [result (commands/parse-args ["remove" "page" "--page" "Home"])] (is (true? (:ok? result))) (is (= :remove-page (:command result))) - (is (= "Home" (get-in result [:options :name]))))) + (is (= "Home" (get-in result [:options :page]))))) + + (testing "remove page rejects legacy --name" + (let [result (commands/parse-args ["remove" "page" "--name" "Home"])] + (is (false? (:ok? result))) + (is (= :invalid-options (get-in result [:error :code]))))) (testing "remove tag parses with name" (let [result (commands/parse-args ["remove" "tag" "--name" "Quote"])] @@ -1242,6 +1247,9 @@ (is (false? (:ok? result))) (is (= :invalid-options (get-in result [:error :code]))))) + ) + +(deftest test-verb-subcommand-parse-upsert-entity (testing "upsert tag parses with name" (let [result (commands/parse-args ["upsert" "tag" "--name" "Quote"])] (is (true? (:ok? result))) @@ -1624,7 +1632,13 @@ "--graph" "logseq_db_logseq_db_demo"])] (is (true? (:ok? result))) (is (= :server-status (:command result))) - (is (= "logseq_db_logseq_db_demo" (get-in result [:options :graph])))))) + (is (= "logseq_db_logseq_db_demo" (get-in result [:options :graph]))))) + + (testing "server status accepts global -g alias" + (let [result (commands/parse-args ["server" "status" "-g" "demo"])] + (is (true? (:ok? result))) + (is (= :server-status (:command result))) + (is (= "demo" (get-in result [:options :graph])))))) (deftest test-verb-subcommand-parse-graph-backup (testing "graph backup list parses" @@ -2051,12 +2065,19 @@ (is (= :remove-block (get-in result [:action :type]))) (is (= [1 2] (get-in result [:action :ids]))))) - (testing "remove page requires name" + (testing "remove page requires page" (let [parsed {:ok? true :command :remove-page :options {}} result (commands/build-action parsed {:graph "demo"})] (is (false? (:ok? result))) (is (= :missing-page-name (get-in result [:error :code]))))) + (testing "remove page accepts --page in action build" + (let [parsed {:ok? true :command :remove-page :options {:page "Home"}} + result (commands/build-action parsed {:graph "demo"})] + (is (true? (:ok? result))) + (is (= :remove-page (get-in result [:action :type]))) + (is (= "Home" (get-in result [:action :page]))))) + (testing "remove tag parses by id" (let [parsed {:ok? true :command :remove-tag :options {:id 42}} result (commands/build-action parsed {:graph "demo"})] @@ -2766,7 +2787,7 @@ (reset! ops* ops) nil) (throw (ex-info "unexpected invoke" {:method method :args args}))))] - (p/let [result (commands/execute {:type :remove-page :repo "demo" :name "Home"} {})] + (p/let [result (commands/execute {:type :remove-page :repo "demo" :page "Home"} {})] (is (= :ok (:status result))) (is (= true (get-in result [:data :result]))) (is (= [[:delete-page [page-uuid {}]]] diff --git a/src/test/logseq/cli/completion_generator_test.cljs b/src/test/logseq/cli/completion_generator_test.cljs index 469ccfb9c5..36e636bc12 100644 --- a/src/test/logseq/cli/completion_generator_test.cljs +++ b/src/test/logseq/cli/completion_generator_test.cljs @@ -139,8 +139,8 @@ page-entry (first (filter #(= :remove-page (:command %)) entries)) tag-entry (first (filter #(= :remove-tag (:command %)) entries)) property-entry (first (filter #(= :remove-property (:command %)) entries))] - (testing "remove-page :name has :complete :pages" - (is (= :pages (get-in page-entry [:spec :name :complete])))) + (testing "remove-page :page has :complete :pages" + (is (= :pages (get-in page-entry [:spec :page :complete])))) (testing "remove-tag :name has :complete :tags" (is (= :tags (get-in tag-entry [:spec :name :complete])))) (testing "remove-property :name has :complete :properties" @@ -429,9 +429,10 @@ (testing "query spec has :name with :complete :queries" (let [query-entry (first (filter #(= :query (:command %)) entries))] (is (= :queries (get-in query-entry [:spec :name :complete]))))) - (testing "remove page spec has :name with :complete :pages" + (testing "remove page spec has :page with :complete :pages" (let [rm-page (first (filter #(= :remove-page (:command %)) entries))] - (is (= :pages (get-in rm-page [:spec :name :complete]))))) + (is (= :pages (get-in rm-page [:spec :page :complete]))) + (is (nil? (get-in rm-page [:spec :name]))))) (testing "upsert tag spec has :complete :tags on :name" (let [tag (first (filter #(= :upsert-tag (:command %)) entries))] (is (= :tags (get-in tag [:spec :name :complete]))))) diff --git a/src/test/logseq/cli/format_test.cljs b/src/test/logseq/cli/format_test.cljs index 0e46a7a9f9..2358d020d0 100644 --- a/src/test/logseq/cli/format_test.cljs +++ b/src/test/logseq/cli/format_test.cljs @@ -360,7 +360,7 @@ (let [result (format/format-result {:status :ok :command :remove-page :context {:repo "demo-repo" - :name "Home"} + :page "Home"} :data {:result {:ok true}}} {:output-format nil})] (is (= "Removed page: Home (repo: demo-repo)" result))))