change ruby proto plugin to copy package name conversion from protoc
diff --git a/src/compiler/ruby_generator.cc b/src/compiler/ruby_generator.cc
index 6e5419c..3a7b89b 100644
--- a/src/compiler/ruby_generator.cc
+++ b/src/compiler/ruby_generator.cc
@@ -124,6 +124,40 @@
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 @@
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();
}