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