aq 0.0.1 → 0.1.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/.travis.yml +1 -0
- data/README.md +55 -1
- data/Rakefile +1 -1
- data/aq.gemspec +2 -1
- data/lib/aq/command.rb +54 -6
- data/lib/aq/error.rb +5 -0
- data/lib/aq/query.rb +3 -1
- data/lib/aq/query_builder.rb +53 -0
- data/lib/aq/schema.rb +89 -0
- data/lib/aq/version.rb +1 -1
- data/test/aq/test_query_builder.rb +98 -0
- data/test/aq/test_schema.rb +77 -0
- data/test/resource/schema.json +5 -0
- data/test/test_helper.rb +0 -1
- metadata +29 -8
- data/test/aq/aq_test.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 044c3e56fb4aeb56f5ead7205d9919f4dfbe8efb
|
4
|
+
data.tar.gz: 8ed0ea0d85526f8439a127fc85abde8c52ae2a61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 879e730fac2abee336ed7c8f8a888c849918bff440e808b744d6b08d1f690cf84323d86c0b99d540b23fc029bd9aa44e21bf5dd7f36730d6c116e021a7c23187
|
7
|
+
data.tar.gz: 3ad0511876952645be034aefb63841f261efd9516d0af2060f2fc6e95476b174afdb11699a390d3e9a52f68a802c4e0b6273f3dfc9da216652839458ffea4d11
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -12,12 +12,66 @@ $ gem install aq
|
|
12
12
|
|
13
13
|
## Usage
|
14
14
|
|
15
|
+
All commands need `--bucket` option because Athena stores query result into S3.
|
16
|
+
You can specify it by `AQ_DEFAULT_BUCKET` environment variable.
|
17
|
+
|
18
|
+
### help
|
19
|
+
|
20
|
+
Display command help
|
21
|
+
|
22
|
+
```bash
|
23
|
+
$ aq help
|
24
|
+
$ aq help [COMMAND]
|
25
|
+
```
|
26
|
+
|
27
|
+
### ls
|
28
|
+
|
29
|
+
Show databases or tables in specified database
|
30
|
+
|
31
|
+
```bash
|
32
|
+
$ aq ls
|
33
|
+
$ aq ls my_database_name
|
34
|
+
```
|
35
|
+
|
36
|
+
### head
|
37
|
+
|
38
|
+
Show records in specified table
|
39
|
+
|
40
|
+
```bash
|
41
|
+
$ aq head my_db.my_table
|
42
|
+
```
|
43
|
+
|
44
|
+
### mk
|
45
|
+
|
46
|
+
Create database
|
47
|
+
|
48
|
+
```bash
|
49
|
+
$ aq mk my_database_name
|
50
|
+
```
|
51
|
+
|
52
|
+
### load
|
53
|
+
|
54
|
+
Create table and load data
|
55
|
+
|
56
|
+
```bash
|
57
|
+
$ aq load my_db.my_table s3://my_bucket/my_object_key/ test/resource/schema.json --partitioning dt:string
|
58
|
+
```
|
59
|
+
|
60
|
+
### rm
|
61
|
+
|
62
|
+
Drop database or table
|
63
|
+
|
64
|
+
```bash
|
65
|
+
$ aq rm my_db
|
66
|
+
$ aq rm my_db.my_table
|
67
|
+
```
|
68
|
+
|
15
69
|
### query
|
16
70
|
|
17
71
|
Run query
|
18
72
|
|
19
73
|
```bash
|
20
|
-
$ aq query 'SELECT * FROM "test"."test_logs" limit 10;'
|
74
|
+
$ aq query 'SELECT * FROM "test"."test_logs" limit 10;'
|
21
75
|
```
|
22
76
|
|
23
77
|
## Development
|
data/Rakefile
CHANGED
data/aq.gemspec
CHANGED
@@ -22,10 +22,11 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
23
|
spec.require_paths = ["lib"]
|
24
24
|
|
25
|
-
spec.add_dependency "thor"
|
25
|
+
spec.add_dependency "thor", "~> 0.0"
|
26
26
|
spec.add_dependency "aws-sdk-athena", "~> 1.0"
|
27
27
|
spec.add_dependency "aws-sdk-s3", "~> 1.0"
|
28
28
|
spec.add_dependency "kosi", "~> 1.0"
|
29
|
+
spec.add_dependency "highline", "~> 1.0"
|
29
30
|
|
30
31
|
spec.add_development_dependency "bundler"
|
31
32
|
spec.add_development_dependency "rake"
|
data/lib/aq/command.rb
CHANGED
@@ -1,25 +1,73 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
require 'date'
|
4
|
+
require 'highline/import'
|
4
5
|
require 'thor'
|
5
6
|
|
7
|
+
require 'aq/query'
|
8
|
+
require 'aq/query_builder'
|
9
|
+
require 'aq/schema'
|
10
|
+
require 'aq/version'
|
11
|
+
|
6
12
|
module Aq
|
7
13
|
class AqCmd < Thor
|
8
14
|
package_name 'aq'
|
15
|
+
class_option :bucket, desc: 'S3 bucket where the query result is stored. This param can also be specified by AQ_DEFAULT_BUCKET environment variable.', default: ENV['AQ_DEFAULT_BUCKET']
|
16
|
+
class_option :object_prefix, desc: 'S3 object prefix where the query result is stored', default: "Unsaved/#{Date.today.strftime('%Y/%m/%d')}"
|
17
|
+
|
18
|
+
desc "ls [DATABASE]", "Show databases or tables in specified database"
|
19
|
+
def ls(database=nil)
|
20
|
+
query = QueryBuilder.ls database
|
21
|
+
Aq::Query.new(options[:bucket], options[:object_prefix]).run(query)
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "head TABLE_NAME", "Show records in specified table"
|
25
|
+
option :max_rows, desc: 'This number of rows are printed', default: 100, type: :numeric, aliases: '-n'
|
26
|
+
def head(table)
|
27
|
+
query = QueryBuilder.head table, options[:max_rows]
|
28
|
+
Aq::Query.new(options[:bucket], options[:object_prefix]).run(query)
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "mk NAME", "Create database"
|
32
|
+
def mk(name)
|
33
|
+
query = QueryBuilder.mk name
|
34
|
+
Aq::Query.new(options[:bucket], options[:object_prefix]).run(query)
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "load TABLE SOURCE SCHEMA", "Create table and load data"
|
38
|
+
option :source_format, desc: 'Specify source file data format. Now aq support only NEWLINE_DELIMITED_JSON.', default: 'NEWLINE_DELIMITED_JSON'
|
39
|
+
option :partitioning, desc: 'Specify partition key and type. ex. key1:type1,key2:type2,...', default: nil
|
40
|
+
def load(table, source, schema)
|
41
|
+
schema = SchemaLoader.new.load schema
|
42
|
+
query = QueryBuilder.load table, source, schema, options[:source_format], options[:partitioning]
|
43
|
+
Aq::Query.new(options[:bucket], options[:object_prefix]).run(query)
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "rm NAME", "Drop database or table"
|
47
|
+
option :force, desc: 'Skip confirmation if this is set', type: :boolean, aliases: '-f'
|
48
|
+
def rm(name)
|
49
|
+
if options[:force]
|
50
|
+
answer = true
|
51
|
+
else
|
52
|
+
answer = agree("Would you remove #{name}? (y)es or (n)o")
|
53
|
+
end
|
54
|
+
unless answer
|
55
|
+
puts 'Canceled'
|
56
|
+
exit 1
|
57
|
+
end
|
58
|
+
|
59
|
+
query = QueryBuilder.rm name
|
60
|
+
Aq::Query.new(options[:bucket], options[:object_prefix]).run(query)
|
61
|
+
end
|
9
62
|
|
10
63
|
desc "query QUERY", "Run the query"
|
11
|
-
option :bucket, desc: 'S3 bucket where the query result is stored.', required: true
|
12
|
-
option :object_prefix, desc: 'S3 object prefix where the query result is stored. Default is `Unsaved/%Y/%m/%d`'
|
13
64
|
option :timeout, desc: 'Wait for execution of the query for this number of seconds', default: nil, type: :numeric
|
14
65
|
def query(query)
|
15
|
-
|
16
|
-
object_prefix = options[:object_prefix] || "Unsaved/#{Date.today.strftime("%Y/%m/%d")}"
|
17
|
-
Aq::Query.new(options[:bucket], object_prefix).run(query, options[:timeout])
|
66
|
+
Aq::Query.new(options[:bucket], options[:object_prefix]).run(query, options[:timeout])
|
18
67
|
end
|
19
68
|
|
20
69
|
desc "version", "Print the version"
|
21
70
|
def version
|
22
|
-
require 'aq/version'
|
23
71
|
puts "aq v#{Aq::VERSION}"
|
24
72
|
end
|
25
73
|
end
|
data/lib/aq/error.rb
ADDED
data/lib/aq/query.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
require 'aq/base'
|
4
|
+
require 'aq/error'
|
4
5
|
require 'aws-sdk-s3'
|
5
6
|
require 'csv'
|
6
7
|
require 'kosi'
|
@@ -10,6 +11,7 @@ module Aq
|
|
10
11
|
class Query < Base
|
11
12
|
def initialize(bucket, object_prefix)
|
12
13
|
super()
|
14
|
+
raise InvalidParameterError.new '`bucket` must be specified.' if bucket.nil? || bucket.empty?
|
13
15
|
@bucket = bucket
|
14
16
|
@object_prefix = object_prefix
|
15
17
|
end
|
@@ -79,7 +81,7 @@ module Aq
|
|
79
81
|
kosi = Kosi::Table.new({header: csv.headers})
|
80
82
|
print kosi.render(result)
|
81
83
|
else
|
82
|
-
print body.read
|
84
|
+
print body.read + "\n"
|
83
85
|
end
|
84
86
|
end
|
85
87
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'aq/error'
|
2
|
+
|
3
|
+
module Aq
|
4
|
+
class QueryBuilder
|
5
|
+
def self.ls(database)
|
6
|
+
if database.nil?
|
7
|
+
'SHOW DATABASES'
|
8
|
+
else
|
9
|
+
"SHOW TABLES IN #{database}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.head(table, num)
|
14
|
+
raise InvalidParameterError.new 'The table name must be specified in the format `DATABSE.TABLE`' unless table.include? '.'
|
15
|
+
"SELECT * FROM #{table} LIMIT #{num}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.mk(name)
|
19
|
+
if !name.include? '.'
|
20
|
+
"CREATE DATABASE IF NOT EXISTS #{name}"
|
21
|
+
else
|
22
|
+
raise InvalidParameterError.new 'Use `load` command if you create new table.'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.load(table, source, schema, source_format, patition)
|
27
|
+
raise InvalidParameterError.new '`SOURCE` must start with "s3://"' unless source.start_with? 's3://'
|
28
|
+
schema_state = schema.get_all.map do |s|
|
29
|
+
"`#{s[:name]}` #{s[:type]}"
|
30
|
+
end.join(',')
|
31
|
+
raise InvalidParameterError.new 'Now aq support only NEWLINE_DELIMITED_JSON.' unless %w(NEWLINE_DELIMITED_JSON).include? source_format
|
32
|
+
serde = 'org.apache.hive.hcatalog.data.JsonSerDe'
|
33
|
+
patition_state = patition.nil? ? '' : "PARTITIONED BY (#{patition.gsub(':', ' ')})"
|
34
|
+
|
35
|
+
<<"SQL"
|
36
|
+
CREATE EXTERNAL TABLE IF NOT EXISTS #{table} (
|
37
|
+
#{schema_state}
|
38
|
+
)
|
39
|
+
#{patition_state}
|
40
|
+
ROW FORMAT SERDE "#{serde}"
|
41
|
+
LOCATION "#{source}"
|
42
|
+
SQL
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.rm(name)
|
46
|
+
if !name.include? '.'
|
47
|
+
"DROP DATABASE IF EXISTS #{name}"
|
48
|
+
else
|
49
|
+
"DROP TABLE IF EXISTS #{name}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/aq/schema.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'aq/error'
|
5
|
+
|
6
|
+
module Aq
|
7
|
+
class Schema
|
8
|
+
def initialize
|
9
|
+
@schema = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def append_column(name, type, mode=nil)
|
13
|
+
nullable = mode != 'required'
|
14
|
+
column = {name: name, type: convert_type_from_bq_to_athena(type), nullable: nullable}
|
15
|
+
@schema.push column
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_all
|
19
|
+
@schema
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def convert_type_from_bq_to_athena(type)
|
24
|
+
=begin
|
25
|
+
Schema correspondence table
|
26
|
+
----------+----------
|
27
|
+
BQ | Athena
|
28
|
+
----------+----------
|
29
|
+
STRING | STRING
|
30
|
+
BYTES | ?
|
31
|
+
INTEGER | INT
|
32
|
+
FLOAT | DOUBLE
|
33
|
+
BOOLEAN | BOOLEAN
|
34
|
+
RECORD | ARRAY or MAP
|
35
|
+
TIMESTAMP | TIMESTAMP
|
36
|
+
DATE | DATE
|
37
|
+
TIME | TIMESTAMP
|
38
|
+
DATETIME | TIMESTAMP
|
39
|
+
=end
|
40
|
+
type.upcase!
|
41
|
+
case type
|
42
|
+
when 'BYTES'
|
43
|
+
raise NotSupportedError.new '`BYTES` is not supported in Athena.'
|
44
|
+
when 'INTEGER'
|
45
|
+
'BIGINT'
|
46
|
+
when 'FLOAT'
|
47
|
+
'DOUBLE'
|
48
|
+
when 'RECORD'
|
49
|
+
raise NotImplementedError.new 'Sorry, `RECORD` is not supported yet in aq.'
|
50
|
+
when 'TIME', 'DATETIME'
|
51
|
+
'TIMESTAMP'
|
52
|
+
else
|
53
|
+
type
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class SchemaLoader
|
59
|
+
def load(schema)
|
60
|
+
if File.exist? File.expand_path(schema)
|
61
|
+
load_from_file File.expand_path(schema)
|
62
|
+
else
|
63
|
+
load_from_string schema
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def load_from_file(file_path)
|
69
|
+
schema = Schema.new
|
70
|
+
JSON.load(File.open(file_path).read).each do |c|
|
71
|
+
if c.has_key? 'mode'
|
72
|
+
schema.append_column c['name'], c['type'], c['mode']
|
73
|
+
else
|
74
|
+
schema.append_column c['name'], c['type']
|
75
|
+
end
|
76
|
+
end
|
77
|
+
schema
|
78
|
+
end
|
79
|
+
|
80
|
+
def load_from_string(str)
|
81
|
+
schema = Schema.new
|
82
|
+
str.split(',').each do |column|
|
83
|
+
c = column.split(':')
|
84
|
+
schema.append_column c[0], c[1]
|
85
|
+
end
|
86
|
+
schema
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
data/lib/aq/version.rb
CHANGED
@@ -0,0 +1,98 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require 'aq/error'
|
3
|
+
require 'aq/query_builder'
|
4
|
+
require 'aq/schema'
|
5
|
+
|
6
|
+
module Aq
|
7
|
+
class QueryBuilderTest < Test::Unit::TestCase
|
8
|
+
sub_test_case 'ls' do
|
9
|
+
test 'show databases' do
|
10
|
+
query = QueryBuilder.ls nil
|
11
|
+
expected = 'SHOW DATABASES'
|
12
|
+
assert_equal(expected, query)
|
13
|
+
end
|
14
|
+
|
15
|
+
test 'show tables' do
|
16
|
+
query = QueryBuilder.ls 'my_db'
|
17
|
+
expected = 'SHOW TABLES IN my_db'
|
18
|
+
assert_equal(expected, query)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
sub_test_case 'head' do
|
23
|
+
test 'select' do
|
24
|
+
query = QueryBuilder.head 'my_db.my_table', 10
|
25
|
+
expected = 'SELECT * FROM my_db.my_table LIMIT 10'
|
26
|
+
assert_equal(expected, query)
|
27
|
+
end
|
28
|
+
|
29
|
+
test 'invalid table name' do
|
30
|
+
assert_raise InvalidParameterError do
|
31
|
+
QueryBuilder.head 'my_table', 10
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
sub_test_case 'mk' do
|
37
|
+
test 'create database' do
|
38
|
+
query = QueryBuilder.mk 'my_db'
|
39
|
+
expected = 'CREATE DATABASE IF NOT EXISTS my_db'
|
40
|
+
assert_equal(expected, query)
|
41
|
+
end
|
42
|
+
|
43
|
+
test 'create table' do
|
44
|
+
assert_raise InvalidParameterError do
|
45
|
+
QueryBuilder.mk 'my_db.my_table'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
sub_test_case 'load' do
|
51
|
+
test 'create table with partition' do
|
52
|
+
schema = SchemaLoader.new.load 'test/resource/schema.json'
|
53
|
+
query = QueryBuilder.load(
|
54
|
+
'my_db.my_table', 's3://hoge/foo/', schema, 'NEWLINE_DELIMITED_JSON', 'dt:string'
|
55
|
+
)
|
56
|
+
expected = <<'SQL'
|
57
|
+
CREATE EXTERNAL TABLE IF NOT EXISTS my_db.my_table (
|
58
|
+
`str0` STRING,`str1` STRING,`str2` STRING
|
59
|
+
)
|
60
|
+
PARTITIONED BY (dt string)
|
61
|
+
ROW FORMAT SERDE "org.apache.hive.hcatalog.data.JsonSerDe"
|
62
|
+
LOCATION "s3://hoge/foo/"
|
63
|
+
SQL
|
64
|
+
assert_equal(expected, query)
|
65
|
+
end
|
66
|
+
|
67
|
+
test 'create table without partition' do
|
68
|
+
schema = SchemaLoader.new.load 'test/resource/schema.json'
|
69
|
+
query = QueryBuilder.load(
|
70
|
+
'my_db.my_table', 's3://hoge/foo/', schema, 'NEWLINE_DELIMITED_JSON', nil
|
71
|
+
)
|
72
|
+
expected = <<'SQL'
|
73
|
+
CREATE EXTERNAL TABLE IF NOT EXISTS my_db.my_table (
|
74
|
+
`str0` STRING,`str1` STRING,`str2` STRING
|
75
|
+
)
|
76
|
+
|
77
|
+
ROW FORMAT SERDE "org.apache.hive.hcatalog.data.JsonSerDe"
|
78
|
+
LOCATION "s3://hoge/foo/"
|
79
|
+
SQL
|
80
|
+
assert_equal(expected, query)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
sub_test_case 'rm' do
|
85
|
+
test 'drop database' do
|
86
|
+
query = QueryBuilder.rm 'my_db'
|
87
|
+
expected = 'DROP DATABASE IF EXISTS my_db'
|
88
|
+
assert_equal(expected, query)
|
89
|
+
end
|
90
|
+
|
91
|
+
test 'drop table' do
|
92
|
+
query = QueryBuilder.rm 'my_db.my_table'
|
93
|
+
expected = 'DROP TABLE IF EXISTS my_db.my_table'
|
94
|
+
assert_equal(expected, query)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require 'aq/error'
|
3
|
+
require 'aq/schema'
|
4
|
+
|
5
|
+
module Aq
|
6
|
+
class SchemaTest < Test::Unit::TestCase
|
7
|
+
setup do
|
8
|
+
@schema = Schema.new
|
9
|
+
end
|
10
|
+
|
11
|
+
test 'ok' do
|
12
|
+
@schema.append_column 'str0', 'string'
|
13
|
+
@schema.append_column 'str1', 'string', 'required'
|
14
|
+
@schema.append_column 'str2', 'string', 'nullable'
|
15
|
+
@schema.append_column 'num', 'integer'
|
16
|
+
@schema.append_column 'f', 'float'
|
17
|
+
@schema.append_column 'bool', 'boolean'
|
18
|
+
@schema.append_column 'ts', 'timestamp'
|
19
|
+
@schema.append_column 'd', 'date'
|
20
|
+
@schema.append_column 't', 'time'
|
21
|
+
@schema.append_column 'dt', 'datetime'
|
22
|
+
|
23
|
+
expected = [
|
24
|
+
{name: 'str0', type: 'STRING' , nullable: true },
|
25
|
+
{name: 'str1', type: 'STRING' , nullable: false},
|
26
|
+
{name: 'str2', type: 'STRING' , nullable: true },
|
27
|
+
{name: 'num', type: 'BIGINT' , nullable: true },
|
28
|
+
{name: 'f', type: 'DOUBLE' , nullable: true },
|
29
|
+
{name: 'bool', type: 'BOOLEAN' , nullable: true },
|
30
|
+
{name: 'ts', type: 'TIMESTAMP', nullable: true },
|
31
|
+
{name: 'd', type: 'DATE' , nullable: true },
|
32
|
+
{name: 't', type: 'TIMESTAMP', nullable: true },
|
33
|
+
{name: 'dt', type: 'TIMESTAMP', nullable: true },
|
34
|
+
]
|
35
|
+
|
36
|
+
assert_equal(expected, @schema.get_all)
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'not supported type' do
|
40
|
+
assert_raise NotSupportedError do
|
41
|
+
@schema.append_column 'ng', 'bytes'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
test 'not implemented type' do
|
46
|
+
assert_raise NotImplementedError do
|
47
|
+
@schema.append_column 'ng', 'record'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class SchemaLoaderTest < Test::Unit::TestCase
|
53
|
+
setup do
|
54
|
+
@loader = SchemaLoader.new
|
55
|
+
end
|
56
|
+
|
57
|
+
test 'from file' do
|
58
|
+
result = @loader.load('test/resource/schema.json').get_all
|
59
|
+
expected = [
|
60
|
+
{name: 'str0', type: 'STRING', nullable: false},
|
61
|
+
{name: 'str1', type: 'STRING', nullable: true },
|
62
|
+
{name: 'str2', type: 'STRING', nullable: true }
|
63
|
+
]
|
64
|
+
assert_equal(expected, result)
|
65
|
+
end
|
66
|
+
|
67
|
+
test 'from string' do
|
68
|
+
result = @loader.load('str0:STRING,str1:STRING,str2:STRING').get_all
|
69
|
+
expected = [
|
70
|
+
{name: 'str0', type: 'STRING', nullable: true},
|
71
|
+
{name: 'str1', type: 'STRING', nullable: true },
|
72
|
+
{name: 'str2', type: 'STRING', nullable: true }
|
73
|
+
]
|
74
|
+
assert_equal(expected, result)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshihiro MIYAI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '0.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '0.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: aws-sdk-athena
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: highline
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: bundler
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -140,9 +154,14 @@ files:
|
|
140
154
|
- bin/aq
|
141
155
|
- lib/aq/base.rb
|
142
156
|
- lib/aq/command.rb
|
157
|
+
- lib/aq/error.rb
|
143
158
|
- lib/aq/query.rb
|
159
|
+
- lib/aq/query_builder.rb
|
160
|
+
- lib/aq/schema.rb
|
144
161
|
- lib/aq/version.rb
|
145
|
-
- test/aq/
|
162
|
+
- test/aq/test_query_builder.rb
|
163
|
+
- test/aq/test_schema.rb
|
164
|
+
- test/resource/schema.json
|
146
165
|
- test/test_helper.rb
|
147
166
|
homepage: https://github.com/mia-0032/aq
|
148
167
|
licenses:
|
@@ -169,5 +188,7 @@ signing_key:
|
|
169
188
|
specification_version: 4
|
170
189
|
summary: Command Line Tool for AWS Athena (bq command like)
|
171
190
|
test_files:
|
172
|
-
- test/aq/
|
191
|
+
- test/aq/test_query_builder.rb
|
192
|
+
- test/aq/test_schema.rb
|
193
|
+
- test/resource/schema.json
|
173
194
|
- test/test_helper.rb
|