aq 0.0.1 → 0.1.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: 42a8c4ed6011726e5d62b1926a5f20fba8e6e093
4
- data.tar.gz: 6050ecc604778075a1a2cb523f51b4d694d5ba2a
3
+ metadata.gz: 044c3e56fb4aeb56f5ead7205d9919f4dfbe8efb
4
+ data.tar.gz: 8ed0ea0d85526f8439a127fc85abde8c52ae2a61
5
5
  SHA512:
6
- metadata.gz: 3abd963cddbfbe9f1cd905985073183161102da1c1be47cf9a2cdf82643ffe6753d5cb418e9abe5ca379618a321ec875fee77243f6c1c5de0c7343e15069acc3
7
- data.tar.gz: 67ad4c36da859a8586f02458ab0a0d92a8d52feda03a49a211e7be52774e7b614dd48d813dedc94b10da145981b115d3e96eb8e0995b4bc7b8fa5c6a5131cfd1
6
+ metadata.gz: 879e730fac2abee336ed7c8f8a888c849918bff440e808b744d6b08d1f690cf84323d86c0b99d540b23fc029bd9aa44e21bf5dd7f36730d6c116e021a7c23187
7
+ data.tar.gz: 3ad0511876952645be034aefb63841f261efd9516d0af2060f2fc6e95476b174afdb11699a390d3e9a52f68a802c4e0b6273f3dfc9da216652839458ffea4d11
@@ -5,3 +5,4 @@ rvm:
5
5
  - 2.3.4
6
6
  - 2.4.2
7
7
  before_install: gem install bundler
8
+ script: bundle exec rake test
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;' --bucket=aws-athena-query-results-xxxx-region
74
+ $ aq query 'SELECT * FROM "test"."test_logs" limit 10;'
21
75
  ```
22
76
 
23
77
  ## Development
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ require 'rake/testtask'
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
5
  t.libs << 'test' << 'lib'
6
- t.test_files = FileList['test/**/*_test.rb']
6
+ t.test_files = FileList['test/**/test_*.rb']
7
7
  end
8
8
 
9
9
  task :default => :test
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"
@@ -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
- require 'aq/query'
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
@@ -0,0 +1,5 @@
1
+ module Aq
2
+ class InvalidParameterError < StandardError; end
3
+ class NotSupportedError < StandardError; end
4
+ class NotImplementedError < StandardError; end
5
+ end
@@ -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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Aq
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -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
@@ -0,0 +1,5 @@
1
+ [
2
+ {"name": "str0", "type": "string", "mode": "required"},
3
+ {"name": "str1", "type": "string", "mode": "nullable"},
4
+ {"name": "str2", "type": "string"}
5
+ ]
@@ -11,7 +11,6 @@ require 'test/unit'
11
11
  require 'test/unit/rr'
12
12
 
13
13
  $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
14
- require 'aq'
15
14
 
16
15
  class Test::Unit::TestCase
17
16
  end
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.1
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-10-31 00:00:00.000000000 Z
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/aq_test.rb
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/aq_test.rb
191
+ - test/aq/test_query_builder.rb
192
+ - test/aq/test_schema.rb
193
+ - test/resource/schema.json
173
194
  - test/test_helper.rb
@@ -1,11 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- class AqTest < Test::Unit::TestCase
4
- def test_that_it_has_a_version_number
5
- refute_nil ::Aq::VERSION
6
- end
7
-
8
- def test_it_does_something_useful
9
- assert false
10
- end
11
- end