Modern OpenGL shader wrapper v2
This looks a lot better! Good job!

Nitty-gritty stuff:

better cleanup in the constructor

You hava a lot of the following idiom in the constructor:

if(condition) {
  glDeleteShader(shader_id);
  throw something;
}


This is a little fragile, since should you make the class more complex, that's a lot of places to refactor. The following would be better:

try {
  //most of the constructor in here
  ...
  if(condition) throw something;
  ...
}
catch(...) {
  glDeleteShader(shader_id);
  throw;
}


ifstream can throw its own exceptions if you tell it to

ifstream input_stream;
input_stream.exceptions( std::ios::failbit );
input_stream.open(path, std::ifstream::in | std::ifstream::ate);


Use iterators when converting a vector to a string

std::string info_log(log_output.data());
vs
std::string info_log(log_output.begin(), log_output.end());


The second one is better because it works whether there is a null terminator or not. It also removes a strlen() call from the code, which is a O(N) operation.

That's actually all I've got. Good job once again.