Merge pull request #4743 from murgatroid99/node_doc_gen_config_update

Update Node API documentation generation configuration for move to repo root
diff --git a/include/grpc++/generic/async_generic_service.h b/include/grpc++/generic/async_generic_service.h
index 33045b8..57a2696 100644
--- a/include/grpc++/generic/async_generic_service.h
+++ b/include/grpc++/generic/async_generic_service.h
@@ -76,4 +76,4 @@
 
 }  // namespace grpc
 
-#endif  // GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H
\ No newline at end of file
+#endif  // GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H
diff --git a/include/grpc++/support/byte_buffer.h b/include/grpc++/support/byte_buffer.h
index 84042cb..82591a8 100644
--- a/include/grpc++/support/byte_buffer.h
+++ b/include/grpc++/support/byte_buffer.h
@@ -107,4 +107,4 @@
 
 }  // namespace grpc
 
-#endif  // GRPCXX_SUPPORT_BYTE_BUFFER_H
\ No newline at end of file
+#endif  // GRPCXX_SUPPORT_BYTE_BUFFER_H
diff --git a/include/grpc++/support/slice.h b/include/grpc++/support/slice.h
index 30325ef..724691a 100644
--- a/include/grpc++/support/slice.h
+++ b/include/grpc++/support/slice.h
@@ -85,4 +85,4 @@
 
 }  // namespace grpc
 
-#endif  // GRPCXX_SUPPORT_SLICE_H
\ No newline at end of file
+#endif  // GRPCXX_SUPPORT_SLICE_H
diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c
index a5f0dcb..14912af 100644
--- a/src/core/transport/metadata.c
+++ b/src/core/transport/metadata.c
@@ -687,4 +687,4 @@
   slice = s->base64_and_huffman;
   gpr_mu_unlock(&shard->mu);
   return slice;
-}
\ No newline at end of file
+}
diff --git a/src/core/transport/metadata.h b/src/core/transport/metadata.h
index 3898c3d..8742846 100644
--- a/src/core/transport/metadata.h
+++ b/src/core/transport/metadata.h
@@ -153,4 +153,4 @@
 void grpc_mdctx_global_init(void);
 void grpc_mdctx_global_shutdown(void);
 
-#endif /* GRPC_INTERNAL_CORE_TRANSPORT_METADATA_H */
\ No newline at end of file
+#endif /* GRPC_INTERNAL_CORE_TRANSPORT_METADATA_H */
diff --git a/src/node/ext/call.cc b/src/node/ext/call.cc
index e1fc111..da31288 100644
--- a/src/node/ext/call.cc
+++ b/src/node/ext/call.cc
@@ -773,4 +773,4 @@
 }
 
 }  // namespace node
-}  // namespace grpc
\ No newline at end of file
+}  // namespace grpc
diff --git a/src/node/interop/async_delay_queue.js b/src/node/interop/async_delay_queue.js
index b3c30ab..df57209 100644
--- a/src/node/interop/async_delay_queue.js
+++ b/src/node/interop/async_delay_queue.js
@@ -76,4 +76,4 @@
   }
 };
 
-module.exports = AsyncDelayQueue;
\ No newline at end of file
+module.exports = AsyncDelayQueue;
diff --git a/src/node/src/common.js b/src/node/src/common.js
index e4fe5a8..2e6c01c 100644
--- a/src/node/src/common.js
+++ b/src/node/src/common.js
@@ -1,6 +1,6 @@
 /*
  *
- * Copyright 2015, Google Inc.
+ * Copyright 2015-2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -125,7 +125,7 @@
   var prefix = '/' + fullyQualifiedName(service) + '/';
   return _.object(_.map(service.children, function(method) {
     return [_.camelCase(method.name), {
-      path: prefix + _.capitalize(method.name),
+      path: prefix + method.name,
       requestStream: method.requestStream,
       responseStream: method.responseStream,
       requestSerialize: serializeCls(method.resolvedRequestType.build()),
diff --git a/src/proto/gen_build_yaml.py b/src/proto/gen_build_yaml.py
index 4e95983..e243d0d 100755
--- a/src/proto/gen_build_yaml.py
+++ b/src/proto/gen_build_yaml.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python2.7
-# Copyright 2015, Google Inc.
+# Copyright 2015-2016, Google Inc.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -36,21 +36,36 @@
 import re
 import sys
 
+def update_deps(key, proto_filename, deps, is_trans, visited):
+  if not proto_filename in visited:
+    visited.append(proto_filename)
+    with open(proto_filename) as inp:
+      for line in inp:
+        imp = re.search(r'import "([^"]*)"', line)
+        if not imp: continue
+        imp_proto = imp.group(1)
+        if key not in deps: deps[key] = []
+        deps[key].append(imp_proto[:-6])
+        if is_trans:
+          update_deps(key, imp_proto, deps, is_trans, visited)
+
 def main():
+  proto_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
+  os.chdir(os.path.join(proto_dir, '../..'))
+
   deps = {}
-  for root, dirs, files in os.walk(os.path.dirname(sys.argv[0])):
+  deps_trans = {}
+  for root, dirs, files in os.walk('src/proto'):
     for f in files:
       if f[-6:] != '.proto': continue
       look_at = os.path.join(root, f)
-      with open(look_at) as inp:
-        for line in inp:
-          imp = re.search(r'import "([^"]*)"', line)
-          if not imp: continue
-          if look_at[:-6] not in deps: deps[look_at[:-6]] = []
-          deps[look_at[:-6]].append(imp.group(1)[:-6])
+      deps_for = look_at[:-6]
+      update_deps(deps_for, look_at, deps, False, [])      # First level deps
+      update_deps(deps_for, look_at, deps_trans, True, []) # Transitive deps
 
   json = {
-    'proto_deps': deps
+    'proto_deps': deps,
+    'proto_transitive_deps': deps_trans
   }
 
   print yaml.dump(json)
diff --git a/src/proto/grpc/testing/duplicate/echo_duplicate.proto b/src/proto/grpc/testing/duplicate/echo_duplicate.proto
index 9978ca4..9d84de1 100644
--- a/src/proto/grpc/testing/duplicate/echo_duplicate.proto
+++ b/src/proto/grpc/testing/duplicate/echo_duplicate.proto
@@ -38,4 +38,4 @@
 
 service EchoTestService {
   rpc Echo(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse);
-}
\ No newline at end of file
+}
diff --git a/src/proto/grpc/testing/echo.proto b/src/proto/grpc/testing/echo.proto
index 47d4c26..06c3baf 100644
--- a/src/proto/grpc/testing/echo.proto
+++ b/src/proto/grpc/testing/echo.proto
@@ -44,4 +44,4 @@
 
 service UnimplementedService {
   rpc Unimplemented(EchoRequest) returns (EchoResponse);
-}
\ No newline at end of file
+}
diff --git a/templates/package.json.template b/templates/package.json.template
index d50b1e2..ec6827e 100644
--- a/templates/package.json.template
+++ b/templates/package.json.template
@@ -60,7 +60,7 @@
       % for dep in module.transitive_deps:
       % for lib in libs:
       % if lib.name == dep:
-      % for file in lib.public_headers + lib.headers + lib.src:
+      % for file in lib.get('public_headers', []) + lib.headers + lib.src:
       "${file}",
       % endfor
       % endif
diff --git a/test/cpp/end2end/client_crash_test.cc b/test/cpp/end2end/client_crash_test.cc
index d0efabc..5ca5cd7 100644
--- a/test/cpp/end2end/client_crash_test.cc
+++ b/test/cpp/end2end/client_crash_test.cc
@@ -155,4 +155,4 @@
     }
   }
   return 0;
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/client_crash_test_server.cc b/test/cpp/end2end/client_crash_test_server.cc
index 8219631..1ec641c 100644
--- a/test/cpp/end2end/client_crash_test_server.cc
+++ b/test/cpp/end2end/client_crash_test_server.cc
@@ -90,4 +90,4 @@
   grpc::testing::RunServer();
 
   return 0;
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index 82eb566..f8027bc 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -1210,4 +1210,4 @@
   grpc_test_init(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc
index d08ed9b..1d29096 100644
--- a/test/cpp/end2end/mock_test.cc
+++ b/test/cpp/end2end/mock_test.cc
@@ -281,4 +281,4 @@
   grpc_test_init(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/server_crash_test.cc b/test/cpp/end2end/server_crash_test.cc
index c29bc7c..9bf9423 100644
--- a/test/cpp/end2end/server_crash_test.cc
+++ b/test/cpp/end2end/server_crash_test.cc
@@ -171,4 +171,4 @@
   grpc_test_init(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/server_crash_test_client.cc b/test/cpp/end2end/server_crash_test_client.cc
index 3a99ab3..b0e6ac6 100644
--- a/test/cpp/end2end/server_crash_test_client.cc
+++ b/test/cpp/end2end/server_crash_test_client.cc
@@ -87,4 +87,4 @@
   }
 
   return 0;
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/shutdown_test.cc b/test/cpp/end2end/shutdown_test.cc
index c03cf9f..dbbda3a 100644
--- a/test/cpp/end2end/shutdown_test.cc
+++ b/test/cpp/end2end/shutdown_test.cc
@@ -152,4 +152,4 @@
   grpc_test_init(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/streaming_throughput_test.cc b/test/cpp/end2end/streaming_throughput_test.cc
index ef2b53f..4777b88 100644
--- a/test/cpp/end2end/streaming_throughput_test.cc
+++ b/test/cpp/end2end/streaming_throughput_test.cc
@@ -204,4 +204,4 @@
   grpc_test_init(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/thread_stress_test.cc b/test/cpp/end2end/thread_stress_test.cc
index 592c427..4e8860e 100644
--- a/test/cpp/end2end/thread_stress_test.cc
+++ b/test/cpp/end2end/thread_stress_test.cc
@@ -234,4 +234,4 @@
   grpc_test_init(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/test/cpp/end2end/zookeeper_test.cc b/test/cpp/end2end/zookeeper_test.cc
index cec6e89..bbf1b0e 100644
--- a/test/cpp/end2end/zookeeper_test.cc
+++ b/test/cpp/end2end/zookeeper_test.cc
@@ -216,4 +216,4 @@
   grpc_test_init(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/test/cpp/qps/client.h b/test/cpp/qps/client.h
index 0159f4f..15cfd7a 100644
--- a/test/cpp/qps/client.h
+++ b/test/cpp/qps/client.h
@@ -377,4 +377,4 @@
 }  // namespace testing
 }  // namespace grpc
 
-#endif
\ No newline at end of file
+#endif
diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index 3e2317c..f270cd0 100644
--- a/test/cpp/qps/client_async.cc
+++ b/test/cpp/qps/client_async.cc
@@ -599,4 +599,4 @@
 }
 
 }  // namespace testing
-}  // namespace grpc
\ No newline at end of file
+}  // namespace grpc
diff --git a/test/cpp/qps/client_sync.cc b/test/cpp/qps/client_sync.cc
index 1045915..92fbf24 100644
--- a/test/cpp/qps/client_sync.cc
+++ b/test/cpp/qps/client_sync.cc
@@ -172,4 +172,4 @@
 }
 
 }  // namespace testing
-}  // namespace grpc
\ No newline at end of file
+}  // namespace grpc
diff --git a/test/cpp/qps/generic_async_streaming_ping_pong_test.cc b/test/cpp/qps/generic_async_streaming_ping_pong_test.cc
index 7a12750..2b2e1c8 100644
--- a/test/cpp/qps/generic_async_streaming_ping_pong_test.cc
+++ b/test/cpp/qps/generic_async_streaming_ping_pong_test.cc
@@ -79,4 +79,4 @@
 
   grpc::testing::RunGenericAsyncStreamingPingPong();
   return 0;
-}
\ No newline at end of file
+}
diff --git a/test/cpp/qps/qps_driver.cc b/test/cpp/qps/qps_driver.cc
index c70db18..eb0a7a5 100644
--- a/test/cpp/qps/qps_driver.cc
+++ b/test/cpp/qps/qps_driver.cc
@@ -184,4 +184,4 @@
   grpc::testing::QpsDriver();
 
   return 0;
-}
\ No newline at end of file
+}
diff --git a/test/cpp/qps/qps_worker.cc b/test/cpp/qps/qps_worker.cc
index e7714c0..bed867e 100644
--- a/test/cpp/qps/qps_worker.cc
+++ b/test/cpp/qps/qps_worker.cc
@@ -239,4 +239,4 @@
 QpsWorker::~QpsWorker() {}
 
 }  // namespace testing
-}  // namespace grpc
\ No newline at end of file
+}  // namespace grpc
diff --git a/test/cpp/qps/server.h b/test/cpp/qps/server.h
index daee7c3..32a3e85 100644
--- a/test/cpp/qps/server.h
+++ b/test/cpp/qps/server.h
@@ -112,4 +112,4 @@
 }  // namespace testing
 }  // namespace grpc
 
-#endif
\ No newline at end of file
+#endif
diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc
index 1ae88d7..d530dac 100644
--- a/test/cpp/qps/server_async.cc
+++ b/test/cpp/qps/server_async.cc
@@ -397,4 +397,4 @@
 }
 
 }  // namespace testing
-}  // namespace grpc
\ No newline at end of file
+}  // namespace grpc
diff --git a/test/cpp/util/cli_call.cc b/test/cpp/util/cli_call.cc
index 28f5e47..5e29e7a 100644
--- a/test/cpp/util/cli_call.cc
+++ b/test/cpp/util/cli_call.cc
@@ -108,4 +108,4 @@
 }
 
 }  // namespace testing
-}  // namespace grpc
\ No newline at end of file
+}  // namespace grpc
diff --git a/test/cpp/util/cli_call_test.cc b/test/cpp/util/cli_call_test.cc
index 207371d..5fdf519 100644
--- a/test/cpp/util/cli_call_test.cc
+++ b/test/cpp/util/cli_call_test.cc
@@ -140,4 +140,4 @@
   grpc_test_init(argc, argv);
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
-}
\ No newline at end of file
+}
diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py
index 70f1b30..10566d6 100755
--- a/tools/run_tests/run_interop_tests.py
+++ b/tools/run_tests/run_interop_tests.py
@@ -785,4 +785,4 @@
 
   for image in docker_images.itervalues():
     print 'Removing docker image %s' % image
-    dockerjob.remove_image(image)
\ No newline at end of file
+    dockerjob.remove_image(image)