কম্পিউটার টিউটোরিয়াল

RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

লিন্টিং (Linting) হলো সোর্স কোডের প্রোগ্রাম্যাটিক এবং স্টাইলিস্টিক এররها জন্য অটোমেটেড চেকিং। এই চেকিং একটি স্ট্যাটিক কোড অ্যানালসিস টুল দ্বারা করা হয় যাকে লিন্টার (linter) বলে। অন্যদিকে, একটি কোড ফরম্যাটার (code formatter) সোর্স কোড ফরম্যাট করার সাথে জড়িত যাতে সেটি একটি প্রি-কনফিগারড রুল সেটের সাথে স্ট্রিক্টলি মেনে চলে। একটি লিন্টার সাধারণত ভায়লেশন রিপোর্ট করে, কিন্তু সমস্যা ফিক্স করা প্রোগ্রামারের উপর ছাড়া দেয়া হয়, درে একটি কোড ফরম্যাটার তার রুলগুলো সরাসরি সোর্স কোডে অ্যাপ্লাই করে, যা ফরম্যাটিং মিস্টেকস অটোমেটিক্যালি ঠিক করে দেয়।

একটি প্রজেক্টে আরও কনসিস্টেন্ট কোড স্টাইল তৈরি করার টাস্ক সাধারণত আলাদা লিন্টিং এবং ফরম্যাটিং টুলস ইন্ট্রোডিউস করতে বাধ্য করে, কিন্তু কিছু কেসে, একটি সিঙ্গেল টুল দুটি চিন্তা সমাধান করতে পারে। এর একটি ভালো উদাহরণ হলো RuboCop, যা এই আর্টিকেলে আমরা বিস্তারিত বিবেচনা করব। আপনি শিখবেন কীভাবে আপনার রুবি প্রজেক্টে এটি সেট আপ করবেন এবং এর কনফিগারেশন অপশনগুলো অ্যাডজাস্ট করবেন যাতে এর আউটপুট আপনার এক্সপেক্টেশনের সাথে মেলে। লোকাল ডেভেলপমেন্ট প্রসেসে ইন্টিগ্রেট করার পাশাপাশি, আপনি শিখবেন কীভাবে এটিকে আপনার কন্টিনিউয়াস ইন্টিগ্রেশন (CI) ওয়ার্কফ্লোর অংশ করবেন।

RuboCop ইনস্টল করা

RubyGems-এর মাধ্যমে RuboCop ইনস্টল করা সিম্পল:

$ gem install rubocop

ইনস্টল করা ভার্সন চেক করুন:

$ rubocop --version
1.18.3

আপনি যদি Bundler ব্যবহার করতে চান, নিচের স্নিপেটটি আপনার Gemfile-এ রাখুন এবং তারপর bundle install চালান। require: false পার্টটি Bundler.require-কে বলছে যে সেই স্পেসিফিক জেমটি আপনার কোডে রিকোয়ার না করে, কারণ এটি কমান্ড লাইন থেকে ব্যবহার হবে।

gem 'rubocop', require: false

ভার্সন চেক করুন:

$ bundle exec rubocop --version
1.18.3

RuboCop চালানো

আপনি RuboCop ডিফল্ট সেটিংস দিয়ে আপনার প্রজেক্টে চালাতে পারেন rubocop টাইপ করে (বা bundle exec rubocop যদি Bundler দিয়ে ইনস্টল করা থাকে)। আপনি যদি কোনো আর্গুমেন্ট পাস না করেন, তবে এটি করেন্ট ডিরেক্টরির সকল রুবি সোর্স ফাইল এবং সাব-ডিরেক্টরিগুলো চেক করবে। বিকল্পভাবে, আপনি ফাইল এবং ডিরেক্টরির একটি লিস্ট পাস করতে পারেন যেগুলো অ্যানালাইজ করা উচিত।

$ bundle exec rubocop
$ bundle exec rubocop src/lib

কোনো কনফিগারেশন ছাড়া, RuboCop কমিউনিটি-চালিত Ruby Style Guide-এ আউटलাইন করা অনেক গাইডলাইন এনফোর্স করে। কমান্ড চালানোর পর, আপনি কিছু এরর (offenses) পেতে পারেন। প্রতিটি রিপোর্টেড offense সকল ইনফরমেশন সহ ডেকোরেটেড থাকে যা সেটি রিজল্ভ করতে লাগে, যেমন offense-এর বর্ণনা, এবং ফাইল ও লাইন নম্বর যেখানে এটি ঘটেছে।

RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

রিপোর্টের নিচে, আপনি একটি লাইন দেখবেন যা ইন্সপেক্টেড ফাইল সংখ্যা, টোটাল offense সংখ্যা, এবং কতগুলো offense অটোমেটিক্যালি ফিক্স করা যায় সেটি বর্ণনা করে। আপনি যদি -a বা --auto-correct আর্গুমেন্ট আপেন্ড করেন, RuboCop আপনার সোর্স ফাইলে পাওয়া সমস্যাগুলো অটোমেটিক্যালি ঠিক করার চেষ্টা করবে (যেগুলো [Correctable] প্রিফিক্সড)।

$ bundle exec rubocop -a

RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

লক্ষ্য করুন কিভাবে প্রতিটি করেক্টেড offense এখন [Corrected] প্রিফিক্সড। করেক্টেড offense-এর সংখ্যার সারাংশও রিপোর্টের নিচে প্রেজেন্ট করা হয়। উপরের উদাহরণে, আরেকটি করেক্টেবল offense অটো-ফিক্সড হয়নি, এমনকি -a ফ্ল্যাগ আপেন্ড করার পরও। এর কারণ হলো কিছু অটোমেটিক কোরেকশন কোডের সেম্যান্টিক্স কিছুটা পরিবর্তন করতে পারে, তাই RuboCop এটিকে unsafe বলে বিবেচনা করে। আপনি যদি এই offense-গুলোও অটোকরেক্ট করতে চান, -A বা --auto-correct-all ফ্ল্যাগ ব্যবহার করুন।

$ bundle exec rubocop -A

RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

একটি ভালো রুল অফ থাম্ব হলো আপনার টেস্ট সিউইট চালানো অটোকরেক্ট ফাংশনালিটি ব্যবহার করার পর যাতে নিশ্চিত হয় যে আপনার কোডের আচরণ অনেক্সপেক্টেডলি পরিবর্তন হয়নি।

RuboCop কনফিগার করা

RuboCop কনফিগার করা যায় একটি .rubocop.yml ফাইল দিয়ে যা আপনার প্রজেক্টের রুটে রাখা হয়। আপনি যদি সকল প্রজেক্টের জন্য একই চেক চান, আপনি একটি গ্লোবাল কনফিগ ফাইল আপনার হোম ডিরেক্টরিতে (~/.rubocop.yml) বা XDG কনফিগ ডিরেক্টরিতে (~/.config/rubocop/config.yml) রাখতে পারেন। এই গ্লোবাল কনফিগ ফাইলটি ব্যবহার হবে যদি লোকালি স্কোপড প্রজেক্ট কনফিগারেশন ফাইল কারেন্ট ডিরেক্টরির বা সাকসেসিভ প্যারেন্ট ডিরেক্টরিতে না পাওয়া যায়।

RuboCop-এর ডিফল্ট কনফিগারেশন এর কনফিগারেশন হোম ডিরেক্টরিতে (~/.config/rubocop/default.yml) রয়েছে, এবং অন্যান্য সকল কনফিগ ফাইল এটি থেকে ইনহেরিট করে। এর মানে হলো আপনার প্রজেক্ট কনফিগারেশন সেট আপ করার সময়, আপনাকে শুধু সেই পরিবর্তনগুলো করতে হবে যা ডিফল্ট থেকে আলাদা। এতে নির্দিষ্ট চেক এনেবল বা ডিজেবল করা বা তাদের আচরণ পরিবর্তন করা অন্তর্ভুক্ত থাকতে পারে যদি তারা কোনো প্যারামিটার এক্সেপ্ট করে।

RuboCop প্রতিটি אינডিভিজুয়াল চেককে "cops" বলে, এবং প্রতিটি একটি স্পেসিফিক offense ডিটেক্ট করার জন্য দায়িত্বপূর্ণ। উপলব্ধ cops-গুলো নিচের ডিপার্টমেন্টগুলোতে গ্রুপ করা হয়েছে:

  • Style cops প্রায়শই উপরে উল্লিখিত Ruby Style Guide-ভিত্তিক, এবং আপনার কোডের কনসিস্টেন্সি চেক করে।
  • Layout cops ফরম্যাটিং-রিলেটেড ইস্যু ক্যাচ করে, যেমন হোয়াইট স্পেস ব্যবহার।
  • Lint cops আপনার কোডে সম্ভাব্য এরর ডিটেক্ট করে, ruby -w-এর মতো, কিন্তু অডিশনাল চেকসহ।
  • Metric cops সোর্স কোড মেজারমেন্ট-রিলেটেড ইস্যু ডিল করে যেমন ক্লাস লেন্থ এবং মেথড লেন্থ।
  • Naming cops নামকরণ কনভেনশন নিয়ে কাজ করে।
  • Security cops পটেনশিয়াল সিকিউরিটি ইস্যু ক্যাচ করতে সাহায্য করে।
  • Bundler cops Bundler ফাইলে (যেমন Gemfile) ব্যাড প্র্যাকটিস চেক করে।
  • Gemspec cops .gemspec ফাইলে ব্যাড প্র্যাকটিস চেক করে।

RuboCop এক্সটেন্ড করা সম্ভব অডিশনাল লিন্টার এবং ফরম্যাটার দিয়ে। আপনি নিজের এক্সটেনশন বিল্ড করতে পারেন বা বিদ্যমান موارد লाभ নিতে পারেন যদি আপনার প্রজেক্টের সাথে রিলেভেন্ট হয়। উদাহরণস্বরূপ, রেইলস এক্সটেনশন উপলব্ধ রেইলস বেস্ট প্র্যাকটিস এবং কোডিং কনভেনশন এনফোর্স করার জন্য।

RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

আপনি প্রথমবার আপনার কনফিগারেশন ফাইল তৈরি করলে, আপনি নতুন cops-র উপস্থিতি সম্পর্কে-warning মেসেজের একটি ঝড় পাবেন যা যোগ হয়েছে কিন্তু কনফিগার্ড নয়। এর কারণ হলো RuboCop প্রতিটি রিলিজে নতুন cops যোগ করে, এবং এগুলো একটি স্পেশাল পেনডিং স্ট্যাটাসে থাকে যতক্ষণ না ইউজার কনফিগারেশনে স্পষ্টভাবে এনেবল বা ডিজেবল করা হয়। আপনি মেসেজে লিস্টেড প্রতিটি copকে আলাদাভাবে এনেবল বা ডিজেবল করতে পারেন বা নিচের স্নিপেটটি ব্যবহার করে সকল নতুন cops এনেবল করতে পারেন (রিকমেন্ডেড)। এরপর মেসেজগুলো সাপ্রেস হবে।

# .rubocop.yml
AllCops:
  NewCops: enable

আপনি যদি কনফিগারেশন ফাইল এবং RuboCop-এর অসংখ্য অপশন সহ খামখাম করতে না চান, তবে Standard প্রজেক্টে এক নজর দিন। এটি মূলত RuboCop-এর একটি প্রি-কনফিগারড ভার্সন যা আপনার রুবি প্রজেক্টে একটি কনসিস্টেন্ট স্টাইল এনফোর্স করার লক্ষ্য রাখে কোনো রুল কাস্টমাইজেশন ছাড়া। যেখানে এটি প্রথম ঘোষণা করা হয়েছিল সেটি একটি লাইটনিং টক যা এর উদ্ভব এবং মোটিভেশন সম্পর্কে আরও ডিটেইলস দেয়।

আপনি আপনার Gemfile-এ নিচের লাইনটি যোগ করে ইনস্টল করতে পারেন এবং তারপর bundle install চালান।

# Gemfile
gem "standard", group: [:development, :test]

তারপর, আপনি কমান্ড লাইন থেকে Standard এক্সিকিউট করতে পারেন নিচেরভাবে:

$ bundle exec standardrb

এক্সিস্টিং প্রজেক্টে RuboCop যোগ করা

বেশিরভাগ রুবিস্টরা (Rubyists) গ্রীনফিল্ড প্রজেক্টে কাজ করার সুবিধা পান না। আমাদের ডেভেলপমেন্ট টাইমের বেশিরভাগ লিগেসি কোডবেসে কাটে যা ওভারওয়েল্মিং পরিমাণ লিন্টিং offense প্রডিউস করতে পারে যেগুলো অবিলম্বে ট্যাকল করা সম্ভব না। সৌভাগ্যক্রমে, RuboCop-এ একটি উপকারী ফিচার রয়েছে যা এক্সিস্টিং offense-দের একটি অ্যালোয়লিস্ট (allowlist) জেনারেট করে, যেগুলো ধীরে ধীরে সমাধান করা যায়। সুবিধা হলো এটি আপনাকে লিন্টিং আপনার এক্সিস্টিং প্রজেক্টে ইন্ট্রোডিউস করতে দেয় অপরিমাণ অনম্যানেজেবল লিন্টিং এরর ছাড়া, সাথে সাথেই যেকোনো নতুন ভায়লেশন ফ্ল্যাগ করে যান।

$ bundle exec rubocop
523 files inspected, 1018 offenses detected

অ্যালোয়লিস্ট কনফিগ ফাইল তৈরি করা যায় নিচের কমান্ড দিয়ে:

$ bundle exec rubocop --auto-gen-config
Added inheritance from `.rubocop_todo.yml` in `.rubocop.yml`.
Created .rubocop_todo.yml.

--auto-gen-config অপশনটি সকল offense এবং তাদের কাউন্ট কালেক্ট করে এবং কারেন্ট ডিরেক্টরিতে একটি .rubocop_todo.yml ফাইল জেনারেট করে যেখানে সকল কারেন্ট offense ইগনোর করা থাকে। শেষে, এটি .rubocop.yml-কে .rubocop_todo.yml ফাইল থেকে ইনহেরিট করায় যাতে একবার আবার কোডবেসে RuboCop চালালে কোনো offense যেইল না।

$ bundle exec rubocop
523 files inspected, no offenses detected

অ্যালোয়লিস্ট ফাইল জেনারেট করার সময়, RuboCop একটি cop পুরোপুরি বন্ধ করে দেয় যদি ভায়লেশনের সংখ্যা একটি সীমা (ডিফল্ট ১৫) অতিক্রম করে। এটি সাধারণত আপনি যা চান না, কারণ এটি নতুন কোডকে সেই cop-এর বিপরীতে চেক হওয়া থেকে বাধা দেয় এক্সিস্টিং ভায়লেশনের সংখ্যায় কারণে। সৌভাগ্যক্রমে, থ্রেশহোল্ড বাড়ানো সম্ভব যাতে cops ডিজেবল না হয় এমনকি যদি ভায়লেশনের সংখ্যা বেশি হয়।

$ bundle exec rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 10000

--auto-gen-only-exclude অপশন নিশ্চিত করে যে অ্যালোয়লিস্টের প্রতিটি cop-এ একটি Exclude ব্লক থাকে যা সকল ফাইল লিস্ট করে যেখানে ভায়লেশন ঘটেছে, Max-এর বদলে, যা একটি cop-এর জন্য এক্সক্লুডেড ফাইলের ম্যাক্সিমাম সংখ্যা সেট করে। --exclude-limit সেট করাও প্রতিটি cop-এর জন্য Exclude ব্লকে যোগ করা যেতে পারা ফাইল সংখ্যা পরিবর্তন করে। একটি আর্বিট্রারি নম্বর স্পেসিফাই করা যেটি এক্সামাইন করা টোটাল ফাইল সংখ্যা থেকে বড়, নিশ্চিত করে যে কোনো cop আউtright ডিজেবল হবে না, এবং এক্সিস্টিং বা নতুন ফাইলে যোগ করা যেকোনো নিউ কোড যথাযথভাবে চেক হবে।

এক্সিস্টিং ভায়লেশন ফিক্স করা

.rubocop_todo.yml ফাইল জেনারেট করার পর, এক্সিস্টিং ভায়লেশনগুলো ভুলে যাওয়া না, বরং ধীরে ধীরে সেগুলো একের পর এক সমাধান করা গুরুত্বপূর্ণ। আপনি এটি করতে পারেন একটি cop-এর Exclude ব্লক থেকে একটি ফাইল রিমুভ করে, তারপর রিপোর্টেড ভায়লেশন ফিক্স করে, আপনার টেস্ট সিউইট চালিয়ে বাগ ইন্ট্রোডিউস না হয় নিশ্চিত করে, এবং কমিট করে। একবার আপনি একটি cop থেকে সকল ফাইল রিমুভ করলে, আপনি ম্যানুয়ালি সেটি ফাইল থেকে ডিলিট করতে পারেন, অথবা একবার আবার অ্যালোয়লিস্ট ফাইল রিজেনারেট করতে পারেন। সম্ভব হলে --auto-correct অপশন ব্যবহার करना ভুলবেন না প্রসেস খুব দ্রুত করতে।

স্টাইল গাইড অ্যাডপ্ট করা

RuboCop খুব কনফিগারেবল, যা এটিকে যেকোনো টাইপের প্রজেক্টের জন্য ভায়েবল করে তোলে। যাইহোক, রুলস আপনার রিকোয়ারমেন্ট অনুযায়ী কনফিগার করতে অনেক সময় লাগতে পারে, বিশেষত যদি আপনি ডিফল্ট রুলসের সাথে অনেকivamente ডিসঅ্যাগরি করেন। এমন পরিস্থিতিতে, একটি এক্সিস্টিং স্টাইল গাইড অ্যাডপ্ট করা বেনিফিশিয়াল হতে পারে। অনেক কোম্পানি ইতিমধ্যে তাদের রুবি স্টাইল গাইড পাবলিক কনসাম্পশনের জন্য রিলিজ করেছে, যেমন Shopify এবং Airbnb। আপনার পছন্দের স্টাইল গাইড RuboCop-এ ব্যবহার করা যায় সংশ্লিষ্ট জেম আপনার Gemfile-এ যোগ করে:

# Gemfile
gem "rubocop-shopify", require: false

তারপর, আপনার প্রজেক্ট কনফিগারেশনে এটি রিকোয়ার করুন:

# .rubocop.yml
inherit_gem:
  rubocop-shopify: rubocop.yml

লিন্টিং এরর সাপ্রেস করা

যদিও RuboCop একটি দুর্দান্ত টুল, এটি কখনো কখনো ফালস পজিটিভ দেয় বা কোড ফিক্স করার সাজেশন দেয় যা প্রোগ্রামারের ইন্টেন্টের জন্য ডিট্রিমেন্টাল। যখন এমন পরিস্থিতি উপস্থিত হয়, আপনি সোর্স কোডে একটি কমেন্ট দিয়ে ভায়লেশন ইগনোর করতে পারেন। আপনি ডিজেবল করা ইনডিভিজুয়াল cops বা ডিপার্টমেন্ট মেনশন করতে পারেন, নিচের মত:

# rubocop:disable Layout/LineLength, Style
[..]
# rubocop:enable Layout/LineLength, Style

অথবা আপনি সকল cops একটি কোড সেকশনের জন্য একসাথে ডিজেবল করতে পারেন:

# rubocop:disable all
[..]
# rubocop:enable all

আপনি যদি এন্ড-অফ-লাইন কমেন্ট ব্যবহার করেন, স্পেসিফাইড cops সে লাইনের জন্য মাত্র ডিজেবল হবে।

for x in (0..10) # rubocop:disable Style/For

এডিটর ইন্টিগ্রেশন

কমান্ড লাইন থেকে প্রতিবার চেক চালানোর বদলে, টাইপ করার সময় এডিটরে RuboCop-এ প্রোডিউসড ওয়ার্নিং এবং এরর দেখতে পাওয়া হ্যান্ডি। সৌভাগ্যক্রমে, RuboCop ইন্টিগ্রেশন বেশির populares কোড এডিটর এবং IDE-এ উপলব্ধ, অধিকাংশ থার্ড-পার্টি প্লাগইন দিয়ে। Visual Studio Code-এ, আপনাকে শুধু এই Ruby এক্সটেনশন ইনস্টল করতে হবে এবং আপনার ইউজার settings.json ফাইলে নিচের কন্টেন্ট রাখতে হবে:

{
  "ruby.lint": {
    "rubocop": true
  }
}

আপনি যদি Vim বা Neovim ব্যবহার করেন, RuboCop-এর ডায়াগনস্টিক্স coc.nvim দিয়ে ডিসপ্লে করতে পারেন। আপনাকে Solargraph ল্যাঙ্গুয়েজ সার্ভার ইনস্টল করতে হবে (gem install solargraph), এবং তারপর coc-solargraph এক্সটেনশন (:CocInstall coc-solargraph)। তারপর, আপনার coc-settings.json ফাইল নিচেরভাবে কনফিগার করুন:

{
  "coc.preferences.formatOnSaveFiletypes": ["ruby"],
  "solargraph.autoformat": true,
  "solargraph.diagnostics": true,
  "solargraph.formatting": true
}

RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

প্রি-কমিট হুক সেটআপ

একটি গিট pre-commit হুক সেট আপ করা একটি দুর্দান্ত উপায় যাতে একটি প্রজেক্টের সকল রুবি কোড সোর্স কন্ট্রোলে চেক-ইন হওয়ার আগে লিন্টেড এবং প্রপারলি ফরম্যাটেড হয়। এই আর্টিকেল আপনাকে দেখাবে কীভাবে Overcommit দিয়ে এটি সেট আপ করবেন, একটি টুল গিট pre-commit হুক ম্যানেজ এবং কনফিগার করার জন্য, কিন্তু আপনি RuboCop অন্য টুলসও ইন্টিগ্রেট করতে পারেন যদি আপনার ইতিমধ্যে একটি এক্সিস্টিং pre-commit ওয়ার্কফ্লো থাকে।

প্রথমে, Overcommit RubyGems দিয়ে ইনস্টল করুন এবং তারপর আপনার প্রজেক্টে ইনস্টল করুন:

$ gem install overcommit
$ overcommit --install # আপনার প্রজেক্টের রুটে

দ্বিতীয় কমান্ডটি একটি রিপো-স্পেসিফিক সেটিংস ফাইল (.overcommit.yml) কারেন্ট ডিরেক্টরিতে তৈরি করবে এবং যেকোনো এক্সিস্টিং হুক ব্যাকআপ করবে। এই ফাইল ডিফল্ট কনফিগারেশন থেকে এক্সটেন্ড করে, তাই আপনাকে শুধু আপনার কনফিগারেশন স্পেসিফাই করতে হবে ডিফল্টের সাপেক্ষে। উদাহরণস্বরূপ, আপনি RuboCop pre-commit হুক নিচের স্নিপেট দিয়ে এনেবল করতে পারেন:

# .overcommit.yml
PreCommit:
  RuboCop:
    enabled: true
    on_warn: fail
    problem_on_unmodified_line: ignore
    command: ['bundle', 'exec', 'rubocop']

on_warn: fail সেটিং Overcommit-কে ওয়ার্নিংকে ফেইল যeble টريت করতে বাধ্য করে, درে problem_on_unmodified_line: ignore স্টেজড না হওয়া লাইনে ওয়ার্নিং এবং এরর ইগনোর করতে বাধ্য করে। আপনি প্রজেক্টের গিটহাব পেইজে সকল উপলব্ধ হুক অপশন এবং তাদের অ্যাক্সেপটেবল ভ্যালু রেঞ্জ ব্রাউজ করতে পারেন। আপনার কনফিগারেশন ফাইল পরিবর্তন করার পর overcommit --sign চালাতে হতে পারে চেঞ্জস ইফেক্টिव করার জন্য।

RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

কখনো কখনো, আপনি একটি ফাইল কমিট করতে চাইবেন যা সকল চেক পাস করে না (যেমন একটি work-in-progress), আপনি কেস-বাই-কেস বেসিসে ইনডিভিজুয়াল চেক স্কিপ করতে পারেন:

$ SKIP=RuboCop git commit -m "WIP: Unfinished work"

CI ওয়ার্কফ্লোতে RuboCop যোগ করা

প্রতিটি পুল রিকোয়েস্টে RuboCop চেক চালানো ব্যাডলি ফরম্যাটেড কোড আপনার প্রজেক্টে মার্জ হওয়া থেকে বাধা দেয়ার আরেকটি উপায়। যদিও আপনি যেকোনো CI টুল দিয়ে এটি সেট আপ করতে পারেন, এই আর্টিকেল শুধু GitHub Actions দিয়ে RuboCop চালানোর পদ্ধতি আলোচনা করবে।

প্রথম ধাপ হলো আপনার প্রজেক্টের রুটে .github/workflows ডিরেক্টরি তৈরি করা এবং নতুন ডিরেক্টরির মধ্যে একটি rubocop.yml ফাইল। ফাইলটি আপনার এডিটরে খুলুন এবং নিচের মত আপডেট করুন:

# .github/workflows/rubocop.yml
name: Lint code with RuboCop
on: [push, pull_request]
jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest, ubuntu-latest, windows-latest]
    steps:
      - uses: actions/checkout@v2
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.0'
          bundler-cache: true
      - name: Run RuboCop
        run: bundle exec rubocop

উপরের ওয়ার্কফ্লো ফাইলটি একটি সিঙ্গেল জব বর্ণনা করে যা এক্সিকিউট হবে যখন কোড GitHub-এ পুশ হবে বা যখন যেকোনো ব্রাঞ্চের বিপক্ষে একটি পুল রিকোয়েস্ট তৈরি হবে। একটি job হলো একটি সিকোয়েন্স অফ স্টেপস যা সিকোয়েনশিয়ালি রান করে। এই নির্দিষ্ট জবটি একবার রান করবে লেটেস্ট Ubuntu, MacOS, এবং Windows ভার্সনগুলোতে যা GitHub Actions প্রদান করে (যেমন runs-on এবং strategy.matrix-এ ডিফাইন করা)। প্রথম স্টেপ রিপোজিটরির কোড চেকআউট করে, পরবর্তীটি রুবি টুল চেইন এবং ডিপেন্ডেন্সি সেট আপ করে, এবং শেষটি RuboCop এক্সিকিউট করে।

ফাইলটি এডিট করা শেষ হলে, সেভ করুন, কমিট করুন, এবং GitHub-এ পুশ করুন। এরপর, আপনি পরবর্তী চেক-ইন এবং পুল রিকোয়েস্টে রিপোর্টেড ইস্যুগুলোর ইনলাইন ডিসপ্লে পাবেন।

RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

বিকল্প অটো-ফরম্যাটার

যদিও RuboCop কমপ্রিহেনসিভ অটো-ফরম্যাটিং ক্যাপাবিলিটি প্রদান করে, বিকল্প টুলস সম্পর্কে অবগত থাকা গুরুত্বপূর্ণ যদি এটি আপনার 니ডস পর্যাপ্তভাবে পূরণ না করে।

Prettier

Prettier শুরু হয়েছিল একটি আপিনিওনেটেড কোড ফরম্যাটার হিসেবে JavaScript-এর জন্য, কিন্তু এখন এটি অনেক ভাষা সাপোর্ট করে, রুবি সহ। এর Ruby প্লাগইন ইনস্টল করা স্ট্রেইটফরওয়ার্ড: prettier জেম আপনার Gemfile-এ যোগ করুন এবং তারপর bundle চালান।

# Gemfile
gem 'prettier'

এই পয়েন্টে, আপনি Prettier দিয়ে আপনার রুবি কোড ফরম্যাট করতে পারেন নিচের কমান্ড দিয়ে:

$ bundle exec rbprettier --write '**/*.rb'

Prettier-এর কিছু রুল RuboCop-এর সাথে কনফ্লিক্ট করে, তাই RuboCop-এর ফরম্যাটিং চেকস ডিজেবল করা জরুরি যাতে এটি Prettier-এ ইন্টারফেয়ার না করে। সৌভাগ্যক্রমে, RuboCop চেকস যেগুলো Prettier-এর সাথে কনফ্লিক্ট করে বা unnecessarily, সেগুলো অফ করা সহজ। আপনাকে শুধু আপনার প্রজেক্টের .rubocop.yml ফাইলের উপরে Prettier-এর RuboCop কনফিগারেশন ইনহেরিট করতে হবে:

# .rubocop.yml
inherit_gem:
  prettier: rubocop.yml

এখন থেকে আপনি RuboCop চালাবেন (bundle exec rubocop) তবে এটি কোনো লেআউট-রিলেটেড offense রিপোর্ট করবে না, Prettier-এর জন্য পথ খুলে দিয়ে যাতে সেটি তার নিজস্ব রুল অনুযায়ী সেগুলো ঠিক করতে পারে। আপনি Prettier-এর আউটপুটও কনফিগার করতে পারেন এর কনফিগারেশন ফাইল দিয়ে, যেটি একই প্রজেক্টের JavaScript এবং Ruby কোডের মধ্যে শেয়ার করা যায়।

RubyFmt

RubyFmt একটি ব্র্যান্ড-নিউ কোড ফরম্যাটার যা রাস্ট (Rust) তে লেখা এবং বর্তমানে সক্রিয় ডেভেলপমেন্টে। Prettier-এর মতো, এটি একটি ফরম্যাটার হিসেবে ইন্টেন্ডেড, কোড অ্যানালসিস টুল নয়। এটিকে এখনো একটি স্টেবল রিলিজ দেখা নেই, তাই আপনার এখন এডপ্ট না করাই ভালো, কিন্তু এটি একটা যেটা চোখে রাখা উচিত।

উপসংহার

  1. রুবিতে মার্জ সর্ট মাস্টার করুন: স্টেপ-বাই-স্টেপ গাইড

  2. রুবি কোড উন্নত করুন: ক্লিনার OOP ডিজাইনের জন্য Cohesion & Coupling আয়ত্ত করুন

  3. রুবিতে স্ট্যাটিক অ্যানালাইসিস মাস্টার করুন: Parser Gem দিয়ে মেথড ও প্যারামিটার এক্সট্রাক্ট করুন

  4. আইপ্যাড ও আইফোনে QR কোড স্ক্যান করার পদ্ধতি: একটি কুইক গাইড