   (->> reader .readLine csv/read-csv first))
 
 (defn warn-if-extraneous-headers
+  "Records an error if headers are present in the file that do not
+  correspond to any in the data-spec (`column-names`)."
   [ctx {:keys [table] :as data-spec} headers column-names]
   (let [extraneous-headers (seq (set/difference (set headers) (set column-names)))]
     (if extraneous-headers

       (map str/lower-case)))

(defn required-header-names
  [columns]
  (-> (comp (filter :required)
            (map :name)

      ctx)))

(defn file-handle->string-keys
  "Given a file handle, returns a collection of cleaned (of non word
  characters), lower-cased string keys for the first line, assumed to
  be the header row."
  [file-handle]
  (->> file-handle
       read-one-line
