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