protobuf/ruby
mkruskal-google 85aa87cbc9
Merge 3.20.1-rc1 into main (#9760)
* Fix NPE during encoding and add regression test for issue 9507.

(cherry picked from commit 58e320a732)

* Implement `respond_to?` in RubyMessage (#9677)

All synthetic methods implemented by `method_missing` are now supported by `respond_to?`.

Fixes issue #9202.

* Fix null pointer exceptions exposed by new regression tests.
* Fix clear_ on oneofs so that it is safe to call repeatedly and so that respond_to? does not depend on whether the oneof is currently cleared.
* Code cleanup: reenable more tests on JRuby.
* Align JRuby behavior with CRuby by throwing a RuntimeError when attempting to assign to a oneof.

(cherry picked from commit 8e7f936696)

* Update protobuf version

* Merge pull request #9727 from mlocati/build-packaged-php-extension

Fix building packaged PHP extension

(cherry picked from commit 7f9901c5f6)

* Update protobuf version

* Update changelogs for 3.20.1-rc1

Co-authored-by: Jason Lunn <jason.lunn@gmail.com>
Co-authored-by: Jorg Brown <jorg.brown@gmail.com>
2022-04-07 18:33:58 -04:00
..
compatibility_tests/v3.0.0 Cherry-pick to get Ruby 3.1 support in protobuf 3.20.0 (#9657) 2022-03-21 15:26:27 -07:00
ext/google/protobuf_c Updated Ruby to the latest upb. (#9589) (#9630) 2022-03-14 14:06:36 -07:00
lib/google Avoid negative indexes for JRuby 2022-04-06 15:49:08 -04:00
src/main Run all JRuby source files through google-java-format. 2022-03-28 18:58:54 -04:00
tests [Ruby] Fix RepeatedField#last, #first inconsistencies 2022-04-01 17:09:22 -04:00
.gitignore Add wrapper type helpers for Ruby (#5739) 2019-03-27 09:44:43 -07:00
Gemfile Cherry-pick fix from #9311 into 3.18.x (#9320) 2021-12-22 15:01:34 -08:00
google-protobuf.gemspec Merge 3.20.1-rc1 into main (#9760) 2022-04-07 18:33:58 -04:00
pom.xml Merge 3.20.1-rc1 into main (#9760) 2022-04-07 18:33:58 -04:00
Rakefile Cherry-pick to get Ruby 3.1 support in protobuf 3.20.0 (#9657) 2022-03-21 15:26:27 -07:00
README.md delete all duplicate empty blanks (#5758) 2019-02-20 19:28:50 -08:00
travis-test.sh Add JRuby test targets for JRuby 9.2.x and 9.3.x. 2021-10-07 18:56:14 -04:00

This directory contains the Ruby extension that implements Protocol Buffers functionality in Ruby.

The Ruby extension makes use of generated Ruby code that defines message and enum types in a Ruby DSL. You may write definitions in this DSL directly, but we recommend using protoc's Ruby generation support with .proto files. The build process in this directory only installs the extension; you need to install protoc as well to have Ruby code generation functionality.

Installation from Gem

In Gemfile (Please check a version of Protocol Buffers you needed RubyGems):

gem 'google-protobuf'

Or for using this pre-packaged gem, simply install it as you would any other gem:

$ gem install [--prerelease] google-protobuf

Once the gem is installed, you may or may not need protoc. If you write your message type descriptions directly in the Ruby DSL, you do not need it. However, if you wish to generate the Ruby DSL from a .proto file, you will also want to install Protocol Buffers itself, as described in this repository's main README file. The version of protoc included in the latest release supports the --ruby_out option to generate Ruby code.

A simple example of using the Ruby extension follows. More extensive documentation may be found in the RubyDoc comments (call-seq tags) in the source, and we plan to release separate, more detailed, documentation at a later date.

require 'google/protobuf'

# generated from my_proto_types.proto with protoc:
#  $ protoc --ruby_out=. my_proto_types.proto
require 'my_proto_types'

mymessage = MyTestMessage.new(:field1 => 42, :field2 => ["a", "b", "c"])
mymessage.field1 = 43
mymessage.field2.push("d")
mymessage.field3 = SubMessage.new(:foo => 100)

encoded_data = MyTestMessage.encode(mymessage)
decoded = MyTestMessage.decode(encoded_data)
assert decoded == mymessage

puts "JSON:"
puts MyTestMessage.encode_json(mymessage)

Installation from Source (Building Gem)

To build this Ruby extension, you will need:

  • Rake
  • Bundler
  • Ruby development headers
  • a C compiler

To Build the JRuby extension, you will need:

  • Maven
  • The latest version of the protobuf java library (see ../java/README.md)
  • Install JRuby via rbenv or RVM

First switch to the desired platform with rbenv or RVM.

Then install the required Ruby gems:

$ gem install bundler
$ bundle

Then build the Gem:

$ rake
$ rake clobber_package gem
$ gem install `ls pkg/google-protobuf-*.gem`

To run the specs:

$ rake test

This gem includes the upb parsing and serialization library as a single-file amalgamation. It is up-to-date with upb git commit 535bc2fe2f2b467f59347ffc9449e11e47791257.

Version Number Scheme

We are using a version number scheme that is a hybrid of Protocol Buffers' overall version number and some Ruby-specific rules. Gem does not allow re-uploads of a gem with the same version number, so we add a sequence number ("upload version") to the version. We also format alphabetical tags (alpha, pre, ...) slightly differently, and we avoid hyphens. In more detail:

  • First, we determine the prefix: a Protocol Buffers version "3.0.0-alpha-2" becomes "3.0.0.alpha.2". When we release 3.0.0, this prefix will be simply "3.0.0".
  • We then append the upload version: "3.0.0.alpha.2.0" or "3.0.0.0". If we need to upload a new version of the gem to fix an issue, the version becomes "3.0.0.alpha.2.1" or "3.0.0.1".
  • If we are working on a prerelease version, we append a prerelease tag: "3.0.0.alpha.3.0.pre". The prerelease tag comes at the end so that when version numbers are sorted, any prerelease builds are ordered between the prior version and current version.

These rules are designed to work with the sorting rules for Gem::Version: release numbers should sort in actual release order.