DIY Robot Framework Library

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

1
2
3
${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 ดูดีเลยทีเดียว

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

เวลาใช้ก็

1
${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