kwatable 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.txt +15 -3
- data/README.txt +1 -1
- data/bin/kwatable +3 -9
- data/examples/ex1/Makefile +18 -26
- data/examples/ex1/example1.yaml +9 -6
- data/examples/ex2/Makefile +15 -24
- data/kwatable.gemspec +2 -2
- data/lib/kwatable.rb +1 -1
- data/lib/kwatable/error-msg.rb +1 -1
- data/lib/kwatable/kwatable.schema.yaml +12 -2
- data/lib/kwatable/main-program.rb +18 -7
- data/lib/kwatable/manipulator.rb +3 -3
- data/lib/kwatable/templates/ddl-mysql.eruby +1 -1
- data/lib/kwatable/templates/ddl-postgresql.eruby +3 -3
- data/lib/kwatable/templates/defaults.yaml +1 -1
- data/lib/kwatable/templates/dto-java.eruby +75 -9
- data/lib/kwatable/templates/dto-ruby.eruby +27 -15
- data/lib/kwatable/templates/validator-ruby.eruby +97 -0
- data/test/assert-diff.rb +1 -1
- data/test/test.rb +80 -151
- metadata +4 -25
- data/test/test1/test1.ddl-mysql.expected +0 -23
- data/test/test1/test1.ddl-postgresql.expected +0 -23
- data/test/test1/test1.dto-java.Group.expected +0 -35
- data/test/test1/test1.dto-java.User.expected +0 -57
- data/test/test1/test1.dto-ruby.Group.expected +0 -20
- data/test/test1/test1.dto-ruby.User.expected +0 -33
- data/test/test1/test1.yaml +0 -96
- data/test/test2/test2.ddl-mysql.expected +0 -49
- data/test/test2/test2.ddl-postgresql.expected +0 -49
- data/test/test2/test2.dto-java.Address.expected +0 -40
- data/test/test2/test2.dto-java.Customer.expected +0 -47
- data/test/test2/test2.dto-java.Item.expected +0 -35
- data/test/test2/test2.dto-java.SalesOrder.expected +0 -48
- data/test/test2/test2.dto-java.SalesOrderLine.expected +0 -54
- data/test/test2/test2.dto-ruby.Address.expected +0 -22
- data/test/test2/test2.dto-ruby.Customer.expected +0 -29
- data/test/test2/test2.dto-ruby.Item.expected +0 -20
- data/test/test2/test2.dto-ruby.SalesOrder.expected +0 -29
- data/test/test2/test2.dto-ruby.SalesOrderLine.expected +0 -36
- data/test/test2/test2.yaml +0 -94
@@ -4,13 +4,14 @@
|
|
4
4
|
## kwatable template file for Ruby DTO class
|
5
5
|
##
|
6
6
|
## copyright(c) 2005 kuwata-lab.com all rights reserved.
|
7
|
-
## $Release: 0.
|
8
|
-
## $Rev:
|
7
|
+
## $Release: 0.2.0 $
|
8
|
+
## $Rev: 17 $
|
9
9
|
##
|
10
10
|
## template properties:
|
11
|
-
## module
|
12
|
-
## parent
|
13
|
-
## reqpath
|
11
|
+
## --module=name : module name
|
12
|
+
## --parent=name : parent class
|
13
|
+
## --reqpath=path : require path
|
14
|
+
## --symbolkey : use symbol as hash key
|
14
15
|
##
|
15
16
|
|
16
17
|
|
@@ -100,11 +101,15 @@
|
|
100
101
|
#
|
101
102
|
# require other dto file
|
102
103
|
#
|
104
|
+
refclass_table = {}
|
103
105
|
for column in table['columns']
|
104
106
|
if column['ref']
|
105
107
|
refclass = column['ref']['table']['class']
|
106
108
|
refclass ||= camel_case(column['ref']['table']['name'])
|
107
109
|
reqpath = properties[:reqpath]
|
110
|
+
next if refclass_table[refclass]
|
111
|
+
refclass_table[refclass] = true
|
112
|
+
|
108
113
|
%>
|
109
114
|
require '<%= reqpath %><%= reqpath ? '/' : '' %><%= refclass %>'
|
110
115
|
<%
|
@@ -118,31 +123,38 @@ require '<%= reqpath %><%= reqpath ? '/' : '' %><%= refclass %>'
|
|
118
123
|
#
|
119
124
|
mod = klass[:module] ? "#{klass[:module]}::" : ""
|
120
125
|
extends = klass[:parent] ? " < #{klass[:parent]}" : ""
|
126
|
+
|
121
127
|
%>
|
122
128
|
## <%= klass[:desc] %>
|
123
129
|
|
124
|
-
class <%= mod %><%= klass[:name]
|
130
|
+
class <%= mod %><%= klass[:name] %><%= extends %>
|
131
|
+
|
125
132
|
|
126
133
|
<%
|
127
134
|
#
|
128
|
-
#
|
135
|
+
# accessor
|
129
136
|
#
|
130
|
-
%>
|
131
|
-
def populate(values={})
|
137
|
+
%>
|
132
138
|
<% for var in variables %>
|
133
|
-
|
139
|
+
attr_accessor :<%= '%-14s' % var[:name] %> # <%= var[:desc] %>
|
140
|
+
|
134
141
|
<% end %>
|
135
|
-
end
|
136
142
|
|
137
143
|
<%
|
138
144
|
#
|
139
|
-
#
|
145
|
+
# set all values
|
140
146
|
#
|
141
|
-
|
147
|
+
%>
|
148
|
+
def populate(_hash={})
|
149
|
+
<% flag_symbol = properties[:keytype] == 'symbol' %>
|
142
150
|
<% for var in variables %>
|
143
|
-
|
144
|
-
|
151
|
+
<% if flag_symbol %>
|
152
|
+
@<%= "%-14s" % var[:name] %> = _hash[:<%= var[:name] %>]
|
153
|
+
<% else %>
|
154
|
+
@<%= "%-14s" % var[:name] %> = _hash['<%= var[:name] %>']
|
155
|
+
<% end %>
|
145
156
|
<% end %>
|
157
|
+
end
|
146
158
|
|
147
159
|
<%
|
148
160
|
#
|
@@ -0,0 +1,97 @@
|
|
1
|
+
<%
|
2
|
+
|
3
|
+
##
|
4
|
+
## kwatable template file for Ruby Validator
|
5
|
+
##
|
6
|
+
## copyright(c) 2005 kuwata-lab.com all rights reserved.
|
7
|
+
## $Release: 0.2.0 $
|
8
|
+
## $Rev$
|
9
|
+
##
|
10
|
+
## template properties:
|
11
|
+
## module - module/class name
|
12
|
+
##
|
13
|
+
|
14
|
+
#
|
15
|
+
# context variables
|
16
|
+
#
|
17
|
+
tables = context['tables']
|
18
|
+
properties = context['properties']
|
19
|
+
|
20
|
+
#
|
21
|
+
# constraint keys
|
22
|
+
#
|
23
|
+
constraint_keys = %w[required with max-length min-length enum pattern]
|
24
|
+
|
25
|
+
%>
|
26
|
+
##
|
27
|
+
## validator for Ruby
|
28
|
+
## generated by kwatable with template 'validator-ruby.eruby'
|
29
|
+
## at <%= Time.now.to_s %>
|
30
|
+
|
31
|
+
##
|
32
|
+
<% if properties[:module] %>
|
33
|
+
|
34
|
+
module <%= properties[:module] %>
|
35
|
+
|
36
|
+
<% end %>
|
37
|
+
<% for table in tables %>
|
38
|
+
|
39
|
+
## <%= table['name'] %> - <%= table['desc'] %>
|
40
|
+
|
41
|
+
def validate_<%= table['name'] %>(values)
|
42
|
+
errors = []
|
43
|
+
<% for column in table['columns'] %>
|
44
|
+
<% colname = column['name'] %>
|
45
|
+
<% has_constraints = ! (column.keys & constraint_keys).empty? %>
|
46
|
+
|
47
|
+
## <%= table['name'] %>.<%= column['name'] %>
|
48
|
+
|
49
|
+
<% next if column['serial'] || column['auto'] %>
|
50
|
+
<% if column['strip'] != false || has_constraints %>
|
51
|
+
val = values[:<%= colname %>]
|
52
|
+
<% end %>
|
53
|
+
<% if column['strip'] != false %>
|
54
|
+
val.strip! if val
|
55
|
+
<% end %>
|
56
|
+
<% next unless has_constraints %>
|
57
|
+
if val == nil || val.empty?
|
58
|
+
<% if column['required'] %>
|
59
|
+
errors << [:<%= colname %>, :required]
|
60
|
+
<% else %>
|
61
|
+
# nothing
|
62
|
+
<% end %>
|
63
|
+
<% if (column['max-length'] || column['width']) && !column['enum'] %>
|
64
|
+
elsif val.length > <%= column['max-length'] || column['width'] %>
|
65
|
+
|
66
|
+
errors << [:<%= colname %>, :max_length]
|
67
|
+
<% end %>
|
68
|
+
<% if column['min-length'] && !column['width'] %>
|
69
|
+
elsif val.length < <%= column['max-length'] %>
|
70
|
+
|
71
|
+
errors << [:<%= colname %>, :min_length]
|
72
|
+
<% end %>
|
73
|
+
<% if column['enum'] %>
|
74
|
+
<% enum = column['enum'].find_all { |e| e != nil } %>
|
75
|
+
<% if enum.length == 1 %>
|
76
|
+
elsif val != <%= enum.first.inspect %>
|
77
|
+
|
78
|
+
<% else %>
|
79
|
+
elsif ! <%= column['enum'].inspect %>.include?(val)
|
80
|
+
<% end %>
|
81
|
+
errors << [:<%= colname %>, :enum]
|
82
|
+
<% end %>
|
83
|
+
<% if pat = column['pattern'] %>
|
84
|
+
elsif val !~ <%= pat.is_a?(Regexp) ? pat.intern : pat %>
|
85
|
+
|
86
|
+
errors << [:<%= colname %>, :pattern]
|
87
|
+
<% end %>
|
88
|
+
end
|
89
|
+
<% end ## for column %>
|
90
|
+
|
91
|
+
return errors
|
92
|
+
end
|
93
|
+
<% end ## for table %>
|
94
|
+
<% if properties[:module] %>
|
95
|
+
|
96
|
+
end
|
97
|
+
<% end %>
|
data/test/assert-diff.rb
CHANGED
data/test/test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
###
|
2
2
|
### copyright(c) 2005 kuwata-lab.com all rights reserved.
|
3
|
-
### $Release: 0.
|
4
|
-
### $Rev:
|
3
|
+
### $Release: 0.2.0 $
|
4
|
+
### $Rev: 17 $
|
5
5
|
###
|
6
6
|
|
7
7
|
unless defined?(BASE_DIR)
|
@@ -11,7 +11,7 @@ unless defined?(BASE_DIR)
|
|
11
11
|
BIN_DIR = BASE_DIR + "/bin"
|
12
12
|
EXAMPLES_DIR = BASE_DIR + "/examples"
|
13
13
|
$LOAD_PATH << LIB_DIR << TEST_DIR
|
14
|
-
|
14
|
+
|
15
15
|
ENV['RUBYLIB'] = LIB_DIR
|
16
16
|
ENV['PATH'] = "#{BIN_DIR}:#{ENV['PATH']}"
|
17
17
|
#puts ENV['PATH']
|
@@ -29,181 +29,110 @@ require 'kwatable/main-program'
|
|
29
29
|
require 'assert-diff'
|
30
30
|
|
31
31
|
|
32
|
-
class KwatableExampleTest < Test::Unit::TestCase
|
33
|
-
|
34
|
-
def _test(options={})
|
35
|
-
optstr = "#{@option}"
|
36
|
-
if options[:multiple] # or if @classnames
|
37
|
-
outdir = prefix()
|
38
|
-
optstr << " -smd #{outdir}"
|
39
|
-
end
|
40
|
-
cmd = "kwatable -f #{@template} #{optstr} #{@datafile}"
|
41
|
-
#cmd = "kwatable -I #{BASE_DIR}/templates -f #{@template} #{optstr} #{@datafile}"
|
42
|
-
$logger.write("- command: #{cmd}\n thread: #{Thread.current.__id__}\n timestamp: #{Time.new.to_s}\n")
|
43
|
-
#actual = `#{cmd}`
|
44
|
-
argv = cmd.split(/\s+/)
|
45
|
-
argv.shift
|
46
|
-
main = Kwatable::MainProgram.new(argv)
|
47
|
-
actual = main.execute()
|
48
|
-
|
49
|
-
if @classnames
|
50
|
-
actuals = {}
|
51
|
-
@classnames.each do |classname|
|
52
|
-
actual = File.read(@output % classname)
|
53
|
-
File.unlink(@output % classname)
|
54
|
-
if options[:ignore_linenum]
|
55
|
-
actual = _ignore_line(actual, options[:ignore_linenum])
|
56
|
-
end
|
57
|
-
actuals[classname] = actual
|
58
|
-
File.open(@actual % classname, 'w') { |f| f.write(actual) }
|
59
|
-
end
|
60
|
-
@classnames.each do |classname|
|
61
|
-
actual = actuals[classname]
|
62
|
-
expected = File.read(@expected % classname)
|
63
|
-
assert_equal_with_diff(expected, actual)
|
64
|
-
end
|
65
|
-
else
|
66
|
-
if options[:ignore_linenum]
|
67
|
-
actual = _ignore_line(actual, options[:ignore_linenum])
|
68
|
-
end
|
69
|
-
File.open(@actual, 'w') { |f| f.write(actual) }
|
70
|
-
expected = File.open(@expected) { |f| f.read() }
|
71
|
-
assert_equal_with_diff(expected, actual)
|
72
|
-
end
|
73
|
-
end
|
74
32
|
|
75
|
-
|
76
|
-
raise NotImplementedError.new("#{self.class.name}#prefix() is not implemented.")
|
77
|
-
end
|
33
|
+
DATE_PATTERN = /^.*?at [\w ]+ \d\d:\d\d:\d\d [A-Z]{3} \d\d\d\d\s*$/
|
78
34
|
|
79
|
-
|
80
|
-
raise NotImplementedError.new("#{self.class.name}#classnames() is not implemented.")
|
81
|
-
end
|
35
|
+
class ExampleTest < Test::Unit::TestCase
|
82
36
|
|
83
37
|
|
84
|
-
def
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
38
|
+
def _test
|
39
|
+
#Dir.chdir TEST_DIR
|
40
|
+
Dir.chdir @dir
|
41
|
+
argv = ["-f", @template]
|
42
|
+
argv.concat @options if @options
|
43
|
+
argv << @datafile
|
44
|
+
main = Kwatable::MainProgram.new(argv)
|
45
|
+
output = main.execute()
|
46
|
+
@expfiles.each do |expfile|
|
47
|
+
expected = File.read(".expected/#{expfile}")
|
48
|
+
actual = output ? output.dup : File.read(expfile)
|
49
|
+
actual.sub!(DATE_PATTERN, '')
|
50
|
+
expected.sub!(DATE_PATTERN, '')
|
51
|
+
assert_equal_with_diff(expected, actual)
|
90
52
|
end
|
91
|
-
return s
|
92
53
|
end
|
93
54
|
|
94
|
-
def _setup_ddl(basename)
|
95
|
-
dir = prefix()
|
96
|
-
@datafile = "#{dir}/#{prefix()}.yaml"
|
97
|
-
@template = "#{basename}.eruby"
|
98
|
-
@actual = "#{dir}/#{prefix()}.#{basename}.actual"
|
99
|
-
@expected = "#{dir}/#{prefix()}.#{basename}.expected"
|
100
|
-
end
|
101
55
|
|
102
|
-
def
|
103
|
-
dir =
|
104
|
-
@
|
105
|
-
@
|
106
|
-
@
|
107
|
-
|
108
|
-
@classnames = classnames()
|
109
|
-
@output = "#{dir}/%s#{suffix}"
|
56
|
+
def test_ex1_mysql
|
57
|
+
@dir = "#{EXAMPLES_DIR}/ex1"
|
58
|
+
@template = 'ddl-mysql.eruby'
|
59
|
+
@datafile = 'example1.yaml'
|
60
|
+
@expfiles = %w[ddl-mysql.sql]
|
61
|
+
_test
|
110
62
|
end
|
111
63
|
|
112
|
-
end
|
113
|
-
|
114
64
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
def classnames
|
122
|
-
return %w[Group User]
|
65
|
+
def test_ex1_postgresql
|
66
|
+
@dir = "#{EXAMPLES_DIR}/ex1"
|
67
|
+
@template = 'ddl-postgresql.eruby'
|
68
|
+
@datafile = 'example1.yaml'
|
69
|
+
@expfiles = %w[ddl-postgresql.sql]
|
70
|
+
_test
|
123
71
|
end
|
124
72
|
|
125
73
|
|
126
|
-
def
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
#@template = "ddl-postgresql.eruby"
|
138
|
-
#@actual = "test1.ddl-postgresql.actual"
|
139
|
-
#@expected = "test1.ddl-postgresql.expected"
|
140
|
-
_setup_ddl('ddl-postgresql')
|
141
|
-
_test(:ignore_linenum=>4)
|
142
|
-
end
|
143
|
-
|
144
|
-
def test1_dto_java
|
145
|
-
#@datafile = "test1.yaml"
|
146
|
-
#@template = "dto-java.eruby"
|
147
|
-
#@actual = "test1.dto-java.%s.actual"
|
148
|
-
#@expected = "test1.dto-java.%s.expected"
|
149
|
-
#@classnames = dto_classes()
|
150
|
-
#@output = "%s.java"
|
151
|
-
_setup_dto('dto-java', '.java')
|
152
|
-
_test(:ignore_linenum=>4, :multiple=>true)
|
153
|
-
end
|
154
|
-
|
155
|
-
def test1_dto_ruby
|
156
|
-
#@datafile = "#test1.yaml"
|
157
|
-
#@template = "dto-ruby.eruby"
|
158
|
-
#@actual = "test1.dto-ruby.%s.actual"
|
159
|
-
#@expected = "test1.dto-ruby.%s.expected"
|
160
|
-
#@classnames = dto_classes()
|
161
|
-
#@output = "%s.rb"
|
162
|
-
_setup_dto('dto-ruby', '.rb')
|
163
|
-
_test(:ignore_linenum=>4, :multiple=>true)
|
74
|
+
def test_ex1_java
|
75
|
+
@dir = "#{EXAMPLES_DIR}/ex1"
|
76
|
+
@template = 'dto-java.eruby'
|
77
|
+
@datafile = 'example1.yaml'
|
78
|
+
@expfiles = %w[Group.java User.java]
|
79
|
+
@options = %w[-qm --package=my.example --parent=Object --populate --constructor]
|
80
|
+
begin
|
81
|
+
_test
|
82
|
+
ensure
|
83
|
+
@expfiles.each { |filename| File.unlink(filename) }
|
84
|
+
end
|
164
85
|
end
|
165
86
|
|
166
|
-
end
|
167
|
-
|
168
|
-
|
169
|
-
class KwatableExample2Test < KwatableExampleTest
|
170
87
|
|
171
|
-
def
|
172
|
-
|
88
|
+
def test_ex1_ruby
|
89
|
+
@dir = "#{EXAMPLES_DIR}/ex1"
|
90
|
+
@template = 'dto-ruby.eruby'
|
91
|
+
@datafile = 'example1.yaml'
|
92
|
+
@expfiles = %w[Group.rb User.rb]
|
93
|
+
@options = %w[-qm --module=Example --parent=Object --reqpath=lib --populate --symbolkey]
|
94
|
+
begin
|
95
|
+
_test
|
96
|
+
ensure
|
97
|
+
@expfiles.each { |filename| File.unlink(filename) }
|
98
|
+
end
|
173
99
|
end
|
100
|
+
|
101
|
+
|
102
|
+
##---
|
103
|
+
|
174
104
|
|
175
|
-
def
|
176
|
-
|
105
|
+
def test_ex2_mysql
|
106
|
+
@dir = "#{EXAMPLES_DIR}/ex2"
|
107
|
+
@template = 'ddl-mysql.eruby'
|
108
|
+
@datafile = 'example2.yaml'
|
109
|
+
@expfiles = %w[ddl-mysql.sql]
|
110
|
+
_test
|
177
111
|
end
|
178
112
|
|
179
113
|
|
180
|
-
def
|
181
|
-
|
182
|
-
|
114
|
+
def test_ex2_postgresql
|
115
|
+
@dir = "#{EXAMPLES_DIR}/ex2"
|
116
|
+
@template = 'ddl-postgresql.eruby'
|
117
|
+
@datafile = 'example2.yaml'
|
118
|
+
@expfiles = %w[ddl-postgresql.sql]
|
119
|
+
_test
|
183
120
|
end
|
184
121
|
|
185
|
-
def test2_ddl_postgresql
|
186
|
-
_setup_ddl('ddl-postgresql')
|
187
|
-
_test(:ignore_linenum=>4)
|
188
|
-
end
|
189
122
|
|
190
|
-
def
|
191
|
-
|
192
|
-
|
123
|
+
def test_ex2_java
|
124
|
+
@dir = "#{EXAMPLES_DIR}/ex2"
|
125
|
+
@template = 'dto-java.eruby'
|
126
|
+
@datafile = 'example2.yaml'
|
127
|
+
@expfiles = %w[Address.java Customer.java Item.java SalesOrder.java SalesOrderLine.java]
|
128
|
+
@options = %w[-qm --package=my.example --parent=Object --populate --constructor]
|
129
|
+
begin
|
130
|
+
_test
|
131
|
+
ensure
|
132
|
+
@expfiles.each { |filename| File.unlink(filename) if test(?f, filename)}
|
133
|
+
end
|
193
134
|
end
|
194
135
|
|
195
|
-
def test2_dto_ruby
|
196
|
-
_setup_dto('dto-ruby', '.rb')
|
197
|
-
_test(:ignore_linenum=>4, :multiple=>true)
|
198
|
-
end
|
199
136
|
|
200
137
|
end
|
201
138
|
|
202
|
-
|
203
|
-
File.open('test.log', 'a') do |f|
|
204
|
-
$logger = f
|
205
|
-
suite = Test::Unit::TestSuite.new()
|
206
|
-
suite << KwatableExample1Test.suite()
|
207
|
-
suite << KwatableExample2Test.suite()
|
208
|
-
Test::Unit::UI::Console::TestRunner.run(suite)
|
209
|
-
end
|