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