jabara 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.
- 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
|
- - ">="
|