অ্যানালাইজার ইন্টারফেস


Exercism ওয়েবসাইটের সঙ্গে সব যোগাযোগ স্বয়ংক্রিয়ভাবে সামলানো হয়। অ্যানালাইজারদের দায়িত্ব একটিই: একটি সলিউশন নিয়ে সেটি থেকে একটি স্ট্যাটাস এবং প্রয়োজনীয় মেসেজ ফেরত দেওয়া।

এক্সিকিউশন

  • একটি অ্যানালাইজারকে একটি এক্সিকিউটেবল স্ক্রিপ্ট দিতে হবে। আরও তথ্য পাবেন docker.md ফাইলে।
  • স্ক্রিপ্টটি তিনটি প্যারামিটার পাবে:
    • অনুশীলনীর স্লাগ (যেমন two-fer)।
    • জমা দেওয়া ফাইলটি বা ফাইলগুলো যে ডিরেক্টরিতে আছে তার পাথ (শেষে একটি স্ল্যাশ সহ)।
    • আউটপুট ডিরেক্টরির পাথ (শেষে একটি স্ল্যাশ সহ)। এই ডিরেক্টরিতে লেখা যায়।
  • স্ক্রিপ্টটিকে আউটপুট ডিরেক্টরিতে একটি analysis.json ফাইল লিখতেই হবে।
  • স্ক্রিপ্টটির আউটপুট ডিরেক্টরিতে একটি tags.json ফাইল লেখা উচিত।

অনুমোদিত রান টাইম

প্রতিটি সলিউশনের জন্য অ্যানালাইজার ২০ সেকেন্ডের একটি জানালায় মেশিনের ১০০% রিসোর্স পায়। ২০ সেকেন্ড পর প্রসেসটি থামিয়ে দেওয়া হয় এবং একটি টাইম-আউট রিপোর্ট করা হয়।

Note

টাইম-আউটের সম্ভাবনা কমাতে আমাদের পারফরম্যান্স বেস্ট প্র্যাকটিসেস নথি অনুসরণ করার জোরালো পরামর্শ দিই।

আউটপুট ফরম্যাট

analysis.json

analysis.json ফাইলটি নিচের মতো করে সাজাতে হবে:

{
  "summary": "This solution looks good but has a few points to address",
  "comments": [
    {
      "comment": "ruby.general.some_parameterised_message",
      "params": { "foo": "param1", "bar": "param2" },
      "type": "essential"
    },
    {
      "comment": "ruby.general.some_unparameterised_message",
      "params": {},
      "type": "actionable"
    },
    {
      "comment": "ruby.general.some_unparameterised_message"
    },
    "ruby.general.some_unparameterised_message"
  ]
}

summary (ঐচ্ছিক)

summary ফিল্ডটি একটি টেক্সট (Markdown নয়) ফিল্ড, যা আউটপুটের সারসংক্ষেপ দেয়। এতে এমন কথা থাকতে পারে, যেমন "আপনার সলিউশন প্রায় হয়ে গেছে, আর মাত্র দুটি ছোট পরিবর্তন করলেই হবে।" অথবা "কোডটি দারুণ কাজ করছে, তবে একটু লিন্টিং করা দরকার।"। এই সারসংক্ষেপটি ওয়েবসাইটে মন্তব্যগুলোর উপরে দেখানো হয়।

comments

comments ফিল্ডটি মন্তব্যগুলোর একটি অ্যারে, যেগুলো exercism/website-copy-এর Markdown ডকুমেন্টের দিকে নির্দেশ করে (আরও তথ্যের জন্য দেখুন অ্যানালাইজারের মন্তব্য লেখা)। অ্যারের প্রতিটি মান হয় একটি পয়েন্টার-স্ট্রিং, নয়তো নিচের ফরম্যাটের একটি JSON অবজেক্ট:

comment

website-copy-এর কোনো ফাইলের দিকে নির্দেশ করা পয়েন্টার-স্ট্রিং।

params (ঐচ্ছিক)

রেন্ডারিংয়ের সময় ইন্টারপোলেট করতে হবে এমন সব প্যারাম ধারণ করা একটি JSON অবজেক্ট। যেমন, Markdown ফাইলে আপনি লিখতে পারেন Try %{variable_name} += 1 instead, তারপর %{variable_name}-এর জায়গায় শিক্ষার্থী যে ভ্যারিয়েবলটি আসলে ব্যবহার করেছে সেটি বসাতে params-এ { "variable_name": "foo"} সেট করতে পারেন।

প্যারামিটারযুক্ত ফাইল ব্যবহারের সময় %-এর প্রতিটি ব্যবহারের সামনে আরেকটি % বসিয়ে সেগুলো এস্কেপ করা নিশ্চিত করুন। যেমন Try aim aim for 100%% of the tests passing।

type (ঐচ্ছিক)

নিচের type-গুলো বৈধ:

  • essential: শিক্ষার্থীরা এই মন্তব্যটি আমলে না নেওয়া পর্যন্ত আমরা তাদের সফট-ব্লক করে রাখি
  • actionable: ব্যবহারকারীকে তার সলিউশন উন্নত করার নির্দিষ্ট নির্দেশনা দেওয়া যেকোনো মন্তব্য
  • informative: তথ্য দেয় এমন মন্তব্য, তবে শিক্ষার্থীরা তা কাজে লাগাবে বলে অবশ্যই আশা করা হয় না। যেমন Ruby-তে কেউ যদি TwoFer-এ স্ট্রিং কনক্যাটেনেশন ব্যবহার করে, আমরা তাকে স্ট্রিং ফরম্যাটিং সম্পর্কেও জানাই, কিন্তু সেটি যে ভালো কোনো বিকল্প তা বলি না।
  • celebratory: ব্যবহারকারীকে জানায় যে সে কিছু সঠিকভাবে করেছে, সেটি হয় সলিউশন নিয়ে সাধারণ মন্তব্য, নয়তো কোনো টেকনিক নিয়ে।

type ফিল্ড ছাড়া মন্তব্যগুলো ডিফল্টভাবে informative হিসেবে গণ্য হয়।

বর্তমানে ওয়েবসাইটে আমরা essential মন্তব্যে সফট-ব্লক করি, শিক্ষার্থীদের প্র্যাকটিস অনুশীলনী সম্পূর্ণ হিসেবে চিহ্নিত করার আগে actionable মন্তব্যগুলো সম্পন্ন করতে উৎসাহ দিই (তবে কনসেপ্ট অনুশীলনীতে নয়), কিন্তু informative বা celebratory মন্তব্যে কোনো পদক্ষেপের পরামর্শ দিই না। তবে ভবিষ্যতে আমরা হয়তো অন্য টাইপগুলোতে ইমোজি বা সূচক যোগ করতে পারি, বা সেগুলো আলাদাভাবে দলবদ্ধ করতে পারি।

tags.json

tags.json ফাইলটি নিচের মতো করে সাজাতে হবে:

{
  "tags": [
    "construct:list",
    "paradigm:functional",
    "technique:higher-order-functions",
    "uses:List.unfold"
  ]
}

tags

tags ফিল্ডটি স্ট্রিংয়ের একটি অ্যারে। প্রতিটি ট্যাগের ফরম্যাট: "<category>:<thing>"।

কিছু উদাহরণ:

  • "paradigm:functional"
  • "technique:recursion"
  • "construct:bitwise-and"
  • "uses:DateTime.add_seconds"

কোনো সলিউশন কী কী কনস্ট্রাক্ট/টেকনিক/প্যারাডাইম ব্যবহার করে, তা শনাক্ত করতে ট্যাগ ব্যবহার করা যায়।

আরও তথ্যের জন্য দেখুন সলিউশনে ট্যাগ দেওয়া।

ডিবাগিং

প্রতিটি রানের stdout ও stderr-এর বিষয়বস্তু ফাইলে সংরক্ষিত থাকবে, যা পরে দেখা যাবে।

পরে দেখতে চান এমন ডিবাগিং তথ্য দিয়ে আপনি একটি analysis.out ফাইল লিখতে পারেন।

আরও পড়ুন

একটি অ্যানালাইজার বানানোর আগে অনুগ্রহ করে আমাদের অ্যানালাইজার নির্দেশিকা পড়ুন।