xref: /aosp_15_r20/external/cronet/third_party/protobuf/ruby/README.md (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard WorkerThis directory contains the Ruby extension that implements Protocol Buffers
2*6777b538SAndroid Build Coastguard Workerfunctionality in Ruby.
3*6777b538SAndroid Build Coastguard Worker
4*6777b538SAndroid Build Coastguard WorkerThe Ruby extension makes use of generated Ruby code that defines message and
5*6777b538SAndroid Build Coastguard Workerenum types in a Ruby DSL. You may write definitions in this DSL directly, but
6*6777b538SAndroid Build Coastguard Workerwe recommend using protoc's Ruby generation support with .proto files. The
7*6777b538SAndroid Build Coastguard Workerbuild process in this directory only installs the extension; you need to
8*6777b538SAndroid Build Coastguard Workerinstall protoc as well to have Ruby code generation functionality.
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard WorkerInstallation from Gem
11*6777b538SAndroid Build Coastguard Worker---------------------
12*6777b538SAndroid Build Coastguard WorkerIn Gemfile (Please check a version of Protocol Buffers you needed [RubyGems](https://rubygems.org/gems/google-protobuf)):
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker    gem 'google-protobuf'
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard WorkerOr for using this pre-packaged gem, simply install it as you would any other gem:
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker    $ gem install [--prerelease] google-protobuf
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard WorkerOnce the gem is installed, you may or may not need `protoc`. If you write your
21*6777b538SAndroid Build Coastguard Workermessage type descriptions directly in the Ruby DSL, you do not need it.
22*6777b538SAndroid Build Coastguard WorkerHowever, if you wish to generate the Ruby DSL from a `.proto` file, you will
23*6777b538SAndroid Build Coastguard Workeralso want to install Protocol Buffers itself, as described in this repository's
24*6777b538SAndroid Build Coastguard Workermain `README` file. The version of `protoc` included in the latest release
25*6777b538SAndroid Build Coastguard Workersupports the `--ruby_out` option to generate Ruby code.
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard WorkerA simple example of using the Ruby extension follows. More extensive
28*6777b538SAndroid Build Coastguard Workerdocumentation may be found in the RubyDoc comments (`call-seq` tags) in the
29*6777b538SAndroid Build Coastguard Workersource, and we plan to release separate, more detailed, documentation at a
30*6777b538SAndroid Build Coastguard Workerlater date.
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker```ruby
33*6777b538SAndroid Build Coastguard Workerrequire 'google/protobuf'
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker# generated from my_proto_types.proto with protoc:
36*6777b538SAndroid Build Coastguard Worker#  $ protoc --ruby_out=. my_proto_types.proto
37*6777b538SAndroid Build Coastguard Workerrequire 'my_proto_types'
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Workermymessage = MyTestMessage.new(:field1 => 42, :field2 => ["a", "b", "c"])
40*6777b538SAndroid Build Coastguard Workermymessage.field1 = 43
41*6777b538SAndroid Build Coastguard Workermymessage.field2.push("d")
42*6777b538SAndroid Build Coastguard Workermymessage.field3 = SubMessage.new(:foo => 100)
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Workerencoded_data = MyTestMessage.encode(mymessage)
45*6777b538SAndroid Build Coastguard Workerdecoded = MyTestMessage.decode(encoded_data)
46*6777b538SAndroid Build Coastguard Workerassert decoded == mymessage
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Workerputs "JSON:"
49*6777b538SAndroid Build Coastguard Workerputs MyTestMessage.encode_json(mymessage)
50*6777b538SAndroid Build Coastguard Worker```
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard WorkerInstallation from Source (Building Gem)
53*6777b538SAndroid Build Coastguard Worker---------------------------------------
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard WorkerTo build this Ruby extension, you will need:
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker* Rake
58*6777b538SAndroid Build Coastguard Worker* Bundler
59*6777b538SAndroid Build Coastguard Worker* Ruby development headers
60*6777b538SAndroid Build Coastguard Worker* a C compiler
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard WorkerTo Build the JRuby extension, you will need:
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker* Maven
65*6777b538SAndroid Build Coastguard Worker* The latest version of the protobuf java library (see ../java/README.md)
66*6777b538SAndroid Build Coastguard Worker* Install JRuby via rbenv or RVM
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard WorkerFirst switch to the desired platform with rbenv or RVM.
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard WorkerThen install the required Ruby gems:
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker    $ gem install bundler
73*6777b538SAndroid Build Coastguard Worker    $ bundle
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard WorkerThen build the Gem:
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker    $ rake
78*6777b538SAndroid Build Coastguard Worker    $ rake clobber_package gem
79*6777b538SAndroid Build Coastguard Worker    $ gem install `ls pkg/google-protobuf-*.gem`
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard WorkerTo run the specs:
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker    $ rake test
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard WorkerThis gem includes the upb parsing and serialization library as a single-file
86*6777b538SAndroid Build Coastguard Workeramalgamation. It is up-to-date with upb git commit
87*6777b538SAndroid Build Coastguard Worker`535bc2fe2f2b467f59347ffc9449e11e47791257`.
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard WorkerVersion Number Scheme
90*6777b538SAndroid Build Coastguard Worker---------------------
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard WorkerWe are using a version number scheme that is a hybrid of Protocol Buffers'
93*6777b538SAndroid Build Coastguard Workeroverall version number and some Ruby-specific rules. Gem does not allow
94*6777b538SAndroid Build Coastguard Workerre-uploads of a gem with the same version number, so we add a sequence number
95*6777b538SAndroid Build Coastguard Worker("upload version") to the version. We also format alphabetical tags (alpha,
96*6777b538SAndroid Build Coastguard Workerpre, ...) slightly differently, and we avoid hyphens. In more detail:
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker* First, we determine the prefix: a Protocol Buffers version "3.0.0-alpha-2"
99*6777b538SAndroid Build Coastguard Worker  becomes "3.0.0.alpha.2". When we release 3.0.0, this prefix will be simply
100*6777b538SAndroid Build Coastguard Worker  "3.0.0".
101*6777b538SAndroid Build Coastguard Worker* We then append the upload version: "3.0.0.alpha.2.0" or "3.0.0.0". If we need
102*6777b538SAndroid Build Coastguard Worker  to upload a new version of the gem to fix an issue, the version becomes
103*6777b538SAndroid Build Coastguard Worker  "3.0.0.alpha.2.1" or "3.0.0.1".
104*6777b538SAndroid Build Coastguard Worker* If we are working on a prerelease version, we append a prerelease tag:
105*6777b538SAndroid Build Coastguard Worker  "3.0.0.alpha.3.0.pre". The prerelease tag comes at the end so that when
106*6777b538SAndroid Build Coastguard Worker  version numbers are sorted, any prerelease builds are ordered between the
107*6777b538SAndroid Build Coastguard Worker  prior version and current version.
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard WorkerThese rules are designed to work with the sorting rules for
110*6777b538SAndroid Build Coastguard Worker[Gem::Version](http://ruby-doc.org/stdlib-2.0/libdoc/rubygems/rdoc/Gem/Version.html):
111*6777b538SAndroid Build Coastguard Workerrelease numbers should sort in actual release order.
112