কীভাবে একটি মেনু ফিড তৈরি করবেন

নিচের টিউটোরিয়ালে আমরা দেখাব কিভাবে JSON-এ Google Protocol Buffers (protobuf) সংজ্ঞা ব্যবহার করে একটি ফিড তৈরি করা যায়। প্রোটোবাফ স্কিমার উপর ভিত্তি করে সোর্স কোড তৈরি করতে আমরা প্রোটোবাফ কম্পাইলার ব্যবহার করব। জেনারেটেড সোর্স কোড ব্যবহার করে একটি ফিড তৈরি করা একটি সহজ ইন্টারফেস প্রদান করে এবং ভুল ফিল্ডের নাম বা ক্ষেত্রের ধরন দিয়ে ফিড এন্টিটি তৈরি করা থেকে বিরত রাখে।

প্রকল্প সেটআপ

  • একটি নতুন প্রকল্প ডিরেক্টরি তৈরি করুন।
  • proto সংজ্ঞা থেকে food_menu.proto money.proto localized_text.proto- এর বিষয়বস্তু আপনার প্রোজেক্ট ডিরেক্টরি রুটে নতুন ফাইল হিসেবে কপি করুন।
  • প্রোটোক কম্পাইলার ইনস্টল করুন

    প্রোটো ফাইলগুলি থেকে সোর্স কোড তৈরি করার জন্য, আপনাকে প্রোটোক কম্পাইলার প্রয়োজন হবে। Protocol Buffers GitHub রিলিজ পৃষ্ঠা থেকে সর্বশেষ প্রি-বিল্ট বাইনারি ডাউনলোড করুন।

    জিপটি বের করুন এবং PATH এনভায়রনমেন্ট ভেরিয়েবলে বিন পাথ যোগ করুন, উদাহরণস্বরূপ:

    unzip protoc-22.0-linux-x86_64.zip -d /usr/local/protoc
    export PATH="$PATH:/usr/local/protoc/bin"
      

সোর্স কোড তৈরি করুন

পাইথন

  1. Python protobuf লাইব্রেরি
    pip install protobuf
        
    ইনস্টল করুন
  2. ক্লায়েন্ট সোর্স কোড তৈরি করুন।

    প্রোটো আউটপুট ডিরেক্টরি তৈরি করুন: তৈরি

    protoc --python_out=./generated food_menu.proto money.proto localized_text.proto
        

    PYTHONPATH এনভায়রনমেন্ট ভেরিয়েবল আপডেট করুন যেমন জেনারেট করা পাথ অন্তর্ভুক্ত করার জন্য:

    export PYTHONPATH="$PYTHONPATH:./generated"
        

    আপনি যদি Bazel ব্যবহার করেন, তাহলে প্রোটোক চালানোর বিকল্প হিসেবে py_proto_library নিয়মটি ব্যবহার করে দেখুন।

ব্যবহারের উদাহরণ

সম্পূর্ণ উদাহরণ প্রকল্প এখানে পাওয়া যাবে.

"""Menu feed example used in

https://developers.google.com/maps-booking/verticals/dining/guides/tutorials/tutorial-menu-feed-protos#python.
"""
import json
from generated import food_menu_pb2
from google.protobuf.json_format import MessageToDict

# create feed
feed = food_menu_pb2.FoodMenuFeed()

# add a menu component to feed data
menuComponent = feed.data.add()
menuComponent.menu.menu_id = 'menu1'
menuComponent.menu.merchant_ids.append('dining-1')
menuDisplayName = menuComponent.menu.display_name.text.add()
menuDisplayName.text = 'Menu'
menuDisplayName.language_code = 'en-us'
menuComponent.menu.language = 'en-us'
menuComponent.menu.last_merchant_update_time.seconds = 1633621547

for i in ['appetizers', 'dinner']:
  menuComponent.menu.menu_section_ids.append(i)

# add a menu section component to feed data
sectionComponent = feed.data.add()
sectionComponent.section.menu_section_id = 'appetizers'
sectionDisplayName = sectionComponent.section.display_name.text.add()
sectionDisplayName.text = 'Lunch Appetizers'
sectionDisplayName.language_code = 'en-us'
sectionComponent.section.menu_item_ids.append('breadsticks-sauce')

# add a menu item component to feed data
itemComponent = feed.data.add()
itemComponent.item.menu_item_id = 'breadsticks-sauce'
itemDisplayName = itemComponent.item.display_name.text.add()
itemDisplayName.text = 'Breadsticks & Sauce'
itemDisplayName.language_code = 'en-us'
itemDescription = itemComponent.item.description.text.add()
itemDescription.text = 'Breakfast basket w/ side of tomato sauce (size 6 or 12)'
itemDescription.language_code = 'en-us'

for i in ['breadstick-sm', 'breadstick-lg']:
  itemComponent.item.menu_item_option_set.menu_item_option_ids.append(i)

for i in [
    'http://www.example.com/photos/breadsticks.jpg',
    'http://www.example.com/photos/sauce.jpg',
]:
  itemImage = itemComponent.item.images.add()
  itemImage.uri = i

# add a menu item option component to feed data
optionComponent = feed.data.add()
optionComponent.option.menu_item_option_id: 'breadstick-sm'
optionComponent.option.value.property_type = (
    food_menu_pb2.MenuItemOptionProperty.PropertyType.SIZE
)
optionTextValue = optionComponent.option.value.text_val.text.add()
optionTextValue.text = 'Small'
optionTextValue.language_code = 'en-us'
optionOffer = optionComponent.option.offer_set.offers.add()
optionOffer.price.currency_code = 'USD'
optionOffer.price.units = 8
optionOffer.price.nanos = 0

feedJSON = json.dumps(MessageToDict(feed, preserving_proto_field_name=True))
print(feedJSON)

    

কোডের উদাহরণটি দেখায় কিভাবে নিম্নলিখিত প্রতিটি সত্তার সাথে একটি ফিড অবজেক্ট তৈরি করতে হয়:

  • তালিকা
  • মেনু বিভাগ
  • মেনু আইটেম
  • MenuItemOption

উদাহরণটি দেখায় কিভাবে JSON এ ফিডকে সিরিয়ালাইজ করতে হয়।

Python api বৈশিষ্ট্যগুলি সেট করে নেস্টেড অবজেক্টের অলস আরম্ভ করার অনুমতি দেয়।

টাইপস্ক্রিপ্ট

  1. TypeScript প্রোটোক প্লাগইন ইনস্টল করুন।
    npm init
    npm i -D typescript
    npm i ts-proto
          
    নোট করুন যে ts-proto একটি আনুষ্ঠানিকভাবে সমর্থিত Google প্রকল্প নয়।
  2. আউটপুট ডিরেক্টরি তৈরি করুন এবং ক্লায়েন্ট সোর্স কোড তৈরি করুন।

    প্রোটো আউটপুট ডিরেক্টরি তৈরি করুন: src/generated

    protoc --plugin="./node_modules/.bin/protoc-gen-ts_proto" --ts_proto_opt=useOptionals=all --ts_proto_opt=snakeToCamel=false --ts_proto_opt=onlyTypes=true --ts_proto_out="./src/generated" food_menu.proto money.proto localized_text.proto
          

    আপনি যদি Bazel ব্যবহার করেন, তাহলে চলমান প্রোটোকের বিকল্প হিসাবে js_proto_library নিয়মটি ব্যবহার করে দেখুন।

ব্যবহারের উদাহরণ

সম্পূর্ণ উদাহরণ প্রকল্প এখানে পাওয়া যাবে.

import {FoodMenuFeed, Menu, MenuItem, MenuSection, MenuItemOption, MenuItemOptionProperty_PropertyType} from './generated/food_menu';

const menu: Menu = {
  menu_id: 'menu1',
  merchant_ids: ['dining-1'],
  display_name: {text: [{text: 'Menu', language_code: 'en-us'}]},
  language: 'en-us',
  menu_section_ids: ['appetizers', 'dinner'],
  last_merchant_update_time: new Date()
};

const section: MenuSection = {
  menu_section_id: 'appetizers',
  display_name: {text: [{text: 'Lunch Appetizers', language_code: 'en-us'}]},
  menu_section_ids: ['breadsticks-sauce']
};

const item: MenuItem = {
  menu_item_id: 'breadsticks-sauce',
  display_name: {text: [{text: 'Breadsticks & Sauce', language_code: 'en-us'}]},
  description: {
    text: [{
      text: 'Breakfast basket w/ side of tomato sauce (size 6 or 12)',
      language_code: 'en-us'
    }]
  },
  menu_item_option_set:
      {menu_item_option_ids: ['breadstick-sm', 'breadstick-lg']},
  images: [
    {uri: 'http://www.example.com/photos/breadsticks.jpg'},
    {uri: 'http://www.example.com/photos/sauce.jpg'}
  ]
};

const option: MenuItemOption = {
  menu_item_option_id: 'breadstick-sm',
  value: {
    property_type: MenuItemOptionProperty_PropertyType.SIZE,
    text_val: {
      text: [
        {text: "Small", language_code: "en-us"}
      ]
     }
  },
  offer_set: {
    offers: [{
      price: {
        currency_code: "USD",
        units: 8,
        nanos: 0
      }
    }]
  }
};

const feed: FoodMenuFeed = {
  data: [{menu}, {section}, {item}, {option}]
};

console.log(JSON.stringify(feed));

  

কোডের উদাহরণটি দেখায় কিভাবে নিম্নলিখিত প্রতিটি সত্তার সাথে একটি ফিড অবজেক্ট তৈরি করতে হয়:

  • তালিকা
  • মেনু বিভাগ
  • মেনু আইটেম
  • MenuItemOption

উদাহরণটি দেখায় কিভাবে JSON এ ফিডকে সিরিয়ালাইজ করতে হয়।

জাভা

  1. এখানে বর্ণিত হিসাবে maven বা gradle ব্যবহার করে আপনার প্রকল্পে protobuf-java এবং protobuf-java-util নির্ভরতা যোগ করুন।
  2. ক্লায়েন্ট সোর্স কোড তৈরি করুন।
    protoc --java_out=src/main/java food_menu.proto money.proto localized_text.proto
        

    আপনি maven ব্যবহার করার সময় কম্পাইলের সময় সোর্স কোড তৈরি করতে protobuf-maven-plugin ব্যবহার করতে পারেন।

    আপনি যদি Bazel ব্যবহার করেন, তাহলে প্রোটোক চালানোর বিকল্প হিসাবে java_proto_library নিয়মটি ব্যবহার করে দেখুন।

ব্যবহারের উদাহরণ

সম্পূর্ণ উদাহরণ প্রকল্প এখানে পাওয়া যাবে.

package com.example;

import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Timestamp;
import com.google.type.Money;
import com.google.protobuf.util.JsonFormat;
import com.google.type.LocalizedText;
import food.menu.v1.FoodMenu.FoodMenuFeed;
import food.menu.v1.FoodMenu.Menu;
import food.menu.v1.FoodMenu.MenuComponent;
import food.menu.v1.FoodMenu.MenuItem;
import food.menu.v1.FoodMenu.MenuSection;
import food.menu.v1.FoodMenu.TextField;
import food.menu.v1.FoodMenu.MenuItemOption;
import food.menu.v1.FoodMenu.MenuItemOptionProperty;
import food.menu.v1.FoodMenu.OfferSet;
import food.menu.v1.FoodMenu.Offer;

/**
 * Menu feed example used in
 *
 * <p>https://developers.google.com/maps-booking/verticals/dining/guides/tutorials/tutorial-menu-feed-protos#java.
 */
public class Feed {

  public static void main(String[] args) throws InvalidProtocolBufferException {
    Feed feed = new Feed();
    feed.createMenuFeed();
  }

  public void createMenuFeed() throws InvalidProtocolBufferException {

    Menu.Builder menu =
        Menu.newBuilder()
            .setMenuId("menu1")
            .addMerchantIds("dining-1")
            .setDisplayName(
                TextField.newBuilder()
                    .addText(LocalizedText.newBuilder().setText("Menu").setLanguageCode("en-us")))
            .setLanguage("en-us")
            .setLastMerchantUpdateTime(Timestamp.newBuilder().setSeconds(1633621547));

    MenuSection.Builder section =
        MenuSection.newBuilder()
            .setMenuSectionId("appetizers")
            .setDisplayName(
                TextField.newBuilder()
                    .addText(
                        LocalizedText.newBuilder()
                            .setText("Lunch Appetizers")
                            .setLanguageCode("en-us")))
            .addMenuItemIds("breadsticks-sauce");

    MenuItem.Builder item =
        MenuItem.newBuilder()
            .setMenuItemId("breadsticks-sauce")
            .setDisplayName(
                TextField.newBuilder()
                    .addText(
                        LocalizedText.newBuilder()
                            .setText("Breadsticks & Sauce")
                            .setLanguageCode("en-us")))
            .setDescription(
                TextField.newBuilder()
                    .addText(
                        LocalizedText.newBuilder()
                            .setText("Breadsticks & Sauce")
                            .setLanguageCode("en-us")));

    MenuItemOption.Builder option =
        MenuItemOption.newBuilder()
          .setMenuItemOptionId("breadstick-sm")
          .setValue(
              MenuItemOptionProperty.newBuilder()
                .setPropertyType(MenuItemOptionProperty.PropertyType.SIZE)
                .setTextVal(TextField.newBuilder()
                    .addText(
                        LocalizedText.newBuilder()
                            .setText("Small")
                            .setLanguageCode("en-us"))))
          .setOfferSet(
              OfferSet.newBuilder()
                .addOffers(
                    Offer.newBuilder()
                      .setPrice(
                          Money.newBuilder()
                            .setCurrencyCode("USD")
                            .setUnits(8)
                            .setNanos(0))));

    FoodMenuFeed.Builder foodMenuFeed =
        FoodMenuFeed.newBuilder()
            .addData(MenuComponent.newBuilder().setMenu(menu))
            .addData(MenuComponent.newBuilder().setSection(section))
            .addData(MenuComponent.newBuilder().setItem(item))
            .addData(MenuComponent.newBuilder().setOption(option));

    String feedJSON =
        JsonFormat.printer()
            .omittingInsignificantWhitespace()
            .preservingProtoFieldNames()
            .print(foodMenuFeed);

    System.out.println(feedJSON);
  }
}

    

কোডের উদাহরণটি দেখায় কিভাবে নিম্নলিখিত প্রতিটি সত্তার সাথে একটি ফিড অবজেক্ট তৈরি করতে হয়:

  • তালিকা
  • মেনু বিভাগ
  • মেনু আইটেম
  • MenuItemOption

উদাহরণটি দেখায় কিভাবে JSON এ ফিডকে সিরিয়ালাইজ করতে হয়।

যাওয়া

  1. go
    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
        
    এর জন্য প্রোটোক প্লাগইন ইনস্টল করুন

    প্রোটোক-জেন-গো প্লাগইন অন্তর্ভুক্ত করতে PATH এনভায়রনমেন্ট ভেরিয়েবল আপডেট করুন, উদাহরণস্বরূপ:

    export PATH="$PATH:$(go env GOPATH)/bin"
        
  2. অ্যাপ শুরু করুন এবং ক্লায়েন্ট সোর্স কোড তৈরি করুন।
    go mod init feed/app
    mkdir generated
    protoc --go_out=./generated/ food_menu.proto money.proto localized_text.proto
        

    আপনি যদি Bazel ব্যবহার করেন, তাহলে চলমান প্রোটোকের বিকল্প হিসাবে go_proto_library নিয়মটি ব্যবহার করে দেখুন।

ব্যবহারের উদাহরণ

সম্পূর্ণ উদাহরণ প্রকল্প এখানে পাওয়া যাবে.

/*
Menu feed example used in
https://developers.google.com/maps-booking/verticals/dining/guides/tutorials/tutorial-menu-feed-protos#go.
*
*/
package main

import (
	pb "feed/app/generated/food/menu/v1/proto"
	"fmt"

	localized_text "google.golang.org/genproto/googleapis/type/localized_text"
	money "google.golang.org/genproto/googleapis/type/money"
	"google.golang.org/protobuf/encoding/protojson"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
)

func main() {

	//create a menu component
	menu := &pb.Menu{
		MenuId:      "menu1",
		MerchantIds: []string{"dining-1"},
		DisplayName: &pb.TextField{
			Text: []*localized_text.LocalizedText{{
				Text:         "Menu",
				LanguageCode: "en-us",
			}},
		},
		Language: "en-us",
		LastMerchantUpdateTime: &timestamppb.Timestamp{
			Seconds: 1633621547,
		},
	}

	//create a menu section component
	section := &pb.MenuSection{
		MenuSectionId: "appetizers",
		DisplayName: &pb.TextField{
			Text: []*localized_text.LocalizedText{{
				Text:         "Lunch Appetizers",
				LanguageCode: "en-us",
			}},
		},
		MenuItemIds: []string{"breadsticks-sauce"},
	}

	//create a menu item component
	item := &pb.MenuItem{
		MenuItemId: "breadsticks-sauce",
		DisplayName: &pb.TextField{
			Text: []*localized_text.LocalizedText{{
				Text:         "Breadsticks & Sauce",
				LanguageCode: "en-us",
			}},
		},
		Description: &pb.TextField{
			Text: []*localized_text.LocalizedText{{
				Text:         "Breakfast basket w/ side of tomato sauce (size 6 or 12)",
				LanguageCode: "en-us",
			}},
		},
		Pricing: &pb.MenuItem_MenuItemOptionSet_{
			MenuItemOptionSet: &pb.MenuItem_MenuItemOptionSet{
				MenuItemOptionIds: []string{"breadstick-sm", "breadstick-lg"},
			},
		},
	}
	imageUris := []string{
		"http://www.example.com/photos/breadsticks.jpg",
		"http://www.example.com/photos/sauce.jpg",
	}
	for _, uri := range imageUris {
		image := &pb.Image{
			Uri: uri,
		}
		item.Images = append(item.Images, image)
	}

	//create a menu item option
	option := &pb.MenuItemOption{
		MenuItemOptionId: "breadstick-sm",
		Value: &pb.MenuItemOptionProperty{
			PropertyType: pb.MenuItemOptionProperty_SIZE,
			Value: &pb.MenuItemOptionProperty_TextVal{
				TextVal: &pb.TextField{
					Text: []*localized_text.LocalizedText{{
						Text:         "Small",
						LanguageCode: "en-us",
					}},
				},
			},
		},
		OfferSet: &pb.OfferSet{
			Offers: []*pb.Offer{{
				Price: &money.Money{
					CurrencyCode: "USD",
					Units:        8,
					Nanos:        0,
				},
			}},
		},
	}

	//create feed
	feed := &pb.FoodMenuFeed{
		Data: []*pb.MenuComponent{{
			Type: &pb.MenuComponent_Menu{
				Menu: menu,
			},
		},
			{
				Type: &pb.MenuComponent_Section{
					Section: section,
				},
			},
			{
				Type: &pb.MenuComponent_Item{
					Item: item,
				},
			},
			{
				Type: &pb.MenuComponent_Option{
					Option: option,
				},
			}},
	}

	marshalOptions := protojson.MarshalOptions{
		UseProtoNames: true,
	}
	jsonBytes, _ := marshalOptions.Marshal(feed)
	fmt.Printf("message = %s", string(jsonBytes))
}


    

কোডের উদাহরণটি দেখায় কিভাবে নিম্নলিখিত প্রতিটি সত্তার সাথে একটি ফিড অবজেক্ট তৈরি করতে হয়:

  • তালিকা
  • মেনু বিভাগ
  • মেনু আইটেম
  • MenuItemOption

উদাহরণটি দেখায় কিভাবে JSON এ ফিডকে সিরিয়ালাইজ করতে হয়।