diff --git a/examples/Makefile b/examples/Makefile index ef7a4ef58e..f7ee9b116d 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -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 diff --git a/examples/add_person.rb b/examples/add_person.rb new file mode 100755 index 0000000000..35b6db9de9 --- /dev/null +++ b/examples/add_person.rb @@ -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 diff --git a/examples/list_people.rb b/examples/list_people.rb new file mode 100755 index 0000000000..fa633615aa --- /dev/null +++ b/examples/list_people.rb @@ -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)