xlsx2mysql 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e64cc8461d6dd9c48d25445edf5dc37eb7a9185b990f8e666740ce03d444fe67
4
+ data.tar.gz: afc7589fb6aaad02fe03479b6969a3048d91ca944b353f79fb89cefe100fc2a5
5
+ SHA512:
6
+ metadata.gz: 47ebcd1b5dfc1d5005ec2f666e43c078552894570c716c0b7111bca008695f51ab187ede53177ec00911d3bb64bc4312dd49f0260c9019e8d1274d07a65fbafc
7
+ data.tar.gz: 78214fa8e8e8816ca9b61ceefe979fde1fb915f7facafc33c98ad7e43ae67a0ed0bae07d3d974330f3a2a2eebbf071d3d5194d4e086747a36af1cd42d1f03ef6
@@ -0,0 +1,45 @@
1
+ module Xlsx2Mysql
2
+ class Column
3
+ attr_accessor :name, :regexp
4
+
5
+ def initialize(name, regexp = /(.*)/)
6
+ @name = name
7
+ @regexp = regexp
8
+ end
9
+
10
+ def + other_column
11
+ Columns.new(self, other_column)
12
+ end
13
+
14
+ def retrieve_value row_index, ws
15
+ index = name.to_s + row_index.to_s
16
+ regexp.match(ws[index])
17
+ $1
18
+ end
19
+ end
20
+
21
+ class Columns
22
+ attr_accessor :columns
23
+
24
+ def initialize *args
25
+ @columns = args
26
+ end
27
+
28
+ def + x
29
+ columns << x
30
+ self
31
+ end
32
+
33
+ def retrieve_value row_index, ws
34
+ res_array = []
35
+ columns.each do |x|
36
+ if x.is_a?(Column)
37
+ res_array << x.retrieve_value(row_index, ws)
38
+ elsif x.is_a?(String)
39
+ res_array << x
40
+ else
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ module Configurable
2
+ def self.with(*attrs)
3
+ not_provided = Object.new
4
+
5
+ instance_methods = Module.new do
6
+ attrs.each do |attr|
7
+ define_method attr do |value = not_provided, &block|
8
+ if value === not_provided && block.nil?
9
+ result = instance_variable_get("@#{attr}")
10
+ result.is_a?(Proc) ? instance_eval(&result) : result
11
+ else
12
+ instance_variable_set("@#{attr}", block || value)
13
+ end
14
+ end
15
+ end
16
+ attr_writer *attrs
17
+ def configure(&block)
18
+ instance_eval(&block)
19
+ end
20
+ end
21
+
22
+ Module.new do
23
+ singleton_class.send :define_method, :included do |host_class|
24
+ host_class.include instance_methods
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,49 @@
1
+ module Xlsx2Mysql
2
+ class MysqlController
3
+ include Configurable.with(
4
+ :host, :port, :user, :password, :database, :charset, :table
5
+ )
6
+
7
+ def initialize
8
+ @charset = 'utf8mb4'
9
+ @port = '3306'
10
+ end
11
+
12
+ def acquire_table_fields
13
+ describe_table.map {|x| x[0]}
14
+ end
15
+
16
+ def insert_one_record(key_values)
17
+ connect unless @my
18
+ raise "MySQL is not connected!" unless @my
19
+ keys = []
20
+ values = []
21
+ question_marks = []
22
+ key_values.each do |key, value|
23
+ keys << key
24
+ question_marks << '?'
25
+ values << value
26
+ end
27
+ sql =<<SQL
28
+ INSERT INTO #{table}
29
+ (#{keys.join(',')})
30
+ VALUES
31
+ (#{question_marks.join(',')});
32
+ SQL
33
+ @my.prepare(sql).execute(*values)
34
+ end
35
+
36
+ private
37
+
38
+ def describe_table
39
+ connect unless @my
40
+ raise "MySQL is not connected!" unless @my
41
+ @my.query("DESCRIBE #{table}").entries
42
+ end
43
+
44
+ def connect
45
+ mysql_url = "mysql://#{user}:#{password}@#{host}:#{port}/#{database}?charset=#{charset}"
46
+ @my = Mysql.connect(mysql_url)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,73 @@
1
+ module Xlsx2Mysql
2
+ class Relative
3
+ attr_accessor :fields_hash
4
+
5
+ def initialize(name = nil, &block)
6
+ @fields_hash = {}
7
+ instance_eval(&block)
8
+ run
9
+ end
10
+
11
+ def mysql_ref
12
+ @mysql_ref ||= MysqlController.new
13
+ end
14
+
15
+ def mysql(&block)
16
+ mysql_ref.configure(&block)
17
+ define_methods_with_field_name
18
+ end
19
+
20
+ def xlsx_ref
21
+ @xlsx_ref ||= XlsxController.new
22
+ end
23
+
24
+ def xlsx(&block)
25
+ xlsx_ref.configure(&block)
26
+ end
27
+
28
+ alias excel xlsx
29
+
30
+ def associate(&block)
31
+ instance_eval(&block)
32
+ end
33
+
34
+ def method_missing(name, *args)
35
+ if name =~ /[A-Z]+/
36
+ Column.new(name, args[0])
37
+ else
38
+ super
39
+ end
40
+ end
41
+
42
+ def Object.const_missing(name)
43
+ if name =~ /[A-Z]+/
44
+ Column.new(name)
45
+ else
46
+ super
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def define_methods_with_field_name
53
+ mysql_ref.acquire_table_fields.each do |field|
54
+ define_singleton_method field do |column|
55
+ fields_hash[field] = column
56
+ end
57
+ end
58
+ end
59
+
60
+ def run
61
+ row_begin = xlsx_ref.row_begin || 1
62
+ row_end = xlsx_ref.row_end || xlsx_ref.max_row
63
+
64
+ (row_begin..row_end).each do |row|
65
+ key_values = {}
66
+ fields_hash.each do |field, column|
67
+ key_values[field] = column.retrieve_value row, xlsx_ref.ws
68
+ end
69
+ mysql_ref.insert_one_record key_values
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,3 @@
1
+ def relatives(name = nil, &block)
2
+ Xlsx2Mysql::Relative.new(name, &block)
3
+ end
@@ -0,0 +1,3 @@
1
+ module Xlsx2Mysql
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,27 @@
1
+ module Xlsx2Mysql
2
+ class XlsxController
3
+ include Configurable.with(:path, :worksheet, :row_begin, :row_end)
4
+
5
+ def at_cell index
6
+ load unless @ws
7
+ @ws[index]
8
+ end
9
+
10
+ def max_row
11
+ load unless @ws
12
+ @ws.max_row.to_i
13
+ end
14
+
15
+ def ws
16
+ load unless @ws
17
+ @ws
18
+ end
19
+
20
+ private
21
+
22
+ def load
23
+ wb = OpenXML::SpreadsheetML::open path
24
+ @ws = wb[worksheet]
25
+ end
26
+ end
27
+ end
data/lib/xlsx2mysql.rb ADDED
@@ -0,0 +1,12 @@
1
+ # dependencies
2
+ require 'mysql'
3
+ require 'yaml'
4
+ require 'xlsx/DSL'
5
+
6
+ # library
7
+ require "xlsx2mysql/column"
8
+ require "xlsx2mysql/configurable"
9
+ require "xlsx2mysql/relative"
10
+ require "xlsx2mysql/relative_helper"
11
+ require "xlsx2mysql/mysql_controller"
12
+ require "xlsx2mysql/xlsx_controller"
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xlsx2mysql
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Cyan Yan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-02-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mysql
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: xlsx-DSL
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.12.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.12.0
55
+ description: A gem for inserting data to mysql from Excel(xlsx)
56
+ email: cyan_cg@outlook.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/xlsx2mysql.rb
62
+ - lib/xlsx2mysql/column.rb
63
+ - lib/xlsx2mysql/configurable.rb
64
+ - lib/xlsx2mysql/mysql_controller.rb
65
+ - lib/xlsx2mysql/relative.rb
66
+ - lib/xlsx2mysql/relative_helper.rb
67
+ - lib/xlsx2mysql/version.rb
68
+ - lib/xlsx2mysql/xlsx_controller.rb
69
+ homepage: https://github.com/coalooball/xlsx2mysql
70
+ licenses:
71
+ - MIT
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 3.3.7
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: A simple data migration gem
92
+ test_files: []