DIY Robot Framework Library

ปกติเวลาจะจัด Format string ใน Robot Framework ก็จะใช้วิธีเอามาต่อกันเฉย ๆ หรือจะใช้ Keyword Catenate เพื่อต่อ String เช่น ${text}= | Catenate | A | B ก็จะได้ ${text} มีค่าเป็น AB ทีนี้พอค่าที่จะเอามา Catenate กันดันเป็นทศนิยม แล้วอยากจะจัด precision ก่อน ก็เริ่มลำบาก

${degree}=    Set Variable    deg
${v}=    Convert To Number    ${0.1234}    2
${text}=    Catenate    ${v}    ${degree}

ค่า ${text} ที่ได้ก็จะออกมาเป็น 0.12 deg

ทีนี้ในหัวก็เริ่มเตลิด แล้วถ้ามีตัวค่าที่เป็นทศนิยมหลายตัวล่ะ ก็ต้องมานั่ง Convert To Number มันทุกอันก่อนดิ แล้วถ้าอยากจะจัดฟอร์แมตอื่น ๆ อีกนี่ไม่ยาวตายห่าเหรอ มันน่าจะมี library อะไรที่ทำได้เหมือน sprintf ในภาษา C เนอะ … นั่นไง pain point มาแล้ว

ไปค้น ๆ เจอว่า ใน python มันใช้ .format() ในการจัด format ได้ เอามาลองเขียนดูดิ๊ ไอ้เราก็เขียน python ได้งู ๆ ปลา ๆ ด้วย เลยออกมาได้แบบนี้

def format_string(pattern, *args):
    return pattern.format(*args)

เอาไปใส่ชื่อไฟล์ StringFormat.py แล้ว import มาใส่ผ่าน keyword Library ดูดีเลยทีเดียว

*** Settings ***
Library    lib/StringFormat.py

เวลาใช้ก็

${text}=    Format String    {0:0.2} deg    ${0.1234}

เสร็จแล้วก็ไม่อยากเก็บไว้เล่นคนเดียว เอาไปแบ่งคนอื่นด้วยดีกว่า เคยเห็นตอนลง dependecy ของ robot แรก ๆ ผ่านคำสั่ง pip install ตามด้วย dependency ที่ต้องการ เสร็จแล้วก็เอาไปใช้ใน robot ได้ เออ อยากได้แบบนั้นบ้าง ต้องไปหาวิธี

เขาเรียกว่าทำ package distribution นะ มันมี service ให้บริการ distribute package ที่เราทำนี่แหละในชื่อว่า PyPA บริหารงานโดย python เองเลย (https://packaging.python.org/tutorials/distributing-packages) เข้าไปดูวิธีได้เลย

หลัก ๆ แล้ว ไฟล์ที่จำเป็นที่มันบอกไว้ ก็จะมีตามนี้

  • setup.py
  • setup.cfg
  • README.rst
  • MANIFEST.in
  • LICENSE.txt
  • แพ็กเกจของเรา

ก็สร้าง และไปกำหนดค่าให้เรียบร้อย อย่างนึงที่สำคัญคือ ไอ้ “แพ็กเกจของเรา” นี่แหละ จริง ๆ แล้วที่เขียนไว้ก่อนหน้านี่มันทำงานได้นะ แต่ในฐานะแพ็กเกจแล้วมันไม่พอ มันต้องแก้ตามนี้

  1. แพ็กเกจของเรา มันเป็นชื่อแพ็กเกจสวย ๆ ที่เวลาคนเขาเอาไปใช้ เขาจะประกาศไว้ตอน Library ตอนต้น ดังนั้น ตั้งให้เท่ตามที่อยากจะได้
  2. .py ในแพ็กเกจ ที่ต้องมีคือ init.py มันจะใช้ไฟล์นี้เป็นหลัก ถ้าอยากมี .py อื่น ๆ ก็มีได้ ก็ไปดึงมาใช้เอง keyword ต่าง ๆ ที่ใช้ได้ มันจะดึงผ่าน init.py อย่างเดียว ดังนั้นไฟล์ StringFormat.py ที่ทำไว้ เลยถูก rename เป็น init.py
  3. พอเป็น init.py แล้ว สิ่งที่ต้องแก้คือข้างใน เดิมประกาศเป็นแบบ procedural ให้เปลี่ยนเป็น class แทน และเอา function ที่เคยประกาศไว้ ย้ายไปเป็น method ให้หมด (อย่าลืม self นะ)
  4. เสร็จแล้วก็จะได้แพ็กเกจออกมาหน้าตาแบบนี้ https://github.com/chonla/robotframework-stringformat

ที่เหลือก็สั่ง

python3 setup.py bdist_wheel --universal
twine upload dist/

ใส่ username/password ให้เรียบร้อย มันก็จะอัพโหลดเข้าไปที่ PyPA ให้เรา เราก็สามารถใช้ pip install ลงมาใช้งานได้เลย

ข้อสังเกต คือ ตอน pip install ชื่อ package จะเป็นชื่อที่เราตั้งในฟิลด์ “name” ที่ประกาศใน setup.py ส่วนตอนประกาศ Library ใน robot ให้ใช้ชื่อ package ที่เป็นชื่อ directory ที่เราตั้งไว้

Leave a Reply