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 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