data_miner 2.3.0 → 2.3.1

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/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