From cb46db070485cf581521e9c60db4827d3386751f Mon Sep 17 00:00:00 2001
From: murgatroid99 <mlumish@google.com>
Date: Tue, 14 Apr 2015 17:18:26 -0700
Subject: [PATCH] Initial version of service_packager script

---
 src/node/bin/service_packager                 |   2 +
 src/node/cli/service_packager.js              | 116 ++++++++++++++++++
 src/node/cli/service_packager/index.js        |  35 ++++++
 .../service_packager/package.json.template    |  16 +++
 src/node/package.json                         |   3 +
 5 files changed, 172 insertions(+)
 create mode 100755 src/node/bin/service_packager
 create mode 100644 src/node/cli/service_packager.js
 create mode 100644 src/node/cli/service_packager/index.js
 create mode 100644 src/node/cli/service_packager/package.json.template

diff --git a/src/node/bin/service_packager b/src/node/bin/service_packager
new file mode 100755
index 0000000000..c7f2460997
--- /dev/null
+++ b/src/node/bin/service_packager
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require(__dirname+'/../cli/service_packager.js').main(process.argv.slice(2));
\ No newline at end of file
diff --git a/src/node/cli/service_packager.js b/src/node/cli/service_packager.js
new file mode 100644
index 0000000000..7bf54b1c62
--- /dev/null
+++ b/src/node/cli/service_packager.js
@@ -0,0 +1,116 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+'use strict';
+
+var fs = require('fs');
+var path = require('path');
+
+var _ = require('underscore');
+var async = require('async');
+var pbjs = require('protobufjs/cli/pbjs');
+var parseArgs = require('minimist');
+var Mustache = require('mustache');
+
+var package_json = require('../package.json');
+
+var template_path = path.resolve(__dirname, 'service_packager');
+
+var package_tpl_path = path.join(template_path, 'package.json.template');
+
+var arg_format = {
+  string: ['include', 'out', 'name', 'version'],
+  alias: {
+    include: 'i',
+    out: 'o',
+    name: 'n',
+    version: 'v'
+  }
+};
+
+// TODO(mlumish): autogenerate README.md from proto file
+
+function generatePackage(params, callback) {
+  fs.readFile(package_tpl_path, {encoding: 'utf-8'}, function(err, template) {
+    if (err) {
+      callback(err);
+    } else {
+      var rendered = Mustache.render(template, params);
+      callback(null, rendered);
+    }
+  });
+}
+
+function copyFile(src_path, dest_path) {
+  fs.createReadStream(src_path).pipe(fs.createWriteStream(dest_path));
+}
+
+function main(argv) {
+  var args = parseArgs(argv, arg_format);
+  var out_path = path.resolve(args.out);
+  var include_dirs = _.map(path.resolve, args.include);
+  args.grpc_version = package_json.version;
+  generatePackage(args, function(err, rendered) {
+    if (err) throw err;
+    fs.writeFile(path.join(out_path, 'package.json'), rendered, function(err) {
+      if (err) throw err;
+    });
+  });
+  copyFile(path.join(template_path, 'index.js'),
+           path.join(out_path, 'index.js'));
+  copyFile(path.join(__dirname, '..', 'LICENSE'),
+           path.join(out_path, 'LICENSE'));
+
+
+
+  var service_stream = fs.createWriteStream(path.join(out_path,
+                                                      'service.json'));
+  var pbjs_args = _.flatten(['node', 'pbjs',
+                             args._[0],
+                             _.map(include_dirs, function(dir) {
+                               return "-path=" + dir;
+                             })]);
+  var old_stdout = process.stdout;
+  process.__defineGetter__('stdout', function() {
+    return service_stream;
+  });
+  var pbjs_status = pbjs.main(pbjs_args);
+  process.__defineGetter__('stdout', function() {
+    return old_stdout;
+  });
+  if (pbjs_status !== pbjs.STATUS_OK) {
+    throw new Error('pbjs failed with status code ' + pbjs_status);
+  }
+}
+
+exports.main = main;
diff --git a/src/node/cli/service_packager/index.js b/src/node/cli/service_packager/index.js
new file mode 100644
index 0000000000..8a22120ce0
--- /dev/null
+++ b/src/node/cli/service_packager/index.js
@@ -0,0 +1,35 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+var grpc = require('grpc');
+module.exports = grpc.load(__dirname + '/service.json');
diff --git a/src/node/cli/service_packager/package.json.template b/src/node/cli/service_packager/package.json.template
new file mode 100644
index 0000000000..4f199f2f95
--- /dev/null
+++ b/src/node/cli/service_packager/package.json.template
@@ -0,0 +1,16 @@
+{
+  "name": "{{{name}}}",
+  "version": "{{{version}}}",
+  "author": "Google Inc.",
+  "description": "Client library for {{{name}}} built on gRPC",
+  "license": "Apache-2.0",
+  "dependencies": {
+    "grpc": "{{{grpc_version}}}"
+  },
+  "main": "index.js",
+  "files": [
+    "LICENSE",
+    "index.js",
+    "service.json"
+  ]
+}
diff --git a/src/node/package.json b/src/node/package.json
index fc3ca1f103..03f81ba532 100644
--- a/src/node/package.json
+++ b/src/node/package.json
@@ -36,6 +36,7 @@
     "jshint": "^2.5.0",
     "minimist": "^1.1.0",
     "mocha": "~1.21.0",
+    "mustache": "^2.0.0",
     "strftime": "^0.8.2"
   },
   "engines": {
@@ -46,6 +47,8 @@
     "README.md",
     "index.js",
     "binding.gyp",
+    "bin",
+    "cli",
     "examples",
     "ext",
     "interop",
-- 
GitLab