protobuf-closure-library 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
|