sssummary 0.0.1
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.
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/bin/sssummary +53 -0
- data/lib/Sssummary.rb +166 -0
- data/lib/sssummary/version.rb +3 -0
- data/spec/sssammary_spec.rb +298 -0
- data/spec/test_file/test.csv +10 -0
- data/spec/test_file/test.tsv +10 -0
- data/spec/test_file/test_column_names.tsv +10 -0
- data/spec/test_file/test_column_names_result.tsv +9 -0
- data/spec/test_file/test_complex_sql_result.tsv +2 -0
- data/spec/test_file/test_empty.tsv +0 -0
- data/spec/test_file/test_empty_result.tsv +1 -0
- data/spec/test_file/test_header.tsv +11 -0
- data/spec/test_file/test_header_result1.tsv +10 -0
- data/spec/test_file/test_header_result2.tsv +9 -0
- data/spec/test_file/test_ngtest.tsv +12 -0
- data/spec/test_file/test_output_separator_result.csv +9 -0
- data/spec/test_file/test_result.csv +9 -0
- data/spec/test_file/test_result.tsv +9 -0
- data/spec/test_file/test_verbose_result.tsv +17 -0
- data/sssummary.gemspec +22 -0
- metadata +119 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 akira-kuriyama
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Sssummary
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'sssummary'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install sssummary
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/bin/sssummary
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require_relative '../lib/Sssummary'
|
7
|
+
require 'optparse'
|
8
|
+
|
9
|
+
options = {}
|
10
|
+
opt = OptionParser.new
|
11
|
+
opt.on('-f FILE', '--file=FILE') { |v| options[:file] = v }
|
12
|
+
opt.on('-p DBFILE', '--database-file=DBFILE') { |v| options[:dbfile] = v }
|
13
|
+
opt.on('-d DB', '--database=DB') { |v| options[:db_name] = v }
|
14
|
+
opt.on('-t TABLE', '--table=TABLE') { |v| options[:table_name] = v }
|
15
|
+
opt.on('-c COLUMNS', '--columns=COLUMNS') { |v| options[:column_names] = v.split(',') }
|
16
|
+
opt.on('-s IMPORT-SEPARATOR', '--import-separator=IMPORT-SEPARATOR') { |v| options[:import_separator] = v }
|
17
|
+
opt.on('-o OUTPUT-SEPARATOR', '--output-separator=OUTPUT-SEPARATOR') { |v| options[:output_separator] = v }
|
18
|
+
opt.on('-u', '--leave-database') { |v| options[:leave_database] = v }
|
19
|
+
opt.on('-i', '--ignore-header') { |v| options[:ignore_header] = v }
|
20
|
+
opt.on('-v', '--verbose') { |v| options[:verbose] = v }
|
21
|
+
opt.on('-h', '--help') { |v| options[:help] = v }
|
22
|
+
begin
|
23
|
+
opt.permute!(ARGV)
|
24
|
+
rescue OptionParser::ParseError
|
25
|
+
options[:error] = true
|
26
|
+
end
|
27
|
+
show_help if options[:error] || options[:help]
|
28
|
+
sql = ARGV[0]
|
29
|
+
|
30
|
+
def show_help
|
31
|
+
puts <<"EOH"
|
32
|
+
usage: scollct [OPTION]... SQL
|
33
|
+
-f, --file file path for aggregation.
|
34
|
+
If this option are not specified, read aggregation data from STANDARD INPUT.
|
35
|
+
-d, --database database name.
|
36
|
+
-p, --database file the path where you want to save the database file.
|
37
|
+
-t, --table table name.
|
38
|
+
-c, --columns column names. (e.g., date,url,elapsed_time)
|
39
|
+
-s, --import-separator The String placed between each field in import file. default string is TAB.
|
40
|
+
-o, --output-separator The String placed between each field in output. default string is TAB.
|
41
|
+
-l, --leave-database leave the database. If this option are not specified, delete the database file after processing.
|
42
|
+
-i, --ignore-header ignore header(first line) in import file
|
43
|
+
-v, --verbose explain what is being done.
|
44
|
+
-h, --help show this message
|
45
|
+
EOH
|
46
|
+
exit(0) if options[:help]
|
47
|
+
exit(1)
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
52
|
+
puts output
|
53
|
+
exit exit_status
|
data/lib/Sssummary.rb
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'sqlite3'
|
4
|
+
require 'csv'
|
5
|
+
|
6
|
+
class Sssummary
|
7
|
+
|
8
|
+
public
|
9
|
+
def execute(options, sql)
|
10
|
+
begin
|
11
|
+
set_up(options, sql)
|
12
|
+
|
13
|
+
@records = get_records
|
14
|
+
create_table
|
15
|
+
import
|
16
|
+
result_records = execute_sql
|
17
|
+
@messages << get_output(result_records)
|
18
|
+
@exit_status = 0
|
19
|
+
rescue FileEmptyError
|
20
|
+
@exit_status = 1
|
21
|
+
@messages << "Error : input data is empty!\n"
|
22
|
+
ensure
|
23
|
+
drop unless @db.nil?
|
24
|
+
end
|
25
|
+
return @exit_status, @messages.join("\n")
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def set_up(options, sql)
|
30
|
+
@messages = []
|
31
|
+
@messages << 'options : ' + options.to_s if options[:verbose]
|
32
|
+
@options = options
|
33
|
+
@sql = sql
|
34
|
+
@input_file = get_input_file(options)
|
35
|
+
@options[:import_separator] ||= "\t"
|
36
|
+
@options[:output_separator] ||= "\t"
|
37
|
+
@options[:db_name] ||= 'db1'
|
38
|
+
@options[:table_name] ||= 't'
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_input_file(options)
|
42
|
+
input_file = nil
|
43
|
+
if options[:file].nil?
|
44
|
+
if File.pipe?(STDIN)
|
45
|
+
input_file = STDIN
|
46
|
+
end
|
47
|
+
else
|
48
|
+
input_file = open(options[:file])
|
49
|
+
end
|
50
|
+
input_file.gets if options[:ignore_header] && !input_file.nil?
|
51
|
+
input_file
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# get data from STANDARD INPUT or FILE
|
56
|
+
def get_records
|
57
|
+
raise FileEmptyError if @input_file.nil?
|
58
|
+
options = {:col_sep => @options[:import_separator], :skip_blanks => true}
|
59
|
+
records = CSV.parse(@input_file, options)
|
60
|
+
raise FileEmptyError if records.empty?
|
61
|
+
records
|
62
|
+
end
|
63
|
+
|
64
|
+
def import
|
65
|
+
insert_sql = 'INSERT INTO ' + @options[:table_name] +' VALUES('
|
66
|
+
insert_sql += Array.new(@options[:column_names].length, '?').join(',')
|
67
|
+
insert_sql +=');'
|
68
|
+
@messages << 'insert sql : ' + insert_sql if @options[:verbose]
|
69
|
+
stmt = nil
|
70
|
+
begin
|
71
|
+
stmt = @db.prepare(insert_sql)
|
72
|
+
@db.transaction do
|
73
|
+
@records.each do |record|
|
74
|
+
stmt.execute(record)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
ensure
|
78
|
+
stmt.close unless stmt.nil?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_output(result_records)
|
83
|
+
return if result_records.nil?
|
84
|
+
@messages << 'sql : ' + @sql if @options[:verbose]
|
85
|
+
options = {:col_sep => @options[:output_separator]}
|
86
|
+
csv = CSV.generate('', options) do |csv|
|
87
|
+
result_records.each do |record|
|
88
|
+
csv << record
|
89
|
+
end
|
90
|
+
end
|
91
|
+
@messages << 'result : ' if @options[:verbose]
|
92
|
+
csv
|
93
|
+
end
|
94
|
+
|
95
|
+
def create_table
|
96
|
+
@db = SQLite3::Database.new(get_dbfile_path)
|
97
|
+
@messages << 'created Database at ' + get_dbfile_path if @options[:verbose]
|
98
|
+
@db.execute(drop_table_sql)
|
99
|
+
@db.execute(create_table_sql)
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_dbfile_path
|
103
|
+
dbfile_path = nil
|
104
|
+
if @options[:dbfile].nil?
|
105
|
+
dbfile_path = `pwd`.strip
|
106
|
+
else
|
107
|
+
dbfile_path = @options[:dbfile]
|
108
|
+
end
|
109
|
+
dbfile_path += '/' unless dbfile_path.end_with?('/')
|
110
|
+
dbfile_path += @options[:db_name] + '.db'
|
111
|
+
end
|
112
|
+
|
113
|
+
def create_table_sql
|
114
|
+
sql = "CREATE TABLE #{@options[:table_name]} ("
|
115
|
+
sql += get_column_sql
|
116
|
+
sql += ');'
|
117
|
+
@messages << 'create table sql : ' + sql if @options[:verbose]
|
118
|
+
sql
|
119
|
+
end
|
120
|
+
|
121
|
+
def get_column_sql
|
122
|
+
column_names = @options[:column_names]
|
123
|
+
if column_names.nil?
|
124
|
+
column_names = []
|
125
|
+
@records[0].length.times do |i|
|
126
|
+
column_names << "c#{i+1}"
|
127
|
+
end
|
128
|
+
@options[:column_names] = column_names
|
129
|
+
end
|
130
|
+
column_sql = column_names.map do |column|
|
131
|
+
s = column.split(':')
|
132
|
+
if s.length == 1
|
133
|
+
s << 'text'
|
134
|
+
end
|
135
|
+
s.join(' ')
|
136
|
+
end
|
137
|
+
column_sql.join(',')
|
138
|
+
end
|
139
|
+
|
140
|
+
def execute_sql
|
141
|
+
return if @sql.nil?
|
142
|
+
@db.execute(@sql)
|
143
|
+
end
|
144
|
+
|
145
|
+
#create index automatically by analyzing where clause.
|
146
|
+
def create_index
|
147
|
+
#TODO
|
148
|
+
end
|
149
|
+
|
150
|
+
def drop_table_sql
|
151
|
+
"DROP TABLE IF EXISTS #{@options[:table_name]};"
|
152
|
+
end
|
153
|
+
|
154
|
+
def drop
|
155
|
+
@db.close
|
156
|
+
unless @options[:leave_database]
|
157
|
+
File.delete(get_dbfile_path)
|
158
|
+
@messages << 'drop Database at ' + get_dbfile_path if @options[:verbose]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
class FileEmptyError < StandardError;
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
|
@@ -0,0 +1,298 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'rspec'
|
3
|
+
require_relative '../lib/Sssummary'
|
4
|
+
|
5
|
+
describe 'Sssummary' do
|
6
|
+
|
7
|
+
it 'SQLが実行されること' do
|
8
|
+
options = {}
|
9
|
+
options[:file] = 'spec/test_file/test.tsv'
|
10
|
+
sql= 'select * from t order by c1'
|
11
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
12
|
+
|
13
|
+
exit_status.should == 0
|
14
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'インポートされるファイルが空だった場合、エラーメッセージが出力されること' do
|
18
|
+
options = {}
|
19
|
+
sql= 'select * from t order by c1'
|
20
|
+
options[:file] = 'spec/test_file/test_empty.tsv'
|
21
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
22
|
+
|
23
|
+
exit_status.should == 1
|
24
|
+
output.should == File.read('spec/test_file/test_empty_result.tsv').to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'インポートされるファイル場所が存在しなかった場合、エラーが発生すること' do
|
28
|
+
options = {}
|
29
|
+
sql= 'select * from t order by c1'
|
30
|
+
options[:file] = 'spec/test_file/not_exists.tsv'
|
31
|
+
|
32
|
+
lambda {
|
33
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
34
|
+
}.should raise_error(Errno::ENOENT)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'dbfileの保存場所を指定しない場合、カレントディレクトリに保存されること' do
|
38
|
+
options = {}
|
39
|
+
options[:file] = 'spec/test_file/test.tsv'
|
40
|
+
options[:leave_database] = true
|
41
|
+
sql= 'select * from t order by c1'
|
42
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
43
|
+
|
44
|
+
exit_status.should == 0
|
45
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
46
|
+
File.exist?('db1.db').should be_true
|
47
|
+
File.delete('db1.db')
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'dbfileの保存場所を指定した場合、その保存場所にdbfileが作成されること' do
|
51
|
+
options = {}
|
52
|
+
options[:file] = 'spec/test_file/test.tsv'
|
53
|
+
options[:leave_database] = true
|
54
|
+
options[:dbfile] = 'spec/test_file'
|
55
|
+
sql= 'select * from t order by c1'
|
56
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
57
|
+
|
58
|
+
exit_status.should == 0
|
59
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
60
|
+
File.exist?('spec/test_file/db1.db').should be_true
|
61
|
+
File.delete('spec/test_file/db1.db')
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'dbfileの保存場所が不正だった場合、エラーが発生すること' do
|
65
|
+
options = {}
|
66
|
+
options[:file] = 'spec/test_file/test.tsv'
|
67
|
+
options[:dbfile] = 'spec/not_exists'
|
68
|
+
sql= 'select * from t order by c1'
|
69
|
+
lambda {
|
70
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
71
|
+
}.should raise_error(SQLite3::CantOpenException)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'db名を指定しない場合、デフォルトのdb名になること' do
|
75
|
+
options = {}
|
76
|
+
options[:file] = 'spec/test_file/test.tsv'
|
77
|
+
options[:leave_database] = true
|
78
|
+
sql= 'select * from t order by c1'
|
79
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
80
|
+
|
81
|
+
exit_status.should == 0
|
82
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
83
|
+
File.exist?('db1.db').should be_true
|
84
|
+
File.delete('db1.db')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'db名を指定した場合、指定されたdb名になること' do
|
88
|
+
options = {}
|
89
|
+
options[:file] = 'spec/test_file/test.tsv'
|
90
|
+
options[:leave_database] = true
|
91
|
+
options[:db_name] = 'special'
|
92
|
+
|
93
|
+
sql= 'select * from t order by c1'
|
94
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
95
|
+
|
96
|
+
exit_status.should == 0
|
97
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
98
|
+
File.exist?('special.db').should be_true
|
99
|
+
File.delete('special.db')
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'テーブル名を指定しない場合、デフォルトのテーブル名になること' do
|
103
|
+
options = {}
|
104
|
+
options[:file] = 'spec/test_file/test.tsv'
|
105
|
+
sql= 'select * from t order by c1'
|
106
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
107
|
+
|
108
|
+
exit_status.should == 0
|
109
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'テーブル名を指定した場合、指定されたテーブル名になること' do
|
113
|
+
options = {}
|
114
|
+
options[:file] = 'spec/test_file/test.tsv'
|
115
|
+
options[:table_name] = 'log'
|
116
|
+
sql= 'select * from log order by c1'
|
117
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
118
|
+
|
119
|
+
exit_status.should == 0
|
120
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
121
|
+
end
|
122
|
+
|
123
|
+
it '不正なテーブル名を指定した場合、エラーになること' do
|
124
|
+
options = {}
|
125
|
+
options[:file] = 'spec/test_file/test.tsv'
|
126
|
+
options[:table_name] = 'select'
|
127
|
+
sql= 'select * from select order by c1'
|
128
|
+
|
129
|
+
lambda {
|
130
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
131
|
+
}.should raise_error(SQLite3::SQLException)
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'カラム名を指定しない場合、デフォルトのカラム名になること' do
|
135
|
+
options = {}
|
136
|
+
options[:file] = 'spec/test_file/test.tsv'
|
137
|
+
sql= 'select c1, c2, c3 from t order by c1'
|
138
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
139
|
+
|
140
|
+
exit_status.should == 0
|
141
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'カラム名を指定した場合、指定されたカラム名になること' do
|
145
|
+
options = {}
|
146
|
+
options[:file] = 'spec/test_file/test_column_names.tsv'
|
147
|
+
options[:column_names] = 'time,elapsed,ua'.split(',')
|
148
|
+
sql= 'select time, elapsed, ua from t order by time'
|
149
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
150
|
+
|
151
|
+
exit_status.should == 0
|
152
|
+
output.should == File.read('spec/test_file/test_column_names_result.tsv').to_s
|
153
|
+
end
|
154
|
+
|
155
|
+
it '不正なカラム名を指定した場合、エラーが発生すること' do
|
156
|
+
options = {}
|
157
|
+
options[:file] = 'spec/test_file/test_column_names.tsv'
|
158
|
+
options[:column_names] = 'select,elapsed,ua'.split(',')
|
159
|
+
sql= 'select time, elapsed, ua from t order by time'
|
160
|
+
|
161
|
+
lambda {
|
162
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
163
|
+
}.should raise_error(SQLite3::SQLException)
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'インポートするファイルの区切り文字を指定しない場合、タブ区切りでparseされること' do
|
167
|
+
options = {}
|
168
|
+
options[:file] = 'spec/test_file/test.tsv'
|
169
|
+
sql= 'select * from t order by c1'
|
170
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
171
|
+
|
172
|
+
exit_status.should == 0
|
173
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'インポートするファイルの区切り文字を指定した場合、その区切り文字でparseされること' do
|
177
|
+
options = {}
|
178
|
+
options[:file] = 'spec/test_file/test.csv'
|
179
|
+
options[:import_separator] = ','
|
180
|
+
sql= 'select * from t order by c1'
|
181
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
182
|
+
|
183
|
+
exit_status.should == 0
|
184
|
+
output.should == File.read('spec/test_file/test_result.csv').to_s
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'アウトプットの区切り文字を指定しない場合、タグ区切り文字で出力されること' do
|
188
|
+
options = {}
|
189
|
+
options[:file] = 'spec/test_file/test.tsv'
|
190
|
+
sql= 'select * from t order by c1'
|
191
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
192
|
+
|
193
|
+
exit_status.should == 0
|
194
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'アウトプットの区切り文字を指定した場合、その区切り文字で出力されること' do
|
198
|
+
options = {}
|
199
|
+
options[:file] = 'spec/test_file/test.tsv'
|
200
|
+
options[:output_separator] = ','
|
201
|
+
sql= 'select * from t order by c1'
|
202
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
203
|
+
|
204
|
+
exit_status.should == 0
|
205
|
+
output.should == File.read('spec/test_file/test_output_separator_result.csv').to_s
|
206
|
+
end
|
207
|
+
|
208
|
+
it 'leave-databaseオプションを指定しない場合、実行後にdbファイルが削除されていること' do
|
209
|
+
options = {}
|
210
|
+
options[:file] = 'spec/test_file/test.tsv'
|
211
|
+
sql= 'select * from t order by c1'
|
212
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
213
|
+
|
214
|
+
exit_status.should == 0
|
215
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
216
|
+
File.exist?('db1.db').should be_false
|
217
|
+
end
|
218
|
+
|
219
|
+
it 'leave-databaseオプションを指定した場合、実行後にdbファイルが削除されていないこと' do
|
220
|
+
options = {}
|
221
|
+
options[:file] = 'spec/test_file/test.tsv'
|
222
|
+
options[:leave_database] = true
|
223
|
+
sql= 'select * from t order by c1'
|
224
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
225
|
+
|
226
|
+
exit_status.should == 0
|
227
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
228
|
+
File.exist?('db1.db').should be_true
|
229
|
+
File.delete('db1.db')
|
230
|
+
end
|
231
|
+
|
232
|
+
it 'ignore-headerオプションを指定しない場合、ヘッダーはインポートされること' do
|
233
|
+
options = {}
|
234
|
+
sql= 'select * from t order by c1'
|
235
|
+
options[:file] = 'spec/test_file/test_header.tsv'
|
236
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
237
|
+
|
238
|
+
exit_status.should == 0
|
239
|
+
output.should == File.read('spec/test_file/test_header_result1.tsv').to_s
|
240
|
+
end
|
241
|
+
|
242
|
+
it 'ignore-headerオプションを指定した場合、ヘッダーはインポートされないこと' do
|
243
|
+
options = {}
|
244
|
+
options[:ignore_header] = true
|
245
|
+
options[:file] = 'spec/test_file/test_header.tsv'
|
246
|
+
sql= 'select * from t order by c1'
|
247
|
+
|
248
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
249
|
+
|
250
|
+
exit_status.should == 0
|
251
|
+
output.should == File.read('spec/test_file/test_header_result2.tsv').to_s
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'verboseオプションを指定しない場合、詳細メッセージは表示されないこと' do
|
255
|
+
options = {}
|
256
|
+
options[:file] = 'spec/test_file/test.tsv'
|
257
|
+
sql= 'select * from t order by c1'
|
258
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
259
|
+
|
260
|
+
exit_status.should == 0
|
261
|
+
output.should == File.read('spec/test_file/test_result.tsv').to_s
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'verboseオプションを指定した場合、詳細メッセージは表示されること' do
|
265
|
+
options = {}
|
266
|
+
options[:file] = 'spec/test_file/test.tsv'
|
267
|
+
options[:verbose] = true
|
268
|
+
sql= 'select * from t order by c1'
|
269
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
270
|
+
|
271
|
+
exit_status.should == 0
|
272
|
+
result = File.read('spec/test_file/test_verbose_result.tsv').to_s.gsub('#pwd#', `pwd`.strip)
|
273
|
+
output.should == result
|
274
|
+
end
|
275
|
+
|
276
|
+
it '複雑なSQLが実行できること' do
|
277
|
+
options = {}
|
278
|
+
options[:file] = 'spec/test_file/test.tsv'
|
279
|
+
options[:column_names] = 'time,elapsed,ua'.split(',')
|
280
|
+
sql= 'select time, avg(elapsed) from t where ua like \'%Android%\' group by time order by avg(elapsed)'
|
281
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
282
|
+
|
283
|
+
exit_status.should == 0
|
284
|
+
output.should == File.read('spec/test_file/test_complex_sql_result.tsv').to_s
|
285
|
+
end
|
286
|
+
|
287
|
+
it '不正なSQLを実行した場合、エラーが発生すること' do
|
288
|
+
options = {}
|
289
|
+
options[:file] = 'spec/test_file/test_ngtest.tsv'
|
290
|
+
options[:import_separator] = ','
|
291
|
+
options[:column_names] = 'time,elapsed,ua'.split(',')
|
292
|
+
sql= 'select time, avg(elapsed) from t where ua like \'%Android%\' group by time order by avg(elapsed)'
|
293
|
+
lambda {
|
294
|
+
exit_status, output = Sssummary.new.execute(options, sql)
|
295
|
+
}.should raise_error(SQLite3::RangeException)
|
296
|
+
end
|
297
|
+
|
298
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
"2013/07/01 23:08","100","Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25"
|
2
|
+
"2013/07/01 23:08","110","Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"
|
3
|
+
"2013/07/01 23:09","120","Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"
|
4
|
+
"2013/07/01 23:09","104","Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
|
5
|
+
|
6
|
+
"2013/07/01 23:09","110","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)"
|
7
|
+
"2013/07/01 23:10","130","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36"
|
8
|
+
"2013/07/01 23:10","190","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"
|
9
|
+
"2013/07/01 23:11","600","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25"
|
10
|
+
"2013/07/01 23:11","890","Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13"
|
@@ -0,0 +1,10 @@
|
|
1
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
2
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
3
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
4
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
5
|
+
|
6
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
7
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
8
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
9
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
10
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
@@ -0,0 +1,10 @@
|
|
1
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
2
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
3
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
4
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
5
|
+
|
6
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
7
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
8
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
9
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
10
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
@@ -0,0 +1,9 @@
|
|
1
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
2
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
3
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
4
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
5
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
6
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
7
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
8
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
9
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
Error : input data is empty!
|
@@ -0,0 +1,11 @@
|
|
1
|
+
time elapsed ua
|
2
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
3
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
4
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
5
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
6
|
+
|
7
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
8
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
9
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
10
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
11
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
@@ -0,0 +1,10 @@
|
|
1
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
2
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
3
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
4
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
5
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
6
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
7
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
8
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
9
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
10
|
+
time elapsed ua
|
@@ -0,0 +1,9 @@
|
|
1
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
2
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
3
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
4
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
5
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
6
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
7
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
8
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
9
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
@@ -0,0 +1,12 @@
|
|
1
|
+
time,elapsed,ua
|
2
|
+
2013/07/01 23:08,100,Android hoge 1-234
|
3
|
+
2013/06/01 20:08,110,Android hoge 1-234
|
4
|
+
2013/07/01 20:0,Android hoge 1-jo234
|
5
|
+
h
|
6
|
+
2013/07/01 23:07,104,Android hoge fewkk1-234
|
7
|
+
2013/07/01 23:07
|
8
|
+
2013/07/01 23:28,110,Android hofewfge 1-234
|
9
|
+
201,,,,,3/07/01 21:18,130,Android hxfewoge 1-234
|
10
|
+
2013/07/01 20:55,190,Android hoge 1-234
|
11
|
+
'2013/07/02 22:08','600','Andrfewfkoid hoge 1-234'
|
12
|
+
2013/06/30 12:00,890,Anfekdroid hoge 1-234
|
@@ -0,0 +1,9 @@
|
|
1
|
+
2013/07/01 23:08,100,"Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25"
|
2
|
+
2013/07/01 23:08,110,"Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"
|
3
|
+
2013/07/01 23:09,120,"Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"
|
4
|
+
2013/07/01 23:09,104,"Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
|
5
|
+
2013/07/01 23:09,110,Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
6
|
+
2013/07/01 23:10,130,"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36"
|
7
|
+
2013/07/01 23:10,190,Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
8
|
+
2013/07/01 23:11,600,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25"
|
9
|
+
2013/07/01 23:11,890,"Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
2
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
3
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
4
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
5
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
6
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
7
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
8
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
9
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
@@ -0,0 +1,9 @@
|
|
1
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
2
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
3
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
4
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
5
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
6
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
7
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
8
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
9
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
@@ -0,0 +1,17 @@
|
|
1
|
+
options : {:file=>"spec/test_file/test.tsv", :verbose=>true}
|
2
|
+
created Database at #pwd#/db1.db
|
3
|
+
create table sql : CREATE TABLE t (c1 text,c2 text,c3 text);
|
4
|
+
insert sql : INSERT INTO t VALUES(?,?,?);
|
5
|
+
sql : select * from t order by c1
|
6
|
+
result :
|
7
|
+
2013/07/01 23:08 100 Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
|
8
|
+
2013/07/01 23:08 110 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
|
9
|
+
2013/07/01 23:09 120 Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
|
10
|
+
2013/07/01 23:09 104 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; T-01D Build/F0001) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
|
11
|
+
2013/07/01 23:09 110 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
|
12
|
+
2013/07/01 23:10 130 Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
|
13
|
+
2013/07/01 23:10 190 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
|
14
|
+
2013/07/01 23:11 600 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
|
15
|
+
2013/07/01 23:11 890 Mozilla/5.0 (Linux; U; Android 3.2.1; ja-jp; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
|
16
|
+
|
17
|
+
drop Database at #pwd#/db1.db
|
data/sssummary.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/sssummary/version', __FILE__)
|
3
|
+
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.authors = ['akira-kuriyama']
|
7
|
+
gem.email = ['marronshepherd2@gmail.com']
|
8
|
+
gem.description = %q{Summarize a formatted data like CSV by sql on the shell}
|
9
|
+
gem.summary = %q{A client library for summarize data by sql on the shell}
|
10
|
+
gem.homepage = 'https://github.com/akira-kuriyama/sssummary.git'
|
11
|
+
|
12
|
+
gem.files = `git ls-files`.split($\)
|
13
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
14
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
|
+
gem.name = 'sssummary'
|
16
|
+
gem.require_paths = ['lib']
|
17
|
+
gem.version = Sssummary::VERSION
|
18
|
+
|
19
|
+
gem.add_development_dependency 'sqlite3'
|
20
|
+
gem.add_development_dependency 'rspec'
|
21
|
+
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sssummary
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- akira-kuriyama
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: sqlite3
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: Summarize a formatted data like CSV by sql on the shell
|
47
|
+
email:
|
48
|
+
- marronshepherd2@gmail.com
|
49
|
+
executables:
|
50
|
+
- sssummary
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- .gitignore
|
55
|
+
- Gemfile
|
56
|
+
- LICENSE
|
57
|
+
- README.md
|
58
|
+
- Rakefile
|
59
|
+
- bin/sssummary
|
60
|
+
- lib/Sssummary.rb
|
61
|
+
- lib/sssummary/version.rb
|
62
|
+
- spec/sssammary_spec.rb
|
63
|
+
- spec/test_file/test.csv
|
64
|
+
- spec/test_file/test.tsv
|
65
|
+
- spec/test_file/test_column_names.tsv
|
66
|
+
- spec/test_file/test_column_names_result.tsv
|
67
|
+
- spec/test_file/test_complex_sql_result.tsv
|
68
|
+
- spec/test_file/test_empty.tsv
|
69
|
+
- spec/test_file/test_empty_result.tsv
|
70
|
+
- spec/test_file/test_header.tsv
|
71
|
+
- spec/test_file/test_header_result1.tsv
|
72
|
+
- spec/test_file/test_header_result2.tsv
|
73
|
+
- spec/test_file/test_ngtest.tsv
|
74
|
+
- spec/test_file/test_output_separator_result.csv
|
75
|
+
- spec/test_file/test_result.csv
|
76
|
+
- spec/test_file/test_result.tsv
|
77
|
+
- spec/test_file/test_verbose_result.tsv
|
78
|
+
- sssummary.gemspec
|
79
|
+
homepage: https://github.com/akira-kuriyama/sssummary.git
|
80
|
+
licenses: []
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
requirements: []
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 1.8.23
|
100
|
+
signing_key:
|
101
|
+
specification_version: 3
|
102
|
+
summary: A client library for summarize data by sql on the shell
|
103
|
+
test_files:
|
104
|
+
- spec/sssammary_spec.rb
|
105
|
+
- spec/test_file/test.csv
|
106
|
+
- spec/test_file/test.tsv
|
107
|
+
- spec/test_file/test_column_names.tsv
|
108
|
+
- spec/test_file/test_column_names_result.tsv
|
109
|
+
- spec/test_file/test_complex_sql_result.tsv
|
110
|
+
- spec/test_file/test_empty.tsv
|
111
|
+
- spec/test_file/test_empty_result.tsv
|
112
|
+
- spec/test_file/test_header.tsv
|
113
|
+
- spec/test_file/test_header_result1.tsv
|
114
|
+
- spec/test_file/test_header_result2.tsv
|
115
|
+
- spec/test_file/test_ngtest.tsv
|
116
|
+
- spec/test_file/test_output_separator_result.csv
|
117
|
+
- spec/test_file/test_result.csv
|
118
|
+
- spec/test_file/test_result.tsv
|
119
|
+
- spec/test_file/test_verbose_result.tsv
|