kwatable 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +46 -0
- data/MIT-LICENSE +20 -0
- data/README.txt +4 -2
- data/bin/kwatable +4 -4
- data/examples/ex1/Makefile +40 -14
- data/examples/ex1/{example1.yaml → tabledef.yaml} +42 -11
- data/examples/ex2/Makefile +41 -14
- data/examples/ex2/{example2.yaml → tabledef.yaml} +45 -30
- data/examples/ex3/Makefile +52 -0
- data/examples/ex3/tabledef.yaml +136 -0
- data/kwatable.gemspec +11 -10
- data/lib/kwatable.rb +24 -18
- data/lib/kwatable/kwatable.schema.yaml +95 -5
- data/lib/kwatable/main.rb +331 -0
- data/lib/kwatable/manipulator.rb +320 -192
- data/lib/kwatable/messages.rb +59 -0
- data/lib/kwatable/template/ddl-mysql.eruby +202 -0
- data/lib/kwatable/{templates → template}/ddl-postgresql.eruby +71 -45
- data/lib/kwatable/{templates → template}/defaults.yaml +2 -2
- data/lib/kwatable/template/dictionary.en.yaml +70 -0
- data/lib/kwatable/template/dictionary.ja.yaml +165 -0
- data/lib/kwatable/template/dto-java.eruby +77 -0
- data/lib/kwatable/template/dto-java.sub.eruby +259 -0
- data/lib/kwatable/template/dto-ruby.eruby +63 -0
- data/lib/kwatable/template/dto-ruby.sub.eruby +213 -0
- data/lib/kwatable/template/helper/column.rb +70 -0
- data/lib/kwatable/template/helper/common.rb +151 -0
- data/lib/kwatable/template/helper/java.rb +83 -0
- data/lib/kwatable/template/helper/label.rb +90 -0
- data/lib/kwatable/template/helper/ruby.rb +36 -0
- data/lib/kwatable/template/helper/table.rb +62 -0
- data/lib/kwatable/template/hibernate.eruby +139 -0
- data/lib/kwatable/template/rails-controller.eruby +66 -0
- data/lib/kwatable/template/rails-controller.sub.eruby +114 -0
- data/lib/kwatable/template/rails-kwartz.eruby +164 -0
- data/lib/kwatable/template/rails-kwartz/_attr.plogic.eruby +56 -0
- data/lib/kwatable/template/rails-kwartz/_form.plogic.eruby +81 -0
- data/lib/kwatable/template/rails-kwartz/_link.plogic.eruby +36 -0
- data/lib/kwatable/template/rails-kwartz/edit.cfg.yaml.eruby +16 -0
- data/lib/kwatable/template/rails-kwartz/edit.html.eruby +46 -0
- data/lib/kwatable/template/rails-kwartz/edit.plogic.eruby +20 -0
- data/lib/kwatable/template/rails-kwartz/layout.html.eruby +39 -0
- data/lib/kwatable/template/rails-kwartz/layout.plogic.eruby +32 -0
- data/lib/kwatable/template/rails-kwartz/list.html.eruby +94 -0
- data/lib/kwatable/template/rails-kwartz/list.plogic.eruby +41 -0
- data/lib/kwatable/template/rails-kwartz/new.html.eruby +100 -0
- data/lib/kwatable/template/rails-kwartz/new.plogic.eruby +26 -0
- data/lib/kwatable/template/rails-kwartz/show.html.eruby +51 -0
- data/lib/kwatable/template/rails-kwartz/show.plogic.eruby +9 -0
- data/lib/kwatable/template/rails-model.eruby +35 -0
- data/lib/kwatable/template/rails-model.sub.eruby +136 -0
- data/lib/kwatable/{templates → template}/validator-ruby.eruby +18 -11
- data/lib/kwatable/util.rb +133 -0
- data/lib/kwatable/util/assert-text-equal.rb +47 -0
- data/lib/kwatable/util/assertion.rb +115 -0
- data/lib/kwatable/validator.rb +50 -0
- data/test/assert-diff.rb +1 -1
- data/test/test-ex.rb +306 -0
- data/test/test.rb +37 -127
- metadata +66 -17
- data/COPYING +0 -340
- data/ChangeLog.txt +0 -65
- data/lib/kwatable/error-msg.rb +0 -38
- data/lib/kwatable/main-program.rb +0 -216
- data/lib/kwatable/templates/ddl-mysql.eruby +0 -172
- data/lib/kwatable/templates/dto-java.eruby +0 -260
- data/lib/kwatable/templates/dto-ruby.eruby +0 -185
@@ -0,0 +1,35 @@
|
|
1
|
+
<%
|
2
|
+
|
3
|
+
##
|
4
|
+
## kwatable template to generate Rails model class
|
5
|
+
##
|
6
|
+
## $Rev$
|
7
|
+
## $Release: 0.3.0 $
|
8
|
+
## copyright(c) 2005 kuwata-lab.com all rights reserved.
|
9
|
+
##
|
10
|
+
## <template-desc>generate Rails model classes</template-desc>
|
11
|
+
## <template-properties>
|
12
|
+
## --lang=lang : language (ex. --lang=ja)
|
13
|
+
## --backup[=.bkup] : create backup file when updating
|
14
|
+
## --encoding=encoding : encoding (ex. --encoding=UTF8)
|
15
|
+
## </template-properties>
|
16
|
+
##
|
17
|
+
|
18
|
+
|
19
|
+
require 'kwatable/template/helper/common'
|
20
|
+
require 'kwatable/template/helper/table'
|
21
|
+
require 'kwatable/template/helper/column'
|
22
|
+
require 'kwatable/template/helper/label'
|
23
|
+
extend Kwatable::CommonHelper
|
24
|
+
extend Kwatable::TableHelper
|
25
|
+
extend Kwatable::ColumnHelper
|
26
|
+
extend Kwatable::LabelHelper
|
27
|
+
|
28
|
+
|
29
|
+
@output_files = apply_subtemplate_for_each_tables(@tables) { |table|
|
30
|
+
output_filename = table_model(table) + '.rb'
|
31
|
+
output_filename
|
32
|
+
}
|
33
|
+
|
34
|
+
|
35
|
+
%>
|
@@ -0,0 +1,136 @@
|
|
1
|
+
<%
|
2
|
+
|
3
|
+
##
|
4
|
+
## $Rev$
|
5
|
+
## $Release: 0.3.0 $
|
6
|
+
## copyright(c) 2005 kuwata-lab.com all rights reserved.
|
7
|
+
##
|
8
|
+
|
9
|
+
##
|
10
|
+
def relation_options(hash)
|
11
|
+
list = hash.collect { |key, val|
|
12
|
+
k = Inflector.underscore(key)
|
13
|
+
v = val.inspect
|
14
|
+
case k
|
15
|
+
when 'kind' ; nil
|
16
|
+
when 'desc' ; nil
|
17
|
+
when 'table' ; nil
|
18
|
+
when 'columns' ; nil
|
19
|
+
when 'where' ; ":conditions=>#{v}"
|
20
|
+
when 'orderby' ; ":order=>#{v}"
|
21
|
+
#when 'as' ; ":#{k}=>#{v}"
|
22
|
+
#when 'through' ; ":#{k}=>#{v}"
|
23
|
+
#when 'source' ; ":#{k}=>#{v}"
|
24
|
+
else ; ":#{k}=>#{v}"
|
25
|
+
end
|
26
|
+
}.compact()
|
27
|
+
return list
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
## generate model class
|
32
|
+
def generate_model_rb(table, user_code=nil)
|
33
|
+
controller_name = table['name']
|
34
|
+
class_name = table_class(table)
|
35
|
+
desc = (table['desc'] || '').gsub(/^/, '## ').chomp
|
36
|
+
# class start
|
37
|
+
s = ''
|
38
|
+
s << "#{desc}\n"
|
39
|
+
s << "class #{class_name} < ActiveRecord::Base\n"
|
40
|
+
# table name
|
41
|
+
if Inflector.pluralize(table_model(table)) != table['name']
|
42
|
+
s << " set_table_name '#{table['name']}'\n"
|
43
|
+
end
|
44
|
+
# primary key
|
45
|
+
ident_column = table['ident-columns'].first
|
46
|
+
if ident_column['name'] != 'id'
|
47
|
+
s << " set_primary_key '#{ident_column['name']}'\n"
|
48
|
+
end
|
49
|
+
# has_many, has_one
|
50
|
+
relmethods = { '1:1'=>'has_one', '1:n'=>'has_many', 'n:n'=>'has_and_belongs_to_many' }
|
51
|
+
for relation in table['relations']
|
52
|
+
relmethod = relmethods[relation['kind']]
|
53
|
+
relmodel = table_model(relation['table'])
|
54
|
+
relcolname = column_name(relation['columns'].first)
|
55
|
+
relopts = ''
|
56
|
+
relopts << ", :foreign_key=>'#{relcolname}'" if relcolname != "#{table_model(table)}_id"
|
57
|
+
relopts << ", :join_table=>'#{relation['join-table']['name']}'" if relation['join-table']
|
58
|
+
relopts << ", :conditions=>#{relation['where'].inspect}" if relation['where']
|
59
|
+
relopts << ", :order=>'#{relation['order-by']}'" if relation['order-by']
|
60
|
+
relopts << ", :group=>'#{relation['group-by']}'" if relation['group-by']
|
61
|
+
for key in ['as', 'through', 'source']
|
62
|
+
relopts << ", :#{key}=>#{relation[key].inspect}" if relation[key]
|
63
|
+
end
|
64
|
+
if relation['vendor'] && relation['vendor']['rails-model']
|
65
|
+
for param in relation['vendor']['rails-model']
|
66
|
+
key, value = param
|
67
|
+
key.gsub!(/-/, '_')
|
68
|
+
relopts << ", :#{key}=>#{value.inspect}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
s << " #{relmethod} :#{relmodel}#{relopts}\n"
|
72
|
+
end if table['relations']
|
73
|
+
# belongs_to
|
74
|
+
columns = table['columns']
|
75
|
+
for column in columns
|
76
|
+
if column['ref']
|
77
|
+
ref_name = column_refname(column)
|
78
|
+
s << " belongs_to :#{ref_name}"
|
79
|
+
ref_model_name = table_model(column['ref']['table'])
|
80
|
+
ref_class_name = table_class(column['ref']['table'])
|
81
|
+
s << ", :class_name=>'#{ref_class_name}'" if ref_name != ref_model_name
|
82
|
+
ref_attr = column_attr(column['ref'])
|
83
|
+
foreign_key = "#{ref_model_name}_#{ref_attr}"
|
84
|
+
s << ", :foreign_key=>'#{column_attr(column)}'" if column['name'] != foreign_key
|
85
|
+
s << "\n"
|
86
|
+
end
|
87
|
+
end if columns
|
88
|
+
# alias
|
89
|
+
for column in columns
|
90
|
+
if column_attr(column) != column['name']
|
91
|
+
#s << " alias #{column_attr(column)} #{column['name']}\n"
|
92
|
+
s << " def #{column_attr(column)}; #{column['name']}; end\n"
|
93
|
+
s << " def #{column_attr(column)}=(_val); #{column['name']}=(_val); end\n"
|
94
|
+
end
|
95
|
+
end if columns
|
96
|
+
# validator
|
97
|
+
for column in columns
|
98
|
+
next if !column_editable?(column)
|
99
|
+
colname = column_name(column)
|
100
|
+
if column['required']
|
101
|
+
s << " validates_presence_of :#{colname}\n"
|
102
|
+
end
|
103
|
+
if %w[int integer float double money].include?(column['type'])
|
104
|
+
s << " validates_numericality_of :#{colname}\n" unless column['ref']
|
105
|
+
end
|
106
|
+
if column['unique'] || (column['ident'] && colname != 'id')
|
107
|
+
s << " validates_uniqueness_of :#{colname}\n"
|
108
|
+
end
|
109
|
+
if column['pattern']
|
110
|
+
s << " validates_format_of :#{colname}, :with=>#{column['pattern']}\n"
|
111
|
+
end
|
112
|
+
if column['length']
|
113
|
+
h = column['length']
|
114
|
+
s << " validates_length_of :#{colname}"
|
115
|
+
s << ", :maximum=>#{h['max']}" if h['max']
|
116
|
+
s << ", :minimum=>#{h['min']}" if h['min']
|
117
|
+
s << "\n"
|
118
|
+
end
|
119
|
+
end if columns
|
120
|
+
s << "\n"
|
121
|
+
# user-code
|
122
|
+
if user_code
|
123
|
+
s << user_code
|
124
|
+
else
|
125
|
+
s << " ## <user-custom-code>\n"
|
126
|
+
s << " ## ... put user custom code here\n"
|
127
|
+
s << " ## </user-custom-code>\n"
|
128
|
+
end
|
129
|
+
s << "\n"
|
130
|
+
#
|
131
|
+
s << "end\n"
|
132
|
+
return s
|
133
|
+
end
|
134
|
+
|
135
|
+
%>
|
136
|
+
<%= generate_model_rb(@table, @user_custom_code) %>
|
@@ -3,20 +3,27 @@
|
|
3
3
|
##
|
4
4
|
## kwatable template file for Ruby Validator
|
5
5
|
##
|
6
|
+
## $Rev: 32 $
|
7
|
+
## $Release: 0.3.0 $
|
6
8
|
## copyright(c) 2005 kuwata-lab.com all rights reserved.
|
7
|
-
## $Release: 0.2.0 $
|
8
|
-
## $Rev$
|
9
9
|
##
|
10
|
-
## template
|
11
|
-
##
|
10
|
+
## <template-desc>generate validator class for Ruby</template-desc>
|
11
|
+
## <template-properties>
|
12
|
+
## --module=name : module/class name
|
13
|
+
## </template-properties>
|
12
14
|
##
|
13
15
|
|
16
|
+
require 'kwatable/template/helper/common'
|
17
|
+
extend Kwatable::CommonHelper
|
18
|
+
|
19
|
+
|
14
20
|
#
|
15
|
-
# context
|
21
|
+
# context check
|
16
22
|
#
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
context_var_required('@tables')
|
24
|
+
#@tables or raise "don't use '-m' option with '%'." % File.basename(@template_filename)
|
25
|
+
|
26
|
+
|
20
27
|
#
|
21
28
|
# constraint keys
|
22
29
|
#
|
@@ -29,12 +36,12 @@
|
|
29
36
|
## at <%= Time.now.to_s %>
|
30
37
|
|
31
38
|
##
|
32
|
-
<% if properties[:module] %>
|
39
|
+
<% if @properties[:module] %>
|
33
40
|
|
34
|
-
module <%= properties[:module] %>
|
41
|
+
module <%= @properties[:module] %>
|
35
42
|
|
36
43
|
<% end %>
|
37
|
-
<% for table in tables %>
|
44
|
+
<% for table in @tables %>
|
38
45
|
|
39
46
|
## <%= table['name'] %> - <%= table['desc'] %>
|
40
47
|
|
@@ -0,0 +1,133 @@
|
|
1
|
+
###
|
2
|
+
### $Rev: 43 $
|
3
|
+
### $Release: 0.3.0 $
|
4
|
+
### copyright(c) 2005 kuwata-lab.com all rights reserved.
|
5
|
+
###
|
6
|
+
|
7
|
+
module Kwatable
|
8
|
+
|
9
|
+
|
10
|
+
module Util
|
11
|
+
|
12
|
+
|
13
|
+
module_function
|
14
|
+
|
15
|
+
|
16
|
+
##
|
17
|
+
## expand tab characters into spaces
|
18
|
+
##
|
19
|
+
def untabify(str, width=8)
|
20
|
+
list = str.split(/\t/)
|
21
|
+
last = list.pop
|
22
|
+
sb = ''
|
23
|
+
list.each do |s|
|
24
|
+
column = (n = s.rindex(?\n)) ? s.length - n - 1 : s.length
|
25
|
+
n = width - (column % width)
|
26
|
+
sb << s << (" " * n)
|
27
|
+
end
|
28
|
+
sb << last
|
29
|
+
return sb
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
##
|
34
|
+
## find file from path_list
|
35
|
+
##
|
36
|
+
def find_file(filename, path_list, find_in_currdir=true, test_char=?f)
|
37
|
+
ch = test_char
|
38
|
+
return filename if find_in_currdir && test(ch, filename)
|
39
|
+
#return nil if filename[0] == ?/ # absolute path
|
40
|
+
fname = nil
|
41
|
+
found = path_list.find { |path| test(ch, fname = "#{path}/#{filename}") }
|
42
|
+
return found ? fname : nil
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
##
|
47
|
+
## evaluate template with context object
|
48
|
+
##
|
49
|
+
def eval_template(template_filename, context, template=nil)
|
50
|
+
template ||= File.read(template_filename)
|
51
|
+
trim_mode = 1
|
52
|
+
erb = ERB.new(template, nil, trim_mode)
|
53
|
+
return context.instance_eval(erb.src, template_filename)
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
##
|
58
|
+
## encode string
|
59
|
+
##
|
60
|
+
def encode(str, encoding)
|
61
|
+
require 'kconv'
|
62
|
+
out_code = case encoding
|
63
|
+
when /\Aeuc-jp\z/i ; Kconv::EUC
|
64
|
+
when /\As(hift[-_])?jis\z/i ; Kconv::SJIS
|
65
|
+
when /\Autf8\z/i ; Kconv::UTF8
|
66
|
+
when /\Autf16\z/i ; Kconv::UTF16
|
67
|
+
when /\Aiso-2022-jp\z/i ; Kconv::JIS
|
68
|
+
else ; nil
|
69
|
+
end
|
70
|
+
return Kconv.kconv(str, out_code)
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
##
|
75
|
+
## parse command-line options
|
76
|
+
##
|
77
|
+
## ex.
|
78
|
+
## argv = %w[-hqu user -p passwd --help --name=val file1 file2]
|
79
|
+
## options, properties, filenames = Util.parse_argv(argv, "hvq", "upl")
|
80
|
+
## p options #=> { ?h=>true, ?q=>true, ?u=>"user", ?p=>"passwd" }
|
81
|
+
## p properties #=> { :help=>true, :name=>"val" }
|
82
|
+
## p filenames #=> [ "file1", "file2" ]
|
83
|
+
##
|
84
|
+
def parse_argv(argv, single_opts='', arged_opts='', optional_opts='')
|
85
|
+
options = {}
|
86
|
+
properties = {}
|
87
|
+
while argv[0] && argv[0][0] == ?-
|
88
|
+
optstr = argv.shift
|
89
|
+
if optstr == '-'
|
90
|
+
break
|
91
|
+
elsif optstr =~ /\A--([-\w]+)(?:=(.*))?/ # properties
|
92
|
+
key, value = $1, $2
|
93
|
+
case value
|
94
|
+
when nil ; value = true
|
95
|
+
when "true", "yes" ; value = true
|
96
|
+
when "false", "no" ; value = false
|
97
|
+
when "null", "nil" ; value = nil
|
98
|
+
when /\A\d+\z/ ; value = value.to_i
|
99
|
+
when /\A\d+\.\d+\z/ ; value = value.to_f
|
100
|
+
when /\A'.*'\z/ ; value = eval(value)
|
101
|
+
when /\A".*"\z/ ; value = eval(value)
|
102
|
+
end
|
103
|
+
properties[key.gsub(/-/, '_').intern] = value
|
104
|
+
else # options
|
105
|
+
optstr = optstr.slice(1..-1)
|
106
|
+
while optstr && !optstr.empty?
|
107
|
+
optchar = optstr[0]
|
108
|
+
optstr = optstr.slice(1..-1)
|
109
|
+
if single_opts && single_opts.include?(optchar)
|
110
|
+
options[optchar] = true
|
111
|
+
elsif arged_opts && arged_opts.include?(optchar)
|
112
|
+
arg = optstr.empty? ? argv.shift : optstr
|
113
|
+
optstr = nil
|
114
|
+
raise "-#{optchar.chr}: argument required." unless arg
|
115
|
+
options[optchar] = arg
|
116
|
+
elsif optional_opts && optional_opts.include?(optchar)
|
117
|
+
arg = optstr.empty? ? true : optstr
|
118
|
+
optstr = nil
|
119
|
+
options[optchar] = arg
|
120
|
+
else
|
121
|
+
raise "-#{optchar.chr}: unknown option."
|
122
|
+
end
|
123
|
+
end #while
|
124
|
+
end #if
|
125
|
+
end #while
|
126
|
+
filenames = argv
|
127
|
+
return options, properties, filenames
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
###
|
2
|
+
### $Rev: 36 $
|
3
|
+
### $Release: 0.3.0 $
|
4
|
+
### copyright(c) 2005 kuwata-lab.com all rights reserved.
|
5
|
+
###
|
6
|
+
|
7
|
+
require 'test/unit/testcase'
|
8
|
+
require 'tempfile'
|
9
|
+
|
10
|
+
|
11
|
+
class Test::Unit::TestCase # :nodoc:
|
12
|
+
|
13
|
+
|
14
|
+
def assert_text_equal(expected, actual, message=nil, options={}) # :nodoc:
|
15
|
+
diffopt = options[:diffopt] || '-u'
|
16
|
+
flag_cut = options.key?(:cut) ? options[:key] : true
|
17
|
+
prefix = options[:prefix] || ''
|
18
|
+
#prefix = prefix + "\n" if !prefix.empty? && prefix[-1] != ?\n
|
19
|
+
|
20
|
+
if expected == actual
|
21
|
+
assert(true)
|
22
|
+
return
|
23
|
+
end
|
24
|
+
if expected[-1] != ?\n || actual[-1] != ?\n
|
25
|
+
expected += "\n"
|
26
|
+
actual += "\n"
|
27
|
+
end
|
28
|
+
begin
|
29
|
+
expfile = Tempfile.new(".expected.")
|
30
|
+
expfile.write(expected); expfile.flush()
|
31
|
+
actfile = Tempfile.new(".actual.")
|
32
|
+
actfile.write(actual); actfile.flush()
|
33
|
+
diff = `diff #{diffopt} #{expfile.path} #{actfile.path}`
|
34
|
+
ensure
|
35
|
+
expfile.close(true) if expfile
|
36
|
+
actfile.close(true) if actfile
|
37
|
+
end
|
38
|
+
diff.sub!(/\A.*\n.*\n/, '') if flag_cut # cut 1st & 2nd lines
|
39
|
+
msg = prefix + (message || diff)
|
40
|
+
assert_block(msg) { false } # or assert(false, msg)
|
41
|
+
end
|
42
|
+
|
43
|
+
alias assert_equal_with_diff assert_text_equal # for compatibility
|
44
|
+
alias assert_text_equals assert_text_equal # for typo
|
45
|
+
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
###
|
2
|
+
### $Rev: 33 $
|
3
|
+
### $Release: 0.3.0 $
|
4
|
+
### copyright(c) 2005 kuwata-lab.com all rights reserved.
|
5
|
+
###
|
6
|
+
|
7
|
+
##
|
8
|
+
## utility module for assertion
|
9
|
+
##
|
10
|
+
## ex.
|
11
|
+
## require 'assertion'
|
12
|
+
## include Assertion # or extend Assertion
|
13
|
+
## assert s && !s.empty?
|
14
|
+
## assert! unless s && !s.empty?
|
15
|
+
##
|
16
|
+
module Assertion
|
17
|
+
|
18
|
+
|
19
|
+
##
|
20
|
+
## assertion error class
|
21
|
+
##
|
22
|
+
class AssertionError < StandardError
|
23
|
+
|
24
|
+
def initialize(message='')
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
alias _to_s to_s
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
#s = super
|
32
|
+
s = _to_s()
|
33
|
+
return "*** assertion error: #{s}"
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
##
|
40
|
+
## assertion error class
|
41
|
+
##
|
42
|
+
class UnreachableError < AssertionError
|
43
|
+
|
44
|
+
def to_s
|
45
|
+
s = _to_s()
|
46
|
+
return "*** unreachable error: #{s}"
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
module_function
|
53
|
+
|
54
|
+
|
55
|
+
##
|
56
|
+
## raise AssertionError if condition is false
|
57
|
+
##
|
58
|
+
## ex.
|
59
|
+
## assert s && !s.empty?, "s=#{s.inspect}"
|
60
|
+
##
|
61
|
+
def assert(condition, message='')
|
62
|
+
_raise_error(AssertionError, message, caller()) unless condition
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
##
|
67
|
+
## raise AssertionError
|
68
|
+
##
|
69
|
+
## ex.
|
70
|
+
## assert! "s=#{s.inspect}" unless s && !s.empty?
|
71
|
+
##
|
72
|
+
def assert! (message='')
|
73
|
+
_raise_error(AssertionError, message, caller())
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
##
|
78
|
+
## raise UnreachableError
|
79
|
+
##
|
80
|
+
## ex.
|
81
|
+
## case value
|
82
|
+
## when true
|
83
|
+
## ...
|
84
|
+
## when false
|
85
|
+
## ...
|
86
|
+
## else
|
87
|
+
## unreachable
|
88
|
+
## end
|
89
|
+
##
|
90
|
+
def unreachable(message='')
|
91
|
+
_raise_error(UnreachableError, message, caller())
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
|
98
|
+
def _raise_error(error_class, message, caller_obj)
|
99
|
+
error = error_class.new(message)
|
100
|
+
error.set_backtrace(caller_obj)
|
101
|
+
raise error
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
if $0 == __FILE__
|
109
|
+
include Assertion
|
110
|
+
case ARGV.shift
|
111
|
+
when 'assert' ; assert false, ARGV.join(' ')
|
112
|
+
when 'unreachable' ; unreachable ARGV.join(' ')
|
113
|
+
else ; assert! ARGV.join(' ')
|
114
|
+
end
|
115
|
+
end
|