kandata 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 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