Class: MCMD::Margs

Inherits:
Object
  • Object
show all
Defined in:
lib/nysol/margs.rb

Overview

test.rbの内容


require ‘nysol/mcmd’ include MCMD

# “i=,o=,w=,-flag,-x”以外の引数が指定されればエラー終了する。 # “i=,w=”引数を指定しなければエラー終了する。 args=Margs.new(ARGV, “i=,o=,w=,-flag,-x”, “i=,w=”) iFileName = args.file(“i=”) # -> “dat.csv” oFileName = args.str(“o=”,“result.csv”) # -> “result.csv” weight = args.float(“w=”,0.1,0.0,1.0) # -> 0.1 flag = args.bool(“-abc”) # -> true wFlag = args.bool(“-w”) # -> false


Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(argv, allKeyWords = nil, mandatoryKeyWords = nil, help_func = nil, ver_func = nil) ⇒ Margs

コンストラクタ

argv: rubyのARGV変数

allKeyWords: key=もしくは-keyによる引数キーワードリスト(String Array)

ここで指定した以外の引数がARGVに指定されていないことをチェックし、指定されていればエラー終了する。
keyListを省略した場合はこのチェックをしない。

mandatoryKeyWords: key=による引数キーワードリスト(String Array)

ここで指定した引数がコマンドラインで指定されていなければエラー終了する。
mandatoryKeyWordsを省略した場合はこのチェックをしない。


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/nysol/margs.rb', line 95

def initialize(argv, allKeyWords=nil, mandatoryKeyWords=nil, help_func=nil,ver_func=nil)
	@argv=argv
	@allKeyWords=allKeyWords
	@mandatoryKeyWords=mandatoryKeyWords
	@keyValue=Hash.new
	@cmdName=$0.dup

	# コマンドラインで指定された引数を一旦全てHashに格納する。
	@argv.each{|arg|
		if arg[0..0]=="-" then
			@keyValue[arg]=true
 			begin
				if arg=="--help"
					if help_func
						help_func()
						exit()
					else
						help()
						exit()
					end
				elsif arg=="--version"
					if ver_func
						ver_func()
						exit()
					else
						ver_func()
						exit()
					end
				end
			rescue => err
				# help関数がなければ通過させる。
				break
			end

		else
			pos=arg.index("=")
			if pos==nil then
				raise "invalid argument: `#{arg}'"
			end
			val=arg.split("=",2)[1] # 20140924 by ham
			val="" if val==nil
			@keyValue[arg[0..pos]]=val
		end
	}

	# allKeyWordsのオプションタイプのキーワードを登録する
	if @allKeyWords!=nil then
		@allKeyWords.split(",").each{|kw|
			if kw[0..0]=="-" and @keyValue[kw]==nil then
				@keyValue[kw]=false
			end
		}
	end

	# 指定のキーワード以外のキーワードが指定されていないかチェック
	if @allKeyWords!=nil then
		kwList=@allKeyWords.split(",")
		@keyValue.each{|kw,val|
			if kwList.index(kw)==nil then
				raise "I don't know such a argument: `#{kw}'"
			end
		}
	end

	# 必須引数のチェック
	if @mandatoryKeyWords !=nil then
		@mandatoryKeyWords.split(",").each{|kw|
			if @keyValue[kw]==nil and kw[0..0]!="-" then
				raise "argument `#{kw}' is mandatory"
			end
		}
	end
end

Instance Attribute Details

#argvObject (readonly)

Returns the value of attribute argv.



82
83
84
# File 'lib/nysol/margs.rb', line 82

def argv
  @argv
end

#keyValueObject (readonly)

Returns the value of attribute keyValue.



83
84
85
# File 'lib/nysol/margs.rb', line 83

def keyValue
  @keyValue
end

Instance Method Details

#bool(key) ⇒ Object

Bool型引数の値のチェックと取得

返値: 引数で指定されたかどうか(true/false)

key: “-key”形式の引数キーワード

ここで指定した引数がコマンドラインで指定されていればtrueを、指定されていなければfalseを返す。


259
260
261
# File 'lib/nysol/margs.rb', line 259

def bool(key)
	return @keyValue[key]
end

#cmdlineObject

コマンドラインをkey-valuを配列で返す



370
371
372
# File 'lib/nysol/margs.rb', line 370

def cmdline()
 	return "#{@cmdName} #{@argv.join(' ')}"
end

#field(key, iFile, default = nil, min = nil, max = nil) ⇒ Object

Field型引数の値のチェックと取得

返値: 各種配列のHash key=a1:b1%c1,a2:b2%c2,…

names: [a1,a2,...]
newNames: [b1,b2,...]
flags:  [c1,c2,...]
fld2csv: a1,a2,...のCSVファイルにおける項目番号(0から始まる)
csv2fld: CSVファイルの項目番号に対するa1,a2,...の番号(0から始まる)


298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
# File 'lib/nysol/margs.rb', line 298

def field(key,iFile,default=nil,min=nil,max=nil)
	return unless iFile
	val=@keyValue[key]
	val=default if val==nil

	names1=[]
	names2=[]
	flags=[]
	fld2csv=[]
	csv2fld=[]

	# names1,names2,flagsの設定
	if val!=nil then
		val1=val.split(",")
		val1.each{|v|
			val2=v.split("%")
			val3=val2[0].split(":")
			names1 << val3[0]
			names2 << val3[1]
			flags  << val2[1]
		}

		if min then
			raise "#{key} takes at least #{min} field name(s)" if names1.size<min
		end
		if max then
			raise "#{key} takes at most #{max} field name(s)" if names1.size>max
		end

		iNames=MCMD::Mcsvin.new("i=#{iFile}").names
		# fld2csvの設定
		(0...names1.size).each{|i|
			pos=iNames.index(names1[i])
			if pos==nil then
				raise "field name not found: `#{names1[i]}'"
			end
			fld2csv << pos
		}

		# csv2fldの設定
		(0...iNames.size).each{|i|
			pos=fld2csv.index(i)
			if pos!=nil
				csv2fld << pos
			else
				csv2fld << nil
			end
		}

		ret=Hash.new
		ret["names"]=names1
		ret["newNames"]=names2
		ret["flags"]=flags
		ret["fld2csv"]=fld2csv
		ret["csv2fld"]=csv2fld
		ret["csvNames"]=iNames
		return ret
	else
		return nil
	end
end

#file(key, mode = "r", default = nil) ⇒ Object

ファイル型引数の値のチェックと取得

返値: 引数で指定されたファイル名(String)

key: “key=”形式の引数キーワード

ここで指定した引数の値をファイル名と想定し、そのファイルがreadable(writable)かどうかをチェックする。
readable(writable)であればそのファイル名を返し、readable(writable)でなければエラー終了する。
readable(writable)チェックをしないのであればMargs::strを使えばよい。

mode: “r”もしくは“w”を指定し、rならばreadableチェックを、wならwritebleチェックを行う。



272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
# File 'lib/nysol/margs.rb', line 272

def file(key,mode="r",default=nil)
	val=@keyValue[key]
	val=default if val==nil

	if val!=nil then # valがnilの場合(ex. 値なし指定"i=")はノーチェックで通す
		if mode=="r" then
			if not File.readable? val then
				raise "file open error: `#{val}' is not readable"
			end
		elsif mode=="w" then
			if not File.writable? File.dirname(val) then
				raise "file open error: `#{val}' is not writable"
			end
		end
	end
	return val
end

#float(key, default = nil, from = nil, to = nil) ⇒ Object

Float型引数の値のチェックと取得

返値: 引数で指定された値(Float)

key: “key=”形式の引数キーワード

ここで指定した引数の値をFloatとして返す。
コマンドラインで指定されていなければdefaultの値を返す。

default: コマンドラインで指定されなかったときのデフォルト値

from: 値の下限値。指定した値が下限値を下回ればエラー終了する。

to: 値の上限値。指定した値が上限値を上回ればエラー終了する。



237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/nysol/margs.rb', line 237

def float(key, default=nil, from=nil, to=nil)
	val=@keyValue[key]
	val=default if val==nil
	
	if val!=nil then
		val=val.to_f
		if from != nil and val<from then
			raise "range error: `#{key}=#{val}': must be in [#{from}..#{to}]"
		end
		if to   != nil and val>to   then
			raise "range error: `#{key}=#{val}': must be in [#{from}..#{to}]"
		end
	end

	return val
end

#getKeyValue(prefix = nil) ⇒ Object

key-valuを配列で返す



361
362
363
364
365
366
367
# File 'lib/nysol/margs.rb', line 361

def getKeyValue(prefix=nil)
	ret=[]
	@keyValue.each{|k,v|
		ret << ["#{prefix}#{k}","#{v}"]
	}
	return ret
end

#int(key, default = nil, from = nil, to = nil) ⇒ Object

Fixnum型引数の値のチェックと取得

返値: 引数で指定された値(Fixnum)

key: “key=”形式の引数キーワード

ここで指定した引数の値をFloatとして返す。
コマンドラインで指定されていなければdefaultの値を返す。

default: コマンドラインで指定されなかったときのデフォルト値

from: 値の下限値。指定した値が下限値を下回ればエラー終了する。

to: 値の上限値。指定した値が上限値を上回ればエラー終了する。



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/nysol/margs.rb', line 208

def int(key, default=nil, from=nil, to=nil)
	val=@keyValue[key]
	val=default if val==nil
	
	if val!=nil then
		val=val.to_i
		if from != nil and val<from then
			raise "range error: `#{key}=#{val}': must be in [#{from}..#{to}]"
		end
		if to   != nil and val>to   then
			raise "range error: `#{key}=#{val}': must be in [#{from}..#{to}]"
		end
	end

	return val
end

#str(key, default = nil, token1 = nil, token2 = nil) ⇒ Object

String型引数の値のチェックと取得

返値: 引数で指定された値(String)

key: “key=”形式の引数キーワード(String)

ここで指定した引数の値をStringとして返す。
コマンドラインで指定されていなければdefaultの値を返す。

default: コマンドラインで指定されなかったときのデフォルト値(String)



178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/nysol/margs.rb', line 178

def str(key,default=nil,token1=nil,token2=nil)
	val=@keyValue[key]
	val=default if val==nil
	if val!=nil then
		if token1!=nil then
			val=val.split(token1)
			if token2!=nil then
				ary=val.dup()
				val=[]
				ary.each{|v|
					val << v.split(token2)
				}
			end
		end
	end
	return val
end