(require (quote [pycloj-tools.browser :refer :all]) (quote [pycloj-tools.pyutils :as pyutils]) (quote [libpython-clj.python :as py]) (quote [clojure.java.shell :refer [sh]]) (quote [clojure.string :as string]) (quote [com.rpl.specter :refer [transform ALL MAP-VALS]]))
The pycloj-tools.browser
namespace offers a collection of functions for inspecting python modules. We will test it with realistic python packages such as pandas
, as well as with a dummy one, that we have here:
[:div (-> (sh "find" "dummy_package") :out (string/split (re-pattern "\n")) (->> (filter (fn [line] (not (re-find (re-pattern "__pycache__") line)))) (map (fn [line] [:li line])) (into [:ul])))]
[[= (-> "dummy_package.module_a" name->module module->name) "dummy_package.module_a"]]
PASSED
[[= (-> "dummy_package.modulllle_a" name->module) {:cause "ModuleNotFoundError: No module named 'dummy_package.modulllle_a'\n", :failed-import? true, :module-name "dummy_package.modulllle_a"}]]
PASSED
[[= (-> "dummy_package.module_a" name->module module->submodules-names) ["dummy_package.module_a.submodule_aa"]] [= (-> "pandas" name->module module->submodules-names) ["pandas._config" "pandas._libs" "pandas.api" "pandas.arrays" "pandas.compat" "pandas.core" "pandas.errors" "pandas.io" "pandas.plotting" "pandas.tests" "pandas.tseries" "pandas.util"]]]
PASSED
PASSED
[[= (-> "dummy_package.module_a.submodule_aa.submodule_aaa" name->module module->submodules-names) []] [= (-> "pandas.plotting._matplotlib" name->module module->submodules-names) []]]
PASSED
PASSED
[[nil? (-> "dummy_package.modulllle_a" name->module module->submodules-names)]]
PASSED
[[= (->> "dummy_package.module_a" name->module module->submodules (map module->name)) ["dummy_package.module_a.submodule_aa"]]]
PASSED
[[= (->> "dummy_package.module_a" name->module module->recursive-submodules (map module->name)) ["dummy_package.module_a" "dummy_package.module_a.submodule_aa" "dummy_package.module_a.submodule_aa.submodule_aaa"]]]
PASSED
[[= (->> "dummy_package.module_a.submodule_aa" name->module ->functions-map keys set) #{:f}] [= (->> "dummy_package" name->module ->functions-map keys set) #{:calling_custom_clojure_fn :complex_fn :for_iter}] [= (->> "dummy_package" name->module ->classes-map :WithObjClass ->functions-map keys set) #{:__enter__ :__exit__ :__init__ :doit_err :doit_noerr}]]
PASSED
PASSED
PASSED
[[= (->> "dummy_package" name->module ->classes-map keys set) #{:WithObjClass}]]
PASSED
[[= (->> "dummy_package" name->module ->functions-map :complex_fn function->info) {:args [{:annotation nil, :default nil, :empty nil, :kind :POSITIONAL_OR_KEYWORD, :name "a"} {:annotation nil, :default nil, :empty nil, :kind :POSITIONAL_OR_KEYWORD, :name "b"} {:annotation :str, :default 5, :empty nil, :kind :POSITIONAL_OR_KEYWORD, :name "c"} {:annotation nil, :default nil, :empty nil, :kind :VAR_POSITIONAL, :name "args"} {:annotation nil, :default 10, :empty nil, :kind :KEYWORD_ONLY, :name "d"} {:annotation nil, :default nil, :empty nil, :kind :VAR_KEYWORD, :name "kwargs"}], :async? false, :awaitable? false, :builtin? false, :doc nil, :generator? false, :name "complex_fn", :return-annotation nil}]]
PASSED