protobuf-closure-library 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
data/README.rst
CHANGED
@@ -10,9 +10,9 @@ Installation
|
|
10
10
|
|
11
11
|
`Protobuf <http://code.google.com/p/protobuf/>`_ runtime compiler and development header and libraries must be present at gem installation time.
|
12
12
|
|
13
|
-
* Under linux, user the right development package, eg ``
|
13
|
+
* Under linux, user the right development package, eg ``libprotoc-dev`` for ubuntu.
|
14
14
|
* Under osx, use ``brew install protobuf``.
|
15
|
-
*
|
15
|
+
* Under windows, use the `official protobuf binaries <http://code.google.com/p/protobuf/downloads/list>`_.
|
16
16
|
|
17
17
|
Then, install the gem:
|
18
18
|
|
@@ -27,6 +27,13 @@ Usage
|
|
27
27
|
|
28
28
|
require 'protobuf-closure-library'
|
29
29
|
ProtobufClosureLibrary::ProtocJs.compile input_proto_file,
|
30
|
-
output_dir,
|
30
|
+
output_dir, {
|
31
|
+
generator_options: {key: value},
|
32
|
+
protoc_options: []
|
33
|
+
}
|
31
34
|
|
32
35
|
This generated a ``.pb.js`` file correponded to ``input_proto_file`` in ``output_dir``. The output file contains a subclass of `goog.proto2.Message <http://closure-library.googlecode.com/svn/docs/class_goog_proto2_Message.html>`_.
|
36
|
+
|
37
|
+
By default, the generated message classes are subclasses of ``goog.proto2.Message``. This can be overriden by using ``generator_options: {js_superclass: 'cusom_package.CustomClass'}`` which generates message classes with ``cusom_package.CustomClass`` as the superclass.
|
38
|
+
|
39
|
+
Other protoc options can be passed to the compiler by ``protoc_options`` key.
|
@@ -17,6 +17,7 @@
|
|
17
17
|
#include "code_generator.h"
|
18
18
|
|
19
19
|
#include <string>
|
20
|
+
#include <vector>
|
20
21
|
#include <iostream> // NOLINT
|
21
22
|
#include <sstream> // NOLINT
|
22
23
|
|
@@ -37,12 +38,29 @@ CodeGenerator::CodeGenerator(const std::string &name)
|
|
37
38
|
|
38
39
|
CodeGenerator::~CodeGenerator() {}
|
39
40
|
|
41
|
+
std::string CodeGenerator::js_superclass_ = "goog.proto2.Message";
|
42
|
+
bool CodeGenerator::advanced_ = false;
|
43
|
+
|
40
44
|
bool CodeGenerator::Generate(
|
41
45
|
const google::protobuf::FileDescriptor *file,
|
42
|
-
const std::string
|
46
|
+
const std::string & parameter ,
|
43
47
|
google::protobuf::compiler::OutputDirectory *output_directory,
|
44
48
|
std::string *error) const {
|
45
49
|
|
50
|
+
std::vector<std::pair<std::string, std::string> > options;
|
51
|
+
google::protobuf::compiler::ParseGeneratorParameter(parameter, &options);
|
52
|
+
|
53
|
+
for (unsigned int i = 0; i < options.size(); i++) {
|
54
|
+
if (options[i].first == "js_superclass") {
|
55
|
+
CodeGenerator::js_superclass_ = options[i].second;
|
56
|
+
} else if (options[i].first == "advanced" && options[i].second == "true") {
|
57
|
+
CodeGenerator::advanced_ = true;
|
58
|
+
} else {
|
59
|
+
*error = "Unknown generator option: " + options[i].first;
|
60
|
+
return false;
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
46
64
|
const std::string file_name = file->name();
|
47
65
|
std::string output_file_name = file->name();
|
48
66
|
std::size_t loc = output_file_name.rfind(".");
|
@@ -76,8 +94,8 @@ bool CodeGenerator::Generate(
|
|
76
94
|
}
|
77
95
|
|
78
96
|
printer.Print("\n");
|
79
|
-
printer.Print("goog.require('
|
80
|
-
"\n");
|
97
|
+
printer.Print("goog.require('$js_superclass$');\n"
|
98
|
+
"\n", "js_superclass", CodeGenerator::js_superclass_);
|
81
99
|
for (int i = 0; i < file->dependency_count(); ++i) {
|
82
100
|
for (int j = 0; j < file->dependency(i)->message_type_count(); j++) {
|
83
101
|
printer.Print(
|
@@ -172,30 +190,33 @@ void CodeGenerator::GenDescriptor(
|
|
172
190
|
"/**\n"
|
173
191
|
" * Message $name$.\n"
|
174
192
|
" * @constructor\n"
|
175
|
-
" * @extends {
|
193
|
+
" * @extends {$js_superclass$}\n"
|
176
194
|
" */\n",
|
177
|
-
"name", message->name()
|
195
|
+
"name", message->name(),
|
196
|
+
"js_superclass", CodeGenerator::js_superclass_);
|
178
197
|
printer->Print("$name$ = function() {\n",
|
179
198
|
"name", JsFullName(message->file(),
|
180
199
|
message->full_name()));
|
181
200
|
printer->Indent();
|
182
|
-
printer->Print("
|
201
|
+
printer->Print("$js_superclass$.apply(this);\n", "js_superclass", CodeGenerator::js_superclass_);
|
183
202
|
printer->Outdent();
|
184
203
|
printer->Print("};\n"
|
185
|
-
"goog.inherits($name$,
|
204
|
+
"goog.inherits($name$, $js_superclass$);\n"
|
186
205
|
"\n"
|
187
206
|
"\n",
|
188
207
|
"name", JsFullName(message->file(),
|
189
|
-
message->full_name())
|
208
|
+
message->full_name()),
|
209
|
+
"js_superclass", CodeGenerator::js_superclass_);
|
190
210
|
|
191
211
|
printer->Print(
|
192
212
|
"/**\n"
|
193
|
-
" * Overrides {@link
|
213
|
+
" * Overrides {@link $js_superclass$#clone} to specify its exact "
|
194
214
|
"return type.\n"
|
195
215
|
" * @return {!$name$} The cloned message.\n"
|
196
216
|
" * @override\n"
|
197
217
|
" */\n"
|
198
218
|
"$name$.prototype.clone;\n",
|
219
|
+
"js_superclass", CodeGenerator::js_superclass_,
|
199
220
|
"name", JsFullName(message->file(),
|
200
221
|
message->full_name()));
|
201
222
|
|
@@ -393,16 +414,17 @@ void CodeGenerator::GenFieldDescriptor(
|
|
393
414
|
" * Sets the value of the $name$ field.\n",
|
394
415
|
"name", field->name());
|
395
416
|
printer->Print(" * @param {$opt$$type$} value The value.\n"
|
417
|
+
" * @param {Object} opt_options Options.\n"
|
396
418
|
" */\n",
|
397
419
|
"opt", type_is_primitive ? "" : "!",
|
398
420
|
"type", type);
|
399
|
-
printer->Print("$prefix$.prototype.set$field$ = function(value) {\n",
|
421
|
+
printer->Print("$prefix$.prototype.set$field$ = function(value, opt_options) {\n",
|
400
422
|
"prefix", JsFullName(field->containing_type()->file(),
|
401
423
|
field->containing_type()->full_name()),
|
402
424
|
"field", upper_name);
|
403
425
|
printer->Indent();
|
404
426
|
printer->Print(
|
405
|
-
"this.set$$Value($number$, value);\n",
|
427
|
+
"this.set$$Value($number$, value, opt_options);\n",
|
406
428
|
"number", number.str());
|
407
429
|
printer->Outdent();
|
408
430
|
printer->Print("};\n"
|
@@ -508,6 +530,61 @@ void CodeGenerator::GenFieldDescriptor(
|
|
508
530
|
"number", number.str());
|
509
531
|
printer->Outdent();
|
510
532
|
printer->Print("};\n");
|
533
|
+
|
534
|
+
if (CodeGenerator::advanced_) {
|
535
|
+
// update events
|
536
|
+
printer->Print("\n"
|
537
|
+
"/**\n"
|
538
|
+
" * Listens to update event on $name$ field.\n"
|
539
|
+
" * @param {function} callback The callback to invoke.\n"
|
540
|
+
" * @param {Object} context The 'this' sent to callback..\n"
|
541
|
+
" */\n",
|
542
|
+
"name", field->name());
|
543
|
+
printer->Print("$prefix$.prototype.onUpdate$field$ = function(callback, context) {\n",
|
544
|
+
"prefix", JsFullName(field->containing_type()->file(),
|
545
|
+
field->containing_type()->full_name()),
|
546
|
+
"field", upper_name);
|
547
|
+
printer->Indent();
|
548
|
+
printer->Print("this.listen('update:$number$', callback, context);\n",
|
549
|
+
"number", number.str());
|
550
|
+
printer->Outdent();
|
551
|
+
printer->Print("};\n");
|
552
|
+
printer->Print("\n"
|
553
|
+
"/**\n"
|
554
|
+
" * Clears update event on $name$ field.\n"
|
555
|
+
" */\n",
|
556
|
+
"name", field->name());
|
557
|
+
printer->Print("$prefix$.prototype.forgetUpdate$field$ = function() {\n",
|
558
|
+
"prefix", JsFullName(field->containing_type()->file(),
|
559
|
+
field->containing_type()->full_name()),
|
560
|
+
"field", upper_name);
|
561
|
+
printer->Indent();
|
562
|
+
printer->Print("this.forget('update:$number$');\n",
|
563
|
+
"number", number.str());
|
564
|
+
printer->Outdent();
|
565
|
+
printer->Print("};\n");
|
566
|
+
|
567
|
+
// collections
|
568
|
+
printer->Print("\n"
|
569
|
+
"/**\n"
|
570
|
+
" * Returns the collection in the $name$ field.\n",
|
571
|
+
"name", field->name());
|
572
|
+
printer->Print(
|
573
|
+
" * @return {Object} The values in the field.\n"
|
574
|
+
" */\n");
|
575
|
+
printer->Print("$prefix$.prototype.$field$Collection = function() {\n",
|
576
|
+
"prefix", JsFullName(field->containing_type()->file(),
|
577
|
+
field->containing_type()->full_name()),
|
578
|
+
"field", field->camelcase_name());
|
579
|
+
printer->Indent();
|
580
|
+
printer->Print(
|
581
|
+
"return (this.collection$$Values($number$));"
|
582
|
+
"\n",
|
583
|
+
"number", number.str());
|
584
|
+
printer->Outdent();
|
585
|
+
printer->Print("};\n"
|
586
|
+
"\n");
|
587
|
+
} // if (CodeGenerator::advanced_)
|
511
588
|
}
|
512
589
|
|
513
590
|
void CodeGenerator::GenEnumDescriptor(
|
@@ -546,7 +623,8 @@ void CodeGenerator::GenDescriptorMetadata(
|
|
546
623
|
google::protobuf::io::Printer *printer) {
|
547
624
|
printer->Print("\n"
|
548
625
|
"\n"
|
549
|
-
"
|
626
|
+
"$js_superclass$.set$$Metadata($name$, {\n",
|
627
|
+
"js_superclass", CodeGenerator::js_superclass_,
|
550
628
|
"name", JsFullName(message->file(),
|
551
629
|
message->full_name()));
|
552
630
|
printer->Indent();
|
@@ -714,7 +792,8 @@ void CodeGenerator::GenFieldDescriptorMetadata(
|
|
714
792
|
if (field->is_repeated()) {
|
715
793
|
printer->Print("repeated: true,\n");
|
716
794
|
}
|
717
|
-
printer->Print("fieldType:
|
795
|
+
printer->Print("fieldType: $js_superclass$.FieldType.$js_type$,\n",
|
796
|
+
"js_superclass", CodeGenerator::js_superclass_,
|
718
797
|
"js_type", js_type);
|
719
798
|
if (field->has_default_value() ||
|
720
799
|
field->type() == google::protobuf::FieldDescriptor::TYPE_ENUM) {
|
@@ -40,6 +40,8 @@ class CodeGenerator : public ::google::protobuf::compiler::CodeGenerator {
|
|
40
40
|
|
41
41
|
private:
|
42
42
|
std::string name_;
|
43
|
+
static std::string js_superclass_;
|
44
|
+
static bool advanced_;
|
43
45
|
|
44
46
|
static std::string JsFullName(
|
45
47
|
const google::protobuf::FileDescriptor *file,
|
@@ -1,12 +1,24 @@
|
|
1
1
|
module ProtobufClosureLibrary
|
2
2
|
|
3
3
|
class ProtocJs
|
4
|
-
def self.compile proto_file, out_dir,
|
4
|
+
def self.compile proto_file, out_dir, options
|
5
|
+
options = {
|
6
|
+
generator_options: {},
|
7
|
+
protoc_options: []
|
8
|
+
}.merge options
|
9
|
+
|
10
|
+
if !File.exist? out_dir
|
11
|
+
FileUtils.mkdir_p out_dir
|
12
|
+
end
|
13
|
+
|
14
|
+
generator_options = options[:generator_options].map{|k, v| "#{k}=#{v}" }.join(',')
|
15
|
+
js_out_options = generator_options.empty? ? out_dir : "#{generator_options}:#{out_dir}"
|
16
|
+
|
5
17
|
ProtocJsCore.compile RUBY_BIN, proto_file,
|
6
18
|
@@static_proto_path | [
|
7
|
-
"--js_out=#{
|
19
|
+
"--js_out=#{js_out_options}",
|
8
20
|
"--proto_path=#{File.dirname proto_file}"
|
9
|
-
] |
|
21
|
+
] | options[:protoc_options]
|
10
22
|
end
|
11
23
|
|
12
24
|
private
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protobuf-closure-library
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rice
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157106240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157106240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: shoulda
|
27
|
-
requirement: &
|
27
|
+
requirement: &2157105620 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2157105620
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake-compiler
|
38
|
-
requirement: &
|
38
|
+
requirement: &2157105140 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2157105140
|
47
47
|
description: ! " A wrapper for native protocol buffer javascript compiler\n which
|
48
48
|
generates closure library proto2 messages.\n"
|
49
49
|
email:
|
@@ -85,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
85
|
version: '0'
|
86
86
|
segments:
|
87
87
|
- 0
|
88
|
-
hash:
|
88
|
+
hash: 3792040639640788879
|
89
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
90
|
none: false
|
91
91
|
requirements:
|
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
version: '0'
|
95
95
|
segments:
|
96
96
|
- 0
|
97
|
-
hash:
|
97
|
+
hash: 3792040639640788879
|
98
98
|
requirements: []
|
99
99
|
rubyforge_project: protobuf-closure-library
|
100
100
|
rubygems_version: 1.8.10
|