kandata 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b979ce1bd69f4da1bfa67689cd8e67f1b4e94c2e
4
- data.tar.gz: c576026f129471fa86ae2d13989c942521642200
3
+ metadata.gz: 81234a446c42f891691c7c5d8130512c0a7eaa2b
4
+ data.tar.gz: 03e57575d6a39b3f056f433fad9cb791ab21dafa
5
5
  SHA512:
6
- metadata.gz: a2cf47b93f63b3ffa4458e4cafe68dc17d0241319eb4a02b6bb58acb1243af234e2eae3ea9c5c5f678cd500105e4d0944febba4c1764b4a96a0cad94ecd9110e
7
- data.tar.gz: 7f166fe8acf20a63bcd46cfaa7e9bdef54ec33adf23396a44076827a689e3f3bc3e4292c5c1fae214f1afa7c2f34c9eca904162502f1e78dab7847ace56c2864
6
+ metadata.gz: 87912e4ff0f911b3da0e8292877615cf5f8e1ad179d02f22f49ceb3e1eddde9b90965b37440a991aefa6131e94996888c6a6f278a918c79b88043537c82bb3ad
7
+ data.tar.gz: 776f38b3353eab850e80c3af4d887d51947ad69f3329f72f8f8dfb9d225d47534c49229c73d48251e68b4169fb4f608850b571da60f6f129cbb5cf7f8d79ed07
data/.rubocop.yml CHANGED
@@ -15,6 +15,10 @@ Bundler/OrderedGems:
15
15
  Exclude:
16
16
  - 'Gemfile'
17
17
 
18
+ Metrics/BlockLength:
19
+ Exclude:
20
+ - 'spec/**/*'
21
+
18
22
  Metrics/LineLength:
19
23
  Max: 130
20
24
 
data/README.md CHANGED
@@ -1,37 +1,46 @@
1
1
  # Kandata
2
2
 
3
3
  [![CircleCI](https://circleci.com/gh/tamano/kandata.svg?style=svg)](https://circleci.com/gh/tamano/kandata)
4
+ [![Gem Version](https://badge.fury.io/rb/kandata.svg)](https://badge.fury.io/rb/kandata)
4
5
 
5
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/kandata`. To experiment with that code, run `bin/console` for an interactive prompt.
6
+ Kandataは、TSVファイルを自分のローカルのMySQLデータベース内に簡単にロードするためのツールです。
7
+ 現在はコマンドラインツールとしてのみ動作します。
6
8
 
7
- TODO: Delete this and the text above, and describe your gem
9
+ ## インストール方法
8
10
 
9
- ## Installation
11
+ 以下のコマンドでインストールしてください。
10
12
 
11
- Add this line to your application's Gemfile:
12
-
13
- ```ruby
14
- gem 'kandata'
15
- ```
16
-
17
- And then execute:
13
+ $ gem install kandata
18
14
 
19
- $ bundle
15
+ MySQLサーバーがローカルで動作している必要があります。
20
16
 
21
- Or install it yourself as:
17
+ ## 利用方法
22
18
 
23
- $ gem install kandata
19
+ 以下のように実行します。
24
20
 
25
- ## Usage
21
+ $ kandata load_tsv TSVファイル名 [--force]
22
+
23
+ 実行すると、ローカルのMySQLの中に`kandata.TSVファイル名`というテーブルが作成され、TSVの内容がロードされます。
24
+ 後は煮るなり焼くなり、自由に使ってください。
26
25
 
27
- TODO: Write usage instructions here
26
+ なお、TSVファイル内で最初のカラムが`id`という名前だった場合、そのカラムがPKとして扱われます。
27
+ 最初のカラムが`id`ではなかった場合、テーブルには自動的に`id`というAUTO_INCREMENTなカラムが追加されます。
28
+ 先頭以外に`id`という名前のカラムがあった場合はエラーとなります。
28
29
 
29
- ## Development
30
+ `--force`オプションを指定すると、実行時に同名のテーブルがあった場合は一度削除して作り直します。
31
+ 指定していない場合は、エラーとなります。
30
32
 
31
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
33
+ ## 制限事項
34
+ - ローカルでMySQLサーバーが動いていて`root`ユーザーがパスワードなしでログイン可能な前提となっています。
35
+ - MySQL以外のRDBMSには現時点では対応していません。
36
+ - `id`を除く各カラムは`VARCHAR(128)`として作られます。他の型を選ぶことは出来ません。
37
+ - 各カラムへのINDEXの追加には対応していません。必要な場合は自分でSQLで`CREATE INDEX`してください。
32
38
 
33
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
39
+ ## 今後の予定
40
+ - 作成したテーブルに応じたActiveRecordモデルを自動生成できるようにする。
41
+ - `require`で非RailsなRubyスクリプトで読み込んで使えるように。
42
+ - 作成したテーブルのバックアップなどの機能を追加する。
34
43
 
35
44
  ## Contributing
36
45
 
37
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/kandata.
46
+ Bug reports and pull requests are welcome on GitHub at https://github.com/tamano/kandata.
data/circle.yml CHANGED
@@ -1,3 +1,7 @@
1
1
  machine:
2
2
  timezone:
3
3
  Asia/Tokyo
4
+
5
+ database:
6
+ override:
7
+ - echo "Skipping DB section."
data/exe/kandata CHANGED
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
3
  require 'kandata.rb'
4
4
 
5
5
  Kandata::CLI.start
data/kandata.gemspec CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency 'rubocop', '>= 0.52'
28
28
  spec.add_development_dependency 'simplecov'
29
29
 
30
+ spec.add_dependency 'activerecord'
30
31
  spec.add_dependency 'mysql2'
31
32
  spec.add_dependency 'thor'
32
33
  end
data/lib/kandata.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
+ require 'kandata/active_record'
2
3
  require 'kandata/database'
4
+ require 'kandata/database/connection_info'
3
5
  require 'kandata/tsv_file'
4
6
  require 'kandata/version'
5
7
  require 'kandata/cli'
@@ -7,9 +9,10 @@ require 'kandata/cli'
7
9
  class Kandata
8
10
  # load_tsvの後に、ActiveRecordのインスタンスを返す
9
11
  def self.build_from_tsv(filename, force_load)
10
- _table_name = load_tsv(filename, force_load)
12
+ full_table_name = load_tsv(filename, force_load)
11
13
 
12
- # TODO: ActiveRecordインスタンスの作成
14
+ Kandata::ActiveRecord.connect
15
+ Kandata::ActiveRecord.create_model(full_table_name.split('.').last)
13
16
  end
14
17
 
15
18
  # テーブルを作成し、テーブルにデータを読み込み、テーブル名を戻す
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ require 'active_record'
3
+
4
+ class Kandata
5
+ class ActiveRecord < ActiveRecord::Base
6
+ def self.connect
7
+ establish_connection(
8
+ adapter: 'mysql2',
9
+ host: Kandata::Database::ConnectionInfo.host,
10
+ username: Kandata::Database::ConnectionInfo.user_name,
11
+ database: Kandata::Database::ConnectionInfo.database_name
12
+ )
13
+ end
14
+
15
+ def self.create_model(table_name)
16
+ Class.new(Kandata::ActiveRecord) do
17
+ self.table_name = table_name
18
+ end
19
+ end
20
+ end
21
+ end
@@ -6,24 +6,31 @@ class Kandata
6
6
  class Database < Mysql2::Client
7
7
  def initialize
8
8
  create_database_if_not_exists
9
- super(host: 'localhost', username: 'root', database: database_name, local_infile: true)
9
+ super(
10
+ Kandata::Database::ConnectionInfo.host_and_user.merge(
11
+ database: Kandata::Database::ConnectionInfo.database_name,
12
+ local_infile: true
13
+ )
14
+ )
10
15
  end
11
16
 
12
17
  # ignore :reek:ControlParameter:
13
18
  def load_tsv(filename, force_update)
14
- tsv = Kandata::TsvFile.new(filename)
19
+ @tsv = Kandata::TsvFile.new(filename)
15
20
 
16
- drop_table(tsv) if force_update
17
- create_table(tsv)
21
+ drop_table if force_update
22
+ create_table
23
+ load_data
18
24
 
19
- load_data(tsv)
25
+ full_table_name
20
26
  end
21
27
 
22
28
  private
23
29
 
24
30
  # ignore :reek:FeatureEnvy:
25
31
  def create_database_if_not_exists
26
- client = Mysql2::Client.new(host: 'localhost', username: 'root')
32
+ client = Mysql2::Client.new(Kandata::Database::ConnectionInfo.host_and_user)
33
+ database_name = Kandata::Database::ConnectionInfo.database_name
27
34
 
28
35
  begin
29
36
  client.query("SHOW CREATE DATABASE #{database_name}")
@@ -33,13 +40,12 @@ class Kandata
33
40
  end
34
41
  end
35
42
 
36
- def drop_table(tsv)
37
- query("DROP TABLE IF EXISTS #{full_table_name(tsv)}")
43
+ def drop_table
44
+ query("DROP TABLE IF EXISTS #{full_table_name}")
38
45
  end
39
46
 
40
- # ignore :reek:FeatureEnvy:
41
- def create_table(tsv)
42
- columns = tsv.headers
47
+ def create_table
48
+ columns = @tsv.headers
43
49
 
44
50
  # 後で追加するため一旦削除
45
51
  columns.delete('id')
@@ -47,24 +53,18 @@ class Kandata
47
53
  columns_text = columns.map { |column| "#{column} VARCHAR(128)" }.join(',')
48
54
  columns_text = 'id INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY,' + columns_text
49
55
 
50
- query("CREATE TABLE #{full_table_name(tsv)} (#{columns_text})")
56
+ query("CREATE TABLE #{full_table_name} (#{columns_text})")
51
57
  end
52
58
 
53
- # ignore :reek:FeatureEnvy:
54
- def load_data(tsv)
55
- sql = "LOAD DATA LOCAL INFILE '#{tsv.filename}' INTO TABLE #{full_table_name(tsv)} IGNORE 1 LINES "
56
- sql += "(#{tsv.headers.join(',')})"
59
+ def load_data
60
+ sql = "LOAD DATA LOCAL INFILE '#{@tsv.filename}' INTO TABLE #{full_table_name} IGNORE 1 LINES "
61
+ sql += "(#{@tsv.headers.join(',')})"
57
62
 
58
63
  query(sql)
59
- full_table_name(tsv)
60
- end
61
-
62
- def database_name
63
- 'kandata'
64
64
  end
65
65
 
66
- def full_table_name(tsv)
67
- "#{database_name}.#{tsv.table_name}"
66
+ def full_table_name
67
+ "#{Kandata::Database::ConnectionInfo.database_name}.#{@tsv.table_name}"
68
68
  end
69
69
  end
70
70
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Kandata
4
+ class Database
5
+ class ConnectionInfo
6
+ class << self
7
+ attr_reader :host, :user_name, :database_name
8
+ end
9
+
10
+ @host = 'localhost'
11
+ @user_name = 'root'
12
+ @database_name = 'kandata'
13
+
14
+ def self.host_and_user
15
+ { host: @host, username: @user_name }
16
+ end
17
+ end
18
+ end
19
+ end
@@ -6,12 +6,17 @@ class Kandata
6
6
 
7
7
  def initialize(filename)
8
8
  @filename = filename
9
- raise 'テーブル名に使用できないファイル名です' unless table_name.match?(/^[0-9a-zA-Z$_]+$/)
9
+ validate_filename
10
10
 
11
11
  @headers = File.open(@filename, 'r').first(&:readline).chomp.split("\t")
12
12
  validate_headers
13
13
  end
14
14
 
15
+ def validate_filename
16
+ raise 'テーブル名に使用できないファイル名です' unless table_name.match?(/^[0-9a-zA-Z$_]+$/)
17
+ true
18
+ end
19
+
15
20
  def validate_headers
16
21
  duplicated_columns = @headers.group_by { |value| value }.reject { |_key, value| value.one? }.keys
17
22
  raise "以下のカラムが複数存在しています #{duplicated_columns}" unless duplicated_columns.empty?
@@ -21,6 +26,8 @@ class Kandata
21
26
 
22
27
  # 現時点では、ミス防止のため、先頭以外にidカラムがあるとエラーとして処理する
23
28
  raise '先頭以外にidカラムがあります' if include_id_column? && @headers[0] != 'id'
29
+
30
+ true
24
31
  end
25
32
 
26
33
  def table_name
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  class Kandata
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kandata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuya TAMANO
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-30 00:00:00.000000000 Z
11
+ date: 2018-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activerecord
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: mysql2
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -145,8 +159,10 @@ files:
145
159
  - exe/kandata
146
160
  - kandata.gemspec
147
161
  - lib/kandata.rb
162
+ - lib/kandata/active_record.rb
148
163
  - lib/kandata/cli.rb
149
164
  - lib/kandata/database.rb
165
+ - lib/kandata/database/connection_info.rb
150
166
  - lib/kandata/tsv_file.rb
151
167
  - lib/kandata/version.rb
152
168
  homepage: https://github.com/tamano/kandata