diff options
author | Bo Yang <paulyang1211@gmail.com> | 2018-01-23 15:46:06 -0800 |
---|---|---|
committer | Bo Yang <paulyang1211@gmail.com> | 2018-01-23 15:46:06 -0800 |
commit | 99002ae47a3f88f64ff44dbd80452360e0e5fbc4 (patch) | |
tree | c711557f45024c07f22148bd7f8dc31d61081271 /examples | |
parent | a721bf6d294915b412e4ba6b5d92a9b84c6bfef9 (diff) | |
download | protobuf-99002ae47a3f88f64ff44dbd80452360e0e5fbc4.tar.gz protobuf-99002ae47a3f88f64ff44dbd80452360e0e5fbc4.tar.bz2 protobuf-99002ae47a3f88f64ff44dbd80452360e0e5fbc4.zip |
Initialize python-wheel branch
Diffstat (limited to 'examples')
-rw-r--r-- | examples/AddPerson.java | 95 | ||||
-rw-r--r-- | examples/BUILD | 101 | ||||
-rw-r--r-- | examples/CMakeLists.txt | 48 | ||||
-rw-r--r-- | examples/ListPeople.java | 53 | ||||
-rw-r--r-- | examples/Makefile | 79 | ||||
-rw-r--r-- | examples/README.md | 124 | ||||
-rw-r--r-- | examples/WORKSPACE | 35 | ||||
-rw-r--r-- | examples/add_person.cc | 102 | ||||
-rw-r--r-- | examples/add_person.go | 133 | ||||
-rwxr-xr-x | examples/add_person.py | 63 | ||||
-rw-r--r-- | examples/add_person_test.go | 58 | ||||
-rw-r--r-- | examples/addressbook.proto | 51 | ||||
-rw-r--r-- | examples/list_people.cc | 79 | ||||
-rw-r--r-- | examples/list_people.go | 61 | ||||
-rwxr-xr-x | examples/list_people.py | 40 | ||||
-rw-r--r-- | examples/list_people_test.go | 120 |
16 files changed, 0 insertions, 1242 deletions
diff --git a/examples/AddPerson.java b/examples/AddPerson.java deleted file mode 100644 index c262ab7e..00000000 --- a/examples/AddPerson.java +++ /dev/null @@ -1,95 +0,0 @@ -// See README.txt for information and build instructions. - -import com.example.tutorial.AddressBookProtos.AddressBook; -import com.example.tutorial.AddressBookProtos.Person; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.InputStreamReader; -import java.io.IOException; -import java.io.PrintStream; - -class AddPerson { - // This function fills in a Person message based on user input. - static Person PromptForAddress(BufferedReader stdin, - PrintStream stdout) throws IOException { - Person.Builder person = Person.newBuilder(); - - stdout.print("Enter person ID: "); - person.setId(Integer.valueOf(stdin.readLine())); - - stdout.print("Enter name: "); - person.setName(stdin.readLine()); - - stdout.print("Enter email address (blank for none): "); - String email = stdin.readLine(); - if (email.length() > 0) { - person.setEmail(email); - } - - while (true) { - stdout.print("Enter a phone number (or leave blank to finish): "); - String number = stdin.readLine(); - if (number.length() == 0) { - break; - } - - Person.PhoneNumber.Builder phoneNumber = - Person.PhoneNumber.newBuilder().setNumber(number); - - stdout.print("Is this a mobile, home, or work phone? "); - String type = stdin.readLine(); - if (type.equals("mobile")) { - phoneNumber.setType(Person.PhoneType.MOBILE); - } else if (type.equals("home")) { - phoneNumber.setType(Person.PhoneType.HOME); - } else if (type.equals("work")) { - phoneNumber.setType(Person.PhoneType.WORK); - } else { - stdout.println("Unknown phone type. Using default."); - } - - person.addPhones(phoneNumber); - } - - return person.build(); - } - - // Main function: Reads the entire address book from a file, - // adds one person based on user input, then writes it back out to the same - // file. - public static void main(String[] args) throws Exception { - if (args.length != 1) { - System.err.println("Usage: AddPerson ADDRESS_BOOK_FILE"); - System.exit(-1); - } - - AddressBook.Builder addressBook = AddressBook.newBuilder(); - - // Read the existing address book. - try { - FileInputStream input = new FileInputStream(args[0]); - try { - addressBook.mergeFrom(input); - } finally { - try { input.close(); } catch (Throwable ignore) {} - } - } catch (FileNotFoundException e) { - System.out.println(args[0] + ": File not found. Creating a new file."); - } - - // Add an address. - addressBook.addPeople( - PromptForAddress(new BufferedReader(new InputStreamReader(System.in)), - System.out)); - - // Write the new address book back to disk. - FileOutputStream output = new FileOutputStream(args[0]); - try { - addressBook.build().writeTo(output); - } finally { - output.close(); - } - } -} diff --git a/examples/BUILD b/examples/BUILD deleted file mode 100644 index d5d5d9a5..00000000 --- a/examples/BUILD +++ /dev/null @@ -1,101 +0,0 @@ -# This BUILD file shows how to use protobuf with bazel. Before you can use -# proto_library/<lang>_proto_library rules in a BUILD file, you need to -# include protobuf repo as remote repositories in your WORKSPACE file. See -# the WORKSPACE file in the same directory with this BUILD file for an -# example. - -# For each .proto file, a proto_library target should be defined. This target -# is not bound to any particular language. Instead, it defines the dependency -# graph of the .proto files (i.e., proto imports) and serves as the provider -# of .proto source files to the protocol compiler. -# -# Remote repository "com_google_protobuf" must be defined to use this rule. -proto_library( - name = "addressbook_proto", - srcs = ["addressbook.proto"], - deps = ["@com_google_protobuf//:timestamp_proto"], -) - -# The cc_proto_library rule generates C++ code for a proto_library rule. It -# must have exactly one proto_library dependency. If you want to use multiple -# proto_library targets, create a separate cc_proto_library target for each -# of them. -# -# Remote repository "com_google_protobuf_cc" must be defined to use this rule. -cc_proto_library( - name = "addressbook_cc_proto", - deps = [":addressbook_proto"], -) - -# cc_library/cc_binary targets can depend on cc_proto_library targets. -cc_binary( - name = "add_person_cpp", - srcs = ["add_person.cc"], - deps = [":addressbook_cc_proto"], -) - -cc_binary( - name = "list_people_cpp", - srcs = ["list_people.cc"], - deps = [":addressbook_cc_proto"], -) - -# Similar to cc_proto_library but for Java. -# -# Remote repository "com_google_protobuf_java" must be defined to use this rule. -java_proto_library( - name = "addressbook_java_proto", - deps = [":addressbook_proto"], -) - -java_binary( - name = "add_person_java", - srcs = ["AddPerson.java"], - main_class = "AddPerson", - deps = [":addressbook_java_proto"], -) - -java_binary( - name = "list_people_java", - srcs = ["ListPeople.java"], - main_class = "ListPeople", - deps = [":addressbook_java_proto"], -) - -# Java lite. -# -# Remote repository "com_google_protobuf_javalite" must be defined to use this -# rule. -java_lite_proto_library( - name = "addressbook_java_lite_proto", - deps = [":addressbook_proto"], -) - -# Java lite API is a subset of the regular Java API so if you only uses this -# subset in your code, you can actually compile your code against both (i.e., -# share code between server build and Android build). -# -# The lite version has a smaller code size, and you can see that by comparing -# the resulted .jar file: -# -# $ bazel build :add_person_java_deploy.jar :add_person_java_lite_deploy.jar -# $ ls -l bazel-bin/*_deploy.jar -# -r-xr-xr-x 1 xiaofeng eng 1230797 Sep 8 12:24 bazel-bin/add_person_java_deploy.jar -# -r-xr-xr-x 1 xiaofeng eng 236166 Sep 8 12:24 bazel-bin/add_person_java_lite_deploy.jar -# -# In the above example, the lite .jar file is 6 times smaller. With proper -# proguard inlining/stripping, the difference can be much more larger than -# that. -java_binary( - name = "add_person_java_lite", - srcs = ["AddPerson.java"], - main_class = "AddPerson", - deps = [":addressbook_java_lite_proto"], -) - -java_binary( - name = "list_people_java_lite", - srcs = ["ListPeople.java"], - main_class = "ListPeople", - deps = [":addressbook_java_lite_proto"], -) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt deleted file mode 100644 index 3e8e6541..00000000 --- a/examples/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -# Minimum CMake required -cmake_minimum_required(VERSION 2.8.12) - -# Project -project(protobuf-examples) - -# Find required protobuf package -find_package(protobuf CONFIG REQUIRED) - -if(protobuf_VERBOSE) - message(STATUS "Using Protocol Buffers ${Protobuf_VERSION}") -endif() - -set(CMAKE_INCLUDE_CURRENT_DIR TRUE) - -# http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F -if(MSVC AND protobuf_MSVC_STATIC_RUNTIME) - foreach(flag_var - CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) - if(${flag_var} MATCHES "/MD") - string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") - endif(${flag_var} MATCHES "/MD") - endforeach() -endif() - -foreach(example add_person list_people) - set(${example}_SRCS ${example}.cc) - set(${example}_PROTOS addressbook.proto) - - #Code Generation - if(protobuf_MODULE_COMPATIBLE) #Legacy Support - protobuf_generate_cpp(${example}_PROTO_SRCS ${example}_PROTO_HDRS ${${example}_PROTOS}) - list(APPEND ${example}_SRCS ${${example}_PROTO_SRCS} ${${example}_PROTO_HDRS}) - endif() - - #Executable setup - set(executable_name ${example}_cpp) - add_executable(${executable_name} ${${example}_SRCS} ${${example}_PROTOS}) - if(protobuf_MODULE_COMPATIBLE) #Legacy mode - target_include_directories(${executable_name} PUBLIC ${PROTOBUF_INCLUDE_DIRS}) - target_link_libraries(${executable_name} ${PROTOBUF_LIBRARIES}) - else() - target_link_libraries(${executable_name} protobuf::libprotobuf) - protobuf_generate(TARGET ${executable_name}) - endif() - -endforeach() diff --git a/examples/ListPeople.java b/examples/ListPeople.java deleted file mode 100644 index 580f7ac2..00000000 --- a/examples/ListPeople.java +++ /dev/null @@ -1,53 +0,0 @@ -// See README.txt for information and build instructions. - -import com.example.tutorial.AddressBookProtos.AddressBook; -import com.example.tutorial.AddressBookProtos.Person; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.PrintStream; - -class ListPeople { - // Iterates though all people in the AddressBook and prints info about them. - static void Print(AddressBook addressBook) { - for (Person person: addressBook.getPeopleList()) { - System.out.println("Person ID: " + person.getId()); - System.out.println(" Name: " + person.getName()); - if (!person.getEmail().isEmpty()) { - System.out.println(" E-mail address: " + person.getEmail()); - } - - for (Person.PhoneNumber phoneNumber : person.getPhonesList()) { - switch (phoneNumber.getType()) { - case MOBILE: - System.out.print(" Mobile phone #: "); - break; - case HOME: - System.out.print(" Home phone #: "); - break; - case WORK: - System.out.print(" Work phone #: "); - break; - default: - System.out.println(" Unknown phone #: "); - break; - } - System.out.println(phoneNumber.getNumber()); - } - } - } - - // Main function: Reads the entire address book from a file and prints all - // the information inside. - public static void main(String[] args) throws Exception { - if (args.length != 1) { - System.err.println("Usage: ListPeople ADDRESS_BOOK_FILE"); - System.exit(-1); - } - - // Read the existing address book. - AddressBook addressBook = - AddressBook.parseFrom(new FileInputStream(args[0])); - - Print(addressBook); - } -} diff --git a/examples/Makefile b/examples/Makefile deleted file mode 100644 index 1ff7fa7f..00000000 --- a/examples/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# See README.txt. - -.PHONY: all cpp java python clean - -all: cpp java python - -cpp: add_person_cpp list_people_cpp -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 - -clean: - rm -f add_person_cpp list_people_cpp add_person_java list_people_java add_person_python list_people_python - rm -f javac_middleman AddPerson*.class ListPeople*.class com/example/tutorial/*.class - rm -f protoc_middleman addressbook.pb.cc addressbook.pb.h addressbook_pb2.py com/example/tutorial/AddressBookProtos.java - rm -f *.pyc - rm -f protoc_middleman_go tutorial/*.pb.go add_person_go list_people_go - rmdir tutorial 2>/dev/null || true - rmdir com/example/tutorial 2>/dev/null || true - rmdir com/example 2>/dev/null || true - rmdir com 2>/dev/null || true - -protoc_middleman: addressbook.proto - protoc $$PROTO_PATH --cpp_out=. --java_out=. --python_out=. addressbook.proto - @touch protoc_middleman - -protoc_middleman_go: addressbook.proto - mkdir -p tutorial # make directory for go package - protoc $$PROTO_PATH --go_out=tutorial addressbook.proto - @touch protoc_middleman_go - -add_person_cpp: add_person.cc protoc_middleman - pkg-config --cflags protobuf # fails if protobuf is not installed - c++ add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf` - -list_people_cpp: list_people.cc protoc_middleman - pkg-config --cflags protobuf # fails if protobuf is not installed - c++ list_people.cc addressbook.pb.cc -o list_people_cpp `pkg-config --cflags --libs protobuf` - -add_person_go: add_person.go protoc_middleman_go - go build -o add_person_go add_person.go - -add_person_gotest: add_person_test.go add_person_go - go test add_person.go add_person_test.go - -list_people_go: list_people.go protoc_middleman_go - go build -o list_people_go list_people.go - -list_people_gotest: list_people.go list_people_go - go test list_people.go list_people_test.go - -javac_middleman: AddPerson.java ListPeople.java protoc_middleman - javac -cp $$CLASSPATH AddPerson.java ListPeople.java com/example/tutorial/AddressBookProtos.java - @touch javac_middleman - -add_person_java: javac_middleman - @echo "Writing shortcut script add_person_java..." - @echo '#! /bin/sh' > add_person_java - @echo 'java -classpath .:$$CLASSPATH AddPerson "$$@"' >> add_person_java - @chmod +x add_person_java - -list_people_java: javac_middleman - @echo "Writing shortcut script list_people_java..." - @echo '#! /bin/sh' > list_people_java - @echo 'java -classpath .:$$CLASSPATH ListPeople "$$@"' >> list_people_java - @chmod +x list_people_java - -add_person_python: add_person.py protoc_middleman - @echo "Writing shortcut script add_person_python..." - @echo '#! /bin/sh' > add_person_python - @echo './add_person.py "$$@"' >> add_person_python - @chmod +x add_person_python - -list_people_python: list_people.py protoc_middleman - @echo "Writing shortcut script list_people_python..." - @echo '#! /bin/sh' > list_people_python - @echo './list_people.py "$$@"' >> list_people_python - @chmod +x list_people_python diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 20f285cd..00000000 --- a/examples/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# Protocol Buffers - Code Example - -This directory contains example code that uses Protocol Buffers to manage an -address book. Two programs are provided for each supported language. The -add_person example adds a new person to an address book, prompting the user to -input the person's information. The list_people example lists people already in -the address book. The examples use the exact same format in all three languages, -so you can, for example, use add_person_java to create an address book and then -use list_people_python to read it. - -These examples are part of the Protocol Buffers tutorial, located at: - https://developers.google.com/protocol-buffers/docs/tutorials - -## Build the example using bazel - -The example requires bazel 0.5.4 or newer to build. You can download/install -the latest version of bazel from bazel's release page: - - https://github.com/bazelbuild/bazel/releases - -Once you have bazel installed, simply run the following command in this examples -directory to build the code: - - $ bazel build :all - -Then you can run the built binary: - - $ bazel-bin/add_person_cpp addressbook.data - -To use protobuf in your own bazel project, please follow instructions in the -[BUILD](BUILD) file and [WORKSPACE](WORKSPACE) file. - -## Build the example using make - -You must install the protobuf package before you can build it using make. The -minimum requirement is to install protocol compiler (i.e., the protoc binary) -and the protobuf runtime for the language you want to build. - -You can simply run "make" to build the example for all languages (except for -Go). However, since different language has different installation requirement, -it will likely fail. It's better to follow individual instrutions below to -build only the language you are interested in. - -### C++ - -You can follow instructions in [../src/README.md](../src/README.md) to install -protoc and protobuf C++ runtime from source. - -Then run "make cpp" in this examples directory to build the C++ example. It -will create two executables: add_person_cpp and list_people_cpp. These programs -simply take an address book file as their parameter. The add_person_cpp -programs will create the file if it doesn't already exist. - -To run the examples: - - $ ./add_person_cpp addressbook.data - $ ./list_people_cpp addressbook.data - -Note that on some platforms you may have to edit the Makefile and remove -"-lpthread" from the linker commands (perhaps replacing it with something else). -We didn't do this automatically because we wanted to keep the example simple. - -### Python - -Follow instructions in [../README.md](../README.md) to install protoc and then -follow [../python/README.md](../python/README.md) to install protobuf python -runtime from source. You can also install python runtime using pip: - - $ pip install protobuf - -Make sure the runtime version is the same as protoc binary, or it may not work. - -After you have install both protoc and python runtime, run "make python" to -build two executables (shell scripts actually): add_person_python and -list_people_python. They work the same way as the C++ executables. - -### Java - -Follow instructions in [../README.md](../README.md) to install protoc and then -download protobuf Java runtime .jar file from maven: - - https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java - -Then run the following: - - $ export CLASSPATH=/path/to/protobuf-java-[version].jar - $ make java - -This will create the add_person_java/list_people_java executables (shell -scripts) and can be used to create/display an address book data file. - -### Go - -The Go example requires a plugin to the protocol buffer compiler, so it is not -build with all the other examples. See: - - https://github.com/golang/protobuf - -for more information about Go protocol buffer support. - -First, install the Protocol Buffers compiler (protoc). - -Then, install the Go Protocol Buffers plugin ($GOPATH/bin must be in your $PATH -for protoc to find it): - - go get github.com/golang/protobuf/protoc-gen-go - -Build the Go samples in this directory with "make go". This creates the -following executable files in the current directory: - - add_person_go list_people_go - -To run the example: - - ./add_person_go addressbook.data - -to add a person to the protocol buffer encoded file addressbook.data. The file -is created if it does not exist. To view the data, run: - - ./list_people_go addressbook.data - -Observe that the C++, Python, and Java examples in this directory run in a -similar way and can view/modify files created by the Go example and vice -versa. diff --git a/examples/WORKSPACE b/examples/WORKSPACE deleted file mode 100644 index 936f2441..00000000 --- a/examples/WORKSPACE +++ /dev/null @@ -1,35 +0,0 @@ -# This com_google_protobuf repository is required for proto_library rule. -# It provides the protocol compiler binary (i.e., protoc). -http_archive( - name = "com_google_protobuf", - strip_prefix = "protobuf-master", - urls = ["https://github.com/google/protobuf/archive/master.zip"], -) -load("@com_google_protobuf//:protobuf.bzl", "check_protobuf_required_bazel_version") -check_protobuf_required_bazel_version() - -# This com_google_protobuf_cc repository is required for cc_proto_library -# rule. It provides protobuf C++ runtime. Note that it actually is the same -# repo as com_google_protobuf but has to be given a different name as -# required by bazel. -http_archive( - name = "com_google_protobuf_cc", - strip_prefix = "protobuf-master", - urls = ["https://github.com/google/protobuf/archive/master.zip"], -) - -# Similar to com_google_protobuf_cc but for Java (i.e., java_proto_library). -http_archive( - name = "com_google_protobuf_java", - strip_prefix = "protobuf-master", - urls = ["https://github.com/google/protobuf/archive/master.zip"], -) - -# Similar to com_google_protobuf_cc but for Java lite. If you are building -# for Android, the lite version should be prefered because it has a much -# smaller code size. -http_archive( - name = "com_google_protobuf_javalite", - strip_prefix = "protobuf-javalite", - urls = ["https://github.com/google/protobuf/archive/javalite.zip"], -) diff --git a/examples/add_person.cc b/examples/add_person.cc deleted file mode 100644 index 856e90bb..00000000 --- a/examples/add_person.cc +++ /dev/null @@ -1,102 +0,0 @@ -// See README.txt for information and build instructions. - -#include <ctime> -#include <fstream> -#include <google/protobuf/util/time_util.h> -#include <iostream> -#include <string> - -#include "addressbook.pb.h" - -using namespace std; - -using google::protobuf::util::TimeUtil; - -// This function fills in a Person message based on user input. -void PromptForAddress(tutorial::Person* person) { - cout << "Enter person ID number: "; - int id; - cin >> id; - person->set_id(id); - cin.ignore(256, '\n'); - - cout << "Enter name: "; - getline(cin, *person->mutable_name()); - - cout << "Enter email address (blank for none): "; - string email; - getline(cin, email); - if (!email.empty()) { - person->set_email(email); - } - - while (true) { - cout << "Enter a phone number (or leave blank to finish): "; - string number; - getline(cin, number); - if (number.empty()) { - break; - } - - tutorial::Person::PhoneNumber* phone_number = person->add_phones(); - phone_number->set_number(number); - - cout << "Is this a mobile, home, or work phone? "; - string type; - getline(cin, type); - if (type == "mobile") { - phone_number->set_type(tutorial::Person::MOBILE); - } else if (type == "home") { - phone_number->set_type(tutorial::Person::HOME); - } else if (type == "work") { - phone_number->set_type(tutorial::Person::WORK); - } else { - cout << "Unknown phone type. Using default." << endl; - } - } - *person->mutable_last_updated() = TimeUtil::SecondsToTimestamp(time(NULL)); -} - -// Main function: Reads the entire address book from a file, -// adds one person based on user input, then writes it back out to the same -// file. -int main(int argc, char* argv[]) { - // Verify that the version of the library that we linked against is - // compatible with the version of the headers we compiled against. - GOOGLE_PROTOBUF_VERIFY_VERSION; - - if (argc != 2) { - cerr << "Usage: " << argv[0] << " ADDRESS_BOOK_FILE" << endl; - return -1; - } - - tutorial::AddressBook address_book; - - { - // Read the existing address book. - fstream input(argv[1], ios::in | ios::binary); - if (!input) { - cout << argv[1] << ": File not found. Creating a new file." << endl; - } else if (!address_book.ParseFromIstream(&input)) { - cerr << "Failed to parse address book." << endl; - return -1; - } - } - - // Add an address. - PromptForAddress(address_book.add_people()); - - { - // Write the new address book back to disk. - fstream output(argv[1], ios::out | ios::trunc | ios::binary); - if (!address_book.SerializeToOstream(&output)) { - cerr << "Failed to write address book." << endl; - return -1; - } - } - - // Optional: Delete all global objects allocated by libprotobuf. - google::protobuf::ShutdownProtobufLibrary(); - - return 0; -} diff --git a/examples/add_person.go b/examples/add_person.go deleted file mode 100644 index 4f2e7f74..00000000 --- a/examples/add_person.go +++ /dev/null @@ -1,133 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "strings" - - "github.com/golang/protobuf/proto" - pb "github.com/google/protobuf/examples/tutorial" -) - -func promptForAddress(r io.Reader) (*pb.Person, error) { - // A protocol buffer can be created like any struct. - p := &pb.Person{} - - rd := bufio.NewReader(r) - fmt.Print("Enter person ID number: ") - // An int32 field in the .proto file is represented as an int32 field - // in the generated Go struct. - if _, err := fmt.Fscanf(rd, "%d\n", &p.Id); err != nil { - return p, err - } - - fmt.Print("Enter name: ") - name, err := rd.ReadString('\n') - if err != nil { - return p, err - } - // A string field in the .proto file results in a string field in Go. - // We trim the whitespace because rd.ReadString includes the trailing - // newline character in its output. - p.Name = strings.TrimSpace(name) - - fmt.Print("Enter email address (blank for none): ") - email, err := rd.ReadString('\n') - if err != nil { - return p, err - } - p.Email = strings.TrimSpace(email) - - for { - fmt.Print("Enter a phone number (or leave blank to finish): ") - phone, err := rd.ReadString('\n') - if err != nil { - return p, err - } - phone = strings.TrimSpace(phone) - if phone == "" { - break - } - // The PhoneNumber message type is nested within the Person - // message in the .proto file. This results in a Go struct - // named using the name of the parent prefixed to the name of - // the nested message. Just as with pb.Person, it can be - // created like any other struct. - pn := &pb.Person_PhoneNumber{ - Number: phone, - } - - fmt.Print("Is this a mobile, home, or work phone? ") - ptype, err := rd.ReadString('\n') - if err != nil { - return p, err - } - ptype = strings.TrimSpace(ptype) - - // A proto enum results in a Go constant for each enum value. - switch ptype { - case "mobile": - pn.Type = pb.Person_MOBILE - case "home": - pn.Type = pb.Person_HOME - case "work": - pn.Type = pb.Person_WORK - default: - fmt.Printf("Unknown phone type %q. Using default.\n", ptype) - } - - // A repeated proto field maps to a slice field in Go. We can - // append to it like any other slice. - p.Phones = append(p.Phones, pn) - } - - return p, nil -} - -// Main reads the entire address book from a file, adds one person based on -// user input, then writes it back out to the same file. -func main() { - if len(os.Args) != 2 { - log.Fatalf("Usage: %s ADDRESS_BOOK_FILE\n", os.Args[0]) - } - fname := os.Args[1] - - // Read the existing address book. - in, err := ioutil.ReadFile(fname) - if err != nil { - if os.IsNotExist(err) { - fmt.Printf("%s: File not found. Creating new file.\n", fname) - } else { - log.Fatalln("Error reading file:", err) - } - } - - // [START marshal_proto] - book := &pb.AddressBook{} - // [START_EXCLUDE] - if err := proto.Unmarshal(in, book); err != nil { - log.Fatalln("Failed to parse address book:", err) - } - - // Add an address. - addr, err := promptForAddress(os.Stdin) - if err != nil { - log.Fatalln("Error with address:", err) - } - book.People = append(book.People, addr) - // [END_EXCLUDE] - - // Write the new address book back to disk. - out, err := proto.Marshal(book) - if err != nil { - log.Fatalln("Failed to encode address book:", err) - } - if err := ioutil.WriteFile(fname, out, 0644); err != nil { - log.Fatalln("Failed to write address book:", err) - } - // [END marshal_proto] -} diff --git a/examples/add_person.py b/examples/add_person.py deleted file mode 100755 index aa0fbca7..00000000 --- a/examples/add_person.py +++ /dev/null @@ -1,63 +0,0 @@ -#! /usr/bin/env python - -# See README.txt for information and build instructions. - -import addressbook_pb2 -import sys - -try: - raw_input # Python 2 -except NameError: - raw_input = input # Python 3 - - -# This function fills in a Person message based on user input. -def PromptForAddress(person): - person.id = int(raw_input("Enter person ID number: ")) - person.name = raw_input("Enter name: ") - - email = raw_input("Enter email address (blank for none): ") - if email != "": - person.email = email - - while True: - number = raw_input("Enter a phone number (or leave blank to finish): ") - if number == "": - break - - phone_number = person.phones.add() - phone_number.number = number - - type = raw_input("Is this a mobile, home, or work phone? ") - if type == "mobile": - phone_number.type = addressbook_pb2.Person.MOBILE - elif type == "home": - phone_number.type = addressbook_pb2.Person.HOME - elif type == "work": - phone_number.type = addressbook_pb2.Person.WORK - else: - print("Unknown phone type; leaving as default value.") - - -# 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 len(sys.argv) != 2: - print("Usage:", sys.argv[0], "ADDRESS_BOOK_FILE") - sys.exit(-1) - -address_book = addressbook_pb2.AddressBook() - -# Read the existing address book. -try: - with open(sys.argv[1], "rb") as f: - address_book.ParseFromString(f.read()) -except IOError: - print(sys.argv[1] + ": File not found. Creating a new file.") - -# Add an address. -PromptForAddress(address_book.people.add()) - -# Write the new address book back to disk. -with open(sys.argv[1], "wb") as f: - f.write(address_book.SerializeToString()) diff --git a/examples/add_person_test.go b/examples/add_person_test.go deleted file mode 100644 index 0507db6f..00000000 --- a/examples/add_person_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "strings" - "testing" - - "github.com/golang/protobuf/proto" - pb "github.com/google/protobuf/examples/tutorial" -) - -func TestPromptForAddressReturnsAddress(t *testing.T) { - in := `12345 -Example Name -name@example.com -123-456-7890 -home -222-222-2222 -mobile -111-111-1111 -work -777-777-7777 -unknown - -` - got, err := promptForAddress(strings.NewReader(in)) - if err != nil { - t.Fatalf("promptForAddress(%q) had unexpected error: %s", in, err.Error()) - } - if got.Id != 12345 { - t.Errorf("promptForAddress(%q) got %d, want ID %d", in, got.Id, 12345) - } - if got.Name != "Example Name" { - t.Errorf("promptForAddress(%q) => want name %q, got %q", "Example Name", got.Name) - } - if got.Email != "name@example.com" { - t.Errorf("promptForAddress(%q) => want email %q, got %q", "name@example.com", got.Email) - } - - want := []*pb.Person_PhoneNumber{ - {Number: "123-456-7890", Type: pb.Person_HOME}, - {Number: "222-222-2222", Type: pb.Person_MOBILE}, - {Number: "111-111-1111", Type: pb.Person_WORK}, - {Number: "777-777-7777", Type: pb.Person_MOBILE}, - } - if len(got.Phones) != len(want) { - t.Errorf("want %d phone numbers, got %d", len(want), len(got.Phones)) - } - phones := len(got.Phones) - if phones > len(want) { - phones = len(want) - } - for i := 0; i < phones; i++ { - if !proto.Equal(got.Phones[i], want[i]) { - t.Errorf("want phone %q, got %q", *want[i], *got.Phones[i]) - } - - } -} diff --git a/examples/addressbook.proto b/examples/addressbook.proto deleted file mode 100644 index b4b33b4c..00000000 --- a/examples/addressbook.proto +++ /dev/null @@ -1,51 +0,0 @@ -// See README.txt for information and build instructions. -// -// Note: START and END tags are used in comments to define sections used in -// tutorials. They are not part of the syntax for Protocol Buffers. -// -// To get an in-depth walkthrough of this file and the related examples, see: -// https://developers.google.com/protocol-buffers/docs/tutorials - -// [START declaration] -syntax = "proto3"; -package tutorial; - -import "google/protobuf/timestamp.proto"; -// [END declaration] - -// [START java_declaration] -option java_package = "com.example.tutorial"; -option java_outer_classname = "AddressBookProtos"; -// [END java_declaration] - -// [START csharp_declaration] -option csharp_namespace = "Google.Protobuf.Examples.AddressBook"; -// [END csharp_declaration] - -// [START messages] -message Person { - string name = 1; - int32 id = 2; // Unique ID number for this person. - string email = 3; - - enum PhoneType { - MOBILE = 0; - HOME = 1; - WORK = 2; - } - - message PhoneNumber { - string number = 1; - PhoneType type = 2; - } - - repeated PhoneNumber phones = 4; - - google.protobuf.Timestamp last_updated = 5; -} - -// Our address book file is just one of these. -message AddressBook { - repeated Person people = 1; -} -// [END messages] diff --git a/examples/list_people.cc b/examples/list_people.cc deleted file mode 100644 index b309c596..00000000 --- a/examples/list_people.cc +++ /dev/null @@ -1,79 +0,0 @@ -// See README.txt for information and build instructions. - -#include <fstream> -#include <google/protobuf/util/time_util.h> -#include <iostream> -#include <string> - -#include "addressbook.pb.h" - -using namespace std; - -using google::protobuf::util::TimeUtil; - -// Iterates though all people in the AddressBook and prints info about them. -void ListPeople(const tutorial::AddressBook& address_book) { - for (int i = 0; i < address_book.people_size(); i++) { - const tutorial::Person& person = address_book.people(i); - - cout << "Person ID: " << person.id() << endl; - cout << " Name: " << person.name() << endl; - if (person.email() != "") { - cout << " E-mail address: " << person.email() << endl; - } - - for (int j = 0; j < person.phones_size(); j++) { - const tutorial::Person::PhoneNumber& phone_number = person.phones(j); - - switch (phone_number.type()) { - case tutorial::Person::MOBILE: - cout << " Mobile phone #: "; - break; - case tutorial::Person::HOME: - cout << " Home phone #: "; - break; - case tutorial::Person::WORK: - cout << " Work phone #: "; - break; - default: - cout << " Unknown phone #: "; - break; - } - cout << phone_number.number() << endl; - } - if (person.has_last_updated()) { - cout << " Updated: " << TimeUtil::ToString(person.last_updated()) << endl; - } - } -} - -// Main function: Reads the entire address book from a file and prints all -// the information inside. -int main(int argc, char* argv[]) { - // Verify that the version of the library that we linked against is - // compatible with the version of the headers we compiled against. - GOOGLE_PROTOBUF_VERIFY_VERSION; - - if (argc != 2) { - cerr << "Usage: " << argv[0] << " ADDRESS_BOOK_FILE" << endl; - return -1; - } - - tutorial::AddressBook address_book; - - { - // Read the existing address book. - fstream input(argv[1], ios::in | ios::binary); - if (!address_book.ParseFromIstream(&input)) { - cerr << "Failed to parse address book." << endl; - return -1; - } - } - - ListPeople(address_book); - - // Optional: Delete all global objects allocated by libprotobuf. - google::protobuf::ShutdownProtobufLibrary(); - - return 0; -} diff --git a/examples/list_people.go b/examples/list_people.go deleted file mode 100644 index 70bc589e..00000000 --- a/examples/list_people.go +++ /dev/null @@ -1,61 +0,0 @@ -package main - -import ( - "fmt" - "io" - "io/ioutil" - "log" - "os" - - "github.com/golang/protobuf/proto" - pb "github.com/google/protobuf/examples/tutorial" -) - -func writePerson(w io.Writer, p *pb.Person) { - fmt.Fprintln(w, "Person ID:", p.Id) - fmt.Fprintln(w, " Name:", p.Name) - if p.Email != "" { - fmt.Fprintln(w, " E-mail address:", p.Email) - } - - for _, pn := range p.Phones { - switch pn.Type { - case pb.Person_MOBILE: - fmt.Fprint(w, " Mobile phone #: ") - case pb.Person_HOME: - fmt.Fprint(w, " Home phone #: ") - case pb.Person_WORK: - fmt.Fprint(w, " Work phone #: ") - } - fmt.Fprintln(w, pn.Number) - } -} - -func listPeople(w io.Writer, book *pb.AddressBook) { - for _, p := range book.People { - writePerson(w, p) - } -} - -// Main reads the entire address book from a file and prints all the -// information inside. -func main() { - if len(os.Args) != 2 { - log.Fatalf("Usage: %s ADDRESS_BOOK_FILE\n", os.Args[0]) - } - fname := os.Args[1] - - // [START unmarshal_proto] - // Read the existing address book. - in, err := ioutil.ReadFile(fname) - if err != nil { - log.Fatalln("Error reading file:", err) - } - book := &pb.AddressBook{} - if err := proto.Unmarshal(in, book); err != nil { - log.Fatalln("Failed to parse address book:", err) - } - // [END unmarshal_proto] - - listPeople(os.Stdout, book) -} diff --git a/examples/list_people.py b/examples/list_people.py deleted file mode 100755 index d2c294c6..00000000 --- a/examples/list_people.py +++ /dev/null @@ -1,40 +0,0 @@ -#! /usr/bin/env python - -# See README.txt for information and build instructions. - -from __future__ import print_function -import addressbook_pb2 -import sys - - -# Iterates though all people in the AddressBook and prints info about them. -def ListPeople(address_book): - for person in address_book.people: - print("Person ID:", person.id) - print(" Name:", person.name) - if person.email != "": - print(" E-mail address:", person.email) - - for phone_number in person.phones: - if phone_number.type == addressbook_pb2.Person.MOBILE: - print(" Mobile phone #:", end=" ") - elif phone_number.type == addressbook_pb2.Person.HOME: - print(" Home phone #:", end=" ") - elif phone_number.type == addressbook_pb2.Person.WORK: - print(" Work phone #:", end=" ") - print(phone_number.number) - - -# Main procedure: Reads the entire address book from a file and prints all -# the information inside. -if len(sys.argv) != 2: - print("Usage:", sys.argv[0], "ADDRESS_BOOK_FILE") - sys.exit(-1) - -address_book = addressbook_pb2.AddressBook() - -# Read the existing address book. -with open(sys.argv[1], "rb") as f: - address_book.ParseFromString(f.read()) - -ListPeople(address_book) diff --git a/examples/list_people_test.go b/examples/list_people_test.go deleted file mode 100644 index 87d6ad6e..00000000 --- a/examples/list_people_test.go +++ /dev/null @@ -1,120 +0,0 @@ -package main - -import ( - "bytes" - "strings" - "testing" - - pb "github.com/google/protobuf/examples/tutorial" -) - -func TestWritePersonWritesPerson(t *testing.T) { - buf := new(bytes.Buffer) - // [START populate_proto] - p := pb.Person{ - Id: 1234, - Name: "John Doe", - Email: "jdoe@example.com", - Phones: []*pb.Person_PhoneNumber{ - {Number: "555-4321", Type: pb.Person_HOME}, - }, - } - // [END populate_proto] - writePerson(buf, &p) - got := buf.String() - want := `Person ID: 1234 - Name: John Doe - E-mail address: jdoe@example.com - Home phone #: 555-4321 -` - if got != want { - t.Errorf("writePerson(%s) =>\n\t%q, want %q", p.String(), got, want) - } -} - -func TestListPeopleWritesList(t *testing.T) { - buf := new(bytes.Buffer) - in := pb.AddressBook{[]*pb.Person{ - { - Name: "John Doe", - Id: 101, - Email: "john@example.com", - }, - { - Name: "Jane Doe", - Id: 102, - }, - { - Name: "Jack Doe", - Id: 201, - Email: "jack@example.com", - Phones: []*pb.Person_PhoneNumber{ - {Number: "555-555-5555", Type: pb.Person_WORK}, - }, - }, - { - Name: "Jack Buck", - Id: 301, - Email: "buck@example.com", - Phones: []*pb.Person_PhoneNumber{ - {Number: "555-555-0000", Type: pb.Person_HOME}, - {Number: "555-555-0001", Type: pb.Person_MOBILE}, - {Number: "555-555-0002", Type: pb.Person_WORK}, - }, - }, - { - Name: "Janet Doe", - Id: 1001, - Email: "janet@example.com", - Phones: []*pb.Person_PhoneNumber{ - {Number: "555-777-0000"}, - {Number: "555-777-0001", Type: pb.Person_HOME}, - }, - }, - }} - listPeople(buf, &in) - want := strings.Split(`Person ID: 101 - Name: John Doe - E-mail address: john@example.com -Person ID: 102 - Name: Jane Doe -Person ID: 201 - Name: Jack Doe - E-mail address: jack@example.com - Work phone #: 555-555-5555 -Person ID: 301 - Name: Jack Buck - E-mail address: buck@example.com - Home phone #: 555-555-0000 - Mobile phone #: 555-555-0001 - Work phone #: 555-555-0002 -Person ID: 1001 - Name: Janet Doe - E-mail address: janet@example.com - Mobile phone #: 555-777-0000 - Home phone #: 555-777-0001 -`, "\n") - got := strings.Split(buf.String(), "\n") - if len(got) != len(want) { - t.Errorf( - "listPeople(%s) =>\n\t%q has %d lines, want %d", - in.String(), - buf.String(), - len(got), - len(want)) - } - lines := len(got) - if lines > len(want) { - lines = len(want) - } - for i := 0; i < lines; i++ { - if got[i] != want[i] { - t.Errorf( - "listPeople(%s) =>\n\tline %d %q, want %q", - in.String(), - i, - got[i], - want[i]) - } - } -} |