Browse Source

Add example in ruby (#11717)

examples directory was missing an example in ruby, this PR aims to fix this.

Closes #11717

COPYBARA_INTEGRATE_REVIEW=https://github.com/protocolbuffers/protobuf/pull/11717 from mlitwiniuk:ruby_example 14a5d1a34a
PiperOrigin-RevId: 514756892
pull/12103/head
Maciej Litwiniuk 1 year ago
committed by Copybara-Service
parent
commit
ff5007f929
3 changed files with 138 additions and 2 deletions
  1. +19
    -2
      examples/Makefile
  2. +77
    -0
      examples/add_person.rb
  3. +42
    -0
      examples/list_people.rb

+ 19
- 2
examples/Makefile View File

@ -10,11 +10,12 @@ go: add_person_go list_people_go
gotest: add_person_gotest list_people_gotest
java: add_person_java list_people_java
python: add_person_python list_people_python
ruby: add_person_ruby list_people_ruby
clean:
rm -f add_person_cpp list_people_cpp add_person_java list_people_java add_person_python list_people_python
rm -f add_person_cpp list_people_cpp add_person_java list_people_java add_person_python list_people_python add_person_ruby list_people_ruby
rm -f javac_middleman AddPerson*.class ListPeople*.class com/example/tutorial/protos/*.class
rm -f protoc_middleman addressbook.pb.cc addressbook.pb.h addressbook_pb2.py com/example/tutorial/protos/*.java
rm -f protoc_middleman protoc_middleman_ruby addressbook.pb.cc addressbook.pb.h addressbook_pb2.py addressbook_pb.rb com/example/tutorial/protos/*.java
rm -f *.pyc
rm -f go/tutorialpb/*.pb.go add_person_go list_people_go
rm -f protoc_middleman_dart dart_tutorial/*.pb*.dart
@ -39,6 +40,10 @@ protoc_middleman_dart: addressbook.proto
pub get
@touch protoc_middleman_dart
protoc_middleman_ruby: addressbook.proto
protoc $$PROTO_PATH --ruby_out=. addressbook.proto
@touch protoc_middleman_ruby
add_person_cpp: add_person.cc protoc_middleman
pkg-config --cflags protobuf # fails if protobuf is not installed
c++ -std=c++14 add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf`
@ -90,3 +95,15 @@ list_people_python: list_people.py protoc_middleman
@echo '#! /bin/sh' > list_people_python
@echo './list_people.py "$$@"' >> list_people_python
@chmod +x list_people_python
add_person_ruby: add_person.rb protoc_middleman_ruby
@echo "Writing shortcut script add_person_ruby..."
@echo '#! /bin/sh' > add_person_ruby
@echo './add_person.rb "$$@"' >> add_person_ruby
@chmod +x add_person_ruby
list_people_ruby: list_people.rb protoc_middleman_ruby
@echo "Writing shortcut script list_people_ruby..."
@echo '#! /bin/sh' > list_people_ruby
@echo './list_people.rb "$$@"' >> list_people_ruby
@chmod +x list_people_ruby

+ 77
- 0
examples/add_person.rb View File

@ -0,0 +1,77 @@
#! /usr/bin/env ruby
# See README.md for information and build instructions.
require './addressbook_pb'
require 'pry'
# creates Person object and fills it with data from user input
def prompt_for_address()
person = Tutorial::Person.newlD()
puts "Enter person ID number:"
person.id = STDIN.gets.chomp.to_i
puts "Enter name:"
person.name = STDIN.gets.chomp
puts "Enter email address (blank for none):"
email = STDIN.gets.chomp
if email != ""
person.email = email
end
loop do
puts "Enter a phone number (or leave blank to finish):"
number = STDIN.gets.chomp
if number == ""
break
end
phone_number = Tutorial::Person::PhoneNumber.new(number: number)
puts "Is this a mobile, home or work phone?"
type = STDIN.gets.chomp
case type
when "mobile"
phone_number.type = :MOBILE
when "home"
phone_number.type = :HOME
when "work"
phone_number.type = :WORK
else
puts "Unknown phone type; leaving as default value."
end
person.phones.push(phone_number)
end
person
end
# Main procedure: Reads the entire address book from a file,
# adds one person based on user input, then writes it back out to the same
# file.
if ARGV.length != 1
puts "Usage: #{$0} ADDRESS_BOOK_FILE"
exit(-1)
end
address_book = Tutorial::AddressBook.new()
if File.exist?(ARGV[0])
# Read the existing address book if it exists
f = File.open(ARGV[0], "rb")
address_book = Tutorial::AddressBook.decode(f.read)
f.close
else
puts "#{$PROGRAM_NAME}: File not found. Creating new file."
end
person = prompt_for_address
# Add an address.
address_book.people.push(person)
# Write the new address book back to disk.
f = File.open(ARGV[0], "wb")
f.write(Tutorial::AddressBook.encode(address_book))
f.close

+ 42
- 0
examples/list_people.rb View File

@ -0,0 +1,42 @@
#! /usr/bin/env ruby
require './addressbook_pb'
require 'pry'
# Iterates though all people in the AddressBook and prints info about them.
def list_people(address_book)
address_book.people.each do |person|
puts "Person ID: #{person.id}"
puts " Name: #{person.name}"
if person.email != ""
puts " Email: #{person.email}"
end
person.phones.each do |phone_number|
type =
case phone_number.type
when :MOBILE
"Mobile phone"
when :HOME
"Home phone"
when :WORK
"Work phone"
end
puts " #{type} #: #{phone_number.number}"
end
end
end
# Main procedure: Reads the entire address book from a file and prints all
# the information inside.
if ARGV.length != 1
puts "Usage: #{$PROGRAM_NAME} ADDRESS_BOOK_FILE"
exit(-1)
end
# Read the existing address book.
f = File.open(ARGV[0], "rb")
address_book = Tutorial::AddressBook.decode(f.read)
f.close
list_people(address_book)

Loading…
Cancel
Save