mass_insert 0.1.1 → 0.1.2

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.
Files changed (129) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +10 -0
  3. data/Gemfile +0 -2
  4. data/README.md +15 -23
  5. data/Rakefile +22 -33
  6. data/lib/mass_insert.rb +11 -7
  7. data/lib/mass_insert/base.rb +22 -58
  8. data/lib/mass_insert/builder/adapters.rb +16 -0
  9. data/lib/mass_insert/builder/adapters/adapter.rb +65 -0
  10. data/lib/mass_insert/builder/adapters/helpers/abstract_query.rb +52 -0
  11. data/lib/mass_insert/builder/adapters/helpers/column_value.rb +90 -0
  12. data/lib/mass_insert/builder/adapters/mysql2_adapter.rb +15 -0
  13. data/lib/mass_insert/builder/adapters/postgresql_adapter.rb +7 -0
  14. data/lib/mass_insert/builder/adapters/sqlite3_adapter.rb +27 -0
  15. data/lib/mass_insert/builder/adapters/sqlserver_adapter.rb +26 -0
  16. data/lib/mass_insert/builder/base.rb +28 -0
  17. data/lib/mass_insert/builder/utilities.rb +13 -0
  18. data/lib/mass_insert/executer.rb +13 -0
  19. data/lib/mass_insert/process.rb +24 -0
  20. data/lib/mass_insert/result.rb +33 -0
  21. data/lib/mass_insert/version.rb +1 -1
  22. data/mass_insert.gemspec +2 -2
  23. data/spec/adapters/column_types/binary_spec.rb +64 -0
  24. data/spec/adapters/column_types/boolean_spec.rb +48 -0
  25. data/spec/adapters/column_types/decimal_spec.rb +59 -0
  26. data/spec/adapters/column_types/integer_spec.rb +59 -0
  27. data/spec/adapters/column_types/string_spec.rb +46 -0
  28. data/spec/{active_record_models → adapters}/model_spec.rb +1 -21
  29. data/spec/{active_record_dummy → dummy}/.gitignore +0 -0
  30. data/spec/{active_record_dummy → dummy}/Gemfile +1 -1
  31. data/spec/{active_record_dummy → dummy}/README.rdoc +0 -0
  32. data/spec/{active_record_dummy → dummy}/Rakefile +0 -0
  33. data/spec/{active_record_dummy → dummy}/app/assets/images/rails.png +0 -0
  34. data/spec/{active_record_dummy → dummy}/app/assets/javascripts/application.js +0 -0
  35. data/spec/{active_record_dummy → dummy}/app/assets/stylesheets/application.css +0 -0
  36. data/spec/{active_record_dummy → dummy}/app/controllers/application_controller.rb +0 -0
  37. data/spec/{active_record_dummy → dummy}/app/helpers/application_helper.rb +0 -0
  38. data/spec/{active_record_dummy → dummy}/app/mailers/.gitkeep +0 -0
  39. data/spec/{active_record_dummy → dummy}/app/models/.gitkeep +0 -0
  40. data/spec/{active_record_dummy → dummy}/app/models/user.rb +0 -0
  41. data/spec/{active_record_dummy → dummy}/app/views/layouts/application.html.erb +0 -0
  42. data/spec/{active_record_dummy → dummy}/config.ru +0 -0
  43. data/spec/{active_record_dummy → dummy}/config/application.rb +0 -0
  44. data/spec/{active_record_dummy → dummy}/config/boot.rb +0 -0
  45. data/spec/{active_record_dummy → dummy}/config/database.yml +3 -8
  46. data/spec/{active_record_dummy → dummy}/config/environment.rb +0 -0
  47. data/spec/{active_record_dummy → dummy}/config/environments/development.rb +0 -0
  48. data/spec/{active_record_dummy → dummy}/config/environments/mysql2.rb +0 -0
  49. data/spec/{active_record_dummy → dummy}/config/environments/postgresql.rb +0 -0
  50. data/spec/{active_record_dummy → dummy}/config/environments/production.rb +0 -0
  51. data/spec/{active_record_dummy → dummy}/config/environments/sqlite3.rb +0 -0
  52. data/spec/{active_record_dummy → dummy}/config/environments/test.rb +0 -0
  53. data/spec/{active_record_dummy → dummy}/config/initializers/backtrace_silencers.rb +0 -0
  54. data/spec/{active_record_dummy → dummy}/config/initializers/inflections.rb +0 -0
  55. data/spec/{active_record_dummy → dummy}/config/initializers/mime_types.rb +0 -0
  56. data/spec/{active_record_dummy → dummy}/config/initializers/secret_token.rb +0 -0
  57. data/spec/{active_record_dummy → dummy}/config/initializers/session_store.rb +0 -0
  58. data/spec/{active_record_dummy → dummy}/config/initializers/wrap_parameters.rb +0 -0
  59. data/spec/{active_record_dummy → dummy}/config/locales/en.yml +0 -0
  60. data/spec/{active_record_dummy → dummy}/config/routes.rb +0 -0
  61. data/spec/{active_record_dummy → dummy}/db/migrate/20130412154541_create_users.rb +0 -0
  62. data/spec/{active_record_dummy → dummy}/db/schema.rb +0 -0
  63. data/spec/{active_record_dummy → dummy}/db/seeds.rb +0 -0
  64. data/spec/{active_record_dummy → dummy}/lib/assets/.gitkeep +0 -0
  65. data/spec/{active_record_dummy → dummy}/lib/tasks/.gitkeep +0 -0
  66. data/spec/{active_record_dummy → dummy}/log/.gitkeep +0 -0
  67. data/spec/{active_record_dummy → dummy}/public/404.html +0 -0
  68. data/spec/{active_record_dummy → dummy}/public/422.html +0 -0
  69. data/spec/{active_record_dummy → dummy}/public/500.html +0 -0
  70. data/spec/{active_record_dummy → dummy}/public/favicon.ico +0 -0
  71. data/spec/{active_record_dummy → dummy}/public/index.html +0 -0
  72. data/spec/{active_record_dummy → dummy}/public/robots.txt +0 -0
  73. data/spec/{active_record_dummy → dummy}/script/rails +0 -0
  74. data/spec/{active_record_dummy → dummy}/vendor/assets/javascripts/.gitkeep +0 -0
  75. data/spec/{active_record_dummy → dummy}/vendor/assets/stylesheets/.gitkeep +0 -0
  76. data/spec/{active_record_dummy → dummy}/vendor/plugins/.gitkeep +0 -0
  77. data/spec/lib/mass_insert/base_spec.rb +40 -0
  78. data/spec/lib/mass_insert/builder/adapters/adapter_spec.rb +129 -0
  79. data/spec/lib/mass_insert/builder/adapters/helpers/abstract_query_spec.rb +130 -0
  80. data/spec/{mass_insert/adapters/adapter_helpers → lib/mass_insert/builder/adapters/helpers}/column_value_spec.rb +42 -94
  81. data/spec/lib/mass_insert/builder/adapters/mysql_adapter_spec.rb +15 -0
  82. data/spec/lib/mass_insert/builder/adapters/postgresql_adapter_spec.rb +9 -0
  83. data/spec/lib/mass_insert/builder/adapters/sqlite3_adapter_spec.rb +52 -0
  84. data/spec/lib/mass_insert/builder/adapters/sqlserver_adapter_spec.rb +38 -0
  85. data/spec/lib/mass_insert/builder/adapters_spec.rb +31 -0
  86. data/spec/lib/mass_insert/builder/base_spec.rb +28 -0
  87. data/spec/lib/mass_insert/builder/utilities_spec.rb +11 -0
  88. data/spec/lib/mass_insert/executer_spec.rb +33 -0
  89. data/spec/lib/mass_insert/process_spec.rb +44 -0
  90. data/spec/lib/mass_insert/result_spec.rb +45 -0
  91. data/spec/lib/mass_insert_spec.rb +35 -0
  92. data/spec/spec_helper.rb +7 -2
  93. data/spec/support/mass_insert_support.rb +12 -0
  94. metadata +160 -163
  95. data/lib/mass_insert/adapters.rb +0 -10
  96. data/lib/mass_insert/adapters/adapter.rb +0 -26
  97. data/lib/mass_insert/adapters/adapter_helpers.rb +0 -11
  98. data/lib/mass_insert/adapters/adapter_helpers/abstract_query.rb +0 -56
  99. data/lib/mass_insert/adapters/adapter_helpers/column_value.rb +0 -110
  100. data/lib/mass_insert/adapters/adapter_helpers/sanitizer.rb +0 -21
  101. data/lib/mass_insert/adapters/adapter_helpers/timestamp.rb +0 -33
  102. data/lib/mass_insert/adapters/mysql2_adapter.rb +0 -13
  103. data/lib/mass_insert/adapters/postgresql_adapter.rb +0 -5
  104. data/lib/mass_insert/adapters/sqlite3_adapter.rb +0 -37
  105. data/lib/mass_insert/adapters/sqlserver_adapter.rb +0 -29
  106. data/lib/mass_insert/process_control.rb +0 -46
  107. data/lib/mass_insert/query_builder.rb +0 -39
  108. data/lib/mass_insert/query_execution.rb +0 -29
  109. data/spec/active_record_models/column_types/binary_spec.rb +0 -60
  110. data/spec/active_record_models/column_types/boolean_spec.rb +0 -52
  111. data/spec/active_record_models/column_types/decimal_spec.rb +0 -49
  112. data/spec/active_record_models/column_types/integer_spec.rb +0 -49
  113. data/spec/active_record_models/column_types/string_spec.rb +0 -50
  114. data/spec/dummy_models/test.rb +0 -5
  115. data/spec/mass_insert/adapters/adapter_helpers/abstract_query_spec.rb +0 -119
  116. data/spec/mass_insert/adapters/adapter_helpers/sanitizer_spec.rb +0 -46
  117. data/spec/mass_insert/adapters/adapter_helpers/timestamp_spec.rb +0 -75
  118. data/spec/mass_insert/adapters/adapter_helpers_spec.rb +0 -24
  119. data/spec/mass_insert/adapters/adapter_spec.rb +0 -79
  120. data/spec/mass_insert/adapters/mysql_adapter_spec.rb +0 -22
  121. data/spec/mass_insert/adapters/postgresql_adapter_spec.rb +0 -11
  122. data/spec/mass_insert/adapters/sqlite3_adapter_spec.rb +0 -84
  123. data/spec/mass_insert/adapters/sqlserver_adapter_spec.rb +0 -61
  124. data/spec/mass_insert/adapters_spec.rb +0 -32
  125. data/spec/mass_insert/base_spec.rb +0 -114
  126. data/spec/mass_insert/process_control_spec.rb +0 -125
  127. data/spec/mass_insert/query_builder_spec.rb +0 -84
  128. data/spec/mass_insert/query_execution_spec.rb +0 -50
  129. data/spec/mass_insert_spec.rb +0 -28
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Integer" do
4
+ let!(:values){ [{}] }
5
+ let!(:options){ Hash.new }
6
+
7
+ context "when contains an integer" do
8
+ it "saves the value correctly" do
9
+ values.first.merge!(age: 20)
10
+ User.mass_insert(values, options)
11
+ expect(User.last.age).to eq(20)
12
+ end
13
+ end
14
+
15
+ context "when contains a string without digits" do
16
+ it "converts string value to integer" do
17
+ values.first.merge!(age: "string")
18
+ User.mass_insert(values, options)
19
+ expect(User.last.age).to eq(0)
20
+ end
21
+ end
22
+
23
+ context "when contains a digits string" do
24
+ it "converts string value to integer" do
25
+ values.first.merge!(age: "100")
26
+ User.mass_insert(values, options)
27
+ expect(User.last.age).to eq(100)
28
+ end
29
+
30
+ it "converts string value to integer" do
31
+ values.first.merge!(age: "200.45")
32
+ User.mass_insert(values, options)
33
+ expect(User.last.age).to eq(200)
34
+ end
35
+ end
36
+
37
+ context "when contains a decimal" do
38
+ it "converts decimal value to integer" do
39
+ values.first.merge!(age: 25.69)
40
+ User.mass_insert(values, options)
41
+ expect(User.last.age).to eq(25)
42
+ end
43
+ end
44
+
45
+ context "when contains a boolean" do
46
+ it "raises an exception" do
47
+ values.first.merge!(age: true)
48
+ expect(lambda{ User.mass_insert(values, options) }).to raise_exception
49
+ end
50
+ end
51
+
52
+ context "when not exist in values hashes" do
53
+ it "saves the default value" do
54
+ values.first.delete(:age)
55
+ User.mass_insert(values, options)
56
+ expect(User.last.age).to eq(nil)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe "String" do
4
+ let!(:values){ [{}] }
5
+ let!(:options){ Hash.new }
6
+
7
+ context "when contains a string" do
8
+ it "saves the value correctly" do
9
+ values.first.merge!(name: "name")
10
+ User.mass_insert(values, options)
11
+ expect(User.last.name).to eq("name")
12
+ end
13
+ end
14
+
15
+ context "when contains a integer" do
16
+ it "converts integer value to string" do
17
+ values.first.merge!(name: 10)
18
+ User.mass_insert(values, options)
19
+ expect(User.last.name).to eq("10")
20
+ end
21
+ end
22
+
23
+ context "when contains a decimal" do
24
+ it "converts decimal value to string" do
25
+ values.first.merge!(name: 25.69)
26
+ User.mass_insert(values, options)
27
+ expect(User.last.name).to eq("25.69")
28
+ end
29
+ end
30
+
31
+ context "when contains a boolean" do
32
+ it "converts boolean value to string" do
33
+ values.first.merge!(name: true)
34
+ User.mass_insert(values, options)
35
+ expect(User.last.name).to eq("true")
36
+ end
37
+ end
38
+
39
+ context "when not exist in values hashes" do
40
+ it "saves the default value" do
41
+ values.first.delete(:name)
42
+ User.mass_insert(values, options)
43
+ expect(User.last.name).to eq(nil)
44
+ end
45
+ end
46
+ end
@@ -1,6 +1,4 @@
1
- require './spec/spec_helper'
2
- require "./lib/mass_insert"
3
- require "./spec/dummy_models/test"
1
+ require 'spec_helper'
4
2
 
5
3
  describe "Model" do
6
4
 
@@ -82,22 +80,4 @@ describe "Model" do
82
80
  expect(User.count).to eq(1200)
83
81
  end
84
82
  end
85
-
86
- context "when is used with options" do
87
- context "when the table name doesn't exit" do
88
- it "should not save any record" do
89
- 5.times{ @values << @value_hash }
90
- @options.merge!(:table_name => "countries")
91
- expect(lambda{ User.mass_insert(@values, @options) }).to raise_exception
92
- end
93
- end
94
-
95
- context "when the class name not inherit from ActiveRecord" do
96
- it "should not save any record" do
97
- 5.times{ @values << @value_hash }
98
- @options.merge!(:class_name => Test)
99
- expect(lambda{ User.mass_insert(@values, @options) }).to raise_exception
100
- end
101
- end
102
- end
103
83
  end
File without changes
@@ -8,7 +8,7 @@ gem 'rails', '3.2.13'
8
8
  gem 'sqlite3'
9
9
  gem 'mysql2'
10
10
  gem 'pg'
11
- gem 'mass_insert'
11
+ gem 'mass_insert', :path => '../../../mass_insert'
12
12
 
13
13
  # Gems used only for assets and not required
14
14
  # in production environments by default.
File without changes
File without changes
File without changes
File without changes
@@ -11,24 +11,19 @@
11
11
  mysql2:
12
12
  adapter: mysql2
13
13
  database: mysql2_test
14
- user: root
15
- password: D3s4rr0ll0$.
16
- pool: 5
17
- timeout: 5000
14
+ username: travis
18
15
  encoding: utf8
19
16
 
20
17
  postgresql:
21
18
  adapter: postgresql
22
19
  database: postgresql_test
23
- pool: 5
24
- timeout: 5000
20
+ username: postgres
25
21
  encoding: utf8
26
22
 
27
23
  sqlite3:
28
24
  adapter: sqlite3
29
25
  database: db/development.sqlite3
30
- pool: 5
31
- timeout: 5000
26
+ encoding: utf8
32
27
 
33
28
 
34
29
  # Warning: The database defined as "test" will be erased and
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe MassInsert::Base do
4
+ let!(:values) { [{name: "name"}] }
5
+ let!(:options){ {option: "value"} }
6
+
7
+ before :each do
8
+ MassInsert::Process.any_instance.stub(:start)
9
+ end
10
+
11
+ describe ".mass_insert" do
12
+ it "can receive values and options" do
13
+ expect{ User.mass_insert(values, options) }.to_not raise_error
14
+ end
15
+
16
+ it "can receive only values" do
17
+ expect{ User.mass_insert(values) }.to_not raise_error
18
+ end
19
+
20
+ it "can't be called without params" do
21
+ expect{ User.mass_insert }.to raise_error
22
+ end
23
+ end
24
+
25
+ describe ".mass_insert_results" do
26
+ before :each do
27
+ User.mass_insert(values, options)
28
+ end
29
+
30
+ it "returns a MassInsert::Result instance" do
31
+ expect(User.mass_insert_results).to be_an_instance_of(MassInsert::Result)
32
+ end
33
+
34
+ it "calls MassInsert::Result.new with mass_insert process" do
35
+ process = User.instance_variable_get(:@mass_insert_process)
36
+ MassInsert::Result.should_receive(:new).with(process).exactly(1).times
37
+ User.mass_insert_results
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,129 @@
1
+ require 'spec_helper'
2
+
3
+ describe MassInsert::Builder::Adapters::Adapter do
4
+ let!(:subject){ described_class.new([], {}) }
5
+
6
+ describe "#initialize" do
7
+ it "initializes values" do
8
+ expect(subject.values).to eq([])
9
+ end
10
+
11
+ it "initializes options" do
12
+ expect(subject.options).to eq({})
13
+ end
14
+ end
15
+
16
+ describe "#class_name" do
17
+ it "returns class_name option value" do
18
+ subject.options = {:class_name => "FakeModel"}
19
+ expect(subject.class_name).to eq("FakeModel")
20
+ end
21
+ end
22
+
23
+ describe "#primary_key" do
24
+ it "returns primary_key option value" do
25
+ subject.options = {:primary_key => true}
26
+ expect(subject.primary_key).to be_true
27
+ end
28
+ end
29
+
30
+ describe "#each_slice" do
31
+ it "returns each_slice option value" do
32
+ subject.options = {:each_slice => 10000}
33
+ expect(subject.each_slice).to be 10000
34
+ end
35
+ end
36
+
37
+ describe "#columns" do
38
+ context "when instance columns variable isn't defined" do
39
+ it "returns sanitized_columns result" do
40
+ subject.stub(:sanitized_columns).and_return("sanitized_columns")
41
+ expect(subject.columns).to eq("sanitized_columns")
42
+ end
43
+ end
44
+
45
+ context "when instance columns variable has been defined" do
46
+ it "returns instance columns variable" do
47
+ subject.stub(:sanitized_columns).and_return("sanitized_columns")
48
+ subject.columns
49
+ subject.stub(:sanitized_columns).and_return("sanitized_columns_other")
50
+ expect(subject.columns).to eq("sanitized_columns")
51
+ end
52
+ end
53
+ end
54
+
55
+ describe "#sanitized_columns" do
56
+ before :each do
57
+ subject.options.merge!({:class_name => User})
58
+ User.stub(:column_names).and_return(["id", "name", "email"])
59
+ end
60
+
61
+ context "when primary_key is false" do
62
+ it "returns the columns array without primary key column" do
63
+ subject.options.merge!({:primary_key => false})
64
+ expect(subject.columns).to eq([:name, :email])
65
+ end
66
+ end
67
+
68
+ context "when primary key is true" do
69
+ it "returns the columns array with primary key column" do
70
+ subject.options.merge!({:primary_key => true})
71
+ expect(subject.columns).to eq([:id, :name, :email])
72
+ end
73
+ end
74
+ end
75
+
76
+ describe "#timestamp?" do
77
+ context "when respond to timestamp columns" do
78
+ it "returns true" do
79
+ subject.stub(:columns).and_return([:updated_at, :created_at])
80
+ expect(subject.timestamp?).to be_true
81
+ end
82
+ end
83
+
84
+ context "when doesn't respond to timestamp columns" do
85
+ it "returns false" do
86
+ subject.stub(:columns).and_return([:created_at])
87
+ expect(subject.timestamp?).to be_false
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "#timestamp_format" do
93
+ it "returns default timestamp format" do
94
+ expect(subject.timestamp_format).to eq("%Y-%m-%d %H:%M:%S.%6N")
95
+ end
96
+ end
97
+
98
+ describe "#timestamp" do
99
+ it "returns default timestamp value with correct format" do
100
+ subject.stub(:timestamp_format).and_return("%Y-%m-%d %H:%M:%S")
101
+ expect(subject.timestamp).to eq(Time.now.strftime("%Y-%m-%d %H:%M:%S"))
102
+ end
103
+ end
104
+
105
+ describe "#timestamp_hash" do
106
+ it "returns a timestamp hash" do
107
+ timestamp = Time.now.strftime("%Y-%m-%d %H:%M:%S")
108
+ subject.stub(:timestamp).and_return(timestamp)
109
+ expect(subject.timestamp_hash).to eq({:created_at => timestamp, :updated_at => timestamp})
110
+ end
111
+ end
112
+
113
+ describe "#values_per_insertion" do
114
+ context "when each_slice option is not false" do
115
+ it "returns each_slice value" do
116
+ subject.options.merge!(each_slice: 10)
117
+ expect(subject.values_per_insertion).to eq(10)
118
+ end
119
+ end
120
+
121
+ context "when each_slice option is false" do
122
+ it "returns length of values" do
123
+ subject.values = [{}, {}]
124
+ subject.options.merge!(each_slice: false)
125
+ expect(subject.values_per_insertion).to eq(2)
126
+ end
127
+ end
128
+ end
129
+ end