arison 0.1.3 → 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 +5 -5
- data/.gitignore +1 -0
- data/.travis.yml +3 -5
- data/arison.gemspec +3 -3
- data/lib/arison.rb +10 -0
- data/lib/arison/cli.rb +18 -14
- data/lib/arison/connection.rb +12 -0
- data/lib/arison/constants.rb +4 -0
- data/lib/arison/core.rb +4 -45
- data/lib/arison/migration.rb +1 -1
- data/lib/arison/util.rb +52 -0
- data/lib/arison/version.rb +1 -1
- data/spec/cli_spec.rb +0 -4
- data/spec/core_spec.rb +53 -3
- data/spec/spec_helper.rb +8 -0
- metadata +13 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4272d33ba6b94a998e9be6b59c94bc5e0482bc89c62a8bb71b2cf6e2825da84c
|
4
|
+
data.tar.gz: 36743d9e04d0a5d0081dd59219781ecf4608eefa03e299e2ccbaa8c982a7b62d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32c2c56c3920e98f44fcb7399c789a315721e2d0a54ce9d718b99b2aa619dd7e998347358b85022b822d63839291cec51643cd31eb6fd004ed184021b153210b
|
7
|
+
data.tar.gz: 94c205cc76eb3b736d74cbbfbbcffa26c04f684ec592321c025dea8e17b040b40fd5e3730375ba54bc4d9b6bc12152d6f45cbddf155d0000495933c317fa02b2
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/arison.gemspec
CHANGED
@@ -5,8 +5,8 @@ require File.expand_path('../lib/arison/version', __FILE__)
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "arison"
|
7
7
|
gem.version = Arison::VERSION
|
8
|
-
gem.summary = %q{
|
9
|
-
gem.description = %q{
|
8
|
+
gem.summary = %q{activerecord-import by jsonl, command line interface}
|
9
|
+
gem.description = %q{activerecord-import by jsonl, command line interface}
|
10
10
|
gem.license = "MIT"
|
11
11
|
gem.authors = ["Hiroshi Toyama"]
|
12
12
|
gem.email = "toyama0919@gmail.com"
|
@@ -18,11 +18,11 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ['lib']
|
19
19
|
|
20
20
|
gem.add_dependency 'thor'
|
21
|
-
gem.add_dependency 'pg'
|
22
21
|
gem.add_dependency 'activesupport'
|
23
22
|
gem.add_dependency 'activerecord'
|
24
23
|
gem.add_dependency 'activerecord-import'
|
25
24
|
|
25
|
+
gem.add_development_dependency 'sqlite3'
|
26
26
|
gem.add_development_dependency 'bundler'
|
27
27
|
gem.add_development_dependency 'pry', '~> 0.10.1'
|
28
28
|
gem.add_development_dependency 'rake', '~> 10.3.2'
|
data/lib/arison.rb
CHANGED
@@ -1,4 +1,14 @@
|
|
1
1
|
require 'arison/version'
|
2
|
+
require 'arison/constants'
|
3
|
+
require 'arison/util'
|
2
4
|
require 'arison/core'
|
3
5
|
require 'arison/migration'
|
6
|
+
require 'arison/connection'
|
4
7
|
require 'arison/cli'
|
8
|
+
|
9
|
+
module Arison
|
10
|
+
def self.import(table, data, config: DEFAULT_CONFIG_FILE_PATH, profile: DEFAULT_CONFIG_PROFILE)
|
11
|
+
con = Connection.new(config: config, profile: profile)
|
12
|
+
con.import(table, data)
|
13
|
+
end
|
14
|
+
end
|
data/lib/arison/cli.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "thor"
|
3
|
-
require 'yaml'
|
4
3
|
require 'json'
|
5
4
|
require 'pp'
|
6
5
|
|
@@ -12,21 +11,23 @@ module Arison
|
|
12
11
|
map '-f' => :query_file
|
13
12
|
map '-b' => :import
|
14
13
|
|
15
|
-
class_option :profile, aliases: '-p', type: :string, default:
|
14
|
+
class_option :profile, aliases: '-p', type: :string, default: DEFAULT_CONFIG_PROFILE, desc: 'profile by .database.yml'
|
16
15
|
class_option :pretty, aliases: '-P', type: :boolean, default: false, desc: 'pretty print'
|
17
|
-
class_option :config, aliases: '--config', type: :string, default:
|
16
|
+
class_option :config, aliases: '--config', type: :string, default: DEFAULT_CONFIG_FILE_PATH, desc: 'config file'
|
18
17
|
def initialize(args = [], options = {}, config = {})
|
19
18
|
super(args, options, config)
|
20
19
|
@global_options = config[:shell].base.options
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
|
21
|
+
if @global_options[:config] && File.exist?(@global_options[:config])
|
22
|
+
profile = Util.get_profile(@global_options[:config], @global_options[:profile])
|
23
|
+
@core = Core.new(profile)
|
24
|
+
end
|
24
25
|
end
|
25
26
|
|
26
27
|
desc 'query_inline', 'Sample task'
|
27
28
|
option :query, aliases: '-q', type: :string, required: true, desc: 'query'
|
28
29
|
def query_inline
|
29
|
-
puts_json @core.query(options[
|
30
|
+
puts_json @core.query(options[:query])
|
30
31
|
end
|
31
32
|
|
32
33
|
desc 'query_file', 'query_file'
|
@@ -40,15 +41,18 @@ module Arison
|
|
40
41
|
end
|
41
42
|
|
42
43
|
desc 'columns', 'columns'
|
43
|
-
|
44
|
-
|
44
|
+
option :table, aliases: '-t', type: :string, desc: 'table'
|
45
|
+
def columns
|
46
|
+
puts_json @core.columns_with_table_name(options[:table])
|
45
47
|
end
|
46
48
|
|
47
|
-
desc 'import', 'import'
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
desc 'import', 'import json data.'
|
50
|
+
option :table, aliases: '-t', type: :string, desc: 'table'
|
51
|
+
option :data, type: :hash, desc: 'buffer'
|
52
|
+
def import
|
53
|
+
data = (options[:data] ? options[:data] : nil) || Util.parse_json(STDIN.read)
|
54
|
+
data = [data] if data.class == Hash
|
55
|
+
@core.import(options[:table], data)
|
52
56
|
end
|
53
57
|
|
54
58
|
desc 'info', 'info'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Arison
|
2
|
+
class Connection
|
3
|
+
def initialize(config: DEFAULT_CONFIG_FILE_PATH, profile: DEFAULT_CONFIG_PROFILE)
|
4
|
+
profile = Util.get_profile(config, profile)
|
5
|
+
@core = Core.new(profile)
|
6
|
+
end
|
7
|
+
|
8
|
+
def import(table, data)
|
9
|
+
@core.import(table, data)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/arison/core.rb
CHANGED
@@ -34,6 +34,7 @@ module Arison
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def import(table_name, data)
|
37
|
+
create_table(table_name, data)
|
37
38
|
klass = get_class(table_name)
|
38
39
|
limits = get_limit_hash(klass)
|
39
40
|
instances = []
|
@@ -88,13 +89,13 @@ module Arison
|
|
88
89
|
|
89
90
|
def get_add_column_dsl(table_name, column_name, record)
|
90
91
|
dsl = %Q{
|
91
|
-
add_column "#{table_name}", "#{column_name}", :#{get_type(column_name, record['column_name'])}
|
92
|
+
add_column "#{table_name}", "#{column_name}", :#{Util.get_type(column_name, record['column_name'])}
|
92
93
|
}
|
93
94
|
end
|
94
95
|
|
95
96
|
def create_table(table_name, data)
|
96
97
|
first = data.class == Array ? data.first : data
|
97
|
-
if
|
98
|
+
if ActiveRecord::Base.connection.data_source_exists?(table_name.to_sym)
|
98
99
|
add_column_live(table_name, data)
|
99
100
|
return
|
100
101
|
end
|
@@ -103,18 +104,6 @@ module Arison
|
|
103
104
|
add_column_live(table_name, data)
|
104
105
|
end
|
105
106
|
|
106
|
-
def parse_json(buffer)
|
107
|
-
begin
|
108
|
-
data = JSON.parse(buffer)
|
109
|
-
rescue => e
|
110
|
-
data = []
|
111
|
-
buffer.lines.each do |line|
|
112
|
-
data << JSON.parse(line)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
data
|
116
|
-
end
|
117
|
-
|
118
107
|
def get_class(table_name)
|
119
108
|
define_class(table_name)
|
120
109
|
table_name.camelcase.constantize
|
@@ -132,41 +121,11 @@ module Arison
|
|
132
121
|
|
133
122
|
def get_column_schema(hash)
|
134
123
|
hash.map do |k, v|
|
135
|
-
type = get_type(k, v)
|
124
|
+
type = Util.get_type(k, v)
|
136
125
|
%Q{t.#{type} "#{k}"} unless type.nil?
|
137
126
|
end
|
138
127
|
end
|
139
128
|
|
140
|
-
def get_type(k, v)
|
141
|
-
if v.nil?
|
142
|
-
%Q{string}
|
143
|
-
elsif k =~ /^id$/i
|
144
|
-
nil
|
145
|
-
elsif v.class == String
|
146
|
-
to_time_or_nil(v).nil? ? %Q{string} : %Q{datetime}
|
147
|
-
elsif v.class == TrueClass || v.class == FalseClass
|
148
|
-
%Q{boolean}
|
149
|
-
elsif v.class == Fixnum
|
150
|
-
%Q{integer}
|
151
|
-
elsif v.class == Float
|
152
|
-
%Q{float}
|
153
|
-
elsif v.class == Array || v.class == Hash
|
154
|
-
%Q{text}
|
155
|
-
elsif v.respond_to?(:strftime)
|
156
|
-
%Q{datetime}
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def to_time_or_nil(value)
|
161
|
-
return nil if value.slice(0, 4) !~ /^[0-9][0-9][0-9][0-9]/
|
162
|
-
begin
|
163
|
-
time = value.to_time
|
164
|
-
time.to_i >= 0 ? time : nil
|
165
|
-
rescue => e
|
166
|
-
nil
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
129
|
def get_limit_hash(klass)
|
171
130
|
columns(klass).inject({}){ |result, column|
|
172
131
|
result[column['name']] = column['limit']
|
data/lib/arison/migration.rb
CHANGED
data/lib/arison/util.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Arison
|
4
|
+
class Util
|
5
|
+
def self.get_profile(config_path, profile)
|
6
|
+
@config = YAML.load_file(config_path)
|
7
|
+
@config[profile]
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.parse_json(buffer)
|
11
|
+
begin
|
12
|
+
data = JSON.parse(buffer)
|
13
|
+
rescue => e
|
14
|
+
data = []
|
15
|
+
buffer.lines.each do |line|
|
16
|
+
data << JSON.parse(line)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
data
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_type(k, v)
|
23
|
+
if v.nil?
|
24
|
+
%Q{string}
|
25
|
+
elsif k =~ /^id$/i
|
26
|
+
nil
|
27
|
+
elsif v.class == String
|
28
|
+
to_time_or_nil(v).nil? ? %Q{string} : %Q{datetime}
|
29
|
+
elsif v.class == TrueClass || v.class == FalseClass
|
30
|
+
%Q{boolean}
|
31
|
+
elsif v.class == Fixnum
|
32
|
+
%Q{integer}
|
33
|
+
elsif v.class == Float
|
34
|
+
%Q{float}
|
35
|
+
elsif v.class == Array || v.class == Hash
|
36
|
+
%Q{text}
|
37
|
+
elsif v.respond_to?(:strftime)
|
38
|
+
%Q{datetime}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.to_time_or_nil(value)
|
43
|
+
return nil if value.slice(0, 4) !~ /^[0-9][0-9][0-9][0-9]/
|
44
|
+
begin
|
45
|
+
time = value.to_time
|
46
|
+
time.to_i >= 0 ? time : nil
|
47
|
+
rescue => e
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/arison/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
data/spec/core_spec.rb
CHANGED
@@ -1,15 +1,65 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'arison'
|
3
|
+
require 'fileutils'
|
3
4
|
|
4
5
|
describe Arison::Core do
|
5
|
-
|
6
|
-
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
FileUtils.rm( 'tmp/core.db', {:force=>true} )
|
9
|
+
@core = get_core
|
7
10
|
end
|
8
11
|
|
9
12
|
it "core not nil" do
|
10
13
|
@core.should_not nil
|
11
14
|
end
|
12
15
|
|
13
|
-
|
16
|
+
it "core import" do
|
17
|
+
data = [
|
18
|
+
{ "column_1" => 1, "column_2" => "string_1", "column_3" => 0.1 },
|
19
|
+
{ "column_1" => 2, "column_2" => "string_2" },
|
20
|
+
]
|
21
|
+
get_core.import('test', data)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "core query record 1" do
|
25
|
+
results = get_core.query('select * from test')
|
26
|
+
record = results.first
|
27
|
+
expect(record['id']).to eq(1)
|
28
|
+
expect(record['column_1']).to eq(1)
|
29
|
+
expect(record['column_2']).to eq("string_1")
|
30
|
+
expect(record['column_3']).to eq(0.1)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "core query record 2" do
|
34
|
+
results = get_core.query('select * from test')
|
35
|
+
record = results[1]
|
36
|
+
expect(record['id']).to eq(2)
|
37
|
+
expect(record['column_1']).to eq(2)
|
38
|
+
expect(record['column_2']).to eq("string_2")
|
39
|
+
expect(record['column_3']).to eq(nil)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "core columns" do
|
43
|
+
columns = get_core.columns_with_table_name("test")
|
44
|
+
expect(columns[0]['name']).to eq('id')
|
45
|
+
expect(columns[0]['sql_type_metadata']['type']).to eq('integer')
|
46
|
+
|
47
|
+
expect(columns[1]['name']).to eq('column_1')
|
48
|
+
expect(columns[1]['sql_type_metadata']['type']).to eq('integer')
|
49
|
+
|
50
|
+
expect(columns[2]['name']).to eq('column_2')
|
51
|
+
expect(columns[2]['sql_type_metadata']['type']).to eq('string')
|
52
|
+
|
53
|
+
expect(columns[3]['name']).to eq('column_3')
|
54
|
+
expect(columns[3]['sql_type_metadata']['type']).to eq('float')
|
55
|
+
|
56
|
+
expect(columns[4]['name']).to eq('created_at')
|
57
|
+
expect(columns[4]['sql_type_metadata']['type']).to eq('datetime')
|
58
|
+
|
59
|
+
expect(columns[5]['name']).to eq('updated_at')
|
60
|
+
expect(columns[5]['sql_type_metadata']['type']).to eq('datetime')
|
61
|
+
end
|
62
|
+
|
63
|
+
after(:all) do
|
14
64
|
end
|
15
65
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arison
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Toyama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: activerecord
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name: activerecord
|
56
|
+
name: activerecord-import
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,13 +67,13 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: sqlite3
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
|
-
type: :
|
76
|
+
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
@@ -178,7 +178,7 @@ dependencies:
|
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0.8'
|
181
|
-
description:
|
181
|
+
description: activerecord-import by jsonl, command line interface
|
182
182
|
email: toyama0919@gmail.com
|
183
183
|
executables:
|
184
184
|
- arison
|
@@ -199,8 +199,11 @@ files:
|
|
199
199
|
- bin/arison
|
200
200
|
- lib/arison.rb
|
201
201
|
- lib/arison/cli.rb
|
202
|
+
- lib/arison/connection.rb
|
203
|
+
- lib/arison/constants.rb
|
202
204
|
- lib/arison/core.rb
|
203
205
|
- lib/arison/migration.rb
|
206
|
+
- lib/arison/util.rb
|
204
207
|
- lib/arison/version.rb
|
205
208
|
- spec/arison_spec.rb
|
206
209
|
- spec/cli_spec.rb
|
@@ -226,10 +229,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
226
229
|
version: '0'
|
227
230
|
requirements: []
|
228
231
|
rubyforge_project:
|
229
|
-
rubygems_version: 2.
|
232
|
+
rubygems_version: 2.7.3
|
230
233
|
signing_key:
|
231
234
|
specification_version: 4
|
232
|
-
summary:
|
235
|
+
summary: activerecord-import by jsonl, command line interface
|
233
236
|
test_files:
|
234
237
|
- spec/arison_spec.rb
|
235
238
|
- spec/cli_spec.rb
|