Remove unecessary self. It keeps the code cleaner and also helps avoid accident shadowing.
Move checks to init, FailFast don't wait around to say something is wrong. Do it as soon as you can.
Move relative_permalinks_deprecation into page. Whether or not a page is using relative_permalinks is page's concern not site's.
Move aggregate_post_info into post
Combine keep_file_regex
Remove source from Post, Page, and StaticFile constructor (it's already beening passed as part of site)
Change arguement to path for Post, Draft, Page, StaticFile and Layout. At the end of the chain read_yaml load off a path. Why split it up in site only to join it back together in the end? Also why is it site's responsibility to break up a path? Let the object break up the path how they want. Refactor the read methods into one to avoid recursion and modify read_yaml to take a path. The multi reads seemed to be a side effect of having to break the path up so join them back together.
Combined the posts, pages, and statics into one array. Site's one responsibilities should be dealing with the files not dealing with posts, pages, layouts, static_files,..., rss_files, images, etc. If more types get added would variables just keep getting made for them? Make the variables reflect responsibilities.
Extract parent object from posts and pages
Removed lsi messages. Why is the lsi the only feature that gets to write to the console status updates by default? Is it because it's expected to take a long time? There's no way to turn it off and it could expected behaviour if jekyll is included somewhere else.
Refactor read and extract conditional to exceptions on class. Extract the conditional to the class - Tell Don't Ask, decision about the state of the object should be made in the objects themselves. It cut's down on coupling and makes it easier to change. If you use the Post class by outsite of site it should still tell you it can't be made with an invalid name.