Gemini Code Assist ile geliştirme iş akışınızı güçlendirin

1. Giriş

e5b98fd4e417c877.png

Bu codelab'de Gemini Code Assist'in, Yazılım Geliştirme Yaşam Döngüsü'nün (SDLC) tasarım, derleme ve test ve dağıtım. Eksiksiz bir uygulama tasarlayıp geliştirecek ve Google Cloud'a dağıtacağız.

Teknik bir etkinlikteki oturumlarda arama yapmak için bir API ve uygulama oluşturacağız. Her oturumun başlığı, özeti, süresi, kategorileri ve en az bir konuşmacısı olacaktır.

Yapacaklarınız

  • Sıfırdan bir OpenAPI spesifikasyonuna göre bir web uygulaması tasarlayın, Derleyin, Test Edin ve Dağıtın

Neler öğreneceksiniz?

  • Gemini Code Assist, OpenAPI Spesifikasyonu oluşturmak için nasıl kullanılır?
  • OpenAPI spesifikasyonu için Python Flask Uygulaması geliştirmek amacıyla Gemini Code Assist kod oluşturma özelliklerini kullanma
  • Gemini Code Assist'i kullanarak Python Flask Uygulaması için web kullanıcı arabirimi oluşturma
  • Uygulamayı Google Cloud Run'a dağıtma konusunda yardım almak için Gemini Code Assist'i kullanma
  • Uygulamayı geliştirirken ve test ederken Kod Açıklaması, Test Durumu oluşturma gibi Gemini Code Assist özelliklerini kullanma

Gerekenler

  • Chrome web tarayıcısı
  • Gmail hesabı
  • Faturalandırmanın etkin olduğu bir Cloud projesi
  • Cloud projeniz için Gemini Code Assist etkinleştirildi

Bu laboratuvar, yeni başlayanlar da dahil olmak üzere her seviyeden geliştiriciye yöneliktir. Örnek uygulama Python dilinde olsa da, neler olduğunu anlamak için Python programlamasına aşina olmanız gerekmez. Gemini Code Assist'in özelliklerini öğrenmeye odaklanacağız.

2. Gemini Code Assist'i kurun

Bu bölümde, bu laboratuvara başlamak için yapmanız gereken tüm işlemler ele alınmaktadır.

Cloud Shell IDE'de Gemini Code Assist'i etkinleştirme

Codelab'in geri kalanında, tümüyle yönetilen Code OSS tabanlı bir geliştirme ortamı olan Cloud Shell IDE'yi kullanacağız. Cloud Shell IDE'de Code Assist'i etkinleştirip yapılandırmamız gerekir. Gerekli adımlar aşağıda verilmiştir:

  1. ide.cloud.google.com adresini ziyaret edin. IDE'nin görünmesi biraz zaman alabilir. Bu nedenle lütfen sabırlı olun ve kurulumla ilgili varsayılan seçenekleri kabul edin. IDE'nin kurulumuyla ilgili bazı talimatlar görürseniz lütfen bu adımları varsayılan ayarlarla tamamlayın.
  2. Gösterilen durum çubuğunda Cloud Code - Oturum aç düğmesini tıklayın. Talimatlara göre eklentiyi yetkilendirin. Durum çubuğunda "Cloud Code - proje yok" ifadesini görüyorsanız bunu seçin ve ardından, üzerinde çalışmayı planladığınız projeler listesinden ilgili Google Cloud projesini seçin.

6f5ce865fc7a3ef5.png

  1. Gösterilen şekilde sağ alt köşedeki Code Assist düğmesini tıklayın ve doğru Google Cloud projesi için son bir kez daha seçim yapın. Cloud AI Companion API'yi etkinleştirmeniz istenirse lütfen bunu yapın ve devam edin.
  2. Google Cloud projenizi seçtikten sonra, durum çubuğundaki Cloud Code durum mesajında bunu gördüğünüzden ve sağdaki durum çubuğunda Code Assist'in etkin olduğundan emin olun:

709e6c8248ac7d88.png

Gemini Code Assist kullanıma hazır.

3. Firestore'u kurun

Cloud Firestore, uygulama verilerimiz için arka uç olarak kullanacağımız, tümüyle yönetilen, sunucusuz bir belge veritabanıdır. Cloud Firestore'daki veriler, belgelerin koleksiyonları halinde yapılandırılır.

Varsayılan Firestore veritabanımızda sessions adlı bir koleksiyon oluşturmamız gerekir. Bu koleksiyonda, uygulamamızda kullanacağımız örnek veriler (belgeler) yer alır.

Cloud Shell IDE'nizin içinden Terminal'i aşağıda gösterildiği gibi ana menüden açın:

f1535e14c9beeec6.png

sessions adında bir koleksiyon oluşturmamız gerekiyor. Bu işlemle, örnek oturum belgelerinin bir listesi tutulur. Her doküman aşağıdaki özelliklere sahip olacaktır:

  1. title: dize
  2. kategoriler: dize dizisi
  3. speakers: dize dizisi
  4. duration: dize
  5. summary: dize

Örnek verileri içeren bir dosyayı kendi projenizdeki bir pakete kopyalayarak bu koleksiyonu örnek verilerle dolduralım. Ardından, koleksiyonu gcloud firestore import komutuyla içe aktarabilirsiniz.

Firestore Veritabanını başlatma

Cloud Console'da Firestore sayfasını ziyaret edin.

Projede daha önce bir Firestore veritabanını başlatmadıysanız default veritabanını oluşturun. Veritabanı oluştururken aşağıdaki değerleri kullanın:

  • Firestore modu: Native
  • Konum: Konum türünü Region olarak belirleyin ve uygulamanız için uygun bölgeyi seçin. Paket konumu için bir sonraki adımda bu konuma ihtiyacınız olacağından bu konumu not alın.
  • Veritabanını oluşturun.

504cabdb99a222a5.png

Aşağıda verilen adımları uygulayarak sessions koleksiyonunu oluşturacağız:

  1. Aşağıda verilen gsutil komutuyla projenizde bir paket oluşturun. Aşağıdaki komutta bulunan <PROJECT_ID> değişkenini Google Cloud proje kimliğinizle değiştirin. <BUCKET_LOCATION> yerine, varsayılan Firestore veritabanınızın Coğrafi Alanı'na karşılık gelen bir bölge adı girin (önceki adımda belirtildiği gibi). Bu ad US-WEST1, EUROPE-WEST1, ASIA-EAST1 olabilir :
gsutil mb -l <BUCKET-LOCATION> gs://<PROJECT_ID>-my-bucket
  1. Paket oluşturulduğuna göre hazırladığımız veritabanı dışa aktarımını Firebase veritabanına aktarmadan önce bu pakete kopyalamamız gerekiyor. Aşağıda verilen komutu kullanın:
gsutil cp -r gs://sessions-master-database-bucket/2024-03-26T09:28:15_95256  gs://<PROJECT_ID>-my-bucket

Artık içe aktarılacak verilere sahip olduğumuza göre, verileri oluşturduğumuz Firebase veritabanına (default) aktarmanın son adımına geçebiliriz.

  1. Aşağıda verilen gcloud komutunu kullanın:
gcloud firestore import gs://<PROJECT_ID>-my-bucket/2024-03-26T09:28:15_95256

İçe aktarma işlemi birkaç saniye sürecek. Hazır olduğunda https://console.cloud.google.com/firestore/databases adresini ziyaret edip default veritabanını ve sessions koleksiyonunu seçerek aşağıda gösterildiği gibi Firestore veritabanınızı ve koleksiyonu doğrulayabilirsiniz:

d3e294d46ba29cd5.png

Bu işlem, uygulamamızda kullanacağımız Firestore koleksiyonunu oluşturma işlemini tamamlar.

4. Başvuru Şablonunu Oluşturma

Codelab'in geri kalanında kullanacağımız örnek bir uygulama (Python Flask uygulaması) oluşturacağız. Bu uygulama, teknik bir konferansta sunulan tüm oturumlarda arama yapacaktır.

Şu adımları uygulayın:

  1. Aşağıdaki durum çubuğunda Google Cloud projesinin adını tıklayın.

f151759c156c124e.png

  1. Bir seçenek listesi görünür. Aşağıdaki listeden New Application'ı (Yeni Uygulama) tıklayın.

91ea9836f38b7f74.png

  1. Cloud Run uygulaması'nı seçin (Bu, uygulamamızın çalışma zamanı olacaktır).
  2. Python (Flask): Cloud Run uygulama şablonunu seçin.
  3. Uygulamaya bir ad verin ve tercih ettiğiniz konuma kaydedin.
  4. Uygulamanızın oluşturulduğunu onaylayan bir bildirim alırsınız ve uygulamanız, aşağıda gösterildiği gibi yüklenmiş olarak yeni bir pencere açılır. Bir README.md dosyası açılır. Bu görünümü şimdilik kapatabilirsiniz.

aaa3725b17ce27cf.png

5. Gemini Code Assist ile etkileşim kurma

Bu laboratuvarın amacı doğrultusunda, VS Code'daki Cloud Code uzantısının bir parçası olarak Cloud Shell IDE'de bulunan Gemini Code Assist Chat'i kullanacağız. Soldaki gezinme çubuğunda yer alan Code Assist düğmesini tıklayarak bu kodu görüntüleyebilirsiniz. Soldaki gezinme araç çubuğunda Code Assist simgesini a489f98a34898727.png bulun ve tıklayın.

Bu işlem, Cloud Shell IDE'de Code Assist sohbet bölmesini açar ve Code Assist ile sohbet edebilirsiniz.

14ad103efaa0ddaa.png

Üstteki çöp kutusu simgesine dikkat edin. Bu şekilde, Code Assist sohbet geçmişinin bağlamını sıfırlayabilirsiniz. Ayrıca, bu sohbet etkileşiminin IDE'de üzerinde çalıştığınız dosyaların bağlamına bağlı olduğunu unutmayın.

6. API Tasarımı

İlk adımımız, tasarım aşamasında Gemini Code Assist'ten yardım almak olacaktır. Bu adımda, arama yapmak istediğimiz varlıklar (bir etkinlikteki teknik oturumlar) için bir OpenAPI spesifikasyonu oluşturacağız.

Şu istemi verin:

Generate an Open API spec that will allow me to retrieve all sessions, sessions by category, session by id. Each session has the following attributes: id, title, list of speakers, list of categories, summary and duration.

Bu komut, oturumlarda çeşitli sorgu parametreleriyle arama yapmak için bir OpenAPI Spesifikasyonu oluşturur. Spesifikasyon örneği aşağıda verilmiştir:

openapi: 3.0.0
info:
 title: Sessions API
 description: This API allows you to retrieve all sessions, sessions by category, and session by id.
 version: 1.0.0
servers:
 - url: https://sessions.example.com
paths:
 /sessions:
   get:
     summary: Get all sessions
     operationId: getSessions
     responses:
       '200':
         description: OK
         content:
           application/json:
             schema:
               type: array
               items:
                 $ref: '#/components/schemas/Session'
 /sessions/{id}:
   get:
     summary: Get session by id
     operationId: getSessionById
     parameters:
       - name: id
         in: path
         required: true
         description: The id of the session
         schema:
           type: string
     responses:
       '200':
         description: OK
         content:
           application/json:
             schema:
               $ref: '#/components/schemas/Session'
 /sessions/categories/{category}:
   get:
     summary: Get sessions by category
     operationId: getSessionsByCategory
     parameters:
       - name: category
         in: path
         required: true
         description: The category of the sessions
         schema:
           type: string
     responses:
       '200':
         description: OK
         content:
           application/json:
             schema:
               type: array
               items:
                 $ref: '#/components/schemas/Session'
components:
 schemas:
   Session:
     type: object
     properties:
       id:
         type: string
         description: The id of the session
       title:
         type: string
         description: The title of the session
       speakers:
         type: array
         items:
           type: string
         description: The list of speakers for the session
       categories:
         type: array
         items:
           type: string
         description: The list of categories for the session
       summary:
         type: string
         description: The summary of the session
       duration:
         type: string
         description: The duration of the session

Spesifikasyonda aşağıdakilerin bulunduğunu görebilirsiniz:

  • Oturum türü için tanımlanmış bir şema.
  • Tanımlanmış çeşitli API yolları:
  • /sessions
  • /sessions/{id}
  • /sessions/categories/{category}

En üstteki klasörde sessionsapi.yaml adlı bir dosya oluşturun ve "mevcut dosyaya ekle" seçeneğini kullanarak içeriği Code Assist sohbet penceresinden kopyalayın. (+ düğmesi) tıklayın ve dosyayı Cloud Shell IDE'de açık tutun.

Bu noktada Gemini Code Assist'in ilginç bir özelliğine dikkat edebilirsiniz: citation. Oluşturulan kod, mevcut açık kaynak kodu gibi başka bir kaynaktan doğrudan alıntı yaptığında bu bilgiler geliştiriciye ortaya çıkar. Geliştiricinin kaynağı ve içeriği ne yapacağına karar vermesi için gereken lisansı sunar.

Oluşturulan içerikle ilgili bir sorun olmadığımızı varsayarsak artık bu spesifikasyon dokümanını kullanarak Python Flask Uygulaması oluşturabiliriz.

7. Uygulamayı Oluşturma

Şimdi Code Assist'ten uygulamayı oluşturmasını isteyeceğiz. sessionsapi.yaml dosyasını açarak aşağıdaki istemi verin.

Generate a Python Application using the Flask framework, based on the sessionsapi.yaml file. This application uses a local in memory list of sessions. Do not use any Flask extensions.

Bu size, Python Flask Uygulaması için OpenAPI spesifikasyon dosyasında belirtilen işlevlere ve yollara dayalı bir iskelet sağlamalıdır.

Sağlanan Python Flask Uygulama kodu aşağıdakine benzer olmalıdır:

from flask import Flask, jsonify, request

app = Flask(__name__)

sessions = [
    {
        "id": "1",
        "title": "Session 1",
        "speakers": ["Speaker 1", "Speaker 2"],
        "categories": ["Category 1", "Category 2"],
        "summary": "This is a summary of session 1.",
        "duration": "1 hour",
    },
    {
        "id": "2",
        "title": "Session 2",
        "speakers": ["Speaker 3", "Speaker 4"],
        "categories": ["Category 3", "Category 4"],
        "summary": "This is a summary of session 2.",
        "duration": "1 hour 30 minutes",
    },
]

@app.route('/sessions', methods=['GET'])
def get_sessions():
    return jsonify(sessions)

@app.route('/sessions/<id>', methods=['GET'])
def get_session_by_id(id):
    session = next((session for session in sessions if session['id'] == id), None)
    if session is None:
        return jsonify({}), 404
    return jsonify(session)

@app.route('/sessions/categories/<category>', methods=['GET'])
def get_sessions_by_category(category):
    sessions_by_category = [session for session in sessions if category in session['categories']]
    return jsonify(sessions_by_category)

if __name__ == '__main__':
    app.run()

Önceki adım kapsamında oluşturulmuş mevcut bir app.py dosyası var. Dosyanın içeriğini Code Assist tarafından oluşturulan kodla değiştirip dosyayı kaydetmeniz yeterlidir.

app.run() satırını, bağlantı noktası 8080, ana makine adresi 0.0.0.0 olacak şekilde değiştirmek ve yerel yürütme sırasında Hata Ayıklama modunda çalıştırmak istiyoruz.Bunu aşağıdaki şekilde yapabilirsiniz. İlk olarak satırı vurgulayalım/seçelim:

app.run()

Ardından, Code Assist Chat arayüzünde şu istemi yazın: Explain this.

Bu, söz konusu satırın ayrıntılı bir açıklamasını göstermelidir; bunun bir örneğini aşağıda görebilirsiniz:

58ec896a32a4fb68.png

Şimdi aşağıdaki istemi kullanın:

update the code to run the application on port 8080, host address 0.0.0.0, and in debug mode

Oluşturulan önerilen kod aşağıdaki gibi olmalıdır:

app.run(host='0.0.0.0', port=8080, debug=True)

app.py dosyasını bu snippet ile güncellemeyi unutmayın.

Uygulamayı yerel olarak çalıştırma

İşe başladığımız işe göre başvuru gereksinimlerini doğrulamak için şimdi uygulamayı yerel olarak çalıştıralım.

İlk adım, sanal ortama yüklenecek requirements.txt içinde Python paket bağımlılıklarıyla sanal bir Python ortamı oluşturmak olacak. Bunu yapmak için Cloud Shell IDE'de Komut Paleti'ne (Ctrl+Üst Karakter+P) gidin ve Python ortamı oluştur yazın. Sonraki birkaç adımı uygulayarak Sanal Ortam (venv), Python 3.x yorumlayıcı ve requirements.txt dosyası seçin.

Ortam oluşturulduktan sonra yeni bir terminal penceresi açın (Ctrl+Üst Karakter+`) ve aşağıdaki komutu verin:

python app.py

Aşağıda örnek bir yürütme gösterilmektedir:

(.venv) romin@cloudshell: $ python app.py 
 * Serving Flask app 'app'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8080
 * Running on http://10.88.0.3:8080
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 132-247-368

Artık API'yi aşağıdaki URL'lerden önizleyebilirsiniz. Geliştirme sunucunuzun 8080 numaralı bağlantı noktasında çalıştığını varsayıyoruz. Değilse, lütfen bunu uygun bağlantı noktası numarasıyla değiştirin.

  • https://<host-name>:8080/sessions
  • https://<host-name>:8080/sessions/{id}
  • https://<host-name>:8080/sessions/categories/{category}

app.py dosyasında yer alan JSON verilerini, bu URL'leri kullanarak alabildiğinizden emin olmak için aşağıda verilen adımları uygulayın:

Yeni bir terminal penceresi açın ve aşağıdaki komutlardan herhangi birini deneyin:

curl -X GET http://127.0.0.1:8080/sessions
curl -X GET http://127.0.0.1:8080/sessions/<ID>
curl -X GET http://127.0.0.1:8080/sessions/categories/<CATEGORY_NAME> 

8. Kodu Yeniden Düzenleme

Sabit kodlu örnek JSON verilerinin app.py içermesi yerine, kod ile veriler arasında net bir ayrım sağlayabilmek için muhtemelen bunu ayırıp başka bir modüle ayırmak isteriz. Haydi başlayalım.

app.py dosyasını açık tutun ve aşağıdaki istemi verin:

Can I improve this code and separate out the sessions data from this app.py file?

Bu bölümde, bunu nasıl yapacağınızla ilgili bazı öneriler bulabilirsiniz. Aldığımız ve buna benzer bir öneri bulabileceğiniz bir örnek aşağıda verilmiştir:

9b9c56cb527dac4c.png

Şimdi bunu uygulayalım ve verilerimizi Code Assist'in önerdiği şekilde bir sessions.py dosyasına ayıralım.

sessions.py adlı yeni bir dosya oluşturun

, oluşturulan verilere göre JSON listesinin içeriği aşağıda verilmiştir:

sessions = [
   {
       "id": "1",
       "title": "Session 1",
       "speakers": ["Speaker 1", "Speaker 2"],
       "categories": ["Category 1", "Category 2"],
       "summary": "This is a summary of session 1.",
       "duration": "1 hour",
   },
   {
       "id": "2",
       "title": "Session 2",
       "speakers": ["Speaker 3", "Speaker 4"],
       "categories": ["Category 3", "Category 4"],
       "summary": "This is a summary of session 2.",
       "duration": "1 hour 30 minutes",
   },
]

app.py dosyası artık çok daha basit olup aşağıda gösterilmiştir:

from flask import Flask, jsonify, request
from sessions import sessions

app = Flask(__name__)

@app.route('/sessions', methods=['GET'])
def get_sessions():
   return jsonify(sessions.sessions)

@app.route('/sessions/<id>', methods=['GET'])
def get_session_by_id(id):
   session = next((session for session in sessions.sessions if session['id'] == id), None)
   if session is None:
       return jsonify({}), 404
   return jsonify(session)

@app.route('/sessions/categories/<category>', methods=['GET'])
def get_sessions_by_category(category):
   sessions_by_category = [session for session in sessions.sessions if category in session['categories']]
   return jsonify(sessions_by_category)

if __name__ == '__main__':
   app.run(host='0.0.0.0', port=8080, debug=True)

Uygulamayı yerel olarak çalıştırmaya devam edebildiğinizden emin olun ve yeniden düzenlenen bu değişikliklerle API'yi kullanmaya devam edin. Python geliştirme sunucusu muhtemelen hâlâ çalışıyor olacağından yalnızca önceki adımda kullanılan curl komutlarını geri çağırmanız yeterlidir.

9. Firestore Koleksiyonu ile entegrasyon

Sonraki adım, oturumlarımız için elimizde olan yerel bellek içi JSON listesinden uzaklaşmak ve uygulamamızı, bu codelab'in başında oluşturduğumuz, Firestore veritabanındaki oturumlar koleksiyonuna bağlamaktır.

sessions.py dosyasını açık tutun ve aşağıdaki istemi verin:

Can you further refactor the sessions.py code to read from a Firestore database that has a collection named sessions. The collection has the same attributes as the session object that we have defined. Use the Python module google-cloud-firestore. 

Firestore koleksiyonundaki tüm oturumları okumamız için aşağıdaki öneriyi aldık:

import google.cloud.firestore

# Create a Firestore client
db = google.cloud.firestore.Client()

# Get the sessions collection
sessions_collection = db.collection("sessions")

# Create a list of sessions
sessions = []

# Iterate over the documents and add them to the list
for doc in sessions_collection.stream():
   session = doc.to_dict()
   session["id"] = doc.id
   sessions.append(session)

Devam edin ve kodu sessions.py bölümüne ekleyin.

Flask Geliştirme sunucunuz yerel olarak çalışıyorsa, uygulamanız Python modülünün bulunamadığını bildirerek kapanmış olabilir.

Örneğin, Code Assist'e aşağıdaki şekilde hangi Python modülünün requirements.txt dosyasına eklenmesi gerektiğini sorabilirsiniz:

Which Python package needs to be installed to make the firestore code work?

Bu işlemle Python modülünün adı verilir (ör. google-cloud-firestore). Bunu requirements.txt dosyasına ekleyin.

Python ortamını yeni eklenen modülle (google-cloud-firestore) yeniden oluşturmanız gerekir. Bunun için mevcut Terminal penceresine aşağıdaki komutu verin:

pip install -r requirements.txt

Uygulamayı yeniden çalıştırın (python app.py ile yeniden başlatın) ve /sessions URL'sini ziyaret edin. Bu işlemin ardından, sessions koleksiyonuna eklediğimiz örnek dokümanları görebilirsiniz.

975d05e6518f1a6a.png

Önceki adımlarda açıklandığı gibi, belirli bir kategorideki belirli oturumları veya tüm oturumları almak için diğer URI'ları sorgulayabilirsiniz.

10. Kod Açıklaması

Kodu iyice anlamak için Gemini Code Assist'in "Explain this" özelliğini kullanmanın tam zamanı. Herhangi bir dosyaya gidebilir veya belirli kod snippet'lerini seçip Code Assist'e şu istemle sorabilirsiniz: Explain this.

Alıştırma olarak, sessions.py dosyasını ziyaret edip Firestore'a özgü kodu vurgulayın ve bununla ilgili kod açıklamasını alın. Bu özelliği sadece Python kodunda değil, projenizdeki diğer dosyalarda da kullanmayı deneyin.

11. Web Uygulamasını Oluşturma

API'yi oluşturup canlı bir Firestore koleksiyonuyla entegre ettiğimize göre şimdi uygulama için Web tabanlı bir kullanıcı arabirimi oluşturalım. Web kullanıcı arabirimimiz, şu anda işlevlerini minimum düzeyde tutacak, yani belirli bir kategoriye ait oturumları arayabilecek. Bunun için bir API yolumuz (ör./sessions/categories/{category}) olduğunu unutmayın. Bu nedenle web uygulamamız bunu çağırmalı ve sonuçları almalıdır.

Hemen konumuza geçelim. Code Assist'e aşağıdaki istemi verin:

Generate a web application that allows me to search for sessions by category and uses the Flask application that we created. Please use basic HTML, CSS and JS. Embed all the Javascript and CSS code into a single HTML file only.

Bu işlem, JavaScript ve CSS'nin gömülü olduğu web uygulaması HTML'sini oluşturur. Ayrıca, app.py dosyasına yeni bir rota eklemenizi de isteyecektir. Böylece, kök veya temel URL'yi ziyaret eden tüm kullanıcılara ana sayfa sunulur. Söz konusu bilgiden bahsedilmiyorsa konu hakkında soru sorun veya aşağıdaki snippet'i kullanın:

@app.route('/')
def index():
   return render_template('index.html')

Bu dosyayı index.html olarak kaydedebilirsiniz ancak bu dosyanın nereye kaydedileceği (ör. hangi klasöre) gerektiğiyle ilgili bir sorunuz olabilir. Code Assist'e ek bir soru sorabiliriz.

Given that I am using the flask framework, where should I put the index.html file?

Dosyada render_template çerçevesini kullandığına dair net bilgiler verilmelidir. Bu nedenle index.html dosyasının templates klasörünün içine yerleştirilmesi gerekir. Bu codelab'in başında Flask şablonuna dayalı bir uygulama oluşturduğumuz için bu klasörü kullanabilirsiniz. Sonuç olarak, mevcut bir index.html dosyası var. Bu dosyanın içeriğini, burada oluşturulan yeni dosyayla değiştirmeniz yeterlidir. Code Assist, app.py dosyanızdaki render_template dosyasını içe aktarmanızdan da bahseder.

Devam edin. Web uygulaması kodunu index.html dosyasına kaydedin ve bu dosyayı templates klasörüne yerleştirmeyi unutmayın.

Uygulamayı yerel olarak çalıştırma

İşe başladığımız işe göre başvuru gereksinimlerini doğrulamak için şimdi uygulamayı yerel olarak çalıştıralım.

Yerel Flask sunucusunun hâlâ çalıştığından ve hata göstermediğinden emin olun. Hata olması durumunda bunları giderin ve sunucuyu başlatın.

Ardından, uygulamanın ana sayfa URL'sini ziyaret edin. Aşağıda gösterildiği gibi sunulan index.html dosyasını size gösterir:

8ca586acc4536879.png

Verilerdeki kategorilerden birini giriş olarak girin (ör. AI) ve Search düğmesini tıklayın. Bu etiket, AI kategorisiyle etiketlenen oturumları gösterir.

165faded790a6c.png

İsteğe bağlı bir alıştırma da her oturumla ilgili süre, kategoriler, konuşmacılar ve özet gibi ek meta verilerin gösterilmesidir.

12. Test Durumu Oluşturma

Session API'yi oluşturduk. Artık farklı API Yolları için birim test durumları oluşturmak üzere Gemini Code Assist'i kullanabilirsiniz.

app.py dosyasını açık tutun ve aşağıdaki istemi verin:

Generate unit test cases for app routes. Use unittest module.

Aşağıdaki yanıtı aldık:

import unittest
from app import app

class FlaskAppTestCase(unittest.TestCase):

    def test_index(self):
        tester = app.test_client()
        response = tester.get('/')
        self.assertEqual(response.status_code, 200)

    def test_get_sessions(self):
        tester = app.test_client()
        response = tester.get('/sessions')
        self.assertEqual(response.status_code, 200)

    def test_get_session_by_id(self):
        tester = app.test_client()
        response = tester.get('/sessions/1')
        self.assertEqual(response.status_code, 200)

    def test_get_sessions_by_category(self):
        tester = app.test_client()
        response = tester.get('/sessions/categories/category1')
        self.assertEqual(response.status_code, 200)

if __name__ == '__main__':
    unittest.main()

Yukarıdaki kodu kullanarak tests.py adlı bir dosya oluşturun.

Test Durumu Oluşturmayla İlgili Not

Yukarıdakinden farklı bir kod girişi görebilirsiniz ve bu, test durumlarını çalıştırırken bazı sorunlara neden olabilir. Örneğin, çalıştırmalarımızın bazılarında aşağıdaki temel kod parçalarının gözden kaçtığını gördük:

from app import app

Test senaryolarını başlatacağımız mevcut Flask Uygulaması'nı içe aktarmak için yukarıdaki kod gereklidir.

if __name__ == '__main__':

`unittest.main()`

Test durumlarını çalıştırmak için yukarıdaki kod gereklidir.

Önerimiz, her bir test durumunu inceleyip oluşturulan koddaki assertEqual ve diğer koşulları kontrol ederek doğru çalıştığından emin olmanızdır. Veriler, Firestore koleksiyonunda harici olduğundan bunlara erişemeyebilir ve bazı sahte veriler kullanabilir, sonuç olarak testler başarısız olabilir. Bu nedenle, test senaryolarınızı uygun şekilde değiştirin veya hemen ihtiyaç duymayabileceğiniz bazı test durumlarını not alın.

Örnek olarak aşağıdaki komutu kullanarak test durumlarını çalıştırdık (Yerel API Uç Noktaları'na çağrı yapılacağından yerel geliştirme sunucusunu çalıştırmayı unutmayın):

python tests.py

Aşağıdaki özet sonucu aldık:

Ran 4 tests in 0.274s

FAILED (failures=2)

3. testteki oturum kimliği doğru olmadığından ve category1 adlı bir kategori olmadığından bu gerçekten doğru

.

Bu nedenle, test durumlarını buna göre düzenleyin ve test edin.

13. Test Odaklı Geliştirme

Şimdi, Session API'mize Test Driven Development (TDD) metodolojisini uygulayarak yeni bir arama yöntemi eklemeye bakalım. Bu yöntem, ilk önce test senaryolarının yazılması, uygulama eksikliği nedeniyle başarısız olmalarının ve eksik uygulamayı oluşturmak için Gemini Code Assist'in kullanılmasıyla testin başarıyla sonuçlanmasını sağlar.

Testing.py dosyasına gidin (tests.py dosyasını, başarılı olan tüm testleri içerecek şekilde düzelttiğinizi varsayarak). Code Assist'e aşağıdaki istemi isteyin:

Generate a new test case to search for sessions by speaker

Bu işlem bize, tests.py dosyasına usulüne uygun şekilde eklediğimiz aşağıdaki test durumu uygulamasını sağladı.

  def test_get_sessions_by_speaker(self):
        tester = app.test_client()
        response = tester.get('/sessions/speakers/speaker1')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json, [sessions.sessions[0], sessions.sessions[1]])

Testleri çalıştırırsanız aşağıdaki hatayı görürsünüz:

$ python tests.py 
.F.
======================================================================
FAIL: test_get_sessions_by_speaker (__main__.FlaskAppTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/romin/hello-world-5/tests.py", line 21, in test_get_sessions_by_speaker
    self.assertEqual(response.status_code, 200)
AssertionError: 404 != 200

----------------------------------------------------------------------
Ran 3 tests in 0.010s

FAILED (failures=1)

Bunun nedeni, test destek kaydının (/sessions/speakers/) yolunu çağırmasıdır ve app.py içinde bu yöntemin uygulanmamasıdır.

Code Assist'ten bize bir uygulama sağlamasını isteyelim. app.py dosyasına gidin ve Code Assist'e aşağıdaki istemi verin:

Add a new route to search for sessions by a specific speaker

Code Assist'in önerdiği ve app.py dosyasına eklediğimiz aşağıdaki uygulamayı aldık:

@app.route('/sessions/speakers/<speaker>', methods=['GET'])
def get_sessions_by_speaker(speaker):
    sessions_by_speaker = [session for session in sessions.sessions if speaker in session['speakers']]
    return jsonify(sessions_by_speaker)

tests.py dosyasını tekrar ziyaret edin. Hızlı bir kontrol için test durumumuzu aşağıdaki şekilde değiştirdik:

   def test_get_sessions_by_speaker(self):
       tester = app.test_client()
       response = tester.get('/sessions/speakers/Romin Irani')
       self.assertEqual(response.status_code, 200)
       self.assertEqual(len(response.json), 1)

Test sorunsuz çalıştı. Oluşturulan test durumlarını incelemeniz, Firestore'da bulunabilecek verilere bağlı olarak bunları biraz düzenlemenizi ve Python Unit Test durumlarında uygun assert* yöntemlerini kullanmanız için bu örneği bırakıyoruz.

14. Google Cloud Run'a dağıtma

Artık geliştirme sürecimizin kalitesi hakkında iyi olduğumuza göre son adımımız bu uygulamayı Google Cloud Run'a dağıtmak olacak. Unutmadığımız bir şey varsa Code Assist'e sormalıyız. app.py açıkken aşağıdaki istemi gönderin :

Is there something here I should change before I deploy to production?

Güzel bir haberimiz var. Hata ayıklama işaretini kapalı olarak ayarlamayı unuttuk :

2f87ed3a811fb218.png

Belirtildiği gibi, hata ayıklamayı kapatın ve Gemini Code Assist'ten gcloud komutuyla ilgili yardım isteyin. Bu komut, uygulamayı doğrudan kaynaktan Cloud Run'a dağıtmak için kullanılabilir (önce container derlemek zorunda kalmadan).

Şu istemi verin:

I would like to deploy the application to Cloud Run directly from source. What is the gcloud command to do that?

Yukarıdaki istemin birkaç varyasyonunu deneyin. Denediğimiz bir başka ifade de şuydu:

I would like to deploy this application to Cloud Run. I don't want to build a container image locally but deploy directly from source to Cloud Run. What is the gcloud command for that?

İdeal olarak aşağıdaki gcloud komutunu almanız gerekir:

gcloud run deploy sessions --source .

Ayrıca şunları da alabilirsiniz:

gcloud run deploy <service-name> --source . \
—-platform managed \
—-allow-unauthenticated

Uygulamanın kök klasöründen yukarıdaki komutu yürütün. region istendiğinde us-central1 simgesini seçin ve unauthenticated invocations öğesine izin vermeniz istendiğinde Y seçeneğini belirleyin. Ayrıca Artifact Registry, Cloud Build ve Cloud Run gibi Google Cloud API'lerini etkinleştirmeniz ve Artifact Registry deposu oluşturma izni vermeniz istenebilir. Lütfen işleme devam edip izin verin.

Dağıtım işleminin tamamlanması yaklaşık 2 dakika sürer. Lütfen sabırlı olun.

Başarıyla dağıtıldıktan sonra Cloud Run hizmet URL'sini görürsünüz. Herkese açık URL'yi ziyaret ettiğinizde aynı web uygulamasının başarıyla dağıtıldığını ve çalıştığını göreceksiniz.

c5322d0fd3e0f616.png

Tebrikler, tebrikler!

15. (İsteğe bağlı) Cloud Logging'i kullanın

Uygulama günlüklerinin, Google Cloud hizmetlerinden (Cloud Logging) birinde merkezileştirilmesi için uygulama günlük kaydı oluşturabiliyoruz. Böylece günlük girişlerini anlamak için Gözlemlenebilirlik Gemini özelliğini de kullanabiliriz.

Bunun için önce Google Cloud'daki mevcut Python Cloud Logging kitaplığını kullanmamız ve bu kitaplığı bilgi, uyarı veya hata mesajlarını günlüğe kaydetmek için kullanmamız gerekir (günlük / önem düzeyine bağlı olarak).

Bunu öncelikle Code Assist'e sormaya çalışalım. Şu istemi deneyin:

How do I use the google-cloud-logging package in Python?

Aşağıdaki gibi, konuyla ilgili bazı bilgiler içeren bir yanıt alırsınız:

2472e1ccaf8a217d.png

Oturumları kategoriye göre arayan işleve günlük ifadeleri ekleyelim.

İlk olarak google-cloud-logging Python paketini requirements.txt dosyasına ekleyin.

Sırada, günlük kaydını uygulamak için kodu nasıl entegre ettiğimizi gösteren bir kod snippet'i var:

...
from google.cloud import logging
...
app = Flask(__name__)

# Create a logger
logger = logging.Client().logger('my-log')

@app.route('/sessions/categories/<category>', methods=['GET'])
def get_sessions_by_category(category):
   logger.log_text(f"Fetching sessions with category {category}")
   sessions_by_category = [session for session in sessions.sessions if category in session['categories']]
   logger.log_text(f'Found {len(sessions_by_category)} sessions with category {category}')
   return jsonify(sessions_by_category)

# # Other App Routes

Önceki bölümde açıklanan komutu kullanarak hizmeti Cloud Run'a tekrar dağıtın ve dağıtıldıktan sonra /sessions/categories/<category> uç noktasına birkaç çağrı yürütün.

Cloud Console → Logs Explorer sayfasına gidin.

59e297577570695.png

...ve aşağıda gösterildiği gibi bu günlük ifadelerini filtreleyebilirsiniz:

914f1fb6cac30a89.png

Günlük ifadelerinden herhangi birini tıklayıp genişletebilir ve ardından Explain this log entry simgesini tıklayarak günlük girişini açıklamak için Gemini'dan yararlanabilirsiniz. Google Cloud için Gemini'ı etkinleştirmediyseniz Cloud AI Companion API'yi etkinleştirmeniz isteneceğini unutmayın. Lütfen talimatları verildiği şekilde yapın.

Aşağıda örnek bir yanıt verilmiştir:

7fc9783910fa92cc.png

16. Tebrikler

Tebrikler, sıfırdan bir uygulamayı başarıyla derlediniz ve Gemini Code Assist'i SDLC'nin tasarım, derleme, test ve dağıtım gibi birçok alanında kullandınız.

Sırada ne var?

Bu codelab'lerden bazılarına göz atın...

Referans belgeler