title: How to create spec from data
body: <p>I am trying to create spec just from data. I have very complex data structure - all nested map.</p>
  
  <pre><code>{:contexts
   ({:importer.datamodel/global-id "01b4e69f86e5dd1d816e91da27edc08e",
     :importer.datamodel/type "province",
     :name "a1",
     :importer.datamodel/part-of "8cda1baed04b668a167d4ca28e3cef36"}
    {:importer.datamodel/global-id "8cda1baed04b668a167d4ca28e3cef36",
     :importer.datamodel/type "country",
     :name "AAA"}
    {:importer.datamodel/global-id "c78e5478e19f2d7c1b02088e53e8d8a4",
     :importer.datamodel/type "location",
     :importer.datamodel/center ["36." "2."],
     :importer.datamodel/part-of "01b4e69f86e5dd1d816e91da27edc08e"}
    {:importer.datamodel/global-id "88844f94f79c75acfcb957bb41386149",
     :importer.datamodel/type "organisation",
     :name "C"}
    {:importer.datamodel/global-id "102e96468e5d13058ab85c734aa4a949",
     :importer.datamodel/type "organisation",
     :name "A"}),
   :datasources
   ({:importer.datamodel/global-id "Source;ACLED",
     :name "ACLED",
     :url "https://www.acleddata.com"}),
   :iois
   ({:importer.datamodel/global-id "item-set;ACLED",
     :importer.datamodel/type "event",
     :datasource "Source;ACLED",
     :features
     ({:importer.datamodel/global-id
       "c74257292f584502f9be02c98829d9fda532a492e7dd41e06c31bbccc76a7ba0",
       :date "1997-01-04",
       :fulltext
       {:importer.datamodel/global-id "df5c7d6d075df3a7719ebdd39c6d4c7f",
        :text "bla"},
       :location-meanings
       ({:importer.datamodel/global-id
         "e5611219971164a15f06e07228fb7b51",
         :location "8cda1baed04b668a167d4ca28e3cef36",
         :contexts (),
         :importer.datamodel/type "position"}
        {:importer.datamodel/global-id
         "af36461d27ec1d8d28fd7f4a70ab7ce2",
         :location "c78e5478e19f2d7c1b02088e53e8d8a4",
         :contexts (),
         :importer.datamodel/type "position"}),
       :interaction-name "Violence",
       :importer.datamodel/type "description",
       :has-contexts
       ({:context "102e96468e5d13058ab85c734aa4a949",
         :context-association-type "actor",
         :context-association-name "actor-1",
         :priority "none"}
        {:context "88844f94f79c75acfcb957bb41386149",
         :context-association-type "actor",
         :context-association-name "actor-2",
         :priority "none"}),
       :facts
       ({:importer.datamodel/global-id
         "c46802ce6dcf33ca02ce113ffd9a855e",
         :importer.datamodel/type "integer",
         :name "fatalities",
         :value "16"}),
       :attributes
       ({:name "description",
         :importer.datamodel/type "string",
         :value "Violence"})}),
     :attributes (),
     :ioi-slice "per-item"})}
  </code></pre>
  
  <p>What tool can create the spec for such a structure?
  I am trying to use this tool: <a href="https://github.com/stathissideris/spec-provider" rel="nofollow noreferrer">https://github.com/stathissideris/spec-provider</a></p>
  
  <p>but it gives me this:</p>
  
  <pre><code>(spec/def :importer.datamodel/data
    (clojure.spec.alpha/coll-of
     (clojure.spec.alpha/or
      :collection
      (clojure.spec.alpha/coll-of
       (clojure.spec.alpha/keys
        :req
        [:importer.datamodel/global-id]
        :opt
        [:importer.datamodel/center
         :importer.datamodel/part-of
         :importer.datamodel/type]
        :opt-un
        [:importer.datamodel/attributes
         :importer.datamodel/datasource
         :importer.datamodel/features
         :importer.datamodel/ioi-slice
         :importer.datamodel/name
         :importer.datamodel/url]))
      :simple
      clojure.core/keyword?)))
  </code></pre>
  
  <p>which is not complete solution...
  I use <code>(sp/pprint-specs (sp/infer-specs data :importer.datamodel/data) 'data 's)</code>...
  What tool can create the spec for such a structure?</p>