|  | @@ -124,6 +124,40 @@ grpc::string SnakeCaseToCamelCase(grpc::string input) {
 | 
	
		
			
				|  |  |    return output;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// The following functions are copied directly from the source for the protoc ruby generator
 | 
	
		
			
				|  |  | +// to ensure compatibility ('int i' changed to 'uint i' is the only change).
 | 
	
		
			
				|  |  | +// See https://github.com/google/protobuf/blob/master/src/google/protobuf/compiler/ruby/ruby_generator.cc#L250
 | 
	
		
			
				|  |  | +// TODO: keep up to date with protoc code generation, though this behavior isn't expected to change
 | 
	
		
			
				|  |  | +bool IsLower(char ch) { return ch >= 'a' && ch <= 'z'; }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +char ToUpper(char ch) { return IsLower(ch) ? (ch - 'a' + 'A') : ch; }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Package names in protobuf are snake_case by convention, but Ruby module
 | 
	
		
			
				|  |  | +// names must be PascalCased.
 | 
	
		
			
				|  |  | +//
 | 
	
		
			
				|  |  | +//   foo_bar_baz -> FooBarBaz
 | 
	
		
			
				|  |  | +std::string PackageToModule(const std::string& name) {
 | 
	
		
			
				|  |  | +  bool next_upper = true;
 | 
	
		
			
				|  |  | +  std::string result;
 | 
	
		
			
				|  |  | +  result.reserve(name.size());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  for (uint i = 0; i < name.size(); i++) {
 | 
	
		
			
				|  |  | +    if (name[i] == '_') {
 | 
	
		
			
				|  |  | +      next_upper = true;
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      if (next_upper) {
 | 
	
		
			
				|  |  | +        result.push_back(ToUpper(name[i]));
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        result.push_back(name[i]);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      next_upper = false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return result;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +// end copying of protoc generator for ruby code
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  grpc::string GetServices(const FileDescriptor *file) {
 | 
	
		
			
				|  |  |    grpc::string output;
 | 
	
	
		
			
				|  | @@ -166,7 +200,7 @@ grpc::string GetServices(const FileDescriptor *file) {
 | 
	
		
			
				|  |  |      std::vector<grpc::string> modules = Split(file->package(), '.');
 | 
	
		
			
				|  |  |      for (size_t i = 0; i < modules.size(); ++i) {
 | 
	
		
			
				|  |  |        std::map<grpc::string, grpc::string> module_vars =
 | 
	
		
			
				|  |  | -          ListToDict({"module.name", SnakeCaseToCamelCase(modules[i]), });
 | 
	
		
			
				|  |  | +          ListToDict({"module.name", PackageToModule(modules[i]), });
 | 
	
		
			
				|  |  |        out.Print(module_vars, "module $module.name$\n");
 | 
	
		
			
				|  |  |        out.Indent();
 | 
	
		
			
				|  |  |      }
 |