Yasal Uyarı: Bu eğitimde okuyucuların Python, API'ler, Git ve Birim Testleri hakkında temel bilgiye sahip olduğu varsayılmaktadır. En harika animasyonlara sahip çeşitli CLI yazılımlarıyla karşılaştım ve bu beni meraklandırdı: 'Minimalist' taş-kağıt-makas okul projemi geliştirebilir miyim? Merhaba, haydi oynayalım! Dövüşçünüzü seçin (taş, kağıt, makas): kaya CLI programı nedir? Wikipedia'da belirtildiği gibi, "Komut satırı arayüzü (CLI), bir kullanıcı veya istemciden gelen komutlarla ve cihaz veya programdan gelen yanıtlarla, metin satırları biçiminde bir cihaz veya bilgisayar programıyla etkileşim kurmanın bir yoludur." Başka bir deyişle, CLI programı, kullanıcının komut satırını kullanarak programla etkileşime geçmek için komutları çalıştırdığı bir programdır. Birçok günlük yazılım bir CLI programı olarak paketlenmiştir. Örneğin, herhangi bir UNIX sistemiyle birlikte gönderilen ve terminalde çalıştırılarak etkinleştirilebilen bir araç olan metin düzenleyicisini ele alalım. vim <FILE> vim ile ilgili olarak, bir CLI programının anatomisine dalalım. Google Cloud CLI Argümanlar Argümanlar (Parametreler) bir programa sağlanan bilgi öğeleridir. Konumlarına göre tanımlandıkları için genellikle konumsal argümanlar olarak anılırlar. Örneğin çekirdek bölümde özelliğini ayarlamak istediğimizde çalıştırıyoruz. project gcloud config set project <PROJECT_ID> Özellikle, bunu şu dile çevirebiliriz: Argüman İçerik Arg 0 gcloud Argüman 1 yapılandırma … … Komutlar Komutlar, bilgisayara talimatlar sağlayan bir dizi argümandır. Önceki örneğe göre, çekirdek bölümde çalıştırarak özelliğini ayarladık. gcloud config set project <PROJECT_ID> project Başka bir deyişle bir komuttur. set İsteğe Bağlı Komutlar Genellikle komutlar gereklidir ancak istisnalar yapabiliriz. Programın kullanım durumuna göre isteğe bağlı komutlar tanımlayabiliriz. Resmi belgelerinde belirtildiği gibi, komutuna geri dönersek, özellikleri değiştirmenize izin veren bir komut grubudur. Kullanımı şu şekilde: gcloud config gcloud config gcloud config GROUP | COMMAND [GCLOUD_WIDE_FLAG … ] bu sayede COMMAND , vb. olabilir... (GROUP'un olduğunu unutmayın) set list config Seçenekler Seçenekler, bir komutun davranışını değiştiren belgelenmiş parametre türleridir. Bunlar '-' veya '--' ile gösterilen anahtar/değer çiftleridir. komut grubunun kullanımına dönersek, bu durumda seçenek(ler) . gcloud config GCLOUD_WIDE_FLAG Örneğin komutun detaylı kullanımını ve açıklamasını görüntülemek istediğimizi varsayalım, çalıştırıyoruz. Başka bir deyişle seçenektir. gcloud config set –help --help Diğer bir örnek ise belirli bir projenin hesaplama bölümünde bölge özelliğini ayarlamak istediğimizde çalıştırmamızdır. Başka bir deyişle , değerini tutan bir seçenektir. gcloud config set compute <ZONE_NAME> –project=<PROJECT_ID> --project <PROJECT_ID> Ayrıca konumlarının genellikle önemli olmadığını da belirtmek önemlidir. Zorunlu Seçenekler Adı gibi seçenekler de genellikle isteğe bağlıdır ancak zorunlu olacak şekilde de uyarlanabilir. Örneğin, bir dataproc kümesi oluşturmak istediğimizde, çalıştırıyoruz. Ve kullanım belgelerinde belirtildiği gibi: gcloud dataproc clusters create <CLUSTER_NAME> –region=<REGION> gcloud dataproc clusters create (CLUSTER: –region=REGION) bayrağı daha önce yapılandırılmamışsa zorunludur. --region Kısa Seçenekler ve Uzun Seçenekler Kısa seçenekler ile başlar ve ardından tek bir alfasayısal karakter gelir; uzun seçenekler ise ile başlar ve ardından birden fazla karakter gelir. Kısa seçenekleri, kullanıcı ne istediğinden emin olduğunda kısayollar olarak düşünün; uzun seçenekler ise daha okunaklıdır. - -- Rock'ı seçtin! Bilgisayar şimdi seçimini yapacak. Bu eğitim sayesinde neyi başaracağız? O yüzden yalan söyledim… Temel taş-kağıt-makas CLI programını yükseltmeye çalışmayacağız. Bunun yerine gerçek dünyadaki bir senaryoya bakalım: Anahat ve Hedefler Ekibiniz projedeki sorunları ve ilerlemeyi takip etmek için Trello'yu kullanıyor. Ekibiniz panoyla etkileşim kurmanın daha basitleştirilmiş bir yolunu arıyor; terminal aracılığıyla yeni bir GitHub deposu oluşturmaya benzer bir şey. Ekip, panonun 'Yapılacaklar' sütununa yeni bir kart ekleyebilme temel gereksinimiyle bir CLI programı oluşturmanız için size başvurdu. Bahsedilen gereksinimden yola çıkarak CLI programımızın gereksinimlerini tanımlayarak taslağını oluşturalım: İşlevsel gereksinimler Kullanıcı panodaki bir sütuna yeni bir kart ekleyebilir Gerekli girişler: sütun, kart adı İsteğe bağlı girişler: kart açıklaması, kart etiketleri (mevcut olanlardan seçim yapın) İşlevsel Olmayan Gereksinimler Kullanıcıdan Trello hesabına erişim sağlamasını isteyen program (yetkilendirme) Kullanıcıdan hangi Trello kartı üzerinde çalışılacağını ayarlamasını isteyen program (yapılandırma) İsteğe Bağlı Gereksinimler Kullanıcı panoya yeni bir sütun ekleyebilir Kullanıcı panoya yeni bir etiket ekleyebilir Kullanıcı tüm sütunların basitleştirilmiş/ayrıntılı görünümünü görebilir Yukarıdakilere dayanarak CLI programımızın komutlarını ve seçeneklerini şu şekilde resmileştirebiliriz: Not: Son iki sütun hakkında endişelenmeyin, bunu daha sonra öğreneceğiz… Teknoloji yığınımıza gelince, buna sadık kalacağız: Birim Testleri pytest pytest-sahte iklim testi yardımcıları Trello py-trello (Trello SDK'sı için Python sarmalayıcısı) CLI daktilo zengin basit terim menüsü Yardımcı Araçlar (Çeşitli) python-dotenv Zaman çizelgesi Bu projeyi bölümler halinde ele alacağız ve işte bekleyebileceğiniz şeylerin bir kısmı: Bölüm 1 iş mantığının uygulanması py-trello Bölüm 2 CLI iş mantığının uygulanması CLI programını paket olarak dağıtma Bölüm 3 İsteğe bağlı işlevsel gereksinimlerin uygulanması Paket güncellemesi Bilgisayar makası seçti! Bakalım bu savaşı kim kazanacak… Başlayalım Klasör Yapısı Amaç CLI programını üzerinde paket olarak dağıtmaktır. Bu nedenle böyle bir kuruluma ihtiyaç vardır: PyPI trellocli/ __init__.py __main__.py models.py cli.py trelloservice.py tests/ test_cli.py test_trelloservice.py README.md pyproject.toml .env .gitignore İşte her dosya ve/veya dizine ayrıntılı bir bakış: : kullanıcılar tarafından kullanılacak paket adı görevi görür; örneğin trellocli pip install trellocli : paketin kökünü temsil eder, klasörü bir Python paketi olarak uygun hale getirir __init__.py : giriş noktasını tanımlar ve kullanıcıların bayrağını kullanarak dosya yolunu belirtmeden modülleri çalıştırmasına olanak tanır; örneğin yerine __main__.py -m python -m <module_name> python -m <parent_folder>/<module_name>.py : küresel olarak kullanılan sınıfları saklar; örneğin, API yanıtlarının uyması beklenen modeller models.py : CLI komutları ve seçenekleri için iş mantığını saklar cli.py : ile etkileşime geçmek için iş mantığını saklar trelloservice.py py-trello : programın birim testlerini saklar tests : CLI uygulaması için birim testlerini saklar test_cli.py : ile etkileşim için birim testlerini saklar test_trelloservice.py py-trello : programın belgelerini saklar README.md : paketin yapılandırmalarını ve gereksinimlerini saklar pyproject.toml : ortam değişkenlerini saklar .env : sürüm kontrolü sırasında göz ardı edilecek (izlenmeyecek) dosyaları belirtir .gitignore Python paketlerini yayınlamaya ilişkin daha ayrıntılı bir açıklama için işte size göz atabileceğiniz harika bir makale: Açık Kaynaklı Python Paketi PyPI'de Nasıl Yayınlanır Yazan: Geir Arne Hjelle Kurmak Başlamadan önce paketin kurulumuna değinelim. Uygulama adı ve sürümü gibi paket sabitlerinin ve değişkenlerin depolandığı yer olan paketimizdeki dosyasıyla başlayarak. Bizim durumumuzda aşağıdakileri başlatmak istiyoruz: __init__.py uygulama ismi versiyon BAŞARI ve HATA sabitleri # trellocli/__init__.py __app_name__ = "trellocli" __version__ = "0.1.0" ( SUCCESS, TRELLO_WRITE_ERROR, TRELLO_READ_ERROR ) = range(3) ERRORS = { TRELLO_WRITE_ERROR: "Error when writing to Trello", TRELLO_READ_ERROR: "Error when reading from Trello" } dosyasına geçtiğinizde programınızın ana akışı burada saklanmalıdır. Bizim durumumuzda, dosyasında çağrılabilir bir fonksiyonun olacağını varsayarak CLI program giriş noktasını saklayacağız. __main__.py cli.py # trellocli/__main__.py from trellocli import cli def main(): # we'll modify this later - after the implementation of `cli.py` pass if __name__ == "__main__": main() Artık paket kurulduğuna göre dosyamızı (ana belgeler) güncellemeye bir göz atalım. Takip etmemiz gereken belirli bir yapı yoktur ancak iyi bir README aşağıdakilerden oluşacaktır: README.md Genel Bakış Kurulum ve Gereksinimler Başlarken ve Kullanım Daha derine inmek istiyorsanız okuyabileceğiniz bir başka harika yazı: Merlos'tan İyi Bir README Nasıl Yazılır Bu proje için README'yi şu şekilde yapılandırmak istiyorum <!--- README.md --> # Overview # Getting Started # Usage # Architecture ## Data Flow ## Tech Stack # Running Tests # Next Steps # References Şimdilik iskeleti olduğu gibi bırakalım - buna daha sonra döneceğiz. Devam edelim, paketimizin meta verilerini göre yapılandıralım resmi belgelere # pyproject.toml [project] name = "trellocli_<YOUR_USERNAME>" version = "0.1.0" authors = [ { name = "<YOUR_NAME>", email = "<YOUR_EMAIL>" } ] description = "Program to modify your Trello boards from your computer's command line" readme = "README.md" requires-python = ">=3.7" classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] dependencies = [] [project.urls] "Homepage" = "" Değiştirmeniz gereken yer tutucuların nasıl olduğuna dikkat edin, örneğin kullanıcı adınız, adınız… Başka bir not olarak, ana sayfa URL'sini şimdilik boş bırakacağız. GitHub'da yayınladıktan sonra değişiklik yapacağız. Ayrıca bağımlılıklar kısmını da şimdilik boş bırakacağız ve ilerledikçe ekleme yapacağız. Listede bir sonraki adım, API sırları ve anahtarları gibi ortam değişkenlerimizi sakladığımız dosyamız olacaktır. Bu dosyanın hassas bilgiler içerdiğinden Git tarafından takip edilmemesi gerektiğini unutmamak önemlidir. .env Bizim durumumuzda Trello kimlik bilgilerimizi burada saklayacağız. Trello'da Güçlendirme oluşturmak için izleyin. Daha spesifik olarak, kullanımına bağlı olarak, uygulamamız için OAuth'u kullanmayı planladığımızdan Trello ile etkileşim kurmak için aşağıdakilere ihtiyacımız olacak: bu kılavuzu py-trello API Anahtarı (uygulamamız için) API Sırrı (uygulamamız için) Token (kullanıcının verilerine erişim izni veren token) API Anahtarınızı ve Sırrınızı aldıktan sonra bunları dosyasında bu şekilde saklayın. .env # .env TRELLO_API_KEY=<your_api_key> TRELLO_API_SECRET=<your_api_secret> Son olarak, bulunabilecek Python şablonunu kullanalım. Bunun, dosyamızın hiçbir zaman takip edilmemesini sağlamak için çok önemli olduğunu unutmayın; eğer bir noktada dosyamız takip edildiyse, daha sonraki adımlarda dosyayı kaldırsak bile, hasar meydana gelir ve kötü niyetli aktörler önceki dosyanın izini sürebilir. hassas bilgiler için yamalar. burada .gitignore .env .env Artık kurulum tamamlandığına göre değişikliklerimizi GitHub'a aktaralım. dosyasında belirtilen meta verilere bağlı olarak LİSANS'ınızı ve ana sayfa URL'nizi buna göre güncellemeyi unutmayın. Daha iyi taahhütlerin nasıl yazılacağına dair referans için: pyproject.toml Daha İyi Taahhütler Yaz, Daha İyi Projeler Oluştur - Victoria Dye Diğer önemli adımlar: Proje için bir virtualenv oluşturun Birim Testleri Testlerimizi yazmaya başlamadan önce, bir API ile çalıştığımız için, programımızı API kesintisi riski olmadan test edebilmek için deneme testleri uygulayacağımızı unutmamak önemlidir. İşte Real Python'un deneme testiyle ilgili başka bir harika makale: Python'da Harici API'leri Alay Etmek İşlevsel gereksinimlere bağlı olarak asıl amacımız kullanıcıların yeni bir kart eklemesine izin vermektir. yönteme başvurulması: . Bunu yapabilmek için sınıfından fonksiyonundan alınabilen sınıfından metodunu çağırmalıyız… py-trello add_card Board get_list List add_card Ana fikri anladınız; nihai hedefimize ulaşmak için pek çok yardımcı yönteme ihtiyacımız olacak, hadi kelimelerle ifade edelim: Müşterinin jetonunu almak için test edin Panoları geri almak için test edin Bir tahtayı almak için test edin Listeleri panodan almak için test edin Bir listeyi almak için test edin Etiketleri panodan almak için test edin Bir etiketi almak için test edin Kart eklemek için test edin Karta etiket ekleme testi Birim testleri yazarken testlerimizin mümkün olduğunca kapsamlı olmasını istediğimizi de unutmamak gerekir. Hataları iyi bir şekilde ele alıyor mu? Programımızın her yönünü kapsıyor mu? Ancak bu eğitimin amacına uygun olarak, yalnızca başarı durumlarını kontrol ederek işleri basitleştireceğiz. Koda dalmadan önce, dosyamızı birim testlerini yazmak/çalıştırmak için gereken bağımlılıkları içerecek şekilde değiştirelim. pyproject.toml # pyproject.toml [project] dependencies = [ "pytest==7.4.0", "pytest-mock==3.11.1" ] Daha sonra virtualenv'imizi etkinleştirelim ve bağımlılıkları yüklemek için. pip install . Bu tamamlandıktan sonra, nihayet bazı testler yazalım. Genel olarak testlerimiz, döndürülecek sahte bir yanıtı, döndürülen değeri sahte yanıtla düzelterek test etmeye çalıştığımız işleve bir yama ve son olarak işleve bir çağrı içermelidir. Kullanıcının erişim belirteçlerini almaya yönelik örnek bir test aşağıdakileri ister: # tests/test_trelloservice.py # module imports from trellocli import SUCCESS from trellocli.trelloservice import TrelloService from trellocli.models import * # dependencies imports # misc imports def test_get_access_token(mocker): """Test to check success retrieval of user's access token""" mock_res = GetOAuthTokenResponse( token="test", token_secret="test", status_code=SUCCESS ) mocker.patch( "trellocli.trelloservice.TrelloService.get_user_oauth_token", return_value=mock_res ) trellojob = TrelloService() res = trellojob.get_user_oauth_token() assert res.status_code == SUCCESS Örnek kodumda henüz ayarlanmamış bir model olduğuna dikkat edin. Daha temiz kod yazmaya yapı sağlar, bunu daha sonra çalışırken göreceğiz. GetOAuthTokenResponse models.py Testlerimizi çalıştırmak için çalıştırmanız yeterlidir. Testlerimizin nasıl başarısız olacağına dikkat edin, ama sorun değil; sonunda işe yarayacak. python -m pytest 💡 Kendi başınıza daha fazla test yazmayı deneyebilir misiniz? Testlerimin neye benzediğini görmek için başvurmaktan çekinmeyin Mücadele Köşesi bu yamaya Şimdilik oluşturalım. Yeni bir bağımlılık eklemekle başlayalım, bu sarmalayıcısıdır. trelloservice py-trello # pyproject.toml dependencies = [ "pytest==7.4.0", "pytest-mock==3.11.1", "py-trello==0.19.0" ] Bir kez daha bağımlılıkları yüklemek için. pip install . Modeller Şimdi beklediğimiz yanıtları düzenlemek için modellerimizi oluşturmaya başlayalım. Bu kısım için, bekleyebileceğimiz dönüş değeri türünü anlamak için birim testlerimize ve kaynak koduna başvurmak en iyisidir. trelloservice py-trello Örneğin, işlevine ( ) atıfta bulunarak kullanıcının erişim belirtecini almak istediğimizi varsayalım, dönüş değerinin buna benzer bir şey olmasını beklediğimizi biliyoruz py-trello create_oauth_token kaynak kodu # trellocli/models.py # module imports # dependencies imports # misc imports from typing import NamedTuple class GetOAuthTokenResponse(NamedTuple): token: str token_secret: str status_code: int Öte yandan, birbiriyle çelişen adlandırma kurallarına dikkat edin. Örneğin modülünün adında bir sınıfı vardır. Bunun geçici çözümü, içe aktarma sırasında bir takma ad sağlamak olabilir. py-trello List # trellocli/models.py # dependencies imports from trello import List as Trellolist Modelleri programınızın ihtiyaçlarına göre uyarlamak için de bu fırsatı kullanmaktan çekinmeyin. Örneğin, dönüş değerinden yalnızca bir özniteliğe ihtiyacınız olduğunu varsayalım; söz konusu değeri bir bütün olarak depolamak yerine dönüş değerinden çıkarmayı bekleyecek şekilde modelinizi yeniden düzenleyebilirsiniz. # trellocli/models.py class GetBoardName(NamedTuple): """Model to store board id Attributes id (str): Extracted board id from Board value type """ id: str 💡 Kendi başınıza daha fazla model yazmayı deneyebilir misiniz? Modellerimin neye benzediğini görmek için başvurmaktan çekinmeyin Challenge Köşesi bu yamaya İş mantığı Kurmak Modeller aşağı, resmi olarak kodlamaya başlayalım. Yine oluşturduğumuz birim testlere başvurmalıyız - mevcut test listesinin hizmet için tam kapsamı sağlamadığını söyleyin, gerektiğinde her zaman geri dönün ve daha fazla test ekleyin. trelloservice Her zamanki gibi, tüm içe aktarma ifadelerini en üste ekleyin. Ardından beklendiği gibi sınıfını ve yer tutucu yöntemlerini oluşturun. Fikir şu ki, hizmetin paylaşılan bir örneğini başlatacağız ve yöntemlerini buna göre çağıracağız. Ayrıca ölçeklenebilirliği, dolayısıyla geniş kapsama ihtiyacını hedefliyoruz. TrelloService cli.py # trellocli/trelloservice.py # module imports from trellocli import TRELLO_READ_ERROR, TRELLO_WRITE_ERROR, SUCCESS from trellocli.models import * # dependencies imports from trello import TrelloClient # misc imports class TrelloService: """Class to implement the business logic needed to interact with Trello""" def __init__(self) -> None: pass def get_user_oauth_token() -> GetOAuthTokenResponse: pass def get_all_boards() -> GetAllBoardsResponse: pass def get_board() -> GetBoardResponse: pass def get_all_lists() -> GetAllListsResponse: pass def get_list() -> GetListResponse: pass def get_all_labels() -> GetAllLabelsResponse: pass def get_label() -> GetLabelResponse: pass def add_card() -> AddCardResponse: pass Not: Bu sefer testlerimizi yaptığımızda testlerimizin nasıl geçeceğine dikkat edin. Aslında bu, doğru yolda ilerlememizi sağlamamıza yardımcı olacaktır. İş akışı, işlevlerimizi genişletmek, testlerimizi yürütmek, başarılı/başarısız olup olmadığını kontrol etmek ve buna göre yeniden düzenleme yapmak olmalıdır. Yetkilendirme ve TrelloClient'ı Başlatma işleviyle başlayalım. Buradaki fikir işlevini çağırmak ve başlatmaktır. Yine bu tür hassas bilgilerin yalnızca dosyasında saklanması gerektiğini vurgulayarak, hassas bilgileri almak için bağımlılığını kullanacağız. dosyamızı buna göre değiştirdikten sonra yetkilendirme adımlarını uygulamaya başlayalım. __init__ get_user_oauth_token TrelloClient .env python-dotenv pyproject.toml # trellocli/trelloservice.py class TrelloService: """Class to implement the business logic needed to interact with Trello""" def __init__(self) -> None: self.__load_oauth_token_env_var() self.__client = TrelloClient( api_key=os.getenv("TRELLO_API_KEY"), api_secret=os.getenv("TRELLO_API_SECRET"), token=os.getenv("TRELLO_OAUTH_TOKEN") ) def __load_oauth_token_env_var(self) -> None: """Private method to store user's oauth token as an environment variable""" load_dotenv() if not os.getenv("TRELLO_OAUTH_TOKEN"): res = self.get_user_oauth_token() if res.status_code == SUCCESS: dotenv_path = find_dotenv() set_key( dotenv_path=dotenv_path, key_to_set="TRELLO_OAUTH_TOKEN", value_to_set=res.token ) else: print("User denied access.") self.__load_oauth_token_env_var() def get_user_oauth_token(self) -> GetOAuthTokenResponse: """Helper method to retrieve user's oauth token Returns GetOAuthTokenResponse: user's oauth token """ try: res = create_oauth_token() return GetOAuthTokenResponse( token=res["oauth_token"], token_secret=res["oauth_token_secret"], status_code=SUCCESS ) except: return GetOAuthTokenResponse( token="", token_secret="", status_code=TRELLO_AUTHORIZATION_ERROR ) Bu uygulamada, örneğin kullanıcının yetkilendirme sırasında tıklaması gibi öngörülebilir hataların üstesinden gelmek için bir yardımcı yöntem oluşturduk. Üstelik, geçerli bir yanıt alınana kadar yinelemeli olarak kullanıcının yetkilendirmesini isteyecek şekilde ayarlanmıştır, çünkü gerçek şu ki, kullanıcı uygulamamıza kendi hesap verilerine erişme yetkisi vermedikçe devam edemeyiz. Deny 💡 dikkat edin? Bu hatayı paket sabiti olarak bildirebilir misiniz? Daha fazla bilgi için Kurulum'a bakın Mücadele Köşesi TRELLO_AUTHORIZATION_ERROR Yardımcı İşlevler Artık yetkilendirme kısmı bittiğine göre, kullanıcının Trello panolarını almakla başlayarak yardımcı işlevlere geçelim. # trellocli/trelloservice.py def get_all_boards(self) -> GetAllBoardsResponse: """Method to list all boards from user's account Returns GetAllBoardsResponse: array of user's trello boards """ try: res = self.__client.list_boards() return GetAllBoardsResponse( res=res, status_code=SUCCESS ) except: return GetAllBoardsResponse( res=[], status_code=TRELLO_READ_ERROR ) def get_board(self, board_id: str) -> GetBoardResponse: """Method to retrieve board Required Args board_id (str): board id Returns GetBoardResponse: trello board """ try: res = self.__client.get_board(board_id=board_id) return GetBoardResponse( res=res, status_code=SUCCESS ) except: return GetBoardResponse( res=None, status_code=TRELLO_READ_ERROR ) Listeleri (sütunları) almaya gelince, sınıfını kontrol etmemiz gerekecek, başka bir deyişle değer tipinin yeni bir parametresini kabul etmemiz gerekecek. py-trello Board Board # trellocli/trelloservice.py def get_all_lists(self, board: Board) -> GetAllListsResponse: """Method to list all lists (columns) from the trello board Required Args board (Board): trello board Returns GetAllListsResponse: array of trello lists """ try: res = board.all_lists() return GetAllListsResponse( res=res, status_code=SUCCESS ) except: return GetAllListsResponse( res=[], status_code=TRELLO_READ_ERROR ) def get_list(self, board: Board, list_id: str) -> GetListResponse: """Method to retrieve list (column) from the trello board Required Args board (Board): trello board list_id (str): list id Returns GetListResponse: trello list """ try: res = board.get_list(list_id=list_id) return GetListResponse( res=res, status_code=SUCCESS ) except: return GetListResponse( res=None, status_code=TRELLO_READ_ERROR ) 💡 ve işlevini kendi başınıza uygulayabilir misiniz? sınıfını gözden geçirin. Uygulamamın nasıl göründüğünü görmek için başvurmaktan çekinmeyin Challenge Köşesi get_all_labels get_label py-trello Board bu yamaya Yeni Kart Ekleme Fonksiyonu Son olarak, tüm bu zaman boyunca hedeflediğimiz şeye nihayet ulaştık: yeni bir kart eklemek. Burada daha önce belirtilen işlevlerin tümünü kullanmayacağımızı unutmayın; yardımcı işlevlerin amacı ölçeklenebilirliği artırmaktır. # trellocli/trelloservice.py def add_card( self, col: Trellolist, name: str, desc: str = "", labels: List[Label] = [] ) -> AddCardResponse: """Method to add a new card to a list (column) on the trello board Required Args col (Trellolist): trello list name (str): card name Optional Args desc (str): card description labels (List[Label]): list of labels to be added to the card Returns AddCardResponse: newly-added card """ try: # create new card new_card = col.add_card(name=name) # add optional description if desc: new_card.set_description(description=desc) # add optional labels if labels: for label in labels: new_card.add_label(label=label) return AddCardResponse( res=new_card, status_code=SUCCESS ) except: return AddCardResponse( res=new_card, status_code=TRELLO_WRITE_ERROR ) 🎉 Artık bu iş bitti ve temizlendi, README'nizi uygun şekilde güncellemeyi ve kodunuzu GitHub'a aktarmayı unutmayın. Tebrikler! Kazandın. Tekrar oynayalım mı (e/h)? Sarmak Bana katlandığınız için teşekkürler :) Bu eğitim sayesinde, birim testleri yazarken alay etmeyi, modelleri tutarlılık için yapılandırmayı, temel işlevleri bulmak için kaynak kodunu baştan sona okumayı ve üçüncü taraf sarmalayıcı kullanarak iş mantığını uygulamayı başarıyla öğrendiniz. CLI programının uygulanması konusunda derinlemesine bir inceleme yapacağımız Bölüm 2'yi takip edin. Bu arada iletişimde kalalım 👀 GitHub kaynak kodu: https://github.com/elainechan01/trellocli