jabara 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/jabara.gemspec +3 -0
- data/lib/jabara/converter/nest_to_flats.rb +42 -0
- data/lib/jabara/mysql/schema.rb +2 -2
- data/lib/jabara/mysql_bulk/output.rb +2 -2
- data/lib/jabara/mysql_dump/output.rb +70 -0
- data/lib/jabara/mysql_dump.rb +1 -0
- data/lib/jabara/parse_com/schema.rb +69 -6
- data/lib/jabara/version.rb +1 -1
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72c834799e8eb5bde01d17821d7b19336277d1dc
|
4
|
+
data.tar.gz: 89c64d90ca7af9db0a56acc3f6cf1b5bc2079195
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fcc4732c2f6b395c3096e10c3a4eef5ed1e882766a2d36e3e5a8a0a4c86dd284405d1e577ff6e296b3a7663b5d2605be2b7bfd5ebf4b50182ff085f56f716d2d
|
7
|
+
data.tar.gz: 23f9901bd17cc56ba61d8e24d89abb30661cf2c069d3b40b4bd6e712d204b3963917ce62271aa6131f5c8e9780db17d5a0d7597cde39e35e22bd6c5f7ae3f136
|
data/jabara.gemspec
CHANGED
@@ -18,7 +18,10 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.required_ruby_version = ">= 2.0.0"
|
22
|
+
|
21
23
|
spec.add_dependency "scheman", "0.0.5"
|
24
|
+
spec.add_dependency "yajl-ruby", "~> 1.2"
|
22
25
|
spec.add_development_dependency "bundler", "~> 1.7"
|
23
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
27
|
spec.add_development_dependency "minitest"
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'jabara/data'
|
2
|
+
require 'jabara/transformer/flatten'
|
3
|
+
|
4
|
+
module Jabara
|
5
|
+
module Converter
|
6
|
+
class NestToFlats
|
7
|
+
|
8
|
+
# inputの[object_type]とoutputsのobject_typeが一致することを仮定
|
9
|
+
# ユースケースによるけど、input schemaのkeysとoutput schemaのcolummsはなるべく一致しているべき
|
10
|
+
def initialize(input:, output_map:, id_key_name: 'belongsTo')
|
11
|
+
@input = input
|
12
|
+
@output_map = output_map # object_typeからOutputへのマッピング
|
13
|
+
@tr_flatten = Jabara::Transformer::Flatten.new(id_key_name: id_key_name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def convert(hash)
|
17
|
+
nested_repr = @input.decode(hash)
|
18
|
+
flat_repr, inner_reprs = @tr_flatten.convert(nested_repr)
|
19
|
+
|
20
|
+
write(flat_repr)
|
21
|
+
inner_reprs.each do |inner_repr|
|
22
|
+
write(inner_repr)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def terminate_all
|
27
|
+
@output_map.each do |_, output|
|
28
|
+
output.terminate
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def write(repr)
|
34
|
+
object_type = Jabara.object_type(repr)
|
35
|
+
output = @output_map[object_type]
|
36
|
+
raise ArgumentError, 'output plugin for %s is not registered' % object_type if output.nil?
|
37
|
+
output.write(repr)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
data/lib/jabara/mysql/schema.rb
CHANGED
@@ -131,7 +131,7 @@ module Jabara
|
|
131
131
|
end
|
132
132
|
|
133
133
|
def self.build(&block)
|
134
|
-
this =
|
134
|
+
this = self.new
|
135
135
|
this.instance_eval(&block)
|
136
136
|
return this.schema
|
137
137
|
end
|
@@ -192,7 +192,7 @@ module Jabara
|
|
192
192
|
private
|
193
193
|
|
194
194
|
def self.stmt_to_schema(create_stmt_hash)
|
195
|
-
this =
|
195
|
+
this = self.new
|
196
196
|
this.schema.table_name = create_stmt_hash[:name]
|
197
197
|
create_stmt_hash[:fields].each do |field_hash|
|
198
198
|
field_hash = field_hash[:field]
|
@@ -8,13 +8,13 @@ module Jabara
|
|
8
8
|
@table_name = schema.table_name
|
9
9
|
@schema = schema
|
10
10
|
@tuple_size = tuple_size
|
11
|
+
@column_keys = @schema.columns.map { |column| column[:key] }
|
11
12
|
reset_buffer
|
12
13
|
end
|
13
14
|
|
14
15
|
def encode(repr)
|
15
16
|
data = ::Jabara.data(repr)
|
16
|
-
tuple_str = "(%s)" % @
|
17
|
-
key = column[:key]
|
17
|
+
tuple_str = "(%s)" % @column_keys.map { |key|
|
18
18
|
mysql_value(data[key])
|
19
19
|
}.join(", ")
|
20
20
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'jabara/data'
|
2
|
+
|
3
|
+
module Jabara
|
4
|
+
module MySQLDump
|
5
|
+
class Output < Jabara::MySQL::Output
|
6
|
+
|
7
|
+
def initialize(schema:, out_path:,
|
8
|
+
fields_terminated_by:',',
|
9
|
+
fields_enclosed_by:'"', # TODO Not supported yet
|
10
|
+
fields_escapted_by:'"', # TODO Not supported yet
|
11
|
+
lines_terminated_by:"\n")
|
12
|
+
@schema = schema
|
13
|
+
@out_path = out_path
|
14
|
+
|
15
|
+
@field_delimiter = fields_terminated_by
|
16
|
+
@field_quote_str = fields_enclosed_by
|
17
|
+
@escape_str = fields_escapted_by
|
18
|
+
@line_delimiter = lines_terminated_by
|
19
|
+
|
20
|
+
@column_keys = @schema.columns.map { |column| column[:key] }
|
21
|
+
@file = File.open(@out_path, 'w')
|
22
|
+
@buf = ''
|
23
|
+
end
|
24
|
+
|
25
|
+
def write(object_repr)
|
26
|
+
begin
|
27
|
+
@file.write(@buf)
|
28
|
+
data = ::Jabara.data(object_repr)
|
29
|
+
@buf = @column_keys.map { |key|
|
30
|
+
mysql_value(data[key])
|
31
|
+
}.join(@field_delimiter) + @line_delimiter
|
32
|
+
rescue => e
|
33
|
+
cleanup
|
34
|
+
raise e # reraise
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def terminate
|
39
|
+
@file.write(@buf.chomp(@line_delimiter))
|
40
|
+
@file.close
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_data_query
|
44
|
+
query = <<SQL
|
45
|
+
load data infile '%s' into `%s`
|
46
|
+
character set %s
|
47
|
+
fields terminated by '%s'
|
48
|
+
enclosed by '%s'
|
49
|
+
escaped by '%s'
|
50
|
+
lines terminated by '%s'
|
51
|
+
;
|
52
|
+
SQL
|
53
|
+
query % [@out_path,
|
54
|
+
@schema.table_name,
|
55
|
+
@char_set || 'utf8mb4',
|
56
|
+
@field_delimiter,
|
57
|
+
@field_quote_str,
|
58
|
+
@escape_str,
|
59
|
+
@line_delimiter]
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
def cleanup
|
64
|
+
@file.close
|
65
|
+
File.delete(@out_path)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'jabara/mysql_dump/output'
|
@@ -86,9 +86,9 @@ module Jabara
|
|
86
86
|
end
|
87
87
|
|
88
88
|
class String
|
89
|
-
def initialize(max:
|
89
|
+
def initialize(max: nil, default: nil) # default = nil の場合はnullを許容する
|
90
90
|
raise TypeError, 'default must be string' unless default.is_a? ::String or default.nil?
|
91
|
-
raise TypeError, 'max must be integer' unless max.is_a? ::Integer
|
91
|
+
raise TypeError, 'max must be integer' unless max.is_a? ::Integer or max.nil?
|
92
92
|
@max = max
|
93
93
|
@default = default
|
94
94
|
end
|
@@ -97,7 +97,8 @@ module Jabara
|
|
97
97
|
return ::Jabara.null if data.nil? and @default.nil?
|
98
98
|
return @default if data.nil?
|
99
99
|
raise TypeError, 'data must be string' unless data.is_a? ::String or default.nil?
|
100
|
-
|
100
|
+
data = data.slice(0, @max) unless @max.nil?
|
101
|
+
::Jabara.primitive(:string, data)
|
101
102
|
end
|
102
103
|
end
|
103
104
|
|
@@ -111,7 +112,7 @@ module Jabara
|
|
111
112
|
|
112
113
|
class Boolean
|
113
114
|
def initialize(default: nil) # default = nil の場合はnullを許容する
|
114
|
-
raise ArgumentError, 'default must be true of false' unless [true, false].include? default
|
115
|
+
raise ArgumentError, 'default must be true of false' unless [true, false].include? default or default.nil?
|
115
116
|
@default = default
|
116
117
|
end
|
117
118
|
|
@@ -159,6 +160,41 @@ module Jabara
|
|
159
160
|
end
|
160
161
|
end
|
161
162
|
|
163
|
+
class JSONString
|
164
|
+
def initialize
|
165
|
+
@encoder = Yajl::Encoder.new
|
166
|
+
end
|
167
|
+
def parse(data)
|
168
|
+
return ::Jabara.null if data.nil?
|
169
|
+
raise ArgumentError, 'data must be hash or array' unless data.is_a? ::Hash or data.is_a? ::Array
|
170
|
+
|
171
|
+
json_str = @encoder.encode(data)
|
172
|
+
::Jabara.primitive(:string, json_str)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
class Variants
|
177
|
+
def initialize(&block)
|
178
|
+
@variants = {}
|
179
|
+
instance_eval(&block)
|
180
|
+
end
|
181
|
+
def parse(data)
|
182
|
+
return ::Jabara.null if data.nil?
|
183
|
+
raise ArgumentError, 'data must be hash' unless data.is_a? ::Hash
|
184
|
+
|
185
|
+
reprs = @variants.map { |key, schema|
|
186
|
+
if not data[key].nil? then schema.decode(data[key]) else nil end
|
187
|
+
}.compact
|
188
|
+
::Jabara.set(reprs)
|
189
|
+
end
|
190
|
+
|
191
|
+
# following methods are for DSL
|
192
|
+
|
193
|
+
def variant(key:, schema:)
|
194
|
+
@variants[key] = ::Jabara::ParseCom::Input.new(schema)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
162
198
|
class Schema
|
163
199
|
|
164
200
|
attr_accessor :key_defs, :object_type, :id_key_name
|
@@ -169,6 +205,13 @@ module Jabara
|
|
169
205
|
@id_key_name = nil
|
170
206
|
end
|
171
207
|
|
208
|
+
#def object_types
|
209
|
+
# @key_defs.map { |key_string, schema|
|
210
|
+
# return [] unless schema.is_a? Jabara::ParseCom::Schema::Object
|
211
|
+
# schema.object_types # TODO impl it
|
212
|
+
# }.flatten
|
213
|
+
#end
|
214
|
+
|
172
215
|
end
|
173
216
|
|
174
217
|
class Builder
|
@@ -176,10 +219,18 @@ module Jabara
|
|
176
219
|
attr_reader :schema
|
177
220
|
|
178
221
|
def self.build(&block)
|
179
|
-
this =
|
222
|
+
this = self.new
|
180
223
|
this.instance_eval(&block)
|
181
224
|
return this.schema
|
182
225
|
end
|
226
|
+
|
227
|
+
def self.relation object_type
|
228
|
+
self.build do
|
229
|
+
type object_type
|
230
|
+
key 'owningId', string
|
231
|
+
key 'relatedId', string
|
232
|
+
end
|
233
|
+
end
|
183
234
|
|
184
235
|
def initialize
|
185
236
|
@schema = Schema.new
|
@@ -201,6 +252,10 @@ module Jabara
|
|
201
252
|
raise ArgumentError, 'key_name must be string' unless key_string.is_a? ::String
|
202
253
|
(@schema.key_defs)[key_string] = type
|
203
254
|
end
|
255
|
+
|
256
|
+
def schema(&block)
|
257
|
+
self.build(&block)
|
258
|
+
end
|
204
259
|
|
205
260
|
# TODO
|
206
261
|
#def object
|
@@ -236,7 +291,7 @@ module Jabara
|
|
236
291
|
DateTime.new default: default
|
237
292
|
end
|
238
293
|
|
239
|
-
def string max:
|
294
|
+
def string max: nil, default: nil
|
240
295
|
String.new max: max, default: default
|
241
296
|
end
|
242
297
|
|
@@ -251,6 +306,14 @@ module Jabara
|
|
251
306
|
def acl user_acl_object_type: ,role_acl_object_type:
|
252
307
|
ACL.new(user_acl_object_type: user_acl_object_type, role_acl_object_type: role_acl_object_type)
|
253
308
|
end
|
309
|
+
|
310
|
+
def json_string
|
311
|
+
JSONString.new
|
312
|
+
end
|
313
|
+
|
314
|
+
def variants(&block)
|
315
|
+
Variants.new(&block)
|
316
|
+
end
|
254
317
|
end
|
255
318
|
end
|
256
319
|
end
|
data/lib/jabara/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jabara
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuki Takeichi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: scheman
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.0.5
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: yajl-ruby
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.2'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,12 +97,15 @@ files:
|
|
83
97
|
- bin/jabara
|
84
98
|
- jabara.gemspec
|
85
99
|
- lib/jabara.rb
|
100
|
+
- lib/jabara/converter/nest_to_flats.rb
|
86
101
|
- lib/jabara/data.rb
|
87
102
|
- lib/jabara/mysql.rb
|
88
103
|
- lib/jabara/mysql/output.rb
|
89
104
|
- lib/jabara/mysql/schema.rb
|
90
105
|
- lib/jabara/mysql_bulk.rb
|
91
106
|
- lib/jabara/mysql_bulk/output.rb
|
107
|
+
- lib/jabara/mysql_dump.rb
|
108
|
+
- lib/jabara/mysql_dump/output.rb
|
92
109
|
- lib/jabara/parse_com.rb
|
93
110
|
- lib/jabara/parse_com/input.rb
|
94
111
|
- lib/jabara/parse_com/schema.rb
|
@@ -110,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
110
127
|
requirements:
|
111
128
|
- - ">="
|
112
129
|
- !ruby/object:Gem::Version
|
113
|
-
version:
|
130
|
+
version: 2.0.0
|
114
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
132
|
requirements:
|
116
133
|
- - ">="
|