দাবিত্যাগ: এই টিউটোরিয়ালটি অনুমান করে যে পাঠকদের পাইথন, এপিআই, গিট এবং ইউনিট টেস্টের মৌলিক জ্ঞান রয়েছে। আমি সেরা অ্যানিমেশন সহ বিভিন্ন CLI সফ্টওয়্যার জুড়ে এসেছি, এবং এটি আমাকে ভাবতে পেরেছে - আমি কি কখনও আমার 'নিম্নতম' রক-পেপার-সিসর স্কুল প্রকল্পকে আপগ্রেড করতে পারি? হাই, খেলা যাক! আপনার ফাইটার চয়ন করুন (শিলা, কাগজ, কাঁচি): শিলা একটি CLI প্রোগ্রাম কি? উইকিপিডিয়ায় যেমন বলা হয়েছে, "কমান্ড-লাইন ইন্টারফেস (সিএলআই) হল একটি ডিভাইস বা কম্পিউটার প্রোগ্রামের সাথে ব্যবহারকারী বা ক্লায়েন্টের কমান্ডের সাথে ইন্টারঅ্যাক্ট করার একটি মাধ্যম এবং পাঠ্যের লাইনের আকারে ডিভাইস বা প্রোগ্রাম থেকে প্রতিক্রিয়া।" অন্য কথায়, একটি CLI প্রোগ্রাম হল একটি প্রোগ্রাম যেখানে ব্যবহারকারী কমান্ড লাইন ব্যবহার করে প্রোগ্রামের সাথে ইন্টারঅ্যাক্ট করতে নির্দেশনা প্রদান করে। অনেক দৈনন্দিন সফ্টওয়্যার একটি CLI প্রোগ্রাম হিসাবে মোড়ানো হয়. উদাহরণ স্বরূপ টেক্সট এডিটর নিন - যে কোনো UNIX সিস্টেমের সাথে পাঠানো একটি টুল যা শুধুমাত্র টার্মিনালে চালিয়ে সক্রিয় করা যেতে পারে। vim vim <FILE> সম্পর্কিত, আসুন একটি সিএলআই প্রোগ্রামের শারীরস্থানে ডুব দেওয়া যাক। গুগল ক্লাউড সিএলআই যুক্তি আর্গুমেন্ট (প্যারামিটার) হল একটি প্রোগ্রামে প্রদত্ত তথ্যের আইটেম। এটি প্রায়ই অবস্থানগত যুক্তি হিসাবে উল্লেখ করা হয় কারণ তারা তাদের অবস্থান দ্বারা চিহ্নিত করা হয়। উদাহরণস্বরূপ, যখন আমরা মূল বিভাগে সম্পত্তি সেট করতে চাই, তখন আমরা project gcloud config set project <PROJECT_ID> উল্লেখযোগ্যভাবে, আমরা এটিতে অনুবাদ করতে পারি যুক্তি বিষয়বস্তু Arg 0 জিক্লাউড Arg 1 কনফিগারেশন … … কমান্ড কমান্ড হল আর্গুমেন্টের একটি বিন্যাস যা কম্পিউটারকে নির্দেশনা প্রদান করে। পূর্ববর্তী উদাহরণের উপর ভিত্তি করে, আমরা চালিয়ে মূল বিভাগে সম্পত্তি সেট করি gcloud config set project <PROJECT_ID> project অন্য কথায়, একটি কমান্ড। set ঐচ্ছিক কমান্ড সাধারণত, কমান্ডের প্রয়োজন হয় কিন্তু আমরা ব্যতিক্রম করতে পারি। প্রোগ্রামের ব্যবহারের ক্ষেত্রে, আমরা ঐচ্ছিক কমান্ড সংজ্ঞায়িত করতে পারি। তাদের অফিসিয়াল ডকুমেন্টেশনে যেমন বলা হয়েছে, কমান্ডের কথা উল্লেখ করে, হল একটি কমান্ড গ্রুপ যা আপনাকে বৈশিষ্ট্যগুলি পরিবর্তন করতে দেয়। ব্যবহারটি নিম্নরূপ: gcloud config gcloud config gcloud config GROUP | COMMAND [GCLOUD_WIDE_FLAG … ] যার দ্বারা COMMAND হয় যেতে পারে, , ইত্যাদি... (মনে রাখবেন GROUP হল ) set list config অপশন বিকল্পগুলি নথিভুক্ত ধরনের পরামিতি যা একটি কমান্ডের আচরণ পরিবর্তন করে। এগুলি কী-মানের জোড়া যা '-' বা '--' দ্বারা চিহ্নিত করা হয়। কমান্ড গ্রুপের ব্যবহারে ফিরে যাওয়া, এই ক্ষেত্রে বিকল্পটি হল । gcloud config GCLOUD_WIDE_FLAG উদাহরণস্বরূপ, বলুন যে আমরা কমান্ডের বিস্তারিত ব্যবহার এবং বিবরণ প্রদর্শন করতে চেয়েছিলাম, আমরা । অন্য কথায়, হল বিকল্প। gcloud config set –help --help আরেকটি উদাহরণ হল যখন আমরা একটি নির্দিষ্ট প্রকল্পের কম্পিউট বিভাগে জোন প্রপার্টি সেট করতে চাই, তখন আমরা চালাই। অন্য কথায়, হল একটি বিকল্প যা মান ধারণ করে। gcloud config set compute <ZONE_NAME> –project=<PROJECT_ID> --project <PROJECT_ID> এটাও মনে রাখা গুরুত্বপূর্ণ যে তাদের অবস্থান সাধারণত কোন ব্যাপার না। বাধ্যতামূলক বিকল্প বিকল্পগুলি, এর নামের মতো, সাধারণত ঐচ্ছিক, তবে বাধ্যতামূলক হওয়ার জন্যও তৈরি করা যেতে পারে। উদাহরণস্বরূপ, যখন আমরা একটি ডেটাপ্রোক ক্লাস্টার তৈরি করতে চাই, তখন আমরা । এবং তাদের ব্যবহারের ডকুমেন্টেশনে বলা হয়েছে: gcloud dataproc clusters create <CLUSTER_NAME> –region=<REGION> gcloud dataproc clusters create (CLUSTER: –region=REGION) পতাকা বাধ্যতামূলক যদি এটি পূর্বে কনফিগার করা না থাকে। --region সংক্ষিপ্ত বিকল্প বনাম দীর্ঘ বিকল্প সংক্ষিপ্ত বিকল্পগুলি দিয়ে শুরু হয় একটি একক বর্ণানুক্রমিক অক্ষর দ্বারা অনুসরণ করা হয়, যেখানে দীর্ঘ বিকল্পগুলি এর পরে একাধিক অক্ষর দ্বারা শুরু হয়৷ সংক্ষিপ্ত বিকল্পগুলিকে শর্টকাট হিসাবে ভাবুন যখন ব্যবহারকারী নিশ্চিত হন যে তারা কী চান তবে দীর্ঘ বিকল্পগুলি আরও পাঠযোগ্য। - -- আপনি শিলা চয়ন! কম্পিউটার এখন তার নির্বাচন করবে। এই টিউটোরিয়ালের মাধ্যমে আমরা কী অর্জন করব? তাই আমি মিথ্যা বলেছি... আমরা প্রধান শিলা-কাগজ-কাঁচি CLI প্রোগ্রাম আপগ্রেড করার চেষ্টা করব না। পরিবর্তে, আসুন একটি বাস্তব-বিশ্বের দৃশ্যকল্পের দিকে নজর দেওয়া যাক: রূপরেখা এবং লক্ষ্য আপনার দল প্রজেক্টের সমস্যা এবং অগ্রগতির ট্র্যাক রাখতে ট্রেলো ব্যবহার করে। আপনার দল বোর্ডের সাথে ইন্টারঅ্যাক্ট করার আরও সহজ উপায় খুঁজছে - টার্মিনালের মাধ্যমে একটি নতুন GitHub সংগ্রহস্থল তৈরি করার মতো কিছু। বোর্ডের 'টু ডু' কলামে একটি নতুন কার্ড যোগ করতে সক্ষম হওয়ার এই মৌলিক প্রয়োজনীয়তার সাথে একটি CLI প্রোগ্রাম তৈরি করতে দলটি আপনার দিকে ফিরেছে। উল্লিখিত প্রয়োজনীয়তার উপর ভিত্তি করে, আসুন আমাদের CLI প্রোগ্রামের প্রয়োজনীয়তাগুলি সংজ্ঞায়িত করে খসড়া তৈরি করি: ক্রিয়ামূলক প্রয়োজনীয়তা ব্যবহারকারী বোর্ডের একটি কলামে একটি নতুন কার্ড যোগ করতে পারেন প্রয়োজনীয় ইনপুট: কলাম, কার্ডের নাম ঐচ্ছিক ইনপুট: কার্ডের বিবরণ, কার্ড লেবেল (বিদ্যমান থেকে নির্বাচন করুন) অ-কার্যকর প্রয়োজনীয়তা ট্রেলো অ্যাকাউন্টে অ্যাক্সেস প্রদানের জন্য ব্যবহারকারীকে অনুরোধ করার জন্য প্রোগ্রাম (অনুমোদন) কোন ট্রেলো বোর্ডে কাজ করতে হবে তা ব্যবহারকারীকে প্রম্পট করার জন্য প্রোগ্রাম (কনফিগারেশন) ঐচ্ছিক প্রয়োজনীয়তা ব্যবহারকারী বোর্ডে একটি নতুন কলাম যোগ করতে পারেন ব্যবহারকারী বোর্ডে একটি নতুন লেবেল যোগ করতে পারেন ব্যবহারকারী সমস্ত কলামের একটি সরলীকৃত/বিশদ দৃশ্য দেখতে পারেন উপরের উপর ভিত্তি করে, আমরা আমাদের CLI প্রোগ্রামের কমান্ড এবং বিকল্পগুলিকে আনুষ্ঠানিক করতে পারি: Ps শেষ দুটি কলাম সম্পর্কে চিন্তা করবেন না, আমরা এটি সম্পর্কে পরে শিখব... আমাদের প্রযুক্তিগত স্ট্যাকের জন্য, আমরা এটির সাথে লেগে থাকব: ইউনিট পরীক্ষা pytest pytest- উপহাস cli-পরীক্ষা-সহায়ক ট্রেলো py-trello (Trello SDK-এর জন্য পাইথন মোড়ক) সিএলআই টাইপার ধনী সহজ-মেনু ইউটিলস (বিবিধ) python-dotenv টাইমলাইন আমরা এই প্রকল্পটি অংশে মোকাবেলা করব এবং আপনি যা আশা করতে পারেন তার একটি স্নিপেট এখানে রয়েছে: অংশ 1 ব্যবসায়িক যুক্তির বাস্তবায়ন py-trello অংশ ২ CLI ব্যবসায়িক যুক্তির বাস্তবায়ন একটি প্যাকেজ হিসাবে CLI প্রোগ্রাম বিতরণ পার্ট 3 ঐচ্ছিক কার্যকরী প্রয়োজনীয়তা বাস্তবায়ন প্যাকেজ আপডেট কম্পিউটার বেছে নিয়েছে কাঁচি! দেখা যাক এই যুদ্ধে কে জয়ী হয়... চল শুরু করি ফোল্ডার স্ট্রাকচার লক্ষ্য হল তে একটি প্যাকেজ হিসাবে CLI প্রোগ্রাম বিতরণ করা। সুতরাং, এই ধরনের একটি সেটআপ প্রয়োজন: 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 এখানে প্রতিটি ফাইল এবং/অথবা ডিরেক্টরিতে একটি গভীর ডুব রয়েছে: : ব্যবহারকারীদের দ্বারা ব্যবহার করা প্যাকেজ নাম হিসাবে কাজ করে যেমন, trellocli pip install trellocli : প্যাকেজের মূল প্রতিনিধিত্ব করে, ফোল্ডারটিকে পাইথন প্যাকেজ হিসাবে মেনে চলে __init__.py : এন্ট্রি পয়েন্ট সংজ্ঞায়িত করে, এবং ব্যবহারকারীদের ফ্ল্যাগ ব্যবহার করে ফাইল পাথ নির্দিষ্ট না করে মডিউল চালানোর অনুমতি দেয় যেমন, <module_name> __main__.py -m python -m <module_name> python -m <parent_folder>/<module_name>.py : বিশ্বব্যাপী ব্যবহৃত ক্লাসগুলি সঞ্চয় করে যেমন, মডেল যেগুলি API প্রতিক্রিয়াগুলি মেনে চলবে বলে আশা করা হয় models.py : CLI কমান্ড এবং বিকল্পগুলির জন্য ব্যবসায়িক যুক্তি সংরক্ষণ করে cli.py : এর সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবসায়িক যুক্তি সংরক্ষণ করে trelloservice.py py-trello : প্রোগ্রামের জন্য ইউনিট পরীক্ষা সঞ্চয় করে tests : CLI বাস্তবায়নের জন্য ইউনিট পরীক্ষা সঞ্চয় করে test_cli.py : এর সাথে ইন্টারঅ্যাকশনের জন্য ইউনিট পরীক্ষা সঞ্চয় করে test_trelloservice.py py-trello : প্রোগ্রামের জন্য ডকুমেন্টেশন সঞ্চয় করে README.md : প্যাকেজের কনফিগারেশন এবং প্রয়োজনীয়তা সংরক্ষণ করে pyproject.toml : পরিবেশের ভেরিয়েবল সঞ্চয় করে .env : সংস্করণ নিয়ন্ত্রণের সময় উপেক্ষা করা ফাইলগুলিকে নির্দিষ্ট করে (ট্র্যাক করা হয়নি) .gitignore পাইথন প্যাকেজ প্রকাশের আরও বিশদ ব্যাখ্যার জন্য, এখানে পরীক্ষা করার জন্য একটি দুর্দান্ত নিবন্ধ রয়েছে: গেইর আর্নে হেজেলের দ্বারা PyPI-তে একটি ওপেন-সোর্স পাইথন প্যাকেজ কীভাবে প্রকাশ করবেন সেটআপ আমরা শুরু করার আগে, প্যাকেজ সেট আপ করার উপর ভিত্তি স্পর্শ করা যাক। আমাদের প্যাকেজের ফাইল দিয়ে শুরু, যেখানে প্যাকেজ ধ্রুবক এবং ভেরিয়েবল সংরক্ষণ করা হয়, যেমন অ্যাপের নাম এবং সংস্করণ। আমাদের ক্ষেত্রে, আমরা নিম্নলিখিতগুলি শুরু করতে চাই: __init__.py অ্যাপ্লিকেশন নাম সংস্করণ সাফল্য এবং ত্রুটি ধ্রুবক # 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" } ফাইলে চলে গেলে, আপনার প্রোগ্রামের মূল প্রবাহ এখানে সংরক্ষণ করা উচিত। আমাদের ক্ষেত্রে, আমরা CLI প্রোগ্রাম এন্ট্রি পয়েন্ট সংরক্ষণ করব, ধরে নিই যে এ একটি কলযোগ্য ফাংশন থাকবে। __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() এখন প্যাকেজটি সেট আপ করা হয়েছে, আসুন আমাদের ফাইল (প্রধান ডকুমেন্টেশন) আপডেট করার দিকে নজর দেওয়া যাক। আমাদের অবশ্যই অনুসরণ করতে হবে এমন একটি নির্দিষ্ট কাঠামো নেই, তবে একটি ভাল README নিম্নলিখিতগুলি নিয়ে গঠিত: README.md ওভারভিউ ইনস্টলেশন এবং প্রয়োজনীয়তা শুরু করা এবং ব্যবহার আপনি যদি আরও গভীরে যেতে চান তবে পড়ার জন্য আরেকটি দুর্দান্ত পোস্ট: মেরলোসের দ্বারা কীভাবে একটি ভাল README লিখবেন এই প্রকল্পের জন্য আমি কীভাবে README গঠন করতে চাই তা এখানে <!--- README.md --> # Overview # Getting Started # Usage # Architecture ## Data Flow ## Tech Stack # Running Tests # Next Steps # References চলুন কঙ্কালটিকে আপাতত রেখে দেওয়া যাক - আমরা পরে এটিতে ফিরে আসব। চলুন, উপর ভিত্তি করে আমাদের প্যাকেজের মেটাডেটা কনফিগার করি অফিসিয়াল ডকুমেন্টেশনের # 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" = "" লক্ষ্য করুন কীভাবে এমন স্থানধারক রয়েছে যা আপনাকে সংশোধন করতে হবে যেমন, আপনার ব্যবহারকারীর নাম, আপনার নাম... অন্য নোটে, আমরা আপাতত হোমপেজ ইউআরএল খালি রাখব। GitHub এ প্রকাশ করার পর আমরা পরিবর্তন করব। আমরা আপাতত নির্ভরতা অংশটি খালি রেখে যাব এবং আমরা যেতে যেতে যোগ করব। তালিকার পরবর্তী হবে আমাদের ফাইল যেখানে আমরা আমাদের পরিবেশ ভেরিয়েবল যেমন API গোপনীয়তা এবং কী সংরক্ষণ করি। এটি মনে রাখা গুরুত্বপূর্ণ যে এই ফাইলটি গিট দ্বারা ট্র্যাক করা উচিত নয় কারণ এতে সংবেদনশীল তথ্য রয়েছে। .env আমাদের ক্ষেত্রে, আমরা এখানে আমাদের ট্রেলো শংসাপত্র সংরক্ষণ করব। ট্রেলোতে একটি পাওয়ার-আপ তৈরি করতে, অনুসরণ করুন। আরও নির্দিষ্টভাবে, এর ব্যবহারের উপর ভিত্তি করে, যেহেতু আমরা আমাদের অ্যাপ্লিকেশনের জন্য OAuth ব্যবহার করতে চাই, Trello-এর সাথে যোগাযোগ করতে আমাদের নিম্নলিখিতগুলির প্রয়োজন হবে: এই নির্দেশিকা py-trello API কী (আমাদের অ্যাপ্লিকেশনের জন্য) API সিক্রেট (আমাদের অ্যাপ্লিকেশনের জন্য) টোকেন (তাদের ডেটাতে অ্যাক্সেস দেওয়ার জন্য ব্যবহারকারীর টোকেন) একবার আপনি আপনার API কী এবং গোপনীয়তা পুনরুদ্ধার করার পরে, সেগুলিকে ফাইলে সংরক্ষণ করুন .env # .env TRELLO_API_KEY=<your_api_key> TRELLO_API_SECRET=<your_api_secret> শেষ কিন্তু অন্তত নয়, আসুন Python টেমপ্লেটটি ব্যবহার করি যা পাওয়া যাবে। মনে রাখবেন যে আমাদের ফাইলটি কখনই ট্র্যাক করা হয় না তা নিশ্চিত করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ - যদি কোনও সময়ে, আমাদের ফাইলটি ট্র্যাক করা হয়, এমনকি যদি আমরা পরবর্তী ধাপে ফাইলটি সরিয়ে ফেলি, তাহলে ক্ষতি হয়ে যায় এবং ক্ষতিকারক অভিনেতারা আগেরটি চিহ্নিত করতে পারে। সংবেদনশীল তথ্যের জন্য প্যাচ। .gitignore এখানে .env .env এখন যেহেতু সেটআপ সম্পূর্ণ হয়েছে, আসুন আমাদের পরিবর্তনগুলিকে GitHub-এ ঠেলে দেওয়া যাক। এ উল্লেখিত মেটাডেটার উপর নির্ভর করে, সেই অনুযায়ী আপনার লাইসেন্স এবং হোমপেজ URL আপডেট করতে ভুলবেন না। কীভাবে আরও ভাল কমিট লিখতে হয় তার রেফারেন্সের জন্য: pyproject.toml ভিক্টোরিয়া ডাই দ্বারা আরও ভাল কমিট লিখুন, আরও ভাল প্রকল্প তৈরি করুন অন্যান্য উল্লেখযোগ্য পদক্ষেপ: প্রকল্পের জন্য একটি ভার্চুয়ালেনভ তৈরি করুন ইউনিট পরীক্ষা আমরা আমাদের পরীক্ষাগুলি লেখার সাথে শুরু করার আগে, এটা মনে রাখা গুরুত্বপূর্ণ যে যেহেতু আমরা একটি API এর সাথে কাজ করছি, আমরা API ডাউনটাইমের ঝুঁকি ছাড়াই আমাদের প্রোগ্রাম পরীক্ষা করতে সক্ষম হওয়ার জন্য মক টেস্টগুলি প্রয়োগ করব৷ এখানে রিয়েল পাইথনের দ্বারা মক টেস্টিং সম্পর্কে আরও একটি দুর্দান্ত নিবন্ধ রয়েছে: পাইথনে বহিরাগত API গুলিকে উপহাস করা কার্যকরী প্রয়োজনীয়তার উপর ভিত্তি করে, আমাদের প্রধান উদ্বেগ হল ব্যবহারকারীদের একটি নতুন কার্ড যোগ করার অনুমতি দেওয়া। এ পদ্ধতিটি উল্লেখ করা: । এটি করতে সক্ষম হওয়ার জন্য, আমাদের অবশ্যই ক্লাস থেকে পদ্ধতিতে কল করতে হবে, যার মধ্যে ক্লাস থেকে ফাংশন থেকে পুনরুদ্ধার করা যেতে পারে, যার মধ্যে পুনরুদ্ধার করা যেতে পারে... py-trello add_card List add_card Board get_list আপনি সারমর্ম পাবেন - আমাদের চূড়ান্ত গন্তব্যে পৌঁছানোর জন্য আমাদের অনেক সাহায্যকারী পদ্ধতির প্রয়োজন হবে, আসুন এটিকে কথায় বলা যাক: ক্লায়েন্টের টোকেন পুনরুদ্ধার করতে পরীক্ষা করুন বোর্ড পুনরুদ্ধার পরীক্ষা একটি বোর্ড পুনরুদ্ধার করতে পরীক্ষা বোর্ড থেকে তালিকা পুনরুদ্ধার পরীক্ষা একটি তালিকা পুনরুদ্ধার করতে পরীক্ষা করুন বোর্ড থেকে লেবেল পুনরুদ্ধার করতে পরীক্ষা একটি লেবেল পুনরুদ্ধার করতে পরীক্ষা করুন কার্ড যোগ করার জন্য পরীক্ষা করুন কার্ডে লেবেল যোগ করতে পরীক্ষা করুন এটাও মনে রাখা গুরুত্বপূর্ণ যে ইউনিট পরীক্ষা লেখার সময়, আমরা চাই আমাদের পরীক্ষাগুলি যতটা সম্ভব বিস্তৃত হোক - এটি কি ত্রুটিগুলি ভালভাবে পরিচালনা করে? এটা কি আমাদের প্রোগ্রামের প্রতিটি দিক কভার করে? যাইহোক, শুধুমাত্র এই টিউটোরিয়ালের উদ্দেশ্যে, আমরা শুধুমাত্র সাফল্যের ক্ষেত্রে পরীক্ষা করে জিনিসগুলিকে সরল করব। কোডে ডাইভ করার আগে, আমাদের ফাইলটি পরিবর্তন করা যাক যাতে লেখা/চালনা ইউনিট পরীক্ষার জন্য প্রয়োজনীয় নির্ভরতা অন্তর্ভুক্ত করা যায়। pyproject.toml # pyproject.toml [project] dependencies = [ "pytest==7.4.0", "pytest-mock==3.11.1" ] এর পরে, আসুন আমাদের virtualenv সক্রিয় করি এবং নির্ভরতা ইনস্টল করতে। pip install . এটি হয়ে গেলে, অবশেষে কিছু পরীক্ষা লিখি। সাধারনত, আমাদের পরীক্ষায় একটি উপহাসিত প্রতিক্রিয়া ফেরত দেওয়া উচিত, আমরা যে ফাংশনটি পরীক্ষা করার চেষ্টা করছি সেই ফাংশনের একটি প্যাচ ঠাট্টা করা প্রতিক্রিয়ার সাথে রিটার্ন মান ঠিক করে এবং অবশেষে ফাংশনে একটি কল। ব্যবহারকারীর অ্যাক্সেস টোকেন পুনরুদ্ধার করার জন্য একটি নমুনা পরীক্ষা নিম্নলিখিত চাই: # 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 আমার নমুনা কোডে লক্ষ্য করুন যে হল একটি মডেল যা এখনও এ সেট করা হয়নি। এটি ক্লিনার কোড লেখার জন্য কাঠামো প্রদান করে, আমরা এটি পরে কাজ করে দেখব। GetOAuthTokenResponse models.py আমাদের পরীক্ষা চালানোর জন্য, কেবল চালান। আমাদের পরীক্ষাগুলি কীভাবে ব্যর্থ হবে তা লক্ষ্য করুন, তবে এটি ঠিক আছে - এটি শেষ পর্যন্ত কার্যকর হবে৷ python -m pytest 💡 আপনি কি নিজে নিজে আরও পরীক্ষা লেখার চেষ্টা করতে পারেন? আমার পরীক্ষাগুলি কেমন দেখায় তা দেখতে পড়ুন নির্দ্বিধায় চ্যালেঞ্জ কর্নার এই প্যাচটি আপাতত, আসুন আমাদের তৈরি করি। একটি নতুন নির্ভরতা যোগ করার সাথে শুরু করে, এটি হল wrapper। trelloservice py-trello # pyproject.toml dependencies = [ "pytest==7.4.0", "pytest-mock==3.11.1", "py-trello==0.19.0" ] আবার, নির্ভরতা ইনস্টল করতে। pip install . মডেল এখন, আমাদের মডেলগুলি তৈরি করে শুরু করা যাক - আমরা যে প্রতিক্রিয়াগুলি আশা করছি তা নিয়ন্ত্রণ করতে। এই অংশের জন্য, আমাদের ইউনিট পরীক্ষা এবং সোর্স কোড উল্লেখ করা উত্তম যাতে আমরা কী ধরনের রিটার্ন মান আশা করতে পারি তা বোঝার জন্য। trelloservice py-trello উদাহরণস্বরূপ, বলুন যে আমরা ব্যবহারকারীর অ্যাক্সেস টোকেন পুনরুদ্ধার করতে চাই, এর ফাংশন ( ) উল্লেখ করে, আমরা জানি রিটার্ন মানটি এরকম কিছু হবে py-trello create_oauth_token উৎস কোড # trellocli/models.py # module imports # dependencies imports # misc imports from typing import NamedTuple class GetOAuthTokenResponse(NamedTuple): token: str token_secret: str status_code: int অন্যদিকে, বিরোধপূর্ণ নামকরণের রীতি সম্পর্কে সচেতন হোন। উদাহরণস্বরূপ, মডিউলের নামে একটি ক্লাস রয়েছে। এর জন্য একটি সমাধান হবে আমদানির সময় একটি উপনাম প্রদান করা। py-trello List # trellocli/models.py # dependencies imports from trello import List as Trellolist আপনার প্রোগ্রামের প্রয়োজন অনুসারে মডেলগুলি তৈরি করতে এই সুযোগটি ব্যবহার করতে দ্বিধা বোধ করুন। উদাহরণ স্বরূপ, বলুন যে রিটার্ন মান থেকে আপনার শুধুমাত্র একটি বৈশিষ্ট্যের প্রয়োজন, আপনি আপনার মডেলটিকে রিফ্যাক্টর করতে পারেন যাতে রিটার্ন মান থেকে উল্লিখিত মানটিকে সম্পূর্ণরূপে সঞ্চয় করার পরিবর্তে বের করার আশা করা যায়। # trellocli/models.py class GetBoardName(NamedTuple): """Model to store board id Attributes id (str): Extracted board id from Board value type """ id: str 💡 আপনি কি নিজের থেকে আরও মডেল লেখার চেষ্টা করতে পারেন? আমার মডেল দেখতে কেমন তা দেখতে পড়ুন নির্দ্বিধায়৷ চ্যালেঞ্জ কর্নার এই প্যাচটি ব্যবসায়িক যুক্তি সেটআপ মডেল নিচে, আসুন আনুষ্ঠানিকভাবে কোডিং শুরু করা যাক. আবার, আমাদের তৈরি করা ইউনিট পরীক্ষাগুলি উল্লেখ করা উচিত - বলুন যে পরীক্ষার বর্তমান তালিকা পরিষেবার জন্য সম্পূর্ণ কভারেজ প্রদান করে না, সর্বদা ফিরে যান এবং প্রয়োজনে আরও পরীক্ষা যোগ করুন। trelloservice স্বাভাবিকভাবে, শীর্ষের দিকে সমস্ত আমদানি বিবৃতি অন্তর্ভুক্ত করুন। তারপর প্রত্যাশিত হিসাবে ক্লাস এবং স্থানধারক পদ্ধতি তৈরি করুন। ধারণাটি হল যে আমরা এ পরিষেবাটির একটি ভাগ করা উদাহরণ শুরু করব এবং সেই অনুযায়ী এর পদ্ধতিগুলিকে কল করব। উপরন্তু, আমরা স্কেলেবিলিটির জন্য লক্ষ্য করছি, এইভাবে ব্যাপক কভারেজের প্রয়োজন। 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 Ps লক্ষ্য করুন কিভাবে এই সময় রাউন্ড আমরা আমাদের পরীক্ষা চালানো, আমাদের পরীক্ষা পাস হবে. প্রকৃতপক্ষে, এটি আমাদের নিশ্চিত করতে সাহায্য করবে যে আমরা সঠিক পথে চলেছি। ওয়ার্কফ্লো আমাদের ফাংশন প্রসারিত করা, আমাদের পরীক্ষা চালানো, পাস/ফেল এবং সেই অনুযায়ী রিফ্যাক্টর পরীক্ষা করা উচিত। অনুমোদন এবং TrelloClient শুরু করা ফাংশন দিয়ে শুরু করা যাক। ধারণা হল এখানে ফাংশন কল করা এবং চালু করা। আবার, শুধুমাত্র ফাইলে এই ধরনের সংবেদনশীল তথ্য সংরক্ষণের প্রয়োজনীয়তার উপর জোর দিয়ে, আমরা সংবেদনশীল তথ্য পুনরুদ্ধার করতে নির্ভরতা ব্যবহার করব। তদনুসারে আমাদের ফাইলটি পরিবর্তন করার পরে, আসুন অনুমোদনের পদক্ষেপগুলি বাস্তবায়ন শুরু করি। __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 ) এই ইমপ্লিমেন্টেশনে, আমরা একটি সহায়ক পদ্ধতি তৈরি করেছি যাতে কোনো অদূরে দেখা যায় এমন ত্রুটি যেমন, অনুমোদনের সময় ব্যবহারকারী ক্লিক করে। অধিকন্তু, এটি একটি বৈধ প্রতিক্রিয়া ফেরত না আসা পর্যন্ত বারবার ব্যবহারকারীর অনুমোদনের জন্য জিজ্ঞাসা করার জন্য সেট আপ করা হয়েছে, কারণ সত্যটি হল যে ব্যবহারকারী আমাদের অ্যাপটিকে তাদের অ্যাকাউন্ট ডেটা অ্যাক্সেস করার অনুমতি না দেওয়া পর্যন্ত আমরা চালিয়ে যেতে পারি না। Deny 💡 নোটিশ ? আপনি একটি প্যাকেজ ধ্রুবক হিসাবে এই ত্রুটি ঘোষণা করতে পারেন? আরও তথ্যের জন্য সেটআপ পড়ুন চ্যালেঞ্জ কর্নার TRELLO_AUTHORIZATION_ERROR হেল্পার ফাংশন এখন অনুমোদনের অংশটি সম্পন্ন হয়েছে, আসুন ব্যবহারকারীর ট্রেলো বোর্ডগুলি পুনরুদ্ধার করা থেকে শুরু করে সাহায্যকারী ফাংশনে এগিয়ে যাই। # 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 ) তালিকাগুলি (কলাম) পুনরুদ্ধার করার জন্য, আমাদের এর ক্লাসটি পরীক্ষা করতে হবে, বা অন্য কথায়, আমাদের অবশ্যই মান প্রকারের একটি নতুন প্যারামিটার গ্রহণ করতে হবে। 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 ) 💡 আপনি কি নিজে থেকে এবং ফাংশন বাস্তবায়ন করতে পারেন? ক্লাসটি সংশোধন করুন। আমার বাস্তবায়ন কেমন দেখাচ্ছে তা দেখতে পড়ুন নির্দ্বিধায় চ্যালেঞ্জ কর্নার get_all_labels get_label py-trello Board এই প্যাচটি একটি নতুন কার্ড যোগ করার ফাংশন সবশেষে কিন্তু অন্তত নয়, আমরা শেষ পর্যন্ত এই পুরো সময় ধরে যা লক্ষ্য করেছিলাম তাতে পৌঁছে গেছি - একটি নতুন কার্ড যোগ করা। মনে রাখবেন যে আমরা এখানে পূর্বে ঘোষিত সমস্ত ফাংশন ব্যবহার করব না - সহায়ক ফাংশনগুলির লক্ষ্য হল স্কেলেবিলিটি বাড়ানো। # 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 ) 🎉 এখন এটি হয়ে গেছে এবং ধূলিসাৎ হয়ে গেছে, সেই অনুযায়ী আপনার README আপডেট করতে ভুলবেন না এবং আপনার কোডটি GitHub-এ পুশ করুন৷ অভিনন্দন! তুমি জিতেছিলে. আবার খেলবেন (y/N)? শেষ করি আমার সাথে থাকার জন্য ধন্যবাদ:) এই টিউটোরিয়ালটির মাধ্যমে, আপনি সফলভাবে ইউনিট পরীক্ষা লেখার সময় উপহাস প্রয়োগ করতে শিখেছেন, সমন্বয়ের জন্য কাঠামোর মডেল, মূল কার্যকারিতা খুঁজে পেতে উত্স কোডটি পড়তে এবং তৃতীয় পক্ষের র্যাপার ব্যবহার করে ব্যবসায়িক যুক্তি প্রয়োগ করতে শিখেছেন। পার্ট 2-এর দিকে নজর রাখুন, যেখানে আমরা CLI প্রোগ্রাম নিজেই বাস্তবায়নের উপর গভীরভাবে ডুব দেব। এর মধ্যে, আসুন যোগাযোগে থাকি 👀 গিটহাব সোর্স কোড: https://github.com/elainechan01/trellocli