parses a project codebases and generates a swagger/OpenAPI schema
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

87 líneas
2.2KB

  1. (ns scan.lang.php.laravel5
  2. (:require [clojure.string :as str]
  3. [clojure.java.io :as io]))
  4. (def
  5. ^{}
  6. omit-comments
  7. (fn [source]
  8. (str/replace source #"\/\*.+\*\/" "")))
  9. (def
  10. ^{}
  11. load-method-signature!
  12. (fn [route]
  13. (cond (.exists (io/file (:ctl route)))
  14. (let [src (slurp (:ctl route))]
  15. (->>
  16. (-> (re-pattern (str "function " (:act route) "\\((.*)\\)"))
  17. (re-find src)
  18. last
  19. (or "")
  20. (str/split #","))
  21. (map str/trim)
  22. (filter (fn [e] (not (str/includes? e "Request"))))
  23. (into [])))
  24. :else nil)))
  25. (def
  26. ^{}
  27. to-openapi
  28. (fn [routes]
  29. (reduce
  30. (fn [acc el]
  31. (assoc-in
  32. acc
  33. [(:path el)
  34. (:verb el)]
  35. {:description (:act el)
  36. :parameters
  37. (into
  38. []
  39. (map
  40. (fn [e]
  41. (if (< 0 (count e))
  42. (let [[type name] (str/split e #" ")]
  43. {:name (re-find #"\w" name)
  44. :in "query"
  45. :required true ;; depends on param optionality
  46. :schema
  47. {:type type}})
  48. []))
  49. (:signature el)))}))
  50. {}
  51. routes)))
  52. (def
  53. ^{}
  54. routes
  55. (fn [project-path]
  56. (to-openapi
  57. (map (fn [route]
  58. (assoc route
  59. :signature
  60. (load-method-signature! route)))
  61. (let [route-file (str project-path "/routes/web.php")]
  62. (filter
  63. (fn [e]
  64. (not (nil? e)))
  65. (map
  66. (fn [hit]
  67. (let [[_ verb raw-params] hit
  68. params (map (fn [e] (str/trim (str/escape e {\' ""}))) (str/split raw-params #","))
  69. [route ctl] params]
  70. (if ctl
  71. {:verb verb
  72. :path route
  73. :ctl (str project-path "/app/Http/Controllers/" (str/replace (str/replace ctl #"\@(.*)" ".php") "\\" "/"))
  74. :act (str/replace ctl #"(.*)\@" "")}
  75. nil)))
  76. (re-seq
  77. #"router->(.*)\((.*)\)"
  78. (omit-comments (slurp route-file))))))))))
  79. (comment
  80. )