mass_insert 0.0.4 → 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.
- data/README.md +16 -14
- data/Rakefile +1 -0
- data/lib/mass_insert/adapters/adapter.rb +9 -30
- data/lib/mass_insert/adapters/{helpers → adapter_helpers}/abstract_query.rb +5 -5
- data/lib/mass_insert/adapters/{helpers → adapter_helpers}/column_value.rb +7 -13
- data/lib/mass_insert/adapters/{helpers → adapter_helpers}/sanitizer.rb +3 -5
- data/lib/mass_insert/adapters/adapter_helpers/timestamp.rb +33 -0
- data/lib/mass_insert/adapters/adapter_helpers.rb +11 -0
- data/lib/mass_insert/adapters/postgresql_adapter.rb +1 -3
- data/lib/mass_insert/adapters.rb +1 -1
- data/lib/mass_insert/process_control.rb +0 -2
- data/lib/mass_insert/query_builder.rb +4 -7
- data/lib/mass_insert/query_execution.rb +5 -5
- data/lib/mass_insert/version.rb +1 -1
- data/spec/mass_insert/adapters/{helpers → adapter_helpers}/abstract_query_spec.rb +11 -10
- data/spec/mass_insert/adapters/{helpers → adapter_helpers}/column_value_spec.rb +13 -17
- data/spec/mass_insert/adapters/{helpers → adapter_helpers}/sanitizer_spec.rb +1 -1
- data/spec/mass_insert/adapters/{helpers → adapter_helpers}/timestamp_spec.rb +10 -10
- data/spec/mass_insert/adapters/adapter_helpers_spec.rb +24 -0
- data/spec/mass_insert/adapters/adapter_spec.rb +6 -22
- data/spec/mass_insert/adapters_spec.rb +1 -1
- metadata +19 -19
- data/lib/mass_insert/adapters/helpers/timestamp.rb +0 -38
- data/lib/mass_insert/adapters/helpers.rb +0 -10
- data/spec/mass_insert/adapters/helpers_spec.rb +0 -24
data/README.md
CHANGED
@@ -17,6 +17,16 @@ Or install it yourself with:
|
|
17
17
|
|
18
18
|
$ gem install mass_insert
|
19
19
|
|
20
|
+
## Advantages
|
21
|
+
|
22
|
+
Faster. It's depending of the computer but these are some results...
|
23
|
+
|
24
|
+
* PostgreSQL - Saving 10,000 records in 0.84s
|
25
|
+
|
26
|
+
## Attention
|
27
|
+
|
28
|
+
Since this is a single database insertion your model validation will be ignored, then if you use this gem you need to be sure that information is OK to be persisted.
|
29
|
+
|
20
30
|
## Basic Usage
|
21
31
|
|
22
32
|
To use MassInsert gem you need to call mass_insert method from your ActiveRecord model and pass it an array with the values that you want to persist into the database.
|
@@ -77,29 +87,21 @@ OR directly
|
|
77
87
|
|
78
88
|
Some options that you can include are...
|
79
89
|
|
80
|
-
|
90
|
+
**table_name**
|
91
|
+
- Default value is the table name to your model. This options rarely needs to change but you can do it if you pass a string with the table name. Example...
|
81
92
|
|
82
93
|
options = {:table_name => "users"}
|
83
94
|
|
84
|
-
|
95
|
+
**primary_key**
|
96
|
+
- Default value is `:id`. You can change the name of primary key column send it a symbol with the column name.
|
85
97
|
|
86
98
|
options = {:primary_key => :post_id}
|
87
99
|
|
88
|
-
|
100
|
+
**primary_key_mode**
|
101
|
+
- Default value is `:auto`. When is `:auto` MassInsert knows that the database will generate the value of the primary key column automatically. If you pass `:manual` as primary key mode you need to create your value hashes with the key and value of the primary key column.
|
89
102
|
|
90
103
|
options = {:primary_key_mode => :manual}
|
91
104
|
|
92
|
-
|
93
|
-
## Advantages
|
94
|
-
|
95
|
-
Faster. It's depending of the computer but these are some results...
|
96
|
-
|
97
|
-
* PostgreSQL - Saving 10,000 records in 0.84s
|
98
|
-
|
99
|
-
## Attention
|
100
|
-
|
101
|
-
Since this is a single database insertion your model validation will be ignored, then if you use this gem you need to be sure that information is OK to be persisted.
|
102
|
-
|
103
105
|
## Contributing
|
104
106
|
|
105
107
|
1. Fork it
|
data/Rakefile
CHANGED
@@ -1,45 +1,24 @@
|
|
1
1
|
module MassInsert
|
2
2
|
module Adapters
|
3
3
|
class Adapter
|
4
|
-
include
|
5
|
-
include Helpers::Timestamp
|
6
|
-
include Helpers::Sanitizer
|
4
|
+
include AdapterHelpers
|
7
5
|
|
8
|
-
attr_accessor :values, :options, :
|
6
|
+
attr_accessor :values, :options, :columns
|
9
7
|
|
10
8
|
def initialize values, options
|
11
9
|
@values = values
|
12
10
|
@options = options
|
13
11
|
end
|
14
12
|
|
15
|
-
# Returns the
|
16
|
-
|
17
|
-
|
18
|
-
options[:class_name]
|
13
|
+
# Returns the options according to the method that wasn't found.
|
14
|
+
def method_missing method, *args
|
15
|
+
@options.has_key?(method) ? @options[method] : super
|
19
16
|
end
|
20
17
|
|
21
|
-
# Returns
|
22
|
-
#
|
23
|
-
def
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
# Returns the array with the column names valid to be included into the
|
28
|
-
# query string according to the options.
|
29
|
-
def column_names
|
30
|
-
@column_names ||= sanitized_columns
|
31
|
-
end
|
32
|
-
|
33
|
-
# Returns the primary_key column that was configured by the user.
|
34
|
-
# Default primary_key it's id
|
35
|
-
def primary_key
|
36
|
-
options[:primary_key]
|
37
|
-
end
|
38
|
-
|
39
|
-
# Returns the primary key mode according to the user configuration.
|
40
|
-
# Default primary key mode it's automatic.
|
41
|
-
def primary_key_mode
|
42
|
-
options[:primary_key_mode]
|
18
|
+
# Returns the array with the column names valid to be included into
|
19
|
+
# the query string according to the options.
|
20
|
+
def columns
|
21
|
+
@columns ||= sanitized_columns
|
43
22
|
end
|
44
23
|
|
45
24
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module MassInsert
|
2
2
|
module Adapters
|
3
|
-
module
|
3
|
+
module AdapterHelpers
|
4
4
|
module AbstractQuery
|
5
5
|
|
6
6
|
# Returns a begin string to a basic mysql query insertion. Include
|
@@ -12,7 +12,7 @@ module MassInsert
|
|
12
12
|
# Returns a string with the column names to the class table name
|
13
13
|
# and divided by commas.
|
14
14
|
def string_columns
|
15
|
-
"(#{
|
15
|
+
"(#{columns.join(", ")}) "
|
16
16
|
end
|
17
17
|
|
18
18
|
# Returns the string with all the row values that will be included
|
@@ -32,14 +32,14 @@ module MassInsert
|
|
32
32
|
# according to the type column and values.
|
33
33
|
# Before that row is prepared with the correct values.
|
34
34
|
def string_single_row_values row
|
35
|
-
row.merge!(
|
36
|
-
|
35
|
+
row.merge!(timestamp_hash) if timestamp?
|
36
|
+
columns.map{ |col| string_single_value(row, col) }.join(", ")
|
37
37
|
end
|
38
38
|
|
39
39
|
# Returns a single column string value with the correct format and
|
40
40
|
# according to the database configuration, column type and presence.
|
41
41
|
def string_single_value row, column
|
42
|
-
ColumnValue.new(row, column,
|
42
|
+
ColumnValue.new(row, column, class_name).build
|
43
43
|
end
|
44
44
|
|
45
45
|
# This functions calls the necessary functions to create a complete
|
@@ -1,20 +1,14 @@
|
|
1
1
|
module MassInsert
|
2
2
|
module Adapters
|
3
|
-
module
|
3
|
+
module AdapterHelpers
|
4
4
|
class ColumnValue
|
5
5
|
|
6
|
-
attr_accessor :row, :column, :
|
6
|
+
attr_accessor :row, :column, :class_name
|
7
7
|
|
8
|
-
def initialize row, column,
|
9
|
-
@row
|
10
|
-
@column
|
11
|
-
@
|
12
|
-
end
|
13
|
-
|
14
|
-
# Returns the class that invokes the mass insert process. The class
|
15
|
-
# is in the options hash.
|
16
|
-
def class_name
|
17
|
-
options[:class_name]
|
8
|
+
def initialize row, column, class_name
|
9
|
+
@row = row
|
10
|
+
@column = column
|
11
|
+
@class_name = class_name
|
18
12
|
end
|
19
13
|
|
20
14
|
# Returns a symbol with the column type in the database. The column or
|
@@ -29,7 +23,7 @@ module MassInsert
|
|
29
23
|
# if the symbol key doesn't exist it will try to find it by string
|
30
24
|
# key. Otherwise it will return nil.
|
31
25
|
def column_value
|
32
|
-
row.fetch(column
|
26
|
+
row.fetch(column){row[@column.to_s]}
|
33
27
|
end
|
34
28
|
|
35
29
|
# Returns the string with the database adapter name usually in the
|
@@ -1,16 +1,14 @@
|
|
1
1
|
module MassInsert
|
2
2
|
module Adapters
|
3
|
-
module
|
3
|
+
module AdapterHelpers
|
4
4
|
module Sanitizer
|
5
5
|
|
6
|
-
# Returns an array with the
|
7
|
-
# a symbols.
|
6
|
+
# Returns an array with the columns in the table like symbols.
|
8
7
|
def table_columns
|
9
8
|
class_name.column_names.map(&:to_sym)
|
10
9
|
end
|
11
10
|
|
12
|
-
#
|
13
|
-
# and prepare the columns array with only valid columns.
|
11
|
+
# Prepare array with the column names according to the options.
|
14
12
|
def sanitized_columns
|
15
13
|
columns = table_columns
|
16
14
|
columns.delete(primary_key) if primary_key_mode == :auto
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module MassInsert
|
2
|
+
module Adapters
|
3
|
+
module AdapterHelpers
|
4
|
+
module Timestamp
|
5
|
+
|
6
|
+
# Returns true o false if the database table has timestamp columns.
|
7
|
+
def timestamp?
|
8
|
+
columns.include?(:created_at) && columns.include?(:updated_at)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns timestamp format according to the database adapter. This
|
12
|
+
# function can be overwrite in database adapters classes.
|
13
|
+
def timestamp_format
|
14
|
+
"%Y-%m-%d %H:%M:%S.%6N"
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns the timestamp value according to the correct timestamp
|
18
|
+
# format to that database engine.
|
19
|
+
def timestamp
|
20
|
+
Time.now.strftime(timestamp_format)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns the timestamp hash to be merge into row values that will
|
24
|
+
# be saved in the database.
|
25
|
+
def timestamp_hash
|
26
|
+
timestamp_value = timestamp
|
27
|
+
{:created_at => timestamp_value, :updated_at => timestamp_value}
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/mass_insert/adapters.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module MassInsert
|
2
2
|
module Adapters
|
3
3
|
autoload :Adapter, 'mass_insert/adapters/adapter.rb'
|
4
|
-
autoload :
|
4
|
+
autoload :AdapterHelpers, 'mass_insert/adapters/adapter_helpers.rb'
|
5
5
|
autoload :Mysql2Adapter, 'mass_insert/adapters/mysql2_adapter.rb'
|
6
6
|
autoload :PostgreSQLAdapter, 'mass_insert/adapters/postgresql_adapter.rb'
|
7
7
|
autoload :SQLite3Adapter, 'mass_insert/adapters/sqlite3_adapter.rb'
|
@@ -15,9 +15,7 @@ module MassInsert
|
|
15
15
|
# complete the mass insertion process and save the time each method
|
16
16
|
# takes being executed.
|
17
17
|
def start
|
18
|
-
# Calls the method that build the query.
|
19
18
|
@build_time = Benchmark.measure{ build_query }
|
20
|
-
# Calls the method that execute the query.
|
21
19
|
@execute_time = Benchmark.measure{ execute_query }
|
22
20
|
end
|
23
21
|
|
@@ -8,9 +8,8 @@ module MassInsert
|
|
8
8
|
@options = options
|
9
9
|
end
|
10
10
|
|
11
|
-
# This function
|
12
|
-
# sql string ready to be executed
|
13
|
-
# the QueryExecution class.
|
11
|
+
# This function gets the correct adapter class and returns the
|
12
|
+
# sql string ready to be executed.
|
14
13
|
def build
|
15
14
|
adapter_class.new(values, options).execute
|
16
15
|
end
|
@@ -21,10 +20,8 @@ module MassInsert
|
|
21
20
|
ActiveRecord::Base.connection.instance_values["config"][:adapter]
|
22
21
|
end
|
23
22
|
|
24
|
-
# Returns
|
25
|
-
#
|
26
|
-
# and options are passed by params when the correct adapter class
|
27
|
-
# is instanced.
|
23
|
+
# Returns the class of the correct database adapter according to the
|
24
|
+
# database engine that is used in Rails project.
|
28
25
|
def adapter_class
|
29
26
|
case adapter
|
30
27
|
when "mysql2"
|
@@ -10,15 +10,15 @@ module MassInsert
|
|
10
10
|
# class instances this class. The query can be a string or an array,
|
11
11
|
# therefore to be sure that the query_container attribute is an array
|
12
12
|
# the param passed to this class is converted to array. The query
|
13
|
-
# container attribute will be iterated in execute method
|
14
|
-
#
|
13
|
+
# container attribute will be iterated in execute method to execute
|
14
|
+
# each query that it contains.
|
15
15
|
def initialize query_container
|
16
16
|
@query_container = Array(query_container)
|
17
17
|
end
|
18
18
|
|
19
|
-
# Saves queries contained in query_container
|
20
|
-
# Use the helper that ActiveRecord provides.
|
21
|
-
# is iterated to save each query that it contains.
|
19
|
+
# Saves queries contained in query_container attribute into database.
|
20
|
+
# Use the helper that ActiveRecord provides. The query_container
|
21
|
+
# attribute is iterated to save each query that it contains.
|
22
22
|
def execute
|
23
23
|
@query_container.each do |query|
|
24
24
|
ActiveRecord::Base.connection.execute(query)
|
data/lib/mass_insert/version.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require './spec/spec_helper'
|
2
2
|
require "./lib/mass_insert"
|
3
3
|
|
4
|
-
describe MassInsert::Adapters::
|
5
|
-
let!(:
|
4
|
+
describe MassInsert::Adapters::AdapterHelpers::AbstractQuery do
|
5
|
+
let!(:options){ {:class_name => "SomeClassName"} }
|
6
|
+
let!(:subject){ MassInsert::Adapters::Adapter.new([], options) }
|
6
7
|
|
7
8
|
describe "#begin_string" do
|
8
9
|
it "should respond to begin_string method" do
|
@@ -21,7 +22,7 @@ describe MassInsert::Adapters::Helpers::AbstractQuery do
|
|
21
22
|
end
|
22
23
|
|
23
24
|
it "should returns correct string to columns" do
|
24
|
-
subject.stub(:
|
25
|
+
subject.stub(:columns).and_return([:name, :email])
|
25
26
|
expect(subject.string_columns).to eq("(name, email) ")
|
26
27
|
end
|
27
28
|
end
|
@@ -69,23 +70,23 @@ describe MassInsert::Adapters::Helpers::AbstractQuery do
|
|
69
70
|
end
|
70
71
|
|
71
72
|
it "should returns the correct string" do
|
72
|
-
subject.stub(:
|
73
|
+
subject.stub(:columns).and_return([:name, :email])
|
73
74
|
expect(subject.string_single_row_values({})).to eq("value, value")
|
74
75
|
end
|
75
76
|
|
76
77
|
context "when respond to timestamp attributes" do
|
77
78
|
it "should call timestamp_values method" do
|
78
|
-
subject.stub(:
|
79
|
-
subject.stub(:
|
80
|
-
subject.should_receive(:
|
79
|
+
subject.stub(:columns).and_return([:created_at, :updated_at])
|
80
|
+
subject.stub(:timestamp_hash).and_return(:test => "test")
|
81
|
+
subject.should_receive(:timestamp_hash).exactly(1).times
|
81
82
|
subject.string_single_row_values({})
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
85
86
|
context "when not respond to timestamp attributes" do
|
86
87
|
it "should returns the correct string" do
|
87
|
-
subject.stub(:
|
88
|
-
subject.should_receive(:
|
88
|
+
subject.stub(:columns).and_return([:name, :email])
|
89
|
+
subject.should_receive(:timestamp_hash).exactly(0).times
|
89
90
|
subject.string_single_row_values({})
|
90
91
|
end
|
91
92
|
end
|
@@ -97,7 +98,7 @@ describe MassInsert::Adapters::Helpers::AbstractQuery do
|
|
97
98
|
end
|
98
99
|
|
99
100
|
it "should call build method in ColumnValue class" do
|
100
|
-
column_value = MassInsert::Adapters::
|
101
|
+
column_value = MassInsert::Adapters::AdapterHelpers::ColumnValue.any_instance
|
101
102
|
column_value.stub(:build).and_return("value")
|
102
103
|
expect(subject.string_single_value({}, :name)).to eq("value")
|
103
104
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
require './spec/spec_helper'
|
2
2
|
require "./lib/mass_insert"
|
3
3
|
|
4
|
-
describe MassInsert::Adapters::
|
5
|
-
let(:
|
4
|
+
describe MassInsert::Adapters::AdapterHelpers::ColumnValue do
|
5
|
+
let(:class_name) { User }
|
6
6
|
let(:row) {{ :name => "name", :age => 10 }}
|
7
7
|
let(:column){ :name }
|
8
|
-
let!(:subject){ MassInsert::Adapters::
|
8
|
+
let!(:subject){ MassInsert::Adapters::AdapterHelpers::ColumnValue.new(row, column, class_name) }
|
9
9
|
|
10
10
|
describe "#initialize" do
|
11
|
-
it "should assign
|
12
|
-
expect(subject.
|
11
|
+
it "should assign class_name param to class_name attribute" do
|
12
|
+
expect(subject.class_name).to eq(class_name)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should assign column param to column attribute" do
|
@@ -21,23 +21,16 @@ describe MassInsert::Adapters::Helpers::ColumnValue do
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
describe "#class_name" do
|
25
|
-
it "should respond to class_name method" do
|
26
|
-
expect(subject).to respond_to(:class_name)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should return the class_name in options" do
|
30
|
-
expect(subject.class_name).to eq(User)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
24
|
describe "#column_type" do
|
35
25
|
it "should respond to column_type method" do
|
36
26
|
expect(subject).to respond_to(:column_type)
|
37
27
|
end
|
38
28
|
|
39
29
|
it "should return symbol :string" do
|
40
|
-
|
30
|
+
subject.stub(:class_name).and_return("ClassName")
|
31
|
+
subject.class_name.stub(:columns_hash).and_return({"name" => "SomeObject"})
|
32
|
+
subject.class_name.columns_hash["name"].stub(:type).and_return(:column_type)
|
33
|
+
expect(subject.column_type).to eq(:column_type)
|
41
34
|
end
|
42
35
|
end
|
43
36
|
|
@@ -90,7 +83,10 @@ describe MassInsert::Adapters::Helpers::ColumnValue do
|
|
90
83
|
end
|
91
84
|
|
92
85
|
it "should return the default database value" do
|
93
|
-
|
86
|
+
subject.stub(:class_name).and_return("ClassName")
|
87
|
+
subject.class_name.stub(:columns_hash).and_return({"name" => "SomeObject"})
|
88
|
+
subject.class_name.columns_hash["name"].stub(:default).and_return(:default_db_value)
|
89
|
+
expect(subject.default_db_value).to eq(:default_db_value)
|
94
90
|
end
|
95
91
|
end
|
96
92
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require './spec/spec_helper'
|
2
2
|
require "./lib/mass_insert"
|
3
3
|
|
4
|
-
describe MassInsert::Adapters::
|
4
|
+
describe MassInsert::Adapters::AdapterHelpers::Sanitizer do
|
5
5
|
let!(:subject){ MassInsert::Adapters::Adapter.new([], {}) }
|
6
6
|
|
7
7
|
describe "#sanitized_columns" do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require './spec/spec_helper'
|
2
2
|
require "./lib/mass_insert"
|
3
3
|
|
4
|
-
describe MassInsert::Adapters::
|
4
|
+
describe MassInsert::Adapters::AdapterHelpers::Timestamp do
|
5
5
|
let!(:subject){ MassInsert::Adapters::Adapter.new([], {}) }
|
6
6
|
|
7
7
|
describe "#timestamp?" do
|
@@ -11,14 +11,14 @@ describe MassInsert::Adapters::Helpers::Timestamp do
|
|
11
11
|
|
12
12
|
context "when respond to timestamp columns" do
|
13
13
|
it "should return true" do
|
14
|
-
subject.stub(:
|
14
|
+
subject.stub(:columns).and_return([:updated_at, :created_at])
|
15
15
|
expect(subject.timestamp?).to be_true
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
context "when not respond to timestamp columns" do
|
20
20
|
it "should return false" do
|
21
|
-
subject.stub(:
|
21
|
+
subject.stub(:columns).and_return([:created_at])
|
22
22
|
expect(subject.timestamp?).to be_false
|
23
23
|
end
|
24
24
|
end
|
@@ -46,29 +46,29 @@ describe MassInsert::Adapters::Helpers::Timestamp do
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
describe "#
|
50
|
-
it "should respond_to
|
51
|
-
expect(subject).to respond_to(:
|
49
|
+
describe "#timestamp_hash" do
|
50
|
+
it "should respond_to timestamp_hash method" do
|
51
|
+
expect(subject).to respond_to(:timestamp_hash)
|
52
52
|
end
|
53
53
|
|
54
54
|
context "when have high precision" do
|
55
55
|
it "should no be equals" do
|
56
|
-
|
56
|
+
timestamp_hash_expected = {
|
57
57
|
:created_at => subject.timestamp,
|
58
58
|
:updated_at => subject.timestamp
|
59
59
|
}
|
60
|
-
expect(subject.
|
60
|
+
expect(subject.timestamp_hash).not_to eq(timestamp_hash_expected)
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
64
|
context "when do not have precision" do
|
65
65
|
it "should be equals" do
|
66
66
|
subject.stub(:timestamp_format).and_return("%Y-%m-%d %H:%M:%S")
|
67
|
-
|
67
|
+
timestamp_hash_expected = {
|
68
68
|
:created_at => subject.timestamp,
|
69
69
|
:updated_at => subject.timestamp
|
70
70
|
}
|
71
|
-
expect(subject.
|
71
|
+
expect(subject.timestamp_hash).to eq(timestamp_hash_expected)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require './spec/spec_helper'
|
2
|
+
require "./lib/mass_insert"
|
3
|
+
|
4
|
+
describe MassInsert::Adapters::AdapterHelpers do
|
5
|
+
it 'should be defined' do
|
6
|
+
expect(MassInsert::Adapters::AdapterHelpers).to be
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should define AbstractQuery module' do
|
10
|
+
expect(MassInsert::Adapters::AdapterHelpers::AbstractQuery).to be
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should define ColumnValue class' do
|
14
|
+
expect(MassInsert::Adapters::AdapterHelpers::ColumnValue).to be
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should define Timestamp module' do
|
18
|
+
expect(MassInsert::Adapters::AdapterHelpers::Timestamp).to be
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should define Sanitizer module' do
|
22
|
+
expect(MassInsert::Adapters::AdapterHelpers::Sanitizer).to be
|
23
|
+
end
|
24
|
+
end
|
@@ -19,10 +19,6 @@ describe MassInsert::Adapters::Adapter do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
describe "#class_name" do
|
22
|
-
it "should respond to class name method" do
|
23
|
-
expect(subject).to respond_to(:class_name)
|
24
|
-
end
|
25
|
-
|
26
22
|
it "should returns the class_name in options" do
|
27
23
|
subject.options = {:class_name => Test}
|
28
24
|
expect(subject.class_name).to eq(Test)
|
@@ -30,17 +26,13 @@ describe MassInsert::Adapters::Adapter do
|
|
30
26
|
end
|
31
27
|
|
32
28
|
describe "#table_name" do
|
33
|
-
it "should respond to table_name method" do
|
34
|
-
expect(subject).to respond_to(:table_name)
|
35
|
-
end
|
36
|
-
|
37
29
|
it "should returns the table_name in options" do
|
38
30
|
subject.options = {:table_name => "users"}
|
39
31
|
expect(subject.table_name).to eq("users")
|
40
32
|
end
|
41
33
|
end
|
42
34
|
|
43
|
-
describe "#
|
35
|
+
describe "#columns" do
|
44
36
|
before :each do
|
45
37
|
subject.options.merge!({
|
46
38
|
:class_name => Test,
|
@@ -49,31 +41,27 @@ describe MassInsert::Adapters::Adapter do
|
|
49
41
|
})
|
50
42
|
end
|
51
43
|
|
52
|
-
it "should respond to
|
53
|
-
expect(subject).to respond_to(:
|
44
|
+
it "should respond to columns method" do
|
45
|
+
expect(subject).to respond_to(:columns)
|
54
46
|
end
|
55
47
|
|
56
48
|
context "when primary_key is auto" do
|
57
49
|
it "should return an array without primary key column" do
|
58
50
|
column_names = [:name, :email]
|
59
|
-
expect(subject.
|
51
|
+
expect(subject.columns).to eq(column_names)
|
60
52
|
end
|
61
53
|
end
|
62
54
|
|
63
55
|
context "when primary key is manual" do
|
64
56
|
it "should return an array with primary key column" do
|
65
57
|
subject.options.merge!({:primary_key_mode => :manual})
|
66
|
-
|
67
|
-
expect(subject.
|
58
|
+
columns_expected = [:id, :name, :email]
|
59
|
+
expect(subject.columns).to eq(columns_expected)
|
68
60
|
end
|
69
61
|
end
|
70
62
|
end
|
71
63
|
|
72
64
|
describe "#primary_key" do
|
73
|
-
it "should respond to primary_key method" do
|
74
|
-
expect(subject).to respond_to(:primary_key)
|
75
|
-
end
|
76
|
-
|
77
65
|
it "should returns the primary_key in options" do
|
78
66
|
subject.options = {:primary_key => :user_id}
|
79
67
|
expect(subject.primary_key).to eq(:user_id)
|
@@ -81,10 +69,6 @@ describe MassInsert::Adapters::Adapter do
|
|
81
69
|
end
|
82
70
|
|
83
71
|
describe "#primary_key_mode" do
|
84
|
-
it "should respond to primary_key_mode method" do
|
85
|
-
expect(subject).to respond_to(:primary_key_mode)
|
86
|
-
end
|
87
|
-
|
88
72
|
it "should returns the primary_key_mode in options" do
|
89
73
|
subject.options = {:primary_key_mode => :auto}
|
90
74
|
expect(subject.primary_key_mode).to eq(:auto)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mass_insert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -61,11 +61,11 @@ files:
|
|
61
61
|
- lib/mass_insert.rb
|
62
62
|
- lib/mass_insert/adapters.rb
|
63
63
|
- lib/mass_insert/adapters/adapter.rb
|
64
|
-
- lib/mass_insert/adapters/
|
65
|
-
- lib/mass_insert/adapters/
|
66
|
-
- lib/mass_insert/adapters/
|
67
|
-
- lib/mass_insert/adapters/
|
68
|
-
- lib/mass_insert/adapters/
|
64
|
+
- lib/mass_insert/adapters/adapter_helpers.rb
|
65
|
+
- lib/mass_insert/adapters/adapter_helpers/abstract_query.rb
|
66
|
+
- lib/mass_insert/adapters/adapter_helpers/column_value.rb
|
67
|
+
- lib/mass_insert/adapters/adapter_helpers/sanitizer.rb
|
68
|
+
- lib/mass_insert/adapters/adapter_helpers/timestamp.rb
|
69
69
|
- lib/mass_insert/adapters/mysql2_adapter.rb
|
70
70
|
- lib/mass_insert/adapters/postgresql_adapter.rb
|
71
71
|
- lib/mass_insert/adapters/sqlite3_adapter.rb
|
@@ -131,12 +131,12 @@ files:
|
|
131
131
|
- spec/active_record_models/column_types/string_spec.rb
|
132
132
|
- spec/active_record_models/model_spec.rb
|
133
133
|
- spec/dummy_models/test.rb
|
134
|
+
- spec/mass_insert/adapters/adapter_helpers/abstract_query_spec.rb
|
135
|
+
- spec/mass_insert/adapters/adapter_helpers/column_value_spec.rb
|
136
|
+
- spec/mass_insert/adapters/adapter_helpers/sanitizer_spec.rb
|
137
|
+
- spec/mass_insert/adapters/adapter_helpers/timestamp_spec.rb
|
138
|
+
- spec/mass_insert/adapters/adapter_helpers_spec.rb
|
134
139
|
- spec/mass_insert/adapters/adapter_spec.rb
|
135
|
-
- spec/mass_insert/adapters/helpers/abstract_query_spec.rb
|
136
|
-
- spec/mass_insert/adapters/helpers/column_value_spec.rb
|
137
|
-
- spec/mass_insert/adapters/helpers/sanitizer_spec.rb
|
138
|
-
- spec/mass_insert/adapters/helpers/timestamp_spec.rb
|
139
|
-
- spec/mass_insert/adapters/helpers_spec.rb
|
140
140
|
- spec/mass_insert/adapters/mysql_adapter_spec.rb
|
141
141
|
- spec/mass_insert/adapters/postgresql_adapter_spec.rb
|
142
142
|
- spec/mass_insert/adapters/sqlite3_adapter_spec.rb
|
@@ -162,7 +162,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
162
162
|
version: '0'
|
163
163
|
segments:
|
164
164
|
- 0
|
165
|
-
hash: -
|
165
|
+
hash: -2888572193486115102
|
166
166
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
167
|
none: false
|
168
168
|
requirements:
|
@@ -171,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
171
|
version: '0'
|
172
172
|
segments:
|
173
173
|
- 0
|
174
|
-
hash: -
|
174
|
+
hash: -2888572193486115102
|
175
175
|
requirements: []
|
176
176
|
rubyforge_project:
|
177
177
|
rubygems_version: 1.8.25
|
@@ -235,12 +235,12 @@ test_files:
|
|
235
235
|
- spec/active_record_models/column_types/string_spec.rb
|
236
236
|
- spec/active_record_models/model_spec.rb
|
237
237
|
- spec/dummy_models/test.rb
|
238
|
+
- spec/mass_insert/adapters/adapter_helpers/abstract_query_spec.rb
|
239
|
+
- spec/mass_insert/adapters/adapter_helpers/column_value_spec.rb
|
240
|
+
- spec/mass_insert/adapters/adapter_helpers/sanitizer_spec.rb
|
241
|
+
- spec/mass_insert/adapters/adapter_helpers/timestamp_spec.rb
|
242
|
+
- spec/mass_insert/adapters/adapter_helpers_spec.rb
|
238
243
|
- spec/mass_insert/adapters/adapter_spec.rb
|
239
|
-
- spec/mass_insert/adapters/helpers/abstract_query_spec.rb
|
240
|
-
- spec/mass_insert/adapters/helpers/column_value_spec.rb
|
241
|
-
- spec/mass_insert/adapters/helpers/sanitizer_spec.rb
|
242
|
-
- spec/mass_insert/adapters/helpers/timestamp_spec.rb
|
243
|
-
- spec/mass_insert/adapters/helpers_spec.rb
|
244
244
|
- spec/mass_insert/adapters/mysql_adapter_spec.rb
|
245
245
|
- spec/mass_insert/adapters/postgresql_adapter_spec.rb
|
246
246
|
- spec/mass_insert/adapters/sqlite3_adapter_spec.rb
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module MassInsert
|
2
|
-
module Adapters
|
3
|
-
module Helpers
|
4
|
-
module Timestamp
|
5
|
-
|
6
|
-
# Returns true o false if the database table has the
|
7
|
-
# timestamp columns.
|
8
|
-
def timestamp?
|
9
|
-
column_names.include?(:created_at) &&
|
10
|
-
column_names.include?(:updated_at)
|
11
|
-
end
|
12
|
-
|
13
|
-
# Returns timestamp format according to the database adapter. This
|
14
|
-
# function can be overwrite in database adapters classes to put the
|
15
|
-
# correct format to that database.
|
16
|
-
def timestamp_format
|
17
|
-
"%Y-%m-%d %H:%M:%S.%6N"
|
18
|
-
end
|
19
|
-
|
20
|
-
# Returns the timestamp value with specific format according to the
|
21
|
-
# correct timestamp format to that database.
|
22
|
-
def timestamp
|
23
|
-
Time.now.strftime(timestamp_format)
|
24
|
-
end
|
25
|
-
|
26
|
-
# Returns the timestamp values to be merge into row values that
|
27
|
-
# will be saved in the database.
|
28
|
-
def timestamp_values
|
29
|
-
{
|
30
|
-
:created_at => timestamp,
|
31
|
-
:updated_at => timestamp
|
32
|
-
}
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
module MassInsert
|
2
|
-
module Adapters
|
3
|
-
module Helpers
|
4
|
-
autoload :AbstractQuery, 'mass_insert/adapters/helpers/abstract_query.rb'
|
5
|
-
autoload :ColumnValue, 'mass_insert/adapters/helpers/column_value.rb'
|
6
|
-
autoload :Timestamp, 'mass_insert/adapters/helpers/timestamp.rb'
|
7
|
-
autoload :Sanitizer, 'mass_insert/adapters/helpers/sanitizer.rb'
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require './spec/spec_helper'
|
2
|
-
require "./lib/mass_insert"
|
3
|
-
|
4
|
-
describe MassInsert::Adapters::Helpers do
|
5
|
-
it 'should be defined' do
|
6
|
-
expect(MassInsert::Adapters::Helpers).to be
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should define AbstractQuery module' do
|
10
|
-
expect(MassInsert::Adapters::Helpers::AbstractQuery).to be
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'should define ColumnValue class' do
|
14
|
-
expect(MassInsert::Adapters::Helpers::ColumnValue).to be
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should define Timestamp module' do
|
18
|
-
expect(MassInsert::Adapters::Helpers::Timestamp).to be
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should define Sanitizer module' do
|
22
|
-
expect(MassInsert::Adapters::Helpers::Sanitizer).to be
|
23
|
-
end
|
24
|
-
end
|