1
0

lint_rules.clj 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/env bb
  2. (require '[babashka.deps :as deps])
  3. (deps/add-deps '{:deps {me.tagaholic/dlint {:mvn/version "0.1.0"}
  4. io.lambdaforge/datalog-parser {:mvn/version "0.1.11"}}
  5. :paths ["src"]})
  6. (ns lint-rules
  7. "Lint datalog rules for parse-ability and unbound variables"
  8. (:require [datalog.parser.impl :as parser-impl]
  9. [dlint.core :as dlint]
  10. [logseq.db.rules :as rules]))
  11. (defn- lint-unbound-rule [rule]
  12. (->> (dlint/lint [rule])
  13. (keep
  14. (fn [[k v]]
  15. (when (seq v)
  16. {:success false :name k :rule rule :unbound-vars v})))))
  17. (defn- lint-rule [rule]
  18. (try (parser-impl/parse-rule rule)
  19. {:success true :rule rule}
  20. (catch Exception e
  21. {:success false :rule rule :error (.getMessage e)})))
  22. (defn- collect-logseq-rules
  23. "Collects logseq rules and prepares them for linting"
  24. []
  25. (into rules/rules
  26. (-> rules/query-dsl-rules
  27. ;; TODO: Update linter to handle false positive on ?str-val
  28. (dissoc :property)
  29. vals)))
  30. (defn -main [rules]
  31. (let [invalid-unbound-rules (->> rules
  32. (mapcat lint-unbound-rule)
  33. (remove :success))
  34. invalid-rules (->> rules
  35. (map lint-rule)
  36. (remove :success))
  37. lint-results (concat invalid-unbound-rules invalid-rules)]
  38. (if (seq lint-results)
  39. (do
  40. (println (count lint-results) "rules failed to lint:")
  41. (println lint-results)
  42. (System/exit 1))
  43. (println (count rules) "datalog rules linted fine!"))))
  44. (when (= *file* (System/getProperty "babashka.file"))
  45. (-main (collect-logseq-rules)))