5050 files (get-clj-files src-dir)
5151 ns-deps (keep extract-namespace-and-deps files)
5252 violations (atom [])]
53-
53+
5454 (doseq [[ns-name deps] ns-deps]
5555 (let [src-layer (ns-to-layer ns-name)]
5656 (when src-layer
5959 (when (and dep-layer
6060 (not (contains? (get allowed-deps src-layer) dep-layer))
6161 (not= src-layer dep-layer))
62- (swap! violations conj
62+ (swap! violations conj
6363 {:source ns-name
6464 :source-layer src-layer
6565 :dependency dep
6666 :dependency-layer dep-layer})))))))
67-
67+
6868 {:valid? (empty? @violations)
6969 :violations @violations}))
7070
7575 files (get-clj-files src-dir)
7676 ns-deps (keep extract-namespace-and-deps files)
7777 violations (atom [])]
78-
78+
7979 (doseq [[ns-name deps] ns-deps]
8080 (doseq [dep deps]
8181 (let [dep-str (str dep)]
8282 (when-not (or (str/starts-with? dep-str " clojure." )
8383 (str/starts-with? dep-str " walue.domain" ))
84- (swap! violations conj
84+ (swap! violations conj
8585 {:namespace ns-name
8686 :external-dependency dep})))))
87-
87+
8888 {:valid? (empty? @violations)
8989 :violations @violations}))
9090
9797 visited (atom #{})
9898 path (atom [])
9999 cycles (atom [])]
100-
100+
101101 (letfn [(dfs [ns ]
102102 (when-not (contains? @visited ns )
103103 (swap! visited conj ns )
104104 (swap! path conj ns )
105-
105+
106106 (doseq [dep (get ns-deps ns )]
107107 (if (some #{dep} @path)
108108 ; ; Encontrou um ciclo
111111 (swap! cycles conj cycle))
112112 ; ; Continue DFS
113113 (dfs dep)))
114-
114+
115115 (swap! path pop)))]
116-
116+
117117 (doseq [ns (keys ns-deps)]
118118 (reset! path [])
119119 (dfs ns )))
120-
120+
121121 {:valid? (empty? @cycles)
122122 :cycles @cycles}))
123123
127127 (let [src-dir " src/walue/port"
128128 files (get-clj-files src-dir)
129129 violations (atom [])]
130-
130+
131131 (doseq [file files]
132132 (let [content (slurp file)
133133 file-name (.getName file)]
134134 (when-not (re-find #"defprotocol" content)
135- (swap! violations conj
135+ (swap! violations conj
136136 {:file file-name
137137 :reason " Port file should define at least one protocol" }))))
138-
138+
139139 {:valid? (empty? @violations)
140140 :violations @violations}))
141141
145145 (let [src-dir " src/walue/adapter"
146146 files (get-clj-files src-dir)
147147 violations (atom [])]
148-
148+
149149 (doseq [file files]
150150 (let [content (slurp file)
151151 file-name (.getName file)
152- has-port-dependency (or
152+ has-port-dependency (or
153153 (re-find #"require.*\[ walue\. port" content)
154154 (re-find #"walue\. port\. [a-z-]+\s +:as" content))]
155155 (when-not has-port-dependency
156- (swap! violations conj
156+ (swap! violations conj
157157 {:file file-name
158158 :reason " Adapter should depend on at least one port" }))))
159-
159+
160160 {:valid? (empty? @violations)
161161 :violations @violations}))
162162
173173 (:valid? circular-deps-result)
174174 (:valid? interface-result)
175175 (:valid? adapter-result))]
176-
176+
177177 {:all-valid? all-valid?
178178 :layer-dependencies layer-deps-result
179179 :domain-purity domain-purity-result
186186 [& args]
187187 (let [results (run-fitness-checks )
188188 all-valid? (:all-valid? results)]
189-
189+
190190 (println " \n === Architectural Fitness Check Results ===\n " )
191-
191+
192192 ; ; Verifica dependências entre camadas
193193 (let [{:keys [valid? violations]} (:layer-dependencies results)]
194194 (println " Layer Dependencies Check:" (if valid? " PASSED ✓" " FAILED ✗" ))
197197 (doseq [v violations]
198198 (println (str " - " (:source v) " (" (name (:source-layer v)) " ) depends on "
199199 (:dependency v) " (" (name (:dependency-layer v)) " )" )))))
200-
200+
201201 ; ; Verifica pureza do domínio
202202 (let [{:keys [valid? violations]} (:domain-purity results)]
203203 (println " \n Domain Purity Check:" (if valid? " PASSED ✓" " FAILED ✗" ))
204204 (when-not valid?
205205 (println " Violations:" )
206206 (doseq [v violations]
207207 (println (str " - " (:namespace v) " depends on external " (:external-dependency v))))))
208-
208+
209209 ; ; Verifica dependências circulares
210210 (let [{:keys [valid? cycles]} (:circular-dependencies results)]
211211 (println " \n Circular Dependencies Check:" (if valid? " PASSED ✓" " FAILED ✗" ))
212212 (when-not valid?
213213 (println " Cycles detected:" )
214214 (doseq [cycle cycles]
215215 (println (str " - " (str/join " -> " cycle))))))
216-
216+
217217 ; ; Verifica isolamento de interfaces
218218 (let [{:keys [valid? violations]} (:interface-isolation results)]
219219 (println " \n Interface Isolation Check:" (if valid? " PASSED ✓" " FAILED ✗" ))
220220 (when-not valid?
221221 (println " Violations:" )
222222 (doseq [v violations]
223223 (println (str " - " (:file v) " : " (:reason v))))))
224-
224+
225225 ; ; Verifica implementação de adaptadores
226226 (let [{:keys [valid? violations]} (:adapter-implementation results)]
227227 (println " \n Adapter Implementation Check:" (if valid? " PASSED ✓" " FAILED ✗" ))
228228 (when-not valid?
229229 (println " Violations:" )
230230 (doseq [v violations]
231231 (println (str " - " (:file v) " : " (:reason v))))))
232-
232+
233233 (println " \n Overall Result:" (if all-valid? " PASSED ✓" " FAILED ✗" ))
234-
234+
235235 (System/exit (if all-valid? 0 1 ))))
0 commit comments