sssummary 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea
19
+ expamle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sssummary.gemspec
4
+ gemspec
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
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
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,3 @@
1
+ class Sssummary
2
+ VERSION = '0.0.1'
3
+ end
@@ -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
@@ -0,0 +1,2 @@
1
+ 2013/07/01 23:09 112.0
2
+ 2013/07/01 23:11 890.0
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