data_miner 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ 2.3.1 / 2012-06-22
2
+
3
+ * Bug fixes
4
+
5
+ * Avoid duplicate rows by correctly identifying auto-increment versus non-auto-increment integer primary keys
6
+ * Properly sort per-row column statistics
7
+
1
8
  2.3.0 / 2012-06-21
2
9
 
3
10
  * Enhancements
data/Rakefile CHANGED
@@ -11,6 +11,7 @@ end
11
11
 
12
12
  task :test_separately do
13
13
  Dir[File.expand_path('../test/**/test_*.rb', __FILE__)].each do |path|
14
+ sleep 0.5
14
15
  system "rake test TEST=#{path}"
15
16
  end
16
17
  end
data/data_miner.gemspec CHANGED
@@ -18,12 +18,12 @@ Gem::Specification.new do |s|
18
18
  s.require_paths = ["lib"]
19
19
 
20
20
  s.add_runtime_dependency 'aasm'
21
- s.add_runtime_dependency 'active_record_inline_schema'
21
+ s.add_runtime_dependency 'active_record_inline_schema', '>=0.5.6'
22
22
  s.add_runtime_dependency 'activerecord', '>=2.3.4'
23
23
  s.add_runtime_dependency 'activesupport', '>=2.3.4'
24
24
  s.add_runtime_dependency 'errata', '>=1.0.1'
25
- s.add_runtime_dependency 'remote_table', '>=1.2.2'
26
- s.add_runtime_dependency 'upsert'
25
+ s.add_runtime_dependency 'remote_table', '>=2.0.2'
26
+ s.add_runtime_dependency 'upsert', '>=0.3.1'
27
27
 
28
28
  s.add_development_dependency 'dkastner-alchemist'
29
29
  s.add_development_dependency 'conversions'
@@ -66,7 +66,7 @@ class DataMiner
66
66
 
67
67
  validates_presence_of :model_name
68
68
 
69
- has_many :column_statistics, :class_name => 'DataMiner::Run::ColumnStatistic'
69
+ has_many :column_statistics, :class_name => 'DataMiner::Run::ColumnStatistic', :order => 'id ASC'
70
70
 
71
71
  include ::AASM
72
72
  aasm_initial_state INITIAL_STATE
@@ -113,9 +113,23 @@ class DataMiner
113
113
 
114
114
  def table_has_autoincrementing_primary_key?
115
115
  return @table_has_autoincrementing_primary_key_query.first if @table_has_autoincrementing_primary_key_query.is_a?(Array)
116
- answer = model.columns.any? do |column|
117
- column.primary and column.sql_type =~ /\bint/i
116
+ c = ActiveRecord::Base.connection_pool.checkout
117
+ answer = if (pk = model.primary_key) and model.columns_hash[pk].type == :integer
118
+ case c.adapter_name
119
+ when /mysql/i
120
+ extra = c.select_value %{SELECT EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = #{c.quote(c.current_database)} AND TABLE_NAME = #{c.quote(model.table_name)} AND COLUMN_NAME = #{c.quote(pk)}}
121
+ extra.to_s.include?('auto_increment')
122
+ when /postgres/i
123
+ column_default = c.select_value %{SELECT COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = #{c.quote(model.table_name)} AND COLUMN_NAME = #{c.quote(pk)}}
124
+ column_default.to_s.include?('nextval')
125
+ when /sqlite/i
126
+ # FIXME doesn't work
127
+ # row = c.select_rows("PRAGMA table_info(#{model.quoted_table_name})").detect { |r| r[1] == pk }
128
+ # row[2] == 'INTEGER' and row[3] == 1 and row[5] == 1
129
+ true
130
+ end
118
131
  end
132
+ ActiveRecord::Base.connection_pool.checkin c
119
133
  @table_has_autoincrementing_primary_key_query = [answer]
120
134
  answer
121
135
  end
@@ -1,3 +1,3 @@
1
1
  class DataMiner
2
- VERSION = '2.3.0'
2
+ VERSION = '2.3.1'
3
3
  end
@@ -0,0 +1,33 @@
1
+ require 'helper'
2
+ init_database
3
+ require 'earth'
4
+
5
+ Earth.init :residence, :electricity, :hospitality, :load_data_miner => true, :apply_schemas => true
6
+
7
+ class PetBlue < ActiveRecord::Base
8
+ data_miner do
9
+ import 'fake', :url => 'fake' do
10
+ key :id
11
+ end
12
+ end
13
+ end
14
+ PetBlue.auto_upgrade!
15
+
16
+ describe DataMiner::Step::Import do
17
+ describe '#table_has_autoincrementing_primary_key?' do
18
+ it "recognizes auto-increment primary keys" do
19
+ PetBlue.data_miner_script.steps.first.send(:table_has_autoincrementing_primary_key?).must_equal true
20
+ end
21
+ it "recognizes that not all integer primary keys are auto-increment" do
22
+ [
23
+ ElectricUtility,
24
+ ResidentialEnergyConsumptionSurveyResponse,
25
+ CommercialBuildingEnergyConsumptionSurveyResponse,
26
+ ].each do |model|
27
+ model.data_miner_script.steps.select { |s| s.is_a?(DataMiner::Step::Import) }.each do |import_step|
28
+ import_step.send(:table_has_autoincrementing_primary_key?).must_equal false
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
data/test/helper.rb CHANGED
@@ -19,55 +19,34 @@ ActiveRecord::Base.logger = Logger.new $stderr
19
19
  ActiveRecord::Base.logger.level = Logger::INFO
20
20
  # ActiveRecord::Base.logger.level = Logger::DEBUG
21
21
 
22
- case ENV['DATABASE']
23
- when /postgr/i
24
- createdb_bin = ENV['TEST_CREATEDB_BIN'] || 'createdb'
25
- dropdb_bin = ENV['TEST_DROPDB_BIN'] || 'dropdb'
26
- username = ENV['TEST_POSTGRES_USERNAME'] || `whoami`.chomp
27
- # password = ENV['TEST_POSTGRES_PASSWORD'] || 'password'
28
- database = ENV['TEST_POSTGRES_DATABASE'] || 'data_miner_test'
29
- system %{#{dropdb_bin} #{database}}
30
- system %{#{createdb_bin} #{database}}
31
- ActiveRecord::Base.establish_connection(
32
- 'adapter' => 'postgresql',
33
- 'encoding' => 'utf8',
34
- 'database' => database,
35
- 'username' => username
36
- # 'password' => password
37
- )
38
- when /sqlite/i
39
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
40
- else
41
- bin = ENV['TEST_MYSQL_BIN'] || 'mysql'
42
- username = ENV['TEST_MYSQL_USERNAME'] || 'root'
43
- password = ENV['TEST_MYSQL_PASSWORD'] || 'password'
44
- database = ENV['TEST_MYSQL_DATABASE'] || 'data_miner_test'
45
- cmd = "#{bin} -u #{username} -p#{password}"
46
- `#{cmd} -e 'show databases'`
47
- unless $?.success?
48
- $stderr.puts "Skipping mysql tests because `#{cmd}` doesn't work"
49
- exit 0
50
- end
51
- system %{#{cmd} -e "drop database #{database}"}
52
- system %{#{cmd} -e "create database #{database}"}
53
- ActiveRecord::Base.establish_connection(
54
- 'adapter' => (RUBY_PLATFORM == 'java' ? 'mysql' : 'mysql2'),
55
- 'encoding' => 'utf8',
56
- 'database' => database,
57
- 'username' => username,
58
- 'password' => password
59
- )
60
- end
61
-
62
22
  ActiveRecord::Base.mass_assignment_sanitizer = :strict
63
23
 
64
24
  require 'data_miner'
65
25
 
66
26
  def init_database(unit_converter = :conversions)
67
- cmd = %{mysql -u root -ppassword -e "DROP DATABASE data_miner_test; CREATE DATABASE data_miner_test CHARSET utf8"}
68
- $stderr.puts "Running `#{cmd}`..."
69
- system cmd
70
- $stderr.puts "Done."
27
+ case ENV['DATABASE']
28
+ when /postgr/i
29
+ system %{dropdb test_data_miner}
30
+ system %{createdb test_data_miner}
31
+ ActiveRecord::Base.establish_connection(
32
+ 'adapter' => 'postgresql',
33
+ 'encoding' => 'utf8',
34
+ 'database' => 'test_data_miner',
35
+ 'username' => `whoami`.chomp
36
+ )
37
+ when /sqlite/i
38
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
39
+ else
40
+ system %{mysql -u root -ppassword -e "DROP DATABASE test_data_miner"}
41
+ system %{mysql -u root -ppassword -e "CREATE DATABASE test_data_miner CHARSET utf8"}
42
+ ActiveRecord::Base.establish_connection(
43
+ 'adapter' => (RUBY_PLATFORM == 'java' ? 'mysql' : 'mysql2'),
44
+ 'encoding' => 'utf8',
45
+ 'database' => 'test_data_miner',
46
+ 'username' => 'root',
47
+ 'password' => 'password'
48
+ )
49
+ end
71
50
 
72
51
  DataMiner::Run.auto_upgrade!
73
52
  DataMiner::Run::ColumnStatistic.auto_upgrade!
@@ -27,7 +27,7 @@ describe DataMiner::Run::ColumnStatistic do
27
27
 
28
28
  it "keeps max and min (as strings)" do
29
29
  Pet.data_miner_runs.first.initial_column_statistics(:age).max.must_equal 'nil'
30
- Pet.data_miner_runs.first.final_column_statistics(:age).max.must_equal '17'
30
+ Pet.data_miner_runs.first.final_column_statistics(:age).max.must_include '17'
31
31
  end
32
32
 
33
33
  it "keeps average and sum" do
@@ -1,7 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require 'helper'
3
3
  init_database
4
- init_models
5
4
  require 'earth'
6
5
 
7
6
  # use earth, which has a plethora of real-world data_miner blocks
@@ -1,7 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require 'helper'
3
3
  init_database
4
- init_models
5
4
  require 'earth'
6
5
 
7
6
  # use earth, which has a plethora of real-world data_miner blocks
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_miner
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-06-21 00:00:00.000000000 Z
14
+ date: 2012-06-22 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: aasm
@@ -36,7 +36,7 @@ dependencies:
36
36
  requirements:
37
37
  - - ! '>='
38
38
  - !ruby/object:Gem::Version
39
- version: '0'
39
+ version: 0.5.6
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
@@ -44,7 +44,7 @@ dependencies:
44
44
  requirements:
45
45
  - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 0.5.6
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: activerecord
50
50
  requirement: !ruby/object:Gem::Requirement
@@ -100,7 +100,7 @@ dependencies:
100
100
  requirements:
101
101
  - - ! '>='
102
102
  - !ruby/object:Gem::Version
103
- version: 1.2.2
103
+ version: 2.0.2
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
@@ -108,7 +108,7 @@ dependencies:
108
108
  requirements:
109
109
  - - ! '>='
110
110
  - !ruby/object:Gem::Version
111
- version: 1.2.2
111
+ version: 2.0.2
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: upsert
114
114
  requirement: !ruby/object:Gem::Requirement
@@ -116,7 +116,7 @@ dependencies:
116
116
  requirements:
117
117
  - - ! '>='
118
118
  - !ruby/object:Gem::Version
119
- version: '0'
119
+ version: 0.3.1
120
120
  type: :runtime
121
121
  prerelease: false
122
122
  version_requirements: !ruby/object:Gem::Requirement
@@ -124,7 +124,7 @@ dependencies:
124
124
  requirements:
125
125
  - - ! '>='
126
126
  - !ruby/object:Gem::Version
127
- version: '0'
127
+ version: 0.3.1
128
128
  - !ruby/object:Gem::Dependency
129
129
  name: dkastner-alchemist
130
130
  requirement: !ruby/object:Gem::Requirement
@@ -349,6 +349,7 @@ files:
349
349
  - lib/data_miner/unit_converter/alchemist.rb
350
350
  - lib/data_miner/unit_converter/conversions.rb
351
351
  - lib/data_miner/version.rb
352
+ - test/data_miner/step/test_import.rb
352
353
  - test/data_miner/test_attribute.rb
353
354
  - test/data_miner/unit_converter/test_alchemist.rb
354
355
  - test/data_miner/unit_converter/test_conversions.rb
@@ -397,6 +398,7 @@ specification_version: 3
397
398
  summary: Download, pull out of a ZIP/TAR/GZ/BZ2 archive, parse, correct, and import
398
399
  XLS, ODS, XML, CSV, HTML, etc. into your ActiveRecord models.
399
400
  test_files:
401
+ - test/data_miner/step/test_import.rb
400
402
  - test/data_miner/test_attribute.rb
401
403
  - test/data_miner/unit_converter/test_alchemist.rb
402
404
  - test/data_miner/unit_converter/test_conversions.rb