Skip to content

Commit

Permalink
Use interface name as component namespace (#12)
Browse files Browse the repository at this point in the history
  • Loading branch information
tengstrand authored Oct 27, 2018
1 parent b821c6e commit 785c2ab
Show file tree
Hide file tree
Showing 18 changed files with 193 additions and 225 deletions.
38 changes: 18 additions & 20 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ example
cmd-line # link to bases/cmd-line/src/se/example/cmd-line
```

If we have a look at some of the generated files, we first find *systems/cmd-line/src/se/example/cmd_line/core.clj*:
If we have a look at some of the generated files, we first find *bases/cmd-line/src/se/example/cmd_line/core.clj*:
```clojure
(ns se.example.cmd-line.core
(:gen-class))
Expand All @@ -332,7 +332,7 @@ If we have a look at some of the generated files, we first find *systems/cmd-lin
(println "Hello world!"))
```

...with its corresponding test *systems/cmd-line/test/se/example/cmd_line/core_test.clj*:
...with its corresponding test *bases/cmd-line/test/se/example/cmd_line/core_test.clj*:
```clojure
(ns se.example.cmd-line.core-test
(:require [clojure.test :refer :all]
Expand Down Expand Up @@ -372,8 +372,8 @@ Changed bases: cmd-line
Changed systems: cmd-line
Compiling workspace interfaces
Created /Users/joakimtengstrand/Dropbox/Polylith/doc-script/example/interfaces/target/interfaces-1.0.jar
Wrote /Users/joakimtengstrand/Dropbox/Polylith/doc-script/example/interfaces/pom.xml
Created /Users/joakimtengstrand/IdeaProjects/example/interfaces/target/interfaces-1.0.jar
Wrote /Users/joakimtengstrand/IdeaProjects/example/interfaces/pom.xml
Installed jar and pom into local repo.
Compiling bases/cmd-line
Expand All @@ -389,8 +389,8 @@ Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
Building systems/cmd-line
Created /Users/joakimtengstrand/Dropbox/Polylith/doc-script/example/systems/cmd-line/target/cmd-line-0.1.jar
Created /Users/joakimtengstrand/Dropbox/Polylith/doc-script/example/systems/cmd-line/target/cmd-line-0.1-standalone.jar
Created /Users/joakimtengstrand/IdeaProjects/example/systems/cmd-line/target/cmd-line-0.1.jar
Created /Users/joakimtengstrand/IdeaProjects/example/systems/cmd-line/target/cmd-line-0.1-standalone.jar
set :last-success in .polylith/time.edn
Expand Down Expand Up @@ -673,17 +673,17 @@ Now we have a *cmd-line* base and a *user* component:
$ lein polylith info
interfaces:
user *
user
components:
user *
user
bases:
cmd-line
systems:
cmd-line
cmd-line -> base
environments:
development
user * -> component
user -> component
cmd-line -> base
```

Expand Down Expand Up @@ -1232,26 +1232,24 @@ Finally you push your changes (5) and then the same plugin code will be executed
To understand how the plugin figures out what components and bases that have changed we can start by looking at the [diff](#diff) command:
```
$ lein polylith diff
interfaces/src/se/example/address/interface.clj
interfaces/src/se/example/address/interface.clj
systems/cmd-line/src/se/example/user/core.clj
systems/cmd-line/project.clj
components/address/src/se/example/address/interface.clj
components/address/src/se/example/address/core.clj
components/address/readme.md
components/address/test/se/example/address/core_test.clj
components/address/project.clj
components/user/src/se/example/user/core.clj
components/user/project.clj
bases/cmd-line/project.clj
environments/development/src/se/example/address/interface.clj
environments/development/src/se/example/address/core.clj
environments/development/src/se/example/user/core.clj
environments/development/interfaces/se/example/address/interface.clj
environments/development/development.iml
environments/development/docs/address-readme.md
environments/development/project-files/systems/cmd-line-project.clj
environments/development/project-files/components/address-project.clj
environments/development/project-files/components/user-project.clj
environments/development/project-files/bases/cmd-line-project.clj
environments/development/test/se/example/address/core_test.clj
environments/development/project.clj
```
Expand Down Expand Up @@ -1340,17 +1338,17 @@ components:
address-fake * > address
user *
bases:
cmd-line *
cmd-line (*)
systems:
cmd-line *
address * -> component
user * -> component
cmd-line * -> base
address * -> component
user * -> component
cmd-line (*) -> base
environments:
development
address * -> component
user * -> component
cmd-line * -> base
address * -> component
user * -> component
cmd-line (*) -> base
```

Now create the *cmd-line-test* system using the *cmd-line* base and then add *user* and *address-fake* to it:
Expand Down
22 changes: 9 additions & 13 deletions src/leiningen/polylith/cmd/add.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@
[leiningen.polylith.utils :as utils]))

(defn system-components [ws-path top-dir system]
(let [dir (shared/full-name top-dir "/" "")
components (shared/all-components ws-path)
(let [dir (shared/full-name top-dir "/" "")
components (shared/all-components ws-path)
directories (file/directories (str ws-path "/systems/" system "/src/" dir))]
(filterv #(contains? components %) (map shared/path->file directories))))
(filterv #(contains? components %) (map #(shared/link->entity ws-path %) directories))))

(defn used-interface [ws-path top-dir system component]
(let [interface (shared/interface-of ws-path top-dir component)
components (system-components ws-path top-dir system)
(let [interface (shared/interface-of ws-path top-dir component)
components (system-components ws-path top-dir system)
component-interfaces (map #(vector (shared/interface-of ws-path top-dir %) %) components)]
(first (filter #(= interface (first %)) component-interfaces))))

(defn validate [ws-path top-dir system component]
(let [components (shared/all-components ws-path)
systems (shared/all-systems ws-path)
systems (shared/all-systems ws-path)
[interface comp] (used-interface ws-path top-dir system component)]
(cond
(utils/is-empty-str? component) [false "Missing component name."]
Expand All @@ -28,18 +28,14 @@
:else [true])))

(defn add-component-to-system [ws-path top-dir component system]
(let [component-dir (shared/full-dir-name top-dir component)
system-dir (shared/full-dir-name top-dir system)
(let [system-dir (shared/full-dir-name top-dir system)
relative-parent-path (shared/relative-parent-path system-dir)
relative-component-path (str relative-parent-path "components/" component)
system-path (str ws-path "/systems/" system)
interface (shared/interface-of ws-path top-dir component)
interface-dir (shared/full-dir-name top-dir interface)]
(when (not= interface component)
(file/create-symlink (str system-path "/src/" interface-dir)
(str relative-component-path "/src/" interface-dir)))
(file/create-symlink (str system-path "/src/" component-dir)
(str relative-component-path "/src/" component-dir))
(file/create-symlink (str system-path "/src/" interface-dir)
(str relative-component-path "/src/" interface-dir))
(file/create-symlink (str system-path "/resources/" component)
(str "../../../components/" component "/resources/" component))))

Expand Down
41 changes: 20 additions & 21 deletions src/leiningen/polylith/cmd/create/component.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,32 @@
(:require [clojure.string :as str]
[leiningen.polylith.cmd.create.interface :as create-ifc]
[leiningen.polylith.cmd.shared :as shared]
[leiningen.polylith.file :as file]))
[leiningen.polylith.file :as file]
[clojure.set :as set]))

(defn create-dev-links? [ws-path top-dir dev-dir interface]
(let [dir (str ws-path "/environments/" dev-dir "/src/" top-dir)
(let [dir (str ws-path "/environments/" dev-dir "/src/" top-dir)
entities (set (file/directory-names dir))]
(not (contains? entities interface))))

(defn used-by-component [ws-path top-dir dev-dir interface]
(let [dir (str ws-path "/environments/" dev-dir "/src/" top-dir)
entities (set (file/directory-names dir))
component (first (filter #(= interface (shared/interface-of ws-path top-dir %)) entities))]
component))
(let [dir (str ws-path "/environments/" dev-dir "/src/" top-dir)
paths (file/directories dir)
entities (set (map #(shared/link->entity ws-path %) paths))
components (set/intersection entities (shared/all-components ws-path))]
(first (filter #(= interface (shared/interface-of ws-path top-dir %)) components))))

(defn create-dev-links! [ws-path dev-dir component interface-dir component-dir]
(let [root (str ws-path "/environments/" dev-dir)
relative-parent-path (shared/relative-parent-path component-dir)
path (str "../../../components/" component)
(let [root (str ws-path "/environments/" dev-dir)
relative-parent-path (shared/relative-parent-path component-dir)
path (str "../../../components/" component)
relative-component-path (str relative-parent-path "components/" component)]
(file/create-symlink (str root "/docs/" component "-readme.md")
(str path "/readme.md"))
(file/create-symlink (str root "/project-files/components/" component "-project.clj")
(str "../" path "/project.clj"))
(file/create-symlink (str root "/src/" component-dir)
(str relative-component-path "/src/" component-dir))
(file/create-symlink (str root "/test/" component-dir)
(str relative-component-path "/test/" component-dir))
(file/create-symlink (str root "/test/" interface-dir)
(str relative-component-path "/test/" interface-dir))
(file/create-symlink (str root "/src/" interface-dir)
(str relative-component-path "/src/" interface-dir))
(file/create-symlink (str root "/resources/" component)
Expand All @@ -39,24 +39,23 @@
component-dir (shared/full-dir-name top-dir component)
comp-root-dir (str ws-path "/components/" component)
interface-ns-name (shared/full-name top-ns "." interface)
component-ns-name (shared/full-name top-ns "." component)
project-ns (shared/full-name top-ns "/" component)
interfaces-dependencies (shared/full-name top-ns "/" "interfaces")
delegate-content [(str "(ns " interface-ns-name ".interface")
(str " (:require [" component-ns-name ".core :as core]))")
(str " (:require [" interface-ns-name ".core :as core]))")
""
";; delegate to the implementations..."
"(defn add-two [x]"
" (core/add-two x))"]
core-content [(str "(ns " component-ns-name ".core)")
core-content [(str "(ns " interface-ns-name ".core)")
""
";; add your functions here..."
"(defn add-two [x]"
" (+ 2 x))"]
doc-content [(str "# " component " component")
""
"add documentation here..."]
test-content [(str "(ns " component-ns-name ".core-test")
test-content [(str "(ns " interface-ns-name ".core-test")
(str " (:require [clojure.test :refer :all]")
(str " [" interface-ns-name ".interface :as " component "]))")
""
Expand All @@ -75,13 +74,13 @@
(file/create-file (str comp-root-dir "/resources/.keep") [""])
(file/create-dir (str comp-root-dir "/resources/" component))
(file/create-file (str comp-root-dir "/resources/" component "/.keep") [""])
(shared/create-src-dirs! ws-path (str "components/" component "/src") [interface-dir component-dir])
(shared/create-src-dirs! ws-path (str "components/" component "/test") [component-dir])
(shared/create-src-dirs! ws-path (str "components/" component "/src") [interface-dir])
(shared/create-src-dirs! ws-path (str "components/" component "/test") [interface-dir])
(file/create-file (str comp-root-dir "/project.clj") project-content)
(file/create-file (str comp-root-dir "/readme.md") doc-content)
(file/create-file (str comp-root-dir "/src/" interface-dir "/interface.clj") delegate-content)
(file/create-file (str comp-root-dir "/src/" component-dir "/core.clj") core-content)
(file/create-file (str comp-root-dir "/test/" component-dir "/core_test.clj") test-content)
(file/create-file (str comp-root-dir "/src/" interface-dir "/core.clj") core-content)
(file/create-file (str comp-root-dir "/test/" interface-dir "/core_test.clj") test-content)

(when-not (file/file-exists (str ws-path "/interfaces/src/" interface-dir))
(create-ifc/create-interface ws-path top-dir top-ns interface))
Expand Down
14 changes: 7 additions & 7 deletions src/leiningen/polylith/cmd/delete/component.clj
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
(defn delete-env-interface [ws-path top-dir env interface]
(file/delete-dir (str ws-path "/environments/" env "/src/" (shared/full-dir-name top-dir interface))))

(defn delete-env-component [ws-path top-dir env component]
(defn delete-env-component [ws-path top-dir env component interface]
(let [root-dir (str ws-path "/environments/" env)]
(file/delete-file! (str root-dir "/src/" (shared/full-dir-name top-dir component)))
(file/delete-file! (str root-dir "/test/" (shared/full-dir-name top-dir component)))
(file/delete-file! (str root-dir "/src/" (shared/full-dir-name top-dir interface)))
(file/delete-file! (str root-dir "/test/" (shared/full-dir-name top-dir interface)))
(file/delete-file! (str root-dir "/docs/" component "-readme.md"))
(file/delete-file! (str root-dir "/project-files/components/" component "-project.clj"))
(file/delete-file! (str root-dir "/resources/" component))))

(defn delete-system-component [ws-path top-dir system component]
(file/delete-file! (str ws-path "/systems/" system "/src/" (shared/full-dir-name top-dir component)))
(defn delete-system-component [ws-path top-dir system component interface]
(file/delete-file! (str ws-path "/systems/" system "/src/" (shared/full-dir-name top-dir interface)))
(file/delete-file! (str ws-path "/systems/" system "/resources/" component)))

(defn delete [ws-path top-dir component]
Expand All @@ -27,8 +27,8 @@
(file/delete-dir (str ws-path "/interfaces/src/" (shared/full-dir-name top-dir interface))))
(file/delete-dir (str ws-path "/components/" component))
(doseq [system systems]
(delete-system-component ws-path top-dir system component))
(delete-system-component ws-path top-dir system component interface))
(doseq [env environments]
(delete-env-component ws-path top-dir env component)
(delete-env-component ws-path top-dir env component interface)
(when (not= component interface)
(delete-env-interface ws-path top-dir env interface)))))
13 changes: 5 additions & 8 deletions src/leiningen/polylith/cmd/deps.clj
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@
(let [content (file/read-file (str file))]
(imported-interfaces content interface-ns->interface)))

(defn ifc-deps [ws-path top-dir entity-type entity entity-dir interface-ns->interface]
(let [dir (str ws-path "/" entity-type "/" entity "/src/" (shared/full-dir-name top-dir entity-dir))
(defn ifc-deps [ws-path top-dir entity-type entity interface-ns->interface]
(let [dir (str ws-path "/" entity-type "/" entity "/src/" top-dir)
files (filterv #(str/ends-with? % ".clj") (file/files dir))]
(vec (mapcat #(imported-comp-deps % interface-ns->interface) files))))

Expand All @@ -140,12 +140,9 @@
(let [dir (if (= "" top-dir) "" (str "/" top-dir))
interfaces-dir (str ws-path "/interfaces/src" dir)
interface-ns->interface (interface-ns->interface-map interfaces-dir)
ifc-component-deps (mapv (fn [[component interface]] (vector component
(ifc-deps ws-path top-dir "components" component interface interface-ns->interface)))
(unique-interfaces ws-path top-dir used-components))
comp-ifc-deps (mapv #(vector % (ifc-deps ws-path top-dir "components" % % interface-ns->interface)) used-components)
base-ifc-deps (mapv #(vector % (ifc-deps ws-path top-dir "bases" % % interface-ns->interface)) used-bases)]
(reduce ->deps (sorted-map) (concat ifc-component-deps comp-ifc-deps base-ifc-deps))))
comp-ifc-deps (mapv #(vector % (ifc-deps ws-path top-dir "components" % interface-ns->interface)) used-components)
base-ifc-deps (mapv #(vector % (ifc-deps ws-path top-dir "bases" % interface-ns->interface)) used-bases)]
(reduce ->deps (sorted-map) (concat comp-ifc-deps base-ifc-deps))))

(defn component-dependencies
([ws-path top-dir]
Expand Down
Loading

0 comments on commit 785c2ab

Please sign in to comment.