Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@ioRekz
Forked from conan/url-spec.clj
Created January 15, 2018 20:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ioRekz/434f7b51ae70d23241d6f406de4fb2ac to your computer and use it in GitHub Desktop.
Save ioRekz/434f7b51ae70d23241d6f406de4fb2ac to your computer and use it in GitHub Desktop.
(require
'[cemerick.url :as url]
'[clojure.spec.alpha :as s]
'[clojure.spec.gen.alpha :as sgen])
(defn non-empty-string-alphanumeric
[]
(sgen/such-that #(not= "" %)
(sgen/string-alphanumeric)))
(defn url-gen
"Generator for generating URLs; note that it may generate
http URLs on port 443 and https URLs on port 80, and only
uses alphanumerics"
[]
(sgen/fmap
(partial apply (comp str url/->URL))
(sgen/tuple
;; protocol
(sgen/elements #{"http" "https"})
;; username
(sgen/string-alphanumeric)
;; password
(sgen/string-alphanumeric)
;; host
(sgen/string-alphanumeric)
;; port
(sgen/choose 1 65535)
;; path
(sgen/fmap #(->> %
(interleave (repeat "/"))
(apply str))
(sgen/not-empty
(sgen/vector
(non-empty-string-alphanumeric))))
;; query
(sgen/map
(non-empty-string-alphanumeric)
(non-empty-string-alphanumeric)
{:max-elements 2})
;; anchor
(sgen/string-alphanumeric))))
(s/def ::url (s/with-gen
(s/and string?
#(try
(url/url %)
(catch Throwable t false)))
url-gen))
(sgen/generate (url-gen))
(s/valid? ::url "http://conan.is")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment