Moonpick เป็นอีกทางเลือกหนึ่งสำหรับ Moonscript แม้ว่า moonscript จะมาพร้อมกับ Liner ในตัว แต่ปัจจุบันมันถูกจำกัดในสิ่งที่ตรวจจับได้ linter ในตัวจะตรวจจับตัวแปรที่ไม่ได้ใช้ แต่สำหรับชุดย่อยของการประกาศที่ไม่ได้ใช้ที่เป็นไปได้ทั้งหมดเท่านั้น จะไม่ตรวจจับตัวแปรนำเข้าที่ไม่ได้ใช้ ตัวแปรการสลายตัว ฟังก์ชั่นที่ไม่ได้ใช้ ฯลฯ Moonpick เกิดมาเพื่อพยายามตรวจจับสิ่งที่กล่าวมาข้างต้นและอื่นๆ
Moonpick สามารถติดตั้งผ่าน Luarocks:
$ luarocks install moonpick
จากนั้นสามารถรันได้จากบรรทัดคำสั่ง:
$ moonpick < path-to-file >
เอาต์พุตจะเลียนแบบเอาต์พุตของ linter ในตัวของ Moonscript อย่างใกล้ชิด
นอกจากนี้ยังรวมเข้ากับแอปพลิเคชันแบบสแตนด์อโลนได้อย่างง่ายดายเนื่องจากมีการพึ่งพาแต่เพียงผู้เดียวคือ moonscript ดูส่วน API สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการรันโดยทางโปรแกรม
Moonpick ตรวจจับตัวแปรที่ไม่ได้ใช้ในทุกรูปแบบ ไม่ว่าจะถูกใช้เป็นตัวแปรอย่างชัดเจนผ่านการมอบหมาย หรือสร้างขึ้นโดยปริยายโดยเป็นส่วนหนึ่งของคำสั่ง import
คำสั่งการแยกส่วนตาราง ฯลฯ
Moonpick ยังสามารถตรวจจับและบ่นเกี่ยวกับพารามิเตอร์ฟังก์ชันที่ประกาศแต่ไม่ได้ใช้ สิ่งนี้ไม่ได้เปิดใช้งานตามค่าเริ่มต้น เนื่องจากเป็นเรื่องปกติที่จะมีพารามิเตอร์ที่ไม่ได้ใช้ เช่น ฟังก์ชั่นอาจติดตาม API ภายนอก และยังต้องการระบุพารามิเตอร์ที่มีอยู่ แม้ว่าจะไม่ได้ใช้ทั้งหมดก็ตาม หากต้องการเปิดใช้งาน ให้ตั้งค่าตัวเลือกการกำหนดค่า report_params
เป็น true
Moonpick มาพร้อมกับการกำหนดค่าเริ่มต้นที่อนุญาตพารามิเตอร์ใด ๆ ที่ขึ้นต้นด้วย '_' ซึ่งเป็นวิธีการรักษาลักษณะเอกสารสำหรับฟังก์ชันและยังคงเป็นที่ชื่นชอบของ linter
ตรวจพบตัวแปรลูปที่ไม่ได้ใช้ คุณสามารถปิดใช้งานสิ่งนี้ได้อย่างสมบูรณ์ในการกำหนดค่า หรือจัดทำรายการที่อนุญาตพิเศษเฉพาะสำหรับตัวแปรลูปเท่านั้น Moonpick มาพร้อมกับการกำหนดค่าเริ่มต้นที่อนุญาตรายการอาร์กิวเมนต์ 'i' และ 'j' หรือตัวแปรใด ๆ ที่ขึ้นต้นด้วย '_'
คล้ายกับ Linter ในตัว Moonpick ตรวจจับการอ้างอิงที่ไม่ได้กำหนด
การแชโดว์การประกาศเกิดขึ้นเมื่อใดก็ตามที่การประกาศแชโดว์กับการประกาศก่อนหน้านี้ที่มีชื่อเดียวกัน พิจารณารหัสต่อไปนี้:
my_mod = require ' my_mod '
-- [.. more code in between.. ]
for my_mod in get_modules ( ' foo ' )
my_mod . bar!
แม้ว่าในตัวอย่างข้างต้นจะค่อนข้างชัดเจนว่า my_mod
ที่ประกาศในลูปนั้นแตกต่างจากระดับบนสุด my_mod
สิ่งนี้อาจชัดเจนน้อยลงอย่างรวดเร็วหากแทรกโค้ดเพิ่มเติมระหว่าง for declaration และการใช้งานในภายหลัง เมื่อถึงจุดนั้นรหัสจะคลุมเครือ การแชโดว์การประกาศช่วยในเรื่องนี้โดยทำให้แน่ใจว่าตัวแปรแต่ละตัวได้รับการกำหนดไว้มากที่สุดครั้งเดียวในลักษณะที่ชัดเจน
การตรวจหาสามารถปิดได้อย่างสมบูรณ์โดยการตั้งค่าตัวแปรการกำหนดค่า report_shadowing
เป็นเท็จ และสามารถกำหนดค่ารายการที่อนุญาตพิเศษได้โดยการระบุรายการการกำหนดค่า whitelist_shadowing
โปรดทราบว่าสำหรับ Moonscript เวอร์ชันที่เก่ากว่า 0.5 การแชโดว์ประเภทนี้จริงๆ แล้วจะใช้การประกาศก่อนหน้านี้อีกครั้ง ซึ่งนำไปสู่ข้อผิดพลาดที่มองข้ามได้ง่ายและทำให้สับสน
การกำหนดตัวแปรที่กำหนดไว้ก่อนหน้านี้ใหม่ซึ่งถือค่าฟังก์ชันนั้นไม่ค่อยต้องการ และมักเป็นผลมาจากการลืมการประกาศก่อนหน้านี้
-- with the following declaration and usage
done = ( x ) -> x . foo and x . bar
done ( {} )
-- one might mistakenly reuse the name further down
i = 1
-- [..]
done = i == 10
ซึ่งอาจทำให้เกิดปัญหาในการตรวจแก้จุดบกพร่องได้ยาก โดยเฉพาะอย่างยิ่งถ้าการกำหนดใหม่เสร็จสิ้นในเส้นทางโค้ดที่ไม่ได้ใช้เสมอไป
การตรวจหาสามารถปิดได้อย่างสมบูรณ์โดยการตั้งค่าตัวแปรการกำหนดค่า report_fndef_reassignments
เป็นเท็จ และสามารถกำหนดค่ารายการที่อนุญาตพิเศษได้โดยการระบุรายการการกำหนดค่า whitelist_fndef_reassignments
การกำหนดตัวแปรระดับบนสุดใหม่จากภายในฟังก์ชันหรือเมธอดบางครั้งอาจเป็นสาเหตุของข้อผิดพลาดที่ไม่ชัดเจนและเข้าใจยาก เช่น:
module = require ' lib.module '
-- [..] much further down
get_foo = ( y ) ->
module = y match ( ' %w+ ' ) lower! -- mistakenly reusing the `module` var
return " #{module}_bar "
ควรเรียกใช้ get_foo
ด้านบนตามเงื่อนไขเท่านั้น ซึ่งอาจทำให้ข้อบกพร่องร้ายแรงไม่มีใครสังเกตเห็น
ตรงกันข้ามกับการตรวจจับอื่นๆ การตรวจจับนี้ ไม่ได้ เปิดใช้งานตามค่าเริ่มต้น การตรวจหาสามารถเปิดได้โดยการตั้งค่าตัวแปรการกำหนดค่า report_top_level_reassignments
เป็นจริง และสามารถกำหนดค่ารายการที่อนุญาตพิเศษได้โดยการระบุรายการการกำหนดค่า whitelist_top_level_reassignments
ขอแนะนำเป็นอย่างยิ่งให้เปิดใช้งานสิ่งนี้
เหตุผลที่ไม่ได้เปิดใช้งานตามค่าเริ่มต้นก็คือ ไม่ใช่เรื่องแปลกที่จะมีโค้ดที่ถูกต้องซึ่งจัดการตัวแปรระดับบนสุดจากภายในฟังก์ชันย่อยหรือเมธอด เพื่อหลีกเลี่ยงการร้องเรียนจาก linter เราจะต้องกำหนดค่า whitelist หรือจะต้องใช้รูปแบบการเขียนโค้ดที่แตกต่างออกไป โดยที่ตัวแปรระดับบนสุดไม่ได้ถูกกำหนดใหม่ (เช่น โดยใช้ตารางเพื่อเก็บสถานะโมดูลแทน)
Moonpick รองรับชุดซุปเปอร์ของไฟล์การกำหนดค่าและรูปแบบเดียวกันกับ linter ในตัว
โดยมีตัวเลือกการกำหนดค่าเพิ่มเติมโดยเพิ่มการรองรับการกำหนดค่า Linting ของพารามิเตอร์ฟังก์ชันและตัวแปรลูป และยังอนุญาตรูปแบบ Lua ในรายการไวท์ลิสต์ทั้งหมด ไฟล์การกำหนดค่า Linter สามารถเขียนได้ใน Lua หรือ Moonscript ( lint_config.lua
และ lint_config.moon
ตามลำดับ)
ดูตัวอย่างด้านล่าง (lint_config.moon โดยใช้ไวยากรณ์ Moonscript):
{
whitelist_globals : {
-- whitelist for all files
[ " . " ] : { ' always_ignore ' } ,
-- whitelist for files matching 'spec'
spec : { ' test_helper ' } ,
}
whitelist_params : {
-- whitelist params for all files
[ " . " ] : { ' my_param ' } ,
-- ignore unused param for files in api
api : { ' extra_info ' } ,
}
whitelist_loop_variables : {
-- always allow loop variables 'i', 'j', 'k', as well as any
-- variable starting with '_' (using a Lua pattern)
[ " . " ] : { ' i ' , ' j ' , ' k ' , ' ^_ ' } ,
}
-- general whitelist for unused variables if desired for
-- some reason
whitelist_unused : {
[ " . " ] : {} ,
}
-- below you'll see the boolean switches controlling the
-- linting, shown with the default value
-- report_loop_variables: true
-- report_params: true
-- report_shadowing: true
-- report_fndef_reassignments: true
-- report_top_level_reassignments: false
}
รายการไวท์ลิสต์จะถือเป็นรูปแบบหากประกอบด้วยสิ่งอื่นที่ไม่ใช่อักขระตัวอักษรและตัวเลข
local moonpick = require ( ' moonpick ' )
Lints รหัสที่กำหนดใน code
ส่งคืนตารางการตรวจสอบ Linting config
คือการกำหนดค่า Linting ที่จะใช้สำหรับไฟล์ และสามารถมีองค์ประกอบเวอร์ชันเรียบๆ ที่มักพบในไฟล์การกำหนดค่า ( whitelist_globals
, whitelist_params
, whitelist_loop_variables
, whitelist_unused
, report_params
, report_loop_variables
)
ตัวอย่างของตารางการกำหนดค่า (ไวยากรณ์ Lua):
local moonpick = require ( ' moonpick ' )
local code = ' a = 2 '
moonpick . lint ( code , {
whitelist_globals = { ' foo ' , ' bar ' , }
whitelist_params = { ' ^_+ ' , ' other_+ ' }
})
ตารางการตรวจสอบที่ส่งคืนจะมีลักษณะเช่นนี้สำหรับตัวอย่างข้างต้น:
{
{
line = 1 ,
pos = 1 ,
msg = ' declared but unused - `a` ' ,
code = ' a = 2 '
}
}
Lints file
ที่กำหนด ส่งคืนตารางการตรวจสอบ Linting ขณะนี้ opts
สามารถมีค่าได้หนึ่งค่า lint_config
ซึ่งระบุไฟล์การกำหนดค่าที่จะโหลดการกำหนดค่า
local moonpick_config = require ( ' moonpick.config ' )
ส่งคืนเส้นทางของไฟล์การกำหนดค่าที่เกี่ยวข้องสำหรับ path
หรือ nil
หากไม่พบ
โหลดการกำหนดค่า Linting สำหรับ file
ไฟล์จากไฟล์การกำหนดค่าที่กำหนดโดย config_path
การกำหนดค่าที่ส่งคืนจะเป็นตัวเลือกการกำหนดค่าแบบตารางสำหรับ file
ส่งคืนอินสแตนซ์ตัวประเมินสำหรับตัวเลือก Linting ที่กำหนด (เช่นที่ส่งคืนโดย load_config_from
) อินสแตนซ์ตัวประเมินมีฟังก์ชันต่อไปนี้ (โปรดทราบว่าฟังก์ชันเหล่านี้เป็นฟังก์ชันที่จะเรียกใช้โดยใช้ตัวดำเนินการจุดธรรมดา .
:
allow_global_access
, allow_unused_param
, allow_unused_loop_variable
, allow_unused
, allow_fndef_reassignment
, allow_top_level_reassignment
ทั้งหมดนี้ใช้สัญลักษณ์เป็นอาร์กิวเมนต์แรก (เป็นสตริง) และส่งคืนค่า true
หรือ false
ขึ้นอยู่กับว่าสัญลักษณ์ผ่านการเป็นขุยหรือไม่
โปรดทราบว่า Moonpick ยังค่อนข้างใหม่ในช่วงนี้ และในขณะที่ดำเนินการด้วยความสำเร็จบนฐานโค้ดที่ใหญ่กว่า แต่ก็อาจสร้างผลบวกลวงและรายงานที่ไม่ถูกต้องได้เป็นอย่างดี หากคุณประสบปัญหานี้ โปรดเปิดปัญหาด้วยตัวอย่างโค้ดที่แสดงให้เห็นถึงพฤติกรรมที่ไม่ถูกต้อง
ลิขสิทธิ์ 2016-2017 นิลส์ นอร์ดแมน
Moonpick ได้รับการเผยแพร่ภายใต้ใบอนุญาต MIT (ดูไฟล์ LICENSE สำหรับรายละเอียดทั้งหมด)
การทดสอบจำเป็นต้อง busted
ทำงานเช่นเดียวกับโมดูล pl
(Penlight - luarock install penlight
) เพิ่งรัน busted
ในไดเร็กทอรีรากของโปรเจ็กต์
ดำเนินการด้วย LUA_PATH ที่ระบุซึ่งชี้ไปยังไดเร็กทอรี src
ในเครื่อง สันนิษฐานว่าเป็นสถานที่ชำระเงินของ ~/code/moonpick
:
LUA_PATH= " $HOME /code/moonpick/src/?.lua; $HOME /code/moonpick/src/?/init.lua; $( lua -e ' print(package.path) ' ) " ~ /code/moonpick/bin/moonpick * .moon