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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 921c5db1c328803a7238637ddc12ef2b01dea0a8
4
- data.tar.gz: 1c0a3f478163eb62a71f9cc2ad6b15fc4e0eef84
3
+ metadata.gz: 72c834799e8eb5bde01d17821d7b19336277d1dc
4
+ data.tar.gz: 89c64d90ca7af9db0a56acc3f6cf1b5bc2079195
5
5
  SHA512:
6
- metadata.gz: 2d2b8007f5d9ecf6ddd5fce7c1ce8190bc9245a8f373e725afb8cbc4a803912554ea3747cecd254cac4d2a453168d5bf0a7b33c96b0eab9a6000cf7a436972ff
7
- data.tar.gz: 5bfc494d5b8fbf10fc94039260f5d736d847da0acaada34ce867de42a820670e2e843ce71ead59c4f22f49447e315801eac97cee1a73a287d2c67a596e9c6591
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
+
@@ -131,7 +131,7 @@ module Jabara
131
131
  end
132
132
 
133
133
  def self.build(&block)
134
- this = Builder.new
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 = Builder.new
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)" % @schema.columns.map { |column|
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: 1000, default: nil) # default = nil の場合はnullを許容する
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
- ::Jabara.primitive(:string, data.slice(0, @max))
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 = Builder.new
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: 1000, default: nil
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
@@ -1,3 +1,3 @@
1
1
  module Jabara
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
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.1.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-02-26 00:00:00.000000000 Z
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: '0'
130
+ version: 2.0.0
114
131
  required_rubygems_version: !ruby/object:Gem::Requirement
115
132
  requirements:
116
133
  - - ">="