Giter VIP home page Giter VIP logo

polylith's People

Contributors

alndvz avatar bpringe avatar devgrapher avatar dpetran avatar ericdallo avatar furkan3ayraktar avatar futuro avatar ieugen avatar imrekoszo avatar ivangalbans avatar jacekschae avatar jeroenvandijk avatar john-shaffer avatar laurio avatar mraveloarinjaka avatar namenu avatar p14n avatar pez avatar seancorfield avatar sundbry avatar tengstrand avatar timokramer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

polylith's Issues

Restrict naming of bricks

Is your feature request related to a problem? Please describe.
Today it's possible to execute a command like "poly create component name:my/component" which will create the component my/component which is not supported.

Describe the solution you'd like
Show an error message if the component name includes illegal characters like / (slash).

Switch to VSCode/Calva as the main IDE in the examples

Is your feature request related to a problem? Please describe.
The documentation uses Cursive today in the examples, which isn't free. An open source solution could help people getting started with Polylith more easily.

Describe the solution you'd like
Calva is a good choice. The latest GitPod based solution that allows you to run the IDE in the browser is also a plus.

Additional context
Add a section for the other main IDE's, Emacs/CIDER and IDEA/Cursive.

Use of :paths outside a project is not recommended

Describe the bug
The polylith directory structure instructs users to create projects with a deps.edn with :paths outside the project itself:

:paths ["../../components/user/src"
         "../../components/user/resources"
         "../../bases/cli/src"
         "../../bases/cli/resources"]

This is generally a bad idea. The intent of :paths is to describe paths in your own project. In the polylith setup, these are effectively local dependencies. In the future, use of paths that are not under the project root may emit a warning or even an error.

deps.edn supports local dependencies using the :local/root coordinate attribute. Relative paths are supported there.

:deps {my.component/user {:local/root "../../components/user"}
       my.base/cli {:local/root "../../bases/cli"}

You would also need deps.edn files under ../../components/user with :paths ["src" "resources"] etc of course.

I can't fully assess what other impacts this may have on the polylith architecture, but using local deps is strongly preferred over referring to non-project paths. If for some reason this is not sufficient, I'd appreciate talking through why (I know there are some issues others have raised for monorepo style setups).

Alternately, using a deps.edn at the root of the entire project may also be an option, if you want to consider the entire thing as a single project.

Don't commit files when creating a workspace

Describe the bug
A clear and concise description of what the bug is.

Ran poly create on an existing repository and poly created a commit automatically.
That commit had a lot of extra files that would never reach git.

To Reproduce
Steps to reproduce the behavior:

  1. Navigate to: go to a git project with existing files and maybe not all added to .gitignore ?!
  2. Run poly create top-ns xxx.yyy
  3. See error

Expected behavior

I would like poly to allow me to commit instead of auto-comitting by default.
I believe the behaviour could be to OPT-IN for auto-commit via a cli parameter.

I also noticed that poly create will overwrite any files that happen to match what it creates.
You lose un-committed changes.
It happened with deps.edn and .gitignore.

Additional context

I did git reset --soft

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .clj-kondo/.cache/2021.10.19/clj/dre-vault.transit.json
        new file:   .clj-kondo/.cache/2021.10.19/clj/ro.ieugen.helmer.cli.transit.json
        new file:   .clj-kondo/.cache/2021.10.19/clj/ro.ieugen.helmer.render-test.transit.json
        new file:   .clj-kondo/.cache/2021.10.19/clj/ro.ieugen.helmer.render.transit.json
        new file:   .clj-kondo/.cache/2021.10.19/clj/ro.ieugen.helmer.vault.transit.json
        new file:   .clj-kondo/.cache/2021.10.19/clj/user.transit.json
        new file:   .clj-kondo/.cache/2021.10.19/lock
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/babashka.curl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/bencode.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cheshire.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cheshire.custom.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cheshire.exact.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cheshire.experimental.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cheshire.factory.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cheshire.generate-seq.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cheshire.generate.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cheshire.parse.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cli-matic.optionals.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cli-matic.platform.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clj-yaml.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cljs.core.async.impl.ioc-macros.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cljs.core.async.interop.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cljs.core.async.macros.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cljs.core.async.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cljs.core.match.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cljs.tools.reader.reader-types.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.buffers.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.channels.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.concurrent.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.dispatch.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.exec.threadpool.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.ioc-macros.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.mutex.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.protocols.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.impl.timers.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.lab.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.async.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.cache.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.cache.wrapped.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.match.array.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.match.debug.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.match.java.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.match.protocols.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.match.regex.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.match.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.memoize.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.protocols.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.reducers.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.server.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.specs.alpha.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.codec.base64.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.csv.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.json.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.priority-map.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.event.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.impl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.jvm.emit.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.jvm.name.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.jvm.parse.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.jvm.pprint.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.process.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.prxml.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.data.xml.tree.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.datafy.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.edn.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.inspector.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.instant.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.java.browse-ui.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.java.browse.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.java.io.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.java.javadoc.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.java.shell.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.main.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.parallel.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.pprint.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.reflect.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.repl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.set.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.spec.alpha.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.spec.gen.alpha.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.spec.test.alpha.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.stacktrace.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.string.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.template.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.test.check.random.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.test.junit.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.test.tap.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.test.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.ast.query.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.ast.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.env.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.jvm.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.jvm.utils.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.add-binding-atom.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.cleanup.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.collect-closed-overs.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.constant-lifter.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.elide-meta.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.emit-form.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.index-vector-nodes.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.analyze-host-expr.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.annotate-branch.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.annotate-host-info.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.annotate-loops.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.annotate-tag.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.box.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.classify-invoke.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.constant-lifter.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.emit-form.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.fix-case-test.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.infer-tag.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.validate-loop-locals.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.validate-recur.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.validate.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.jvm.warn-on-reflection.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.source-info.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.trim.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.uniquify.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.passes.warn-earmuff.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.analyzer.utils.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.logging.impl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.logging.readable.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.logging.test.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.logging.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.macro.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.default-data-readers.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.edn.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.impl.ExceptionInfo.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.impl.commons.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.impl.errors.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.impl.inspect.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.impl.utils.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.reader-types.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.tools.reader.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.uuid.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.walk.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.xml.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/clojure.zip.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/cognitect.transit.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/com.stuartsierra.component.platform.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/contajners.jvm-runtime.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/contajners.sci-runtime.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/dre-vault.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/environ.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/envoy.check.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/envoy.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/envoy.tools.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/envoy.types.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.ordered.common.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.ordered.map.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.ordered.set.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.bean.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.cli.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.compress.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.config.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.datatypes.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.debug.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.deftype.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.dispatch.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.exception.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.experimental.delegate.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.experimental.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.fn.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.io.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.java.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.macro.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.map.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.ns.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.parallel.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.seq.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.state.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.string.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.test.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.time.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/flatland.useful.utils.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup.compiler.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup.def.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup.element.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup.form.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup.middleware.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup.page.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup.util.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/hiccup2.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/io.aviso.ansi.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/io.aviso.binary.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/io.aviso.clipboard.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/io.aviso.columns.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/io.aviso.exception.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/io.aviso.lein-pretty.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/io.aviso.logging.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/io.aviso.repl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/org.httpkit.client.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/org.httpkit.encode.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/org.httpkit.server.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/org.httpkit.sni-client.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/org.httpkit.timer.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/pem-reader.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/pem-reader.parse.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/pem-reader.readers.pkcs1.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/pem-reader.rsa.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/portal.client.jvm.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/portal.main.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/portal.nrepl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/portal.runtime.jvm.client.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/portal.runtime.jvm.commands.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/portal.runtime.jvm.launcher.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/portal.runtime.jvm.server.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/portal.runtime.remote.socket.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/rewrite-clj.node.string.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/rewrite-clj.zip.edit.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/rewrite-clj.zip.find.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/rewrite-clj.zip.remove.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/rewrite-clj.zip.seq.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/ro.ieugen.helmer.cli.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/ro.ieugen.helmer.render-test.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/ro.ieugen.helmer.render.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/ro.ieugen.helmer.vault.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.filter-parser.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.filters.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.middleware.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.node.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.parser.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.tags.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.template-parser.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.util.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/selmer.validator.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/table.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/table.width.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.android-logcat.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.congomongo.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.franzy.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.gelf.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.irclj.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.logstash.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.newrelic.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.postgresql.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.rolling.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.rotor.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.sentry.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.server-socket.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.slack.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.syslog-appender.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.udp-socket.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.3rd-party.zmq.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.carmine.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.example.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.appenders.postal.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.timbre.tools.logging.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.truss.impl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/taoensso.truss.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/tigris.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.client.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.data.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.impl.FixedPathTcpSocket.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.impl.FixedPathTcpSocketFactory.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.impl.FixedPathUnixSocket.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.impl.FixedPathUnixSocketFactory.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.impl.ResponseSocket.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.impl.SingletonSocketFactory.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.impl.StreamingBody.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/unixsocket-http.impl.delegate.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/user.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.authenticate.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.client.api-util.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.client.http.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.client.mock.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.env.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.lease.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.secrets.kvv1.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.secrets.kvv2.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/clj/vault.timer.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/babashka.fs.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/cli-matic.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/cli-matic.help-gen.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/cli-matic.platform-macros.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/cli-matic.presets.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/cli-matic.specs.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/cli-matic.utils-candidates.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/cli-matic.utils.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.data.xml.name.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.data.xml.node.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.data.xml.protocols.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.data.xml.pu-map.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.data.xml.spec.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.clojure-test.assertions.cljs.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.clojure-test.assertions.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.clojure-test.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.generators.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.impl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.properties.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.results.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.rose-tree.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.test.check.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/clojure.tools.cli.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/com.stuartsierra.component.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/com.stuartsierra.dependency.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/contajners.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/contajners.impl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/expound.alpha.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/expound.ansi.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/expound.paths.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/expound.printer.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/expound.problems.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/expound.specs.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/expound.util.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.api.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.async.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.colors.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.console.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.resources.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.browser.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.cson.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.fs.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.index.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.json.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.jvm.editor.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.macros.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.remote.server.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.shell.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.runtime.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.spec.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/portal.sync.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.custom-zipper.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.custom-zipper.switchable.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.custom-zipper.utils.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.interop.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.coercer.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.comment.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.extras.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.fn.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.forms.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.integer.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.keyword.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.meta.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.namespaced-map.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.protocols.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.quote.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.reader-macro.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.regex.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.seq.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.stringz.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.token.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.uneval.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.node.whitespace.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.paredit.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.parser.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.parser.keyword.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.parser.namespaced-map.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.parser.string.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.parser.token.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.parser.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.parser.whitespace.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.reader.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.base.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.context.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.editz.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.findz.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.insert.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.move.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.options.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.removez.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.seqz.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.subedit.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.walk.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/rewrite-clj.zip.whitespace.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/taoensso.encore.test.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/taoensso.encore.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/taoensso.timbre.appenders.core.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/taoensso.timbre.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/taoensso.truss.examples.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljc/user.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cli-matic.optionals.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cli-matic.platform.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.async.impl.buffers.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.async.impl.channels.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.async.impl.dispatch.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.async.impl.ioc-helpers.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.async.impl.protocols.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.async.impl.timers.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.async.interop.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.async.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.core.match.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.tools.reader.edn.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.tools.reader.impl.commons.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.tools.reader.impl.errors.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.tools.reader.impl.inspect.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.tools.reader.impl.utils.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.tools.reader.reader-types.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cljs.tools.reader.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/clojure.data.xml.js.dom.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/clojure.data.xml.js.name.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/clojure.data.xml.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/clojure.test.check.random.doubles.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/clojure.test.check.random.longs.bit-count-impl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/clojure.test.check.random.longs.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/clojure.test.check.random.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/cognitect.transit.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/com.stuartsierra.component.platform.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.client.common.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.client.node.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.client.web.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.main.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.runtime.node.client.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.runtime.node.launcher.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.runtime.node.server.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.runtime.web.client.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.runtime.web.launcher.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.shortcuts.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/portal.web.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/taoensso.timbre.appenders.community.node-spit.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/taoensso.truss.impl.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/cljs/taoensso.truss.transit.json
        new file:   .clj-kondo/.cache/2021.10.20-SNAPSHOT/lock
        new file:   .clj-kondo/rewrite-clj/rewrite-clj/config.edn
        modified:   .gitignore
        new file:   .lsp/.cache/data.mdb
        new file:   .lsp/.cache/lock.mdb
        new file:   .portal/vs-code.edn
        new file:   .vscode/settings.json

Error while using Polylith Tool as a dependency

When trying to run poly as a dependency, it fails to run

To Reproduce
Steps to reproduce the behavior:

  1. Create new directory
  2. Create deps.edn inside new directory
{:aliases
 {:poly
  {:extra-deps {polylith/clj-poly
                {:mvn/version "0.1.0-alpha6"}}
   :main-opts  ["-m" "polylith.clj.core.poly-cli.core"]}}}
  1. Run clj -M:poly info as specified in the README
  2. See execution error:
Execution error (FileNotFoundException) at clojure.main/main (main.java:40).
Could not locate polylith/clj/core/poly_cli/core__init.class, polylith/clj/core/poly_cli/core.clj or polylith/clj/core/poly_cli/core.cljc on classpath. Please check that namespaces with dashes use underscores in the Clojure file name.

Full report at:
/tmp/clojure-4962911649194788572.edn

Here's the full report:

{:clojure.main/message
 "Execution error (FileNotFoundException) at clojure.main/main (main.java:40).\nCould not locate polylith/clj/core/poly_cli/core__init.class, polylith/clj/core/poly_cli/core.clj or polylith/clj/core/poly_cli/core.cljc on classpath. Please check that namespaces with dashes use underscores in the Clojure file name.\n",
 :clojure.main/triage
 {:clojure.error/class java.io.FileNotFoundException,
  :clojure.error/line 40,
  :clojure.error/cause
  "Could not locate polylith/clj/core/poly_cli/core__init.class, polylith/clj/core/poly_cli/core.clj or polylith/clj/core/poly_cli/core.cljc on classpath. Please check that namespaces with dashes use underscores in the Clojure file name.",
  :clojure.error/symbol clojure.main/main,
  :clojure.error/source "main.java",
  :clojure.error/phase :execution},
 :clojure.main/trace
 {:via
  [{:type java.io.FileNotFoundException,
    :message
    "Could not locate polylith/clj/core/poly_cli/core__init.class, polylith/clj/core/poly_cli/core.clj or polylith/clj/core/poly_cli/core.cljc on classpath. Please check that namespaces with dashes use underscores in the Clojure file name.",
    :at [clojure.lang.RT load "RT.java" 462]}],
  :trace
  [[clojure.lang.RT load "RT.java" 462]
   [clojure.lang.RT load "RT.java" 424]
   [clojure.core$load$fn__6839 invoke "core.clj" 6126]
   [clojure.core$load invokeStatic "core.clj" 6125]
   [clojure.core$load doInvoke "core.clj" 6109]
   [clojure.lang.RestFn invoke "RestFn.java" 408]
   [clojure.core$load_one invokeStatic "core.clj" 5908]
   [clojure.core$load_one invoke "core.clj" 5903]
   [clojure.core$load_lib$fn__6780 invoke "core.clj" 5948]
   [clojure.core$load_lib invokeStatic "core.clj" 5947]
   [clojure.core$load_lib doInvoke "core.clj" 5928]
   [clojure.lang.RestFn applyTo "RestFn.java" 142]
   [clojure.core$apply invokeStatic "core.clj" 667]
   [clojure.core$load_libs invokeStatic "core.clj" 5985]
   [clojure.core$load_libs doInvoke "core.clj" 5969]
   [clojure.lang.RestFn applyTo "RestFn.java" 137]
   [clojure.core$apply invokeStatic "core.clj" 667]
   [clojure.core$require invokeStatic "core.clj" 6007]
   [clojure.main$main_opt invokeStatic "main.clj" 514]
   [clojure.main$main_opt invoke "main.clj" 510]
   [clojure.main$main invokeStatic "main.clj" 664]
   [clojure.main$main doInvoke "main.clj" 616]
   [clojure.lang.RestFn applyTo "RestFn.java" 137]
   [clojure.lang.Var applyTo "Var.java" 705]
   [clojure.main main "main.java" 40]],
  :cause
  "Could not locate polylith/clj/core/poly_cli/core__init.class, polylith/clj/core/poly_cli/core.clj or polylith/clj/core/poly_cli/core.cljc on classpath. Please check that namespaces with dashes use underscores in the Clojure file name."}}

Expected behavior
display info about workspace

Operating System (please complete the following information):

  • OS: Nixos
  • Version: 20.09

Versions (please complete the following information):

  • Java: 11.0.9
  • Poly: 0.6.0-alpha

If test setup fails, tests should not run

Describe the bug
If per-project test setup fails (throws an exception), poly test still runs the tests (which may or may not fail).

To Reproduce
Have a per-project test setup that throws an exception, and at least one test that will run from that project. The test setup will fail but the tests will still be run (and so will the test teardown).

Expected behavior
If the per-project test setup fails, tests should not run and poly test should report the failure (with a stacktrace).

I'm not sure whether test teardown should be run if setup fails -- my initial feeling is that if test setup fails, neither the tests nor the teardown should be run.

This is kind of the flip-side to the previous bug I raised around per-project fixtures (where teardown was not being run if tests failed -- here tests should not be run if setup fails).

Support "tools" installation and use

Is your feature request related to a problem? Please describe.
Now that Clojure CLI 1.10.3.933 is out, it would be very convenient to be able to install poly as a "global" tool using the CLI's standard machinery and then use it (via the CLI) in any project: clojure -Ttools install ... and then clojure -Tpoly ...

Describe the solution you'd like
Add a new namespace to the poly CLI with a .api suffix (this is a de facto standard for "tools") that contains high-level "exec" functions that can be invoked via clojure -Tpoly <fn> <kvs-args> and map those functions (and arguments) to poly's internal command/argument structure as appropriate.

Describe alternatives you've considered
A wrapper could be written in user space, but it would be nice to have this baked into the tool.

Polylith should manage its own brew tap

Is your feature request related to a problem? Please describe.
The core Brew team has very strong opinions on how brew formulae should work and a key part of that is that brew always installs all the dependencies a package says it needs and always installs the latest version. This means that brew install poly will force an OpenJDK 16 install on all users. The Clojure CLI had this happen too, with the core Brew team modifying the clojure formula to bring in OpenJDK 16. See Homebrew/homebrew-core#50536 for the background and discussion.

Describe the solution you'd like
In the same way that the Clojure team now manages its own brew tap at clojure/tools/clojure, I think the Polylith team should set up and manage their own tap so that they can control exactly which versions of dependencies get installed -- and indeed if the user has an appropriate openjdk already installed, it shouldn't force install a newer version.

Describe alternatives you've considered
There's no real alternative: either you live with the Brew rules and have people complain about brew install poly changing their installed version of Java, or you run your own tap.

Additional context
I don't know how the Clojure team got their tap registered -- you'd have to ask @puredanger about that.

Question: recommended way to write tests components sharing common interface

Describe the bug
Note: this is not a bug, but a request for clarification (didn't find appropriate template).

What should be a test setup for two or more components sharing the same interface?
The assumption is that the tests are written against interface, not implementation. This goal is to re-use the test suite for both components.

Given components A and B with the same interface, potential options are:

  • Place the tests in A's test directory and use them to test both A and B
  • Create a component C containing only test directory with dependencies on A and B
  • Create a test project to test both components

What is the recommended way?

To Reproduce
Steps to reproduce the behavior:

  1. Create components A and B sharing same interface
  2. Think about where to put the interface (contract) tests

Expected behavior
Polylith architecture has a nice solution for this

Error when including a namspace without an alias in a component

Describe the bug
When a component includes a namespace without an alias the poly info raises the error
Don't know how to create ISeq from: clojure.lang.Symbol

To Reproduce
Steps to reproduce the behavior:

  1. Create a component
  2. in the interface of the component include a namespace without an alias ex:
(ns edge.money.interface
  (:require [com.fulcrologic.guardrails.core :refer [>def >defn =>]]
            [edge.money.core :as core]
            [edge.money :as money]
            edge.money.reader))

Problem is solved when changing
edge.money.reader for edge.money.reader :as reader
2. Run poly info

clj -M:poly info
  1. See error Don't know how to create ISeq from: clojure.lang.Symbol

Expected behavior
An alias for the namespace is not mandatory. The use case is common to force the namespace to be loaded so a namespace without an alias shouldn't break the polylith tool.

Workspace Attachment
If applicable, add output of following command as attachment:

  • poly ws out:ws.edn
    Same error appear when running this command

Operating System (please complete the following information):

  • OS: MacOs
  • Version: BigSur

Versions (please complete the following information):

  • Java: "1.8.0_192-ea"
  • Poly: "0.1.0-alpha9"

Use tools.build

Is your feature request related to a problem? Please describe.
The Polylith codebase itself and the main example use depstar today, which has reached the end of its life and recommend people to use tools.build.

Describe the solution you'd like
Convert the examples and the deployer component to use tools.build.

Take a look at build-clj as a way to reduce boilerplate code in build.clj files.

Contrary to the readme, Cursive supports :local/root component deps

In the readme there is the following section (and later on, there are constraints set by this section):

An alternative way of adding the component is by specifying it as an :extra-deps (the development/src directory still has to be specified as a path):

 :aliases  {:dev {:extra-paths ["development/src"]
                  :extra-deps {poly/user {:local/root "components/user"}}
  ...
            :test {:extra-paths ["components/user/test"]}
If you use Cursive as an IDE, this will not work correctly, and the problem is that Cursive doesn't treat components/user/src as a source directory in the IDE (it will not be marked as green). This is also why we use the first form in this example.

Cursive does support this, however. Here's how to make that work:

  1. add the local/root dep to the root deps.edn
  2. File > New... > Module from Existing Sources... or use the Import Module from Existing Sources... action
  3. browse to the workspace root folder, Open and navigate through the wizard:

Screenshot 2021-09-07 at 15 13 34
Screenshot 2021-09-07 at 15 13 51
Screenshot 2021-09-07 at 15 13 59
Screenshot 2021-09-07 at 15 14 04

Your component src/test folders should now be properly marked:
Screenshot 2021-09-07 at 15 14 27

Homebrew warning

Warning: Calling bottle :unneeded is deprecated! There is no replacement.
Please report this issue to the polyfy/polylith tap (not Homebrew/brew or Homebrew/core):
/usr/local/Homebrew/Library/Taps/polyfy/homebrew-polylith/Formula/poly.rb:8

Ignore top-level 'data_readers.clj'

Is your feature request related to a problem? Please describe.
Reader tags are declared in 'data_readers.clj' files on the classpath root. If a brick needs reader tags, it would be natural to place them in its src folder, or perhaps in resources, but 'poly check' issues a spurious Warning 205: Non top namespace.

Describe the solution you'd like
The polylith tool should ignore 'data_readers.clj' files when checking for non-top namespaces.

Describe alternatives you've considered
Moving the file inside the top-level namespace suppresses the warning, but then Clojure cannot find the file, because it only looks in the classpath root.

Move the poly documentation to gitbook

Is your feature request related to a problem? Please describe.
The current documentation is hard to use because everything lives into one huge document.

Describe the solution you'd like
Move the documentation to gitbook, where it can be split up in sections and be easier to use.

Possible readme instruction issue

Under the section "Create a build script for user-service," there's a line that says to open the interface namespace of the user-remote component and load this file in order to replace the user-remote implementation: "This will replace the user implementation with the user-remote component."

I found that this didn't replace the implementation, which makes sense to me, because that's the interface namespace, not the implementation namespace, that was just loaded. In order to make the next steps in the readme work as stated, I had to open the user-remote implementation namespace and load this file. This also makes sense to me because to replace an implementation, the implementation namespace with desired code should be loaded.

It could also be that I'm misunderstanding something here, but this is how it works with my editor.

Add support for running specific brick tests

Is your feature request related to a problem? Please describe.

At my company we have migrated our different "micro-services" into a single Polylith codebase (bases and components), but our (historical) tests are not optimized for speed, and it's a bit problematic when you use the polylith test runner because it will run all the bricks tests (even if you can run only those modified since the last release or the last stable, it's still very long, up to 5 minutes per base for us).

Describe the solution you'd like

I would like to be able to poly test specific bricks with either poly test base:my-base, poly test component:my-component or poly test brick:my-component.
By default it would run those from the context of the development project.

Describe alternatives you've considered

AFAIU The recommended way to handle slow tests is to move them into projects, but we've been bad with our tests, a lot of them are slow, so I've started optimizing tests speed, it's a lot of work.

Excluding and/or including certain tests via metadata

Is your feature request related to a problem? Please describe.

I would like to write tests that should not always be run, eg:

  • benchmarking/performance tests that take too long to be run every time
  • integration tests with external systems that rely on working VPN, etc. and cannot be run in all environments.

Describe the solution you'd like

The cognitect.test-runner supports this via keyword options:

  :includes - coll of test metadata keywords to include
  :excludes - coll of test metadata keywords to exclude

The filter is applied to which vars will be run: https://github.com/cognitect-labs/test-runner/blob/334f2e2a5491747dff52f9ca8cbb4a53f54d344d/src/cognitect/test_runner.clj#L27-L32

I think a solution could be to similarly support filtering out specific metadata keywords before generating the final test-statements (after all the other logic for which bricks have changed, etc):

test-statements (mapv ->test-statement (concat brick-test-namespaces project-test-namespaces))

The other question would be where to configure the inclusion/exclusions. Perhaps a combo of having defaults configured in the workspace.edn and support for passing specific exclusion/inclusion keywords via poly test?

Describe alternatives you've considered

Right now, these kind of tests:

  • need to be commented out and run manually (e.g. via a REPL inside a rich-comment-form)
  • defined in a separate project that will need to be excluded by default in poly tooling
  • perhaps not defined as tests but separate main executables that are run from root (but then we're reinventing the test-runner framework for reporting, etc)

I would prefer if they would be first-class deftest vars that are tagged via metadata and a way of excluding/including the tags via the poly test CLI. Bonus points if we can have poly CLI report that X number of tests were skipped.

Additional context

Kaocha test-runner also has a similar feature via:

Kaocha supports both filtering via metadata on the test-var and on the namespace. I would not consider the latter strictly necessary, but it is interesting to consider.

Symbolic links to non-existing source code files throws an exception

Describe the bug
poly create c name:products fails if you have temporary files in you project structure

:cause /workspace/components/middleware/src/com/example/middleware/.#core.clj (No such file or directory)

To Reproduce
Steps to reproduce the behavior:

  1. create a file in an existing component with a .# in front of the name
  2. poly create c name:products
  3. See error

Expected behavior
A new component sholul be created, editor temporary files should not get in the way

Operating System (please complete the following information):

  • OS: Linux / Solus
  • Version: solus 4.1

Versions (please complete the following information):

  • Java: openjdk 11.0.10 2021-01-19
  • Poly: 0.2.12-alpha (2021-08-28)

Usage/clarification on extra-paths for issue-66

Hi,

I am trying out the issue-66 branch (each component has a deps.edn) and have some questions.

  1. In projects/foo/deps.edn, I get an error 107 if I do not specify all the components explicitly, even if they are all implicitly included via the base project it depends on. What is the purpose of this? Is it so the poly tool can more easily figure out the dependency table?
  2. In the root deps.edn, what is the purpose of specifying :extra-paths in the dev alias? The repl etc seem to work with just the :extra-deps so I am wondering if this is an artifact of the poly design prior to #66. That said, cursive seems to use the paths to mark “source directories”, but other IDEs don’t seem to do much with it.

Ultimately our goal is to remove boilerplate while still getting the benefits of the design and tooling, so am wondering if these parts can be omitted safely.

Thanks!

Per-project test run setup and teardown

Is your feature request related to a problem? Please describe.
At work, when we run our legacy test suite, we perform some overall setup and teardown around the actual test run that every test would need but would be time-consuming to setup and teardown around every single namespace (i.e., what would be the :once fixture from clojure.test). I think this is a fairly common need, and some test runners even provide these two additional hooks beyond what clojure.test itself provides.

Describe the solution you'd like
I'd like to be able to specify :test-setup and :test-teardown as optional keys in each project's configuration (that already includes :alias and :test) to provide fully-qualified symbol names, and then have poly test invoke these at the start of running tests for a project and at the end.

Describe alternatives you've considered
For Cognitect's test-runner in our legacy code setup, we have our own wrapper that we invoke, which in turn invokes test-runner, and that wrapper is where we perform setup and teardown. This isn't possible with poly testso an alternative would be for use to add a:oncefixture to _every single test namespace_ that used a fixture with some global state to track whether the per-suite setup has yet been performed -- but this wouldn't support teardown. We could add teardown to the JVM shutdown via a hook but that won't work when runningtestfrom thepoly shell`.

Additional context
Since poly runs tests in a classloader, the setup code would look something like this, added before the doseq over the test-statements (and similarly for :test-teardown after that doseq):

(when-let [fixture (:test-setup project-map)]
  (try
    (common/eval-in class-loader
      (str "((requiring-resolve '" fixture "))"))
    (catch Throwable t
      (println "Test setup failed:" t))))

(perhaps with better error handling/messaging!)

Shut down the Forum

The forum doesn't contain much of value and has been spammed for a while now. It's time to shut it down. We need to update:

  • Shut down the forum and announce it in Slack.
  • The link to the Java example that we have in the high-level doc (maybe also move the Java code somewhere).
  • Remove the link to it from the readme.md when generating a new workspace.
  • Remove all other links to it.

Support for custom commands

Is your feature request related to a problem? Please describe.
Add support for custom commands that could be executed by the poly tool.

Describe the solution you'd like
The code for the different custom commands could be added to the poly alias in the root deps.edn file. The commands could be specified in workspace.edn, e.g.:

{
  :commands {"ls" com.mycompany.customcode.ls-command}
...
}

The function will take the internal workspace structure as input, like this:

(defn ls-command [workspace]
  (let [args (-> workspace :user-input :args)
    (apply sh args)))

It would be good also if these commands could support autocomplete, see issue #106.

Additional context
With this in place combined with support for autocomplete, the existing AOT compiled poly command (or a native version of it, see issue #100) would be less attractive to use, because they would not support custom commands and even the native version would be outperformed in terms of startup time by the shell command (which executes instantly).

I think this is the way to go, because then we could use the infrastructure that tools.deps.alpha supports, where code can easily be added and executed as compiled code.

This would also allow people to contribute with new functionality to the poly tool, and it would be good if it could list the available custom commands out there and give som guidance in how to "install" them (how to add them to the :poly alias).

Polylith should not put data in the root of deps.edn

Polylith puts data under the :polylith key at the root of deps.edn. This is a bad idea as tools.deps/clj make no promises about how data at the root is merged/combined or whether it will be allowed at all in the future. That is, this usage may be disallowed and/or broken at any time in the future, without warning.

Two alternatives:

  1. Make your own edn configuration file independent from deps.edn.
  2. Store data under an alias. The deps.edn allows arbitrary data to be stored under the :aliases key. Alias data can be retrieved from the runtime basis. Currently, clj injects the basis file path via the clojure.basis system property (the basis is a superset of the merged deps.edn file - whether custom root keys are included in the basis is a matter of debate but may similar to above, be disallowed). In the future, we think it's likely to have an api for accessing alias data in Clojure core.

Show indirect changes for projects

When a project has changed (one or several files in its own project directory) a * will follow the project name when running the info command. If no project files have changed, no * is shown today, even if the project is indirectly changed by one or several of its (changed) bricks.

An improvement could be to show + if the project is indirectly change (but keep * if only the project itself has changed). This could be used to get a view of which projects to release, by sending in since:release (or some other :tag-patterns key).

Interfaces as unnecessary indirection and boilerplate

Is your feature request related to a problem? Please describe.
When writing a component, the docs recommend the creation of a core.clj and interface.clj. What value is this adding, and does that value exceed the cost of additional indirection and boilerplate? For example, if you place docstrings on your core functions (where it belongs), you have to duplicate it in your interface for it to be useful to other components. What purpose does this serve?

Describe the solution you'd like
I get that I can use core.clj without an interface file, but am I missing anything?

Thanks for Polylith, by the way! Loving it!

Poly command fails when source has non-seq import items

Describe the bug
Having an import that isn't in a seq causes polylith cli to throw an exception. If you wrap your import in a vector or list, poly works as expected. This is also true for requires.

To Reproduce
Steps to reproduce the behavior:

  1. Have a namespace with a bare import, like so
(ns example.ns
  (:import java.time.LocalDateTime))
  1. Run poly info
  2. See error Don't know how to create ISeq from: clojure.lang.Symbol

Expected behavior
To see the poly info output, and not an exception string.

Screenshots
N/A

Workspace Attachment
I'm pretty sure this isn't applicable, but let me know if you need it.

Operating System (please complete the following information):

  • OS: Arch Linux
  • Version: Latest

Versions (please complete the following information):

  • Java: 15.0.2
  • Poly: Latest release, as well as hash ec38a83db7597e6f6f33dfbc1e4da665807ab091

Additional context

Stacktrace:

java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol
 at clojure.lang.RT.seqFrom (RT.java:557)
    clojure.lang.RT.seq (RT.java:537)
    clojure.lang.RT.first (RT.java:693)
    clojure.core$first__5402.invokeStatic (core.clj:55)
    clojure.core/first (core.clj:55)
    polylith.clj.core.workspace_clj.namespaces_from_disk$import$fn__6076.invoke (namespaces_from_disk.clj:15)
    clojure.core$map$fn__5885.invoke (core.clj:2759)
    clojure.lang.LazySeq.sval (LazySeq.java:42)
    clojure.lang.LazySeq.seq (LazySeq.java:58)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.length (RT.java:1785)
    clojure.lang.RT.seqToArray (RT.java:1726)
    clojure.lang.LazySeq.toArray (LazySeq.java:132)
    clojure.lang.RT.toArray (RT.java:1699)
    clojure.core$to_array.invokeStatic (core.clj:346)
    clojure.core$sort.invokeStatic (core.clj:3101)
    clojure.core$sort.invokeStatic (core.clj:3090)
    clojure.core$sort.invoke (core.clj:3090)
    polylith.clj.core.workspace_clj.namespaces_from_disk$imports.invokeStatic (namespaces_from_disk.clj:18)
    polylith.clj.core.workspace_clj.namespaces_from_disk$imports.invoke (namespaces_from_disk.clj:17)
    polylith.clj.core.workspace_clj.namespaces_from_disk$__GT_namespace.invokeStatic (namespaces_from_disk.clj:34)
    polylith.clj.core.workspace_clj.namespaces_from_disk$__GT_namespace.invoke (namespaces_from_disk.clj:29)
    polylith.clj.core.workspace_clj.namespaces_from_disk$namespaces_from_disk$fn__6084.invoke (namespaces_from_disk.clj:37)
    clojure.core$mapv$fn__8470.invoke (core.clj:6917)
    clojure.lang.PersistentVector.reduce (PersistentVector.java:343)
    clojure.core$reduce.invokeStatic (core.clj:6832)
    clojure.core$mapv.invokeStatic (core.clj:6908)
    clojure.core$mapv.invoke (core.clj:6908)
    polylith.clj.core.workspace_clj.namespaces_from_disk$namespaces_from_disk.invokeStatic (namespaces_from_disk.clj:37)
    polylith.clj.core.workspace_clj.namespaces_from_disk$namespaces_from_disk.invoke (namespaces_from_disk.clj:36)
    polylith.clj.core.workspace_clj.components_from_disk$read_component.invokeStatic (components_from_disk.clj:14)
    polylith.clj.core.workspace_clj.components_from_disk$read_component.invoke (components_from_disk.clj:8)
    polylith.clj.core.workspace_clj.components_from_disk$read_components$fn__6199.invoke (components_from_disk.clj:26)
    clojure.core$map$fn__5885.invoke (core.clj:2759)
    clojure.lang.LazySeq.sval (LazySeq.java:42)
    clojure.lang.LazySeq.seq (LazySeq.java:51)
    clojure.lang.RT.seq (RT.java:535)
    clojure.core$seq__5420.invokeStatic (core.clj:139)
    clojure.core$sort.invokeStatic (core.clj:3101)
    clojure.core$sort_by.invokeStatic (core.clj:3107)
    clojure.core$sort_by.invokeStatic (core.clj:3107)
    clojure.core$sort_by.invoke (core.clj:3107)
    polylith.clj.core.workspace_clj.components_from_disk$read_components.invokeStatic (components_from_disk.clj:26)
    polylith.clj.core.workspace_clj.components_from_disk$read_components.invoke (components_from_disk.clj:25)
    polylith.clj.core.workspace_clj.core$workspace_from_disk.invokeStatic (core.clj:50)
    polylith.clj.core.workspace_clj.core$workspace_from_disk.invoke (core.clj:30)
    polylith.clj.core.workspace_clj.core$workspace_from_disk.invokeStatic (core.clj:38)
    polylith.clj.core.workspace_clj.core$workspace_from_disk.invoke (core.clj:30)
    polylith.clj.core.workspace_clj.interface$workspace_from_disk.invokeStatic (interface.clj:7)
    polylith.clj.core.workspace_clj.interface$workspace_from_disk.invoke (interface.clj:4)
    polylith.clj.core.command.core$read_workspace.invokeStatic (core.clj:56)
    polylith.clj.core.command.core$read_workspace.invoke (core.clj:50)
    polylith.clj.core.command.core$execute.invokeStatic (core.clj:66)
    polylith.clj.core.command.core$execute.invoke (core.clj:62)
    polylith.clj.core.command.interface$execute_command.invokeStatic (interface.clj:5)
    polylith.clj.core.command.interface$execute_command.invoke (interface.clj:4)
    polylith.clj.core.poly_cli.core$_main.invokeStatic (core.clj:30)
    polylith.clj.core.poly_cli.core$_main.doInvoke (core.clj:7)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.Var.applyTo (Var.java:705)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.main$main_opt.invokeStatic (main.clj:514)
    clojure.main$main_opt.invoke (main.clj:510)
    clojure.main$main.invokeStatic (main.clj:664)
    clojure.main$main.doInvoke (main.clj:616)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.Var.applyTo (Var.java:705)
    clojure.main.main (main.java:40)

Unknown library type: git

Describe the bug
When using a :git/url deps, a project cannot run through 'poly test'. Instead, we get the error message
Unknown library type: git

To Reproduce
Steps to reproduce the behavior:

  1. Add a :git/url dep to your project deps
  2. Navigate to the workspace root
  3. Run poly test
  4. See error

Expected behavior
I would expect that :git/url deps would be supported.

Operating System:

  • OS: MacOS
  • Version: 11.2.3

Versions (please complete the following information):

  • Java: openjdk version "15.0.1" 2020-10-20, OpenJDK Runtime Environment Zulu15.28+13-CA (build 15.0.1+8), OpenJDK 64-Bit Server VM Zulu15.28+13-CA (build 15.0.1+8, mixed mode, sharing)
  • Poly: 0.1.0-alpha9
  • Brew: Homebrew 3.1.9, Homebrew/homebrew-core (git revision 4c4107224c; last commit 2021-06-0, Homebrew/homebrew-cask (git revision da91e6ae90; last commit 2021-06-02)

Support for running tests for code imported as :local/root

Is your feature request related to a problem? Please describe.
When migrating a codebase to Polylith, it would be nice if the tests for old code, imported as :local/root, could also be included.

Describe the solution you'd like
Make it possible to specify which :local/root imports we should run tests for. This could be specified in workspace.edn and each import should be marked with a true/false flag saying wether the tests should be run or not. If a :local/root is not in the list, a warning should be displayed.

Additional context
There is a risk that a green test suit will mislead people to think that all tests in the codebase are green. The poly test runner only runs tests for bricks and projects today, not code imported as :local/root.

Change character used to represent src/resource/test/execute flags in info command

Is your feature request related to a problem? Please describe.
Remembering which column in the info command output represents the source/resource/test/execute-test is tricky, and it'd be nice if it was self-evident.

Describe the solution you'd like
In the output of the info command, make the following changes:

  • wherever we're showing that a src directory is included, use the s character instead of x; mnemonic src directory
  • wherever we're showing that a resource directory is included, use the r character instead of x; mnemonic resource directory
  • wherever we're showing that a test directory is included, use the t character instead of x; mnemonic test directory
  • wherever we're showing that the tests would be executed, continue using the x character; mnemonic execute, and it matches the existing unix file permission flag of x for executable

Describe alternatives you've considered
I'd initially tried to memorize the positions, but didn't come to much success. I also think being explicit about the type of thing we're showing is better ergonomics and removes any ambiguity for future users.

This also helps in the case that you call poly info :resources, since in the current system you have to remember that the second x is for tests without :resources passed in, and is for resources when you pass in :resources.

Additional context
I'm game to work on this in my free time if you can help point me in the right direction. I started looking into this today but got a bit lost among the project_table and text-table namespaces.

GraalVM native-image support for poly tool

Is your feature request related to a problem? Please describe.
Startup time is really important for developer CLI tools.

Describe the solution you'd like
Faster response on the CLI when running poly

Describe alternatives you've considered
One alternative would be to check if poly could run as a babashka script.

Additional context
I've tried to build a native-image and it seems to work. Would be great to get feedback from someone with more GraalVM experience as well as tested by people who use polylith everyday (I'm just starting my polylith journey).

❯ gu --version
GraalVM Updater 21.2.0

❯ java -version
openjdk version "11.0.12" 2021-07-20
OpenJDK Runtime Environment GraalVM CE 21.2.0 (build 11.0.12+6-jvmci-21.2-b08)
OpenJDK 64-Bit Server VM GraalVM CE 21.2.0 (build 11.0.12+6-jvmci-21.2-b08, mixed mode, sharing)

❯ native-image --report-unsupported-elements-at-runtime \
  --initialize-at-build-time \
  --no-server \
  --no-fallback \
  -H:+ReportExceptionStackTraces \
  -H:EnableURLProtocols=http,https \
  --enable-all-security-services \
  --allow-incomplete-classpath \
  -jar ./poly.jar -H:Name=poly-native

Results look promising running on Polylith repo (version 0.2.0-alpha10 (2021-08-02)):

❯ time poly info
poly info  10.79s user 0.62s system 265% cpu 4.295 total

❯ time ./poly-native info
./poly-native info  0.60s user 0.21s system 98% cpu 0.824 total

Profiles should support :extra-deps / :local/root for components

Describe the bug
If you have multi-implementation components and set up :+default like :dev with :extra-deps and :local/root for the components/<whatever> the poly tool will complain with error 107. You are forced to add :extra-paths for the src (and resources).

Expected behavior
You should be able to specify component dependencies in profiles with :local/root :extra-deps just like you can in projects (including :dev).

Running tests in parallel

Is your feature request related to a problem? Please describe.

I'd like to parallelize the execution of most of my tests in order to speed up their execution.

To be more specific I've a series of tests that heavily bottleneck on IO not only during execution but also in their fixtures. While an asynchronous IO runtime on the Java-side would be best I don't think that's going to be viable for a few years at least, so having multiple threads to nanny the syscalls is the next best thing and the only alternative to projects who are actually bottlenecking on CPU instead.

Describe the solution you'd like

To be able to set metadata to specific deftests as well as ns declarations (which should be equivalent to marking all of its deftests as parallel), to indicate that these tests can become part of a grand pool of tests that can be executed in parallel by a group of workers before the synchronized tests run.

Nice to haves:

  • Being able to specify a custom worker cap as a system property, with a sensible default like the system's virtual core count.
  • Buffered output when running Poly CLI for extra clarity, meaning results would only be printed once all tests for a given namespace are done in case they're all parallel, or waiting until the beginning of the namespace's synchronous execution phase to print the results of its parallel tests right before executing the synchronous ones. Failures could be shown when they occur and releasing the buffer for its namespace then and there, stopping execution just like poly test currently does for synchronous tests.

Describe alternatives you've considered

  • Plug-in API for custom test runners. -- Feels overkill, and likely to introduce more complexity than having a single test runner with even the superset of all popular test runner features.
  • Testing-specific CLI alternative to poly. -- It would likely lag behind Polylith if maintained out of tree and cause a lot more of maintenance effort.

Test Suite Cannot Resolve Multiply-Required Transitive Dependency

Describe the bug

poly test cannot run if two components have transitive dependecies on the same Github-hosted library.

To Reproduce
Steps to reproduce the behavior:

  1. Clone a repo I made to exhibit this behavior.
  2. Run poly test
  3. See error:
    Couldn't resolve libraries for the deploy project: clojure.lang.ExceptionInfo: Unable to compare versions for repro-lib/root: {:local/root "/Users/<etc.>

Expected behavior
The test suite should run without issue - in fact, it does run without issue in Kaocha, through the script kaocha.sh.

Operating System (please complete the following information):

  • OS: MacOS
  • Version: 11.4 (20F71)

Versions (please complete the following information):

  • Java:
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)
  • Poly: 0.2.0-alpha11
  • Brew:
Homebrew 3.2.6
Homebrew/homebrew-core (git revision fb7013ba7a; last commit 2021-08-11)
Homebrew/homebrew-cask (git revision d863760d7b; last commit 2021-08-10)

Additional context

To be clear:

  • The repo I linked to has two components, left and right
  • Those components depend on two different libraries hosted in another repo I made
  • Those two libraries each depend on a third library, hosted in the same repo
  • I added that shared library to :exclusions in all the deps.edn files.

Allow entities to be symbols in "clojure -T" commands

Is your feature request related to a problem? Please describe.
Today we have to give entity values as strings, e.g.:
clojure -Tpoly create entity '"workspace"' name next-gen top-ns com.my-company

Describe the solution you'd like
It would be good if the tool allowed us to pass them in as symbols:
clojure -Tpoly create entity workspace name next-gen top-ns com.my-company

See thread in Slack.

When this is released, make sure to update the Clojure CLI Tool section in the documentation.

Use :deps and :paths in development when running tests

Is your feature request related to a problem? Please describe.
Today we only include dependencies from the :dev and :test aliases when running the tests, but not :paths and :deps (the root keys).

Describe the solution you'd like
Also include dependencies specified in :paths and :deps for the development project (./deps.edn) when running tests.

poly flags :dev alias if it has no :extra-paths in it

Describe the bug
If you're only using :extra-deps in :dev with :local/root dependencies on bricks, poly complains:

Error in ./deps.edn: {:aliases {:dev {:extra-paths ["missing required key"]}}}

You can add :extra-paths [] to satisfy it. That feels like legacy behavior?

Parameterized layout names

Hi,

I have a suggestion that would help me adopt and enjoy Polylith more fully.

Context

Polylith has specific names for components, bases, bricks, interfaces, projects, workspaces, etc. Naming is hard, and also subjective.

For people coming from different backgrounds, a slightly different set of names can help see things more clearly, making adoption + daily work more comfortable.

As a personal example, prior to Polylith I had used 3 other similar solutions in Clojure (be them bespoke or using a certain framework). The point being, one can get pretty used to a specific set of names/concepts, and letting go of them can feel wasteful.

I also try to avoid using identical names for different, yet vaguely similar ideas. I'm talking about Stuart Sierra components vs. Polylith components. I'm not sure I see myself having to clarify Sierra component or Polylith component on a daily basis, seems awkward.

Finally, I think that this would easy migration for projects using similar tech. For example if one such project used the word api instead of interface for N years, then it'd be painful to make all prior documentation, commits, chat logs, etc suddenly invalid.

Proposal

Parameterize the names that the poly tool accepts and handles. Other concerns such as the layout itself wouldn't be affected.

This would mean essentially un-hardcoding strings, and moving them to a centralized, customizable definition:

(def component-name
  "The name for 'components' that a given workspace has chosen to use, in singular."
  (System/getProperty "polylith.component-name"
                      ;; the default:
                      "component"))

(def components-name
  "The name for 'components' that a given workspace has chosen to use, in plural."
  (System/getProperty "polylith.components-name"
                      (str component-name "s")))

This seems a fairly cheap and non-breaking thing to do. I could do the work (one name at a time, for getting good at it).

Let me know what you think.

Cheers - V

Update or remove commands doc in repo

Is your feature request related to a problem? Please describe.

This is related to a potential documentation issue.

Describe the solution you'd like

Update the command documentation to replace the mentioned usage of ns-to-lib with a description of how lib usage is calculated now.

This error description is the content I'm talking about (see here):

Error 109 - Missing libraries in project.
Triggered if a project doesn't contain a library that is used by one
of its bricks. Library usage for a brick is calculated using :ns-to-lib in
'./deps.edn' for all its namespaces.

Isn't that the old way of calculating lib usage?

Failing test exits the shell/prompt

Describe the bug
When running the test command within a shell/prompt, and a test fails, then it exits back to the "parent" shell.

To Reproduce
poly prompt
test

Expected behavior
A failing test should not exit the shell/prompt.

Several clojure -T:build uberjar commands incorrectly contain -A:deps

Describe the bug

example/doc-example/build.clj has:

(ns build
  "The build script for the example of the poly documentation.

   Targets:
   * uberjar :project PROJECT
     - creates an uberjar for the given project

   For help, run:
     clojure -A:deps -T:build help/doc

   Create uberjar for command-line:
     clojure -A:deps -T:build uberjar :project command-line"

Although -A:deps is fairly harmless here, it is not required and should be removed. There are five occurrences of -A:deps with uberjar in three files.

Note that -A:deps is required for the help/doc command:

clojure -A:deps -T:build help/doc

But that is the only place it is needed.

I have not checked the GitBook to see if it occurs elsewhere in that source (I don't know the URL to look at the source for that).

Suggestion: create component test ns without require

Is your feature request related to a problem? Please describe.
When creating a component, a test namespace is also added. That is nice, but it causes warnings when linting code.

Describe the solution you'd like
I suggest that it is added without the require statement, or maybe with a boilerplate unit test.

This is because when using tools like clj-kondo you will get lint warnings for unused requires.
I think it is this row that does it: https://github.com/polyfy/polylith/blob/master/components/creator/src/polylith/clj/core/creator/brick.clj#L32

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.