(2016-09-06 追記) ——————————————-
How To Install OpenSCAD 2015.03 On Ubuntu 14.10, Ubuntu 14.04, Ubuntu 12.04 And Derivative Systems
この記事にあるように、PPAを使ったら最新版がもっと簡単にいれれるのでこっちがおすすめ。
——————————————————————
OpenSCADのテストってどうすれば良いのだろうか
- とりあえずモジュールがビルドできる
- 変数の未定義はなぜかERRORでなくWARNINGとして処理されるので、WARNINGでもビルド失敗としたい
完成品は https://github.com/Drunkar/openscad_modules です。CircleCIによってstlが生成されます。
1. circle.yml: OpenSCADのバージョンに注意
OpenSCADはコマンドラインでビルド可能なのでとりあえずcircleciでビルドしてみると、謎のsyntax errorが発生する。。。
なんかよくよく調べてみると昔のOpenSCADでは多重use/includeをすると全く関係のない行でsyntax errorが発生するというバグがあった模様
そんでUbuntu 14.04 trustyのapt-getでインストールされるOpenSCADは2013.01+dfsg-2.2でこのバグに引っかかってるらしい
http://packages.ubuntu.com/ja/trusty/openscad
なのでただのapt-getじゃなくて新しいパッケージを取ってこないといけない。
https://launchpad.net/~openscad/+archive/ubuntu/releases/+build/7368891
trustyでもOpenSCAD 2015.03-1+dfsg-0.1いけるやん!てことでcircle.ymlはこんな感じになります
general:
branches:
ignore:
- images
machine:
timezone: Asia/Tokyo
python:
version: 3.5.1
dependencies:
pre:
- sudo apt-get update
- sudo apt-get install libboost-filesystem1.54.0 libboost-program-options1.54.0 libboost-regex1.54.0 libglew1.10 libopencsg1 libqt5scintilla2-11 libcgal10
- wget https://launchpad.net/~openscad/+archive/ubuntu/releases/+build/7368891/+files/openscad_2015.03-1+dfsg-0.1~trusty1_amd64.deb && sudo dpkg -i openscad_2015.03-1+dfsg-0.1~trusty1_amd64.deb
- sudo apt-get update
- sudo apt-get install openscad
- sudo pip install --upgrade pip
- sudo pip install -r requirements-dev.txt
test:
post:
- invoke test
おわかりいただけたでしょうか。testはinvokeで行います。なぜならローカルでも実行できるからです。
ではお次はtestの中身です
2. test: “WARNING”を検出してエラーにする
なんでかしらんけど、OpenSCADは未定義の変数があるとその変数に1を代入してWARNINGを出して実行を続けます。
どうみてもエラーだと思いますけどそうなっているので仕方ない。
invokeでnosetestsを呼び出します。(tasks.py)
#!/usr/bin/env python
# coding: utf-8
import invoke
@invoke.task
def test(ctx):
invoke.run("nosetests -v -s")
すると test_build_all.py がテストスクリプトと判断され実行されます。
ここではPythonのsubprocess.Popenでopenscadコマンドを実行し、stdoutとstderrに”WARNING”または”ERROR”のどちらかの文字が含まれていればエラーを発生させています。CircleCIで生成したファイルは、CIRCLE_ARTIFACTSという環境変数に記載されたディレクトリに保存することでダッシュボードからダウンロード可能になるので、openscadの-oオプションで書き出すパスを指定しています。
#!/usr/bin/env python
# coding: utf-8
import os
from glob import glob
import subprocess
CMD = "openscad -o "
OUTPUT_PATH = os.environ["CIRCLE_ARTIFACTS"]
def test_build_all():
for file in glob("modules/*.scad"):
print("--------------------------------------------------------------")
print(file)
output_file = os.path.splitext(os.path.basename(file))[0]
p = subprocess.Popen(["openscad", "-o", OUTPUT_PATH + "/" + output_file + ".stl", file],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
error_count = out.count(b"ERROR") + err.count(b"ERROR")
warning_count = err.count(b"WARNING") + out.count(b"WARNING")
expect = 0
print("stdout: " + out.decode("utf-8"))
print("stderr: " + err.decode("utf-8"))
try:
assert error_count + warning_count == expect
except AssertionError:
raise Exception("ERROR or WARNING exists!")
これでモジュールづくりが捗ります
コメント