rarg 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (8) hide show
  1. data/lib/rarg.rb +112 -0
  2. data/license.txt +281 -0
  3. data/rakefile.rb +44 -0
  4. data/readme_en.txt +50 -0
  5. data/readme_ja.txt +54 -0
  6. data/setup.rb +1585 -0
  7. data/spec/main.rb +74 -0
  8. metadata +59 -0
@@ -0,0 +1,112 @@
1
+ # encoding: us-ascii
2
+ #-----------------------------------------------------------
3
+ # RArg - utility for validating named arguments
4
+ #
5
+ # Version: 0.1 (2009-01-31)
6
+ # Author: Dice <tetradice.1011@gmail.com>
7
+ # License: NYSL 0.9982 <http://www.kmonos.net/nysl/>
8
+ # (this license is like Public Domain)
9
+ #-----------------------------------------------------------
10
+
11
+ module RArg
12
+ VERSION = '0.1'
13
+ VERSION_NUMBER = 0.1
14
+
15
+ class << self
16
+ # parse arguments with definition block. Return: ParseResult
17
+ def parse(args, &definition)
18
+ context = DefinitionContext.new
19
+ context.instance_eval(&definition)
20
+ context.parse(args)
21
+ end
22
+
23
+ alias parse_named_arguments parse
24
+ end
25
+
26
+ # error of definition or parsing
27
+ class Error < ::StandardError
28
+ end
29
+
30
+
31
+ class DefinitionContext
32
+ def initialize
33
+ @required = []
34
+ @defaults = {}
35
+ @aliases = {}
36
+ end
37
+
38
+ def parse(args)
39
+ base = {}
40
+
41
+ @defaults.each_pair do |name, value|
42
+ unless args.include?(name) then
43
+ base[name] = value
44
+ end
45
+ end
46
+
47
+ args.each_pair do |name, value|
48
+ # solve aliases
49
+ if @aliases.include?(name) then
50
+ real_name = @aliases[name]
51
+ else
52
+ real_name = name
53
+ end
54
+
55
+ # check defined or not
56
+ if not @required.include?(real_name) and not @defaults.include?(real_name) then
57
+ raise Error, "'#{real_name}' is not defined"
58
+ end
59
+
60
+ base[real_name] = value
61
+ end
62
+
63
+ if (missing = @required.find{|x| not base.include?(x)}) then
64
+ raise Error, "argument of '#{missing}' is required, but missing"
65
+ end
66
+
67
+
68
+
69
+ return ParseResult.new(base)
70
+ end
71
+
72
+ private
73
+
74
+ # define a required argument
75
+ def require_arg(*names)
76
+ @required.concat(names)
77
+ end
78
+
79
+ # define a default argument, name and value
80
+ def default_arg(name, value = nil)
81
+ @defaults[name] = value
82
+ end
83
+
84
+ # define an alias of argument
85
+ def alias_arg(new, orig)
86
+ if @required.include?(orig) or @defaults.include?(orig) then
87
+ @aliases[new] = orig
88
+ else
89
+ raise Error, "alias: '#{orig}' -> '#{new}', but '#{orig}' is not defined"
90
+ end
91
+ end
92
+ end
93
+
94
+ # return of parsing
95
+ class ParseResult
96
+ attr_reader :base
97
+ alias arguments base
98
+
99
+ def initialize(base)
100
+ @base = base
101
+ end
102
+
103
+ def [](name)
104
+ if @base.include?(name) then
105
+ @base[name]
106
+ else
107
+ raise Error, "argument name '#{name}' is not defined"
108
+ end
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,281 @@
1
+
2
+ ライセンス本文
3
+ ==================================================
4
+
5
+
6
+ NYSL Version 0.9982
7
+ ----------------------------------------
8
+
9
+ A. 本ソフトウェアは Everyone'sWare です。このソフトを手にした一人一人が、
10
+ ご自分の作ったものを扱うのと同じように、自由に利用することが出来ます。
11
+
12
+ A-1. フリーウェアです。作者からは使用料等を要求しません。
13
+ A-2. 有料無料や媒体の如何を問わず、自由に転載・再配布できます。
14
+ A-3. いかなる種類の 改変・他プログラムでの利用 を行っても構いません。
15
+ A-4. 変更したものや部分的に使用したものは、あなたのものになります。
16
+ 公開する場合は、あなたの名前の下で行って下さい。
17
+
18
+ B. このソフトを利用することによって生じた損害等について、作者は
19
+ 責任を負わないものとします。各自の責任においてご利用下さい。
20
+
21
+ C. 著作者人格権は Dice に帰属します。著作権は放棄します。
22
+
23
+ D. 以上の3項は、ソース・実行バイナリの双方に適用されます。
24
+
25
+
26
+ NYSL Version 0.9982 (en) (Unofficial)
27
+ ----------------------------------------
28
+ A. This software is "Everyone'sWare". It means:
29
+ Anybody who has this software can use it as if you're
30
+ the author.
31
+
32
+ A-1. Freeware. No fee is required.
33
+ A-2. You can freely redistribute this software.
34
+ A-3. You can freely modify this software. And the source
35
+ may be used in any software with no limitation.
36
+ A-4. When you release a modified version to public, you
37
+ must publish it with your name.
38
+
39
+ B. The author is not responsible for any kind of damages or loss
40
+ while using or misusing this software, which is distributed
41
+ "AS IS". No warranty of any kind is expressed or implied.
42
+ You use AT YOUR OWN RISK.
43
+
44
+ C. Copyrighted to Dice.
45
+
46
+ D. Above three clauses are applied both to source and binary
47
+ form of this software.
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ 参考文書
56
+ ==================================================
57
+
58
+
59
+ このテキストファイルに関する情報
60
+ ----------------------------------------
61
+
62
+ このファイルは http://www.kmonos.net/nysl/ の情報をまとめたものです。
63
+ ardry <ardry at users dot sourceforge dot jp> 氏の提案を受けて
64
+ k.inaba <kiki at kmonos dot net> がまとめました。
65
+
66
+
67
+ はじめに
68
+ ----------------------------------------
69
+ http://www.kmonos.net/nysl/readme.html
70
+
71
+ * NYSL とは?
72
+
73
+ ソフトウェアの使用許諾条件、いわゆる"ライセンス"の一種です。主な特徴
74
+ としては、『NYSLのもとで公開されているソフトやソースコードは、誰でもそ
75
+ れを自由に使用して別の新しいソフトを作ることができる』こと。
76
+
77
+ この世の中には、いろいろなソフトウェア・ライセンスが存在します。その
78
+ 違いは主に作者の方々の思想の違いに由来しています。あるいは同じ作者のソ
79
+ フトであっても、製作動機や完成度やその時の気分のせいで、異なる利用条件
80
+ を持っていることもあります。まあ、当たり前のことですね。
81
+
82
+ NYSLの場合は、「自分一人でソースを抱え込んでるより、他の人にいろいろ
83
+ いじり倒してもらう方が面白い!」という単純な考え方に基づいています。
84
+ もっと言うと「そのいじり倒した結果が自分に帰って来るかどうかは関係ない。
85
+ 自分の振ったネタからどこかで何かが始まるとしたら、それだけで楽しいじゃ
86
+ ん?」という気分。
87
+
88
+ * ススメ
89
+ 上に書いた「気分」、甘っちょろすぎる考えかたかもしれません。例えば商
90
+ 売としてソフトを売っているとか、シェアウェアとして有料で公開していると
91
+ いった場合ならば、そうほいほいと全てをフリーにしてしまうのは現実的では
92
+ ないでしょう。それはそういうものだと思います。けれどもし、趣味で作って
93
+ 趣味で公開してるようなソフトなら、ホビープログラマがみんなしてオープン
94
+ になることも可能なのではないかと、そうすれば結構楽しいことになるのでは
95
+ ないかと、妄想しています。
96
+
97
+ You may say I'm a dreamer,
98
+ but I'm not the only one.
99
+ I hope someday you'll join us,
100
+ and the world will be as one.
101
+ -- John Lennon, "Imagine"
102
+
103
+ もし貴方がフリーウェア作者さんなら、是非オープンなソフトを公開してみ
104
+ ませんか?
105
+
106
+
107
+ FAQ
108
+ ----------------------------------------
109
+ http://www.kmonos.net/nysl/faq.html
110
+ 編者注:リンクがある場合は<http://url/>の書式を挿入しています。
111
+ 原文のリンク先が移転している場合は、<移http://url>としてます。
112
+
113
+ 基本的に「ご自分の作ったものを扱うのと同じように」。これに尽きます。
114
+
115
+ * 具体的な話
116
+ Q. 転載・再配布自由とありますが、作者への事後報告等も不要ですか?
117
+ A. 不要です。もちろん連絡して下さっても構いません。自分の作ったソフ
118
+ トが広まっていくのを知るのは嬉しいことです。
119
+
120
+ Q. NYSL下で公開されてるソースを使ったプログラムを公開する場合、その
121
+ ソースを使った旨を記述しなければなりませんか?
122
+ A. いいえ。特に何も書かなくてOKです。謝辞等に元ソースの作者の名前
123
+ を載っけたりする必要もありません。(載っけてもOKですが。) ご
124
+ 自分の作ったものと同じように、他人の名前の掲載を強制されるはずが
125
+ ありません。
126
+
127
+ Q. NYSL下で公開されてるソースを使ったプログラムは、 NYSLライセンス
128
+ で公開しなくてはならないのですか?
129
+ A. そんなことはありません。なんなりと好きなライセンスを選んで下さい。
130
+
131
+ Q. 自分の作ったソフトをNYSLに従って配布したいのですが、よろしいです
132
+ か?
133
+ A. 大歓迎です。C.項の名前部分を埋めて使ってやって下さい。ですが、例
134
+ えば zlib ライセンス <http://www.kmonos.net/nysl/zlib.html> など
135
+ の方がそのプログラムには適しているかもしれませんよ? もう一度じっ
136
+ くりと検討してみることをオススメします。
137
+ また、単に「NYSLライセンス( http://www.kmonos.net/nysl/ )に従
138
+ います。」とだけ書いてソフトを公開するのはおすすめしません。とい
139
+ うのは、その URL の指すページの内容は、私 k.inaba がいつでも勝手
140
+ に書き換える可能性があるからです。 k.inaba の決定した NYSL のバー
141
+ ジョンアップに無条件に追随する覚悟があれば、 URL のみの提示でも
142
+ 問題はありません。不安があれば、NYSLの全文をコピーするか、
143
+ 「NYSL 0.9981に従います」のように、バージョン番号を明示指定して
144
+ おくが吉です。
145
+
146
+ Q. NYSLを微妙に変えたライセンスで自作プログラムを配布したいのですが。
147
+ A. ご自由にどうぞ。NYSL自体はNYSDL
148
+ <http://www.kmonos.net/nysl/nysdl.html>のもとで「ご自分の作った
149
+ ものを扱うのと同じように」利用できます。
150
+
151
+ Q. NYSLのような俺々ライセンスは使えない。
152
+ A. 確かに、そのような場面は多々あります。「既に広く利用されているラ
153
+ イセンスでないと信頼性に欠ける」「公式な英語版ライセンスが必要」
154
+ 「オープンソース(TM)プロジェクトのホスティングサービスを利用した
155
+ いが、OSIに認定されたライセンスしか選択肢にない」「名前が嫌だ」
156
+ など。このような場合は無理にNYSLを使うこともないでしょう。
157
+
158
+ 参考までに、私自身は、そのような場合には zlib ライセンスを採用する
159
+ ことにしています。OSI認定ライセンスの中でも非常によく知られている
160
+ ものの一つであり、課す条件も非常に緩いというのがその理由です。
161
+
162
+ * 抽象的な話
163
+ Q. A-4はどういう意味ですか?
164
+ A. どこか改良して公開するときは、変更が加えられている旨を記述してく
165
+ ださい、ということです。原作者が作ったのではない部分について原作
166
+ 者に問い合わせ等が来ても困りますので、そういうことが起きないよう
167
+ にしてね、と。
168
+
169
+ Q. 著作者人格権を保持するってことは、同一性保持権(勝手に改変しちゃ
170
+ ダメと言える権利)は捨てないということだから、自由とは言えないの
171
+ では?
172
+ A. 同一性保持権というのは、「(著作者の)意に反してこれらの変更、切
173
+ 除その他の改変を受けないものとする」という権利です
174
+ (著20<http://www.houko.com/00/01/S45/048.HTM#s2.3.2>)。
175
+ ところが、著作者のの「意」はNYSLに記した通りです。どんな変更を加
176
+ えても著作者の意には反しません。つまり結局の所、好きなように改変
177
+ することができるわけです。
178
+
179
+ Q. しかしそうは言っても、著作者人格権も誰にも帰属してない方が良いと
180
+ 思う。
181
+ A. 日本の法律では著作者人格権は誰にも譲渡できないことになっています
182
+ (著59<http://www.houko.com/00/01/S45/048.HTM#s2.5>)。更にそこか
183
+ ら、著作者人格権は放棄できない、とする解釈が一般的です。「できな
184
+ い」ものなのに「著作者人格権は放棄したものとして扱って下さい」と
185
+ 書いて済ませてしまうのは無意味と考え、現在の形態をとることにしま
186
+ した。繰り返しますが、どんな変更を加えても著作者の意には反しませ
187
+ ん、のでご心配なく。
188
+
189
+ 著作権は、著61<http://www.houko.com/00/01/S45/048.HTM#s2.6>より、
190
+ 権利者が自由に譲渡や処分できる財産権であると解釈されているため、
191
+ 日本法の下でも放棄することが可能であるとし、NYSLではこれを放棄し
192
+ ています。(注:「著作権は放棄可能か?」という問題についてはこれ
193
+ とは異なる説
194
+ <移http://www.sekidou.com/law/cyber/intlprop/intpro11.shtml>も存
195
+ 在しますが、得られる結果はどちらの解釈でも同じです。)
196
+
197
+ Q. 自分の作ったものと同じなら、そのプログラムで使われている技術で特
198
+ 許を受けても構いませんよね?
199
+ A. 誰の作ったものだろうと、それは無理です。その技術は著作者が既に一
200
+ 般に公開しているため、日本で言えば特29
201
+ <http://www.houko.com/00/01/S34/121.HTM#s2>「三 特許出願前に日本
202
+ 国内又は外国において、頒布された刊行物に記載された発明又は電気通
203
+ 信回線を通じて公衆に利用可能となつた発明」に該当しますので。残念
204
+ でした。
205
+
206
+ Q. 自分の作ったものということで、そのプログラムに対して著作権を主張
207
+ してもいいですか?
208
+ A. あなたが、例えば Noah
209
+ <http://www.vector.co.jp/soft/win95/util/se106079.html>をご自分
210
+ で改良したプログラムについて述べているのなら、その著作権はあなた
211
+ に帰属します。しかし、例えば今私がこのサイトで公開している Noah
212
+ そのものについて言うならば、ダメです。
213
+
214
+ まず現実問題として、実際にあなたが作ったのではない以上、あなたに
215
+ は著作権は発生しません。それにも関わらずあなたが著作権を主張する
216
+ ためには、元の権利者である私からの著作権の譲渡という手続きを踏む
217
+ 必要があります。しかし、C. に書いたように、私は既に著作権を放棄
218
+ しています。ゆえに、あなたに譲渡することも出来ません。
219
+ ∴あなたは著作権を主張できません。
220
+
221
+ 「それでは自分の作ったものと同様に自由、とは言えないではないか?」
222
+ という意見もあるかと思います。しかしお待ち下さい。あくまで同様に
223
+ 自由に「利用できる」のです。プログラムを実行するのも、ソースを切っ
224
+ たり貼ったりして他のソースと組み合わせて使うのも、「利用」です。
225
+ しかし、それに対して権利を主張するというのは「利用」とは言えませ
226
+ ん。
227
+
228
+ Q. NYSLと著作権に関してもうちょい詳しく。
229
+ A. 例えばNoahのexeをそのまま持っていって、作者名とソフト名だけ付け
230
+ 替えて Haon というソフトとして公開し、それに対し著作権を主張する、
231
+ という行為は禁止されません。他のライセンスでは禁止されていること
232
+ が多いですし、法律的にも NYSL のこの主張は通らないかもしれない
233
+ (未調査)のですが、少なくともNYSLとしては、この行為を禁じません。
234
+
235
+ 一つ上の A. との違いは何でしょう?それは、上では「Haonに関する著
236
+ 作権」ではなく「Noahに関する著作権」は主張できないことを証明して
237
+ いる点です。Haon に関する著作権を持っていたとしても、別の著作物
238
+ である Noah の頒布を制限したり、 Noahの翻案を禁じたりすることは
239
+ できません。NYSLの下では逆もまた真です。つまり、 Haonの著作権と
240
+ Noahの著作権は全く異なる別個の権利です。
241
+
242
+ HaonとNoahが同じ内容を持っている、ということはここでは無関係です。
243
+ 依拠のない同一の著作物
244
+ <http://www.netlaw.co.jp/booklet_2/9.html#96> がそれぞれ別個に著
245
+ 作権法の保護を受けることができるのと同様ですね。
246
+
247
+ * さらに抽象的な話
248
+ Q. なぜ「フリーウェア」や「Everyones'Ware」という言葉を使うのですか?
249
+ (「フリーソフトウェア」や「オープンソース(TM)ソフトウェア」では
250
+ ないのですか?)
251
+
252
+ A. 私が確認した限りではNYSLは「フリーソフトウェア」の定義にも「オー
253
+ プンソース(TM)」の定義にも合致していますので、機械的にそう呼ぶこ
254
+ とには、問題はありません。
255
+
256
+ ですが、例えばGPLのようにCopyleftな、私にとって 自由でない ライ
257
+ センスを許してしまう「フリーソフトウェア」の定義にはバグがあると
258
+ 考え、この用語は使用していません。「オープンソース(TM)」の定義に
259
+ は特に問題を感じているわけではありませんが、この定義は「ソース
260
+ コードが公けになっている」よりはかなり強い意味を持っていて、その
261
+ 定義の意味の言葉を使いたいことが一度もなかったので、この単語は使
262
+ 用していません。
263
+
264
+ 「フリーウェア」という言葉は厳密な定義はなされていませんが、
265
+ 「無料(Free)で使用してよいソフト」と解釈されることが一般的なため、
266
+ その意味で用いています。
267
+
268
+ Q. このFAQの法的な意味は?
269
+ A. このFAQの内容は、NYSLライセンスの一部ではありません。従って、仮に
270
+ NYSLの内容とこのFAQの内容とが矛盾していたとしても、利用条件として
271
+ 適用されるのは、あくまで NYSLの方です。(つまり、"このFAQではダメ
272
+ と書かれているけれど、NYSLを厳密に解釈すると実はその行為はやって
273
+ も大丈夫" という抜け穴を発見した方は、 NYSLに違反することなくその
274
+ 行為を実行することができます。)
275
+
276
+ ですが、このFAQはNYSLの文面と日本国の法律から導出可能な内容につい
277
+ て述べているので、理論上はそのような矛盾はないと思われます。
278
+
279
+ * ところで
280
+ Q. NYSLって何の略ですか?
281
+ A. 煮るなり焼くなり好きにしろライセンス。
@@ -0,0 +1,44 @@
1
+ # encoding: us-ascii
2
+ require 'rubygems'
3
+ require 'rake/gempackagetask'
4
+ require 'spec/rake/spectask'
5
+
6
+ RARG_VERSION = '0.1'
7
+ SRCS = FileList['lib/*', 'spec/*', '*.rb', '*.txt']
8
+
9
+ task :default => :package
10
+
11
+ spec = Gem::Specification.new do |s|
12
+ s.platform = Gem::Platform::RUBY
13
+ s.summary = "Small library for validating a Hash as named arguments"
14
+ s.author = 'Dice'
15
+ s.email = 'tetradice.1011@gmail.com'
16
+ s.homepage = 'http://rubyforge.org/projects/rarg/'
17
+ s.name = 'rarg'
18
+ s.rubyforge_project = 'rarg'
19
+ s.version = '0.1'
20
+ s.files = SRCS
21
+ s.description = <<EOF
22
+ RArg is simple and small library for validating a Hash as named arguments (keyword arguments).
23
+ It has three functions, requiring arguments, setting default arguments, and aliasing argument name.
24
+ EOF
25
+ end
26
+
27
+ Rake::GemPackageTask.new(spec) do |pkg|
28
+ end
29
+
30
+ task :package => "rarg-#{RARG_VERSION}.zip"
31
+
32
+ task :repackage => [:clobber, :package]
33
+
34
+ file "rarg-#{RARG_VERSION}.zip" => SRCS do |task|
35
+ src_list = SRCS.to_a.map{|x| %Q|"#{x}"|}.join(' ')
36
+ sh "zip #{task.name} #{src_list}"
37
+ end
38
+
39
+
40
+ Spec::Rake::SpecTask.new do |tasklib|
41
+ tasklib.libs << ['./lib']
42
+ tasklib.spec_files = FileList['spec/*.rb']
43
+ tasklib.ruby_opts = %w(-Ku)
44
+ end
@@ -0,0 +1,50 @@
1
+ RArg - utility for validating named arguments
2
+
3
+ Version: 0.1 (2009-01-31)
4
+ Author: Dice <tetradice.1011@gmail.com>
5
+ License: NYSL 0.9982 <http://www.kmonos.net/nysl/>
6
+ (this license is like Public Domain)
7
+
8
+
9
+ Summary
10
+ =======
11
+ RArg is simple and small library for validating a Hash as named arguments
12
+ (keyword arguments). It has three functions, requiring arguments, setting
13
+ default arguments, and aliasing argument name.
14
+
15
+
16
+ Auto Installing
17
+ ===============
18
+ % ruby setup.rb
19
+
20
+
21
+ Example
22
+ =======
23
+ require 'rarg'
24
+
25
+ class Foo
26
+ attr_reader :r1, :r2, :d1
27
+
28
+ def initialize(options = {})
29
+ re = RArg.parse(options) do
30
+ require_arg :r1, :r2
31
+ default_arg :d1, 0
32
+ alias_arg :a1, :r1
33
+ end
34
+
35
+ @r1, @r2, @d1 = re[:r1], re[:r2], re[:d1]
36
+ end
37
+ end
38
+
39
+ Foo.new({}) # Exception: argument of 'r1' is required, but missing (RArg::Error)
40
+ Foo.new({:r1 => nil}) # Exception: argument of 'r2' is required, but missing (RArg::Error)
41
+ Foo.new({:r1 => nil, :r2 => 10, :nd => 20}) # Exception: 'nd' is not defined (RArg::Error)
42
+ Foo.new({:r1 => nil, :r2 => 10}) # No Exception
43
+
44
+ foo = Foo.new({:r1 => 'R1', :r2 => 'R2'})
45
+ p foo.r2 #=> 'R2'
46
+ p foo.d1 #=> 0 (default)
47
+
48
+ foo = Foo.new({:a1 => 'R1', :r2 => nil, :d1 => 'D1'})
49
+ p foo.d1 #=> 'D1' (overwritten)
50
+ p foo.r1 #=> 'R1' (alias definition: r1 => a1)