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