kwatable 0.1.0 → 0.2.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.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
|