data_sanity 0.0.5 → 0.0.7
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/data_sanity.gemspec +1 -0
- data/lib/data_sanity/inspector.rb +22 -4
- data/lib/data_sanity/tasks.rb +9 -2
- data/lib/data_sanity/templates/data_sanity_criteria.yml +10 -0
- data/lib/data_sanity/version.rb +1 -1
- data/spec/data_sanity/inspector_spec.rb +46 -10
- data/spec/support/helper.rb +22 -2
- data/spec/support/sample_app/app/models/car.rb +7 -0
- data/spec/support/sample_app/app/models/person.rb +2 -0
- data/spec/support/sample_app/db/migrate/20111205042538_create_cars.rb +15 -0
- data/spec/support/sample_app/db/schema.rb +10 -1
- metadata +29 -12
- data/spec/support/sample_app/test/fixtures/people.yml +0 -9
- data/spec/support/sample_app/test/unit/person_test.rb +0 -8
data/data_sanity.gemspec
CHANGED
@@ -2,20 +2,25 @@ module DataSanity
|
|
2
2
|
class Inspector
|
3
3
|
|
4
4
|
CONSIDERED_RECORDS = 1
|
5
|
-
ALLOWED_VALIDATION = [:all, :random]
|
6
|
-
attr_accessor :all, :random, :models, :records_per_model
|
5
|
+
ALLOWED_VALIDATION = [:all, :random, :criteria]
|
6
|
+
attr_accessor :all, :random, :criteria, :models, :records_per_model
|
7
7
|
|
8
8
|
def initialize options = {}
|
9
9
|
options[:validate] == :random ? @random = true : @all = true
|
10
10
|
@records_per_model = options[:records_per_model] || CONSIDERED_RECORDS
|
11
11
|
@models = load_models
|
12
|
+
file_path = "#{Rails.root}/config/data_sanity_criteria.yml"
|
13
|
+
@criteria = File.exists?(file_path) ? (YAML.load File.open(file_path).read) : false
|
12
14
|
end
|
13
15
|
|
14
16
|
def investigate
|
15
17
|
@models.each do |model_string|
|
16
18
|
model = model_string.constantize
|
17
19
|
validate_all(model) if @all
|
18
|
-
|
20
|
+
if @random
|
21
|
+
validate_criteria(model, @criteria[model_string]) and return if @criteria && @criteria[model_string].present?
|
22
|
+
validate_random(model)
|
23
|
+
end
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
@@ -29,12 +34,25 @@ module DataSanity
|
|
29
34
|
|
30
35
|
def validate_random(model)
|
31
36
|
no_of_records = model.count
|
37
|
+
return if no_of_records == 0
|
32
38
|
@records_per_model.times do
|
33
|
-
instance = model.
|
39
|
+
instance = model.offset(rand(no_of_records)).first
|
34
40
|
populate_if_invalid_record(instance, model)
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
44
|
+
def validate_criteria(model, criteria)
|
45
|
+
criteria.each do |attribute, values|
|
46
|
+
values.each do |value|
|
47
|
+
results = model.where(attribute.to_sym => value)
|
48
|
+
count = results.count
|
49
|
+
next if count == 0
|
50
|
+
instance = results.offset(rand(count)).first
|
51
|
+
populate_if_invalid_record(instance, model)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
38
56
|
def populate_if_invalid_record(instance, model)
|
39
57
|
DataInspector.create(:table_name => model.to_s,
|
40
58
|
:table_primary_key => model.primary_key,
|
data/lib/data_sanity/tasks.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
namespace :
|
2
|
-
namespace :
|
1
|
+
namespace :data_sanity do
|
2
|
+
namespace :db do
|
3
3
|
desc 'Create data inspector model for data sanity results'
|
4
4
|
task :migrate => :environment do
|
5
5
|
Dir.chdir("#{Rails.root}") do
|
@@ -16,4 +16,11 @@ namespace :db do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
desc 'Creating a sample criteria file'
|
21
|
+
task :citeria do
|
22
|
+
Dir.chdir("#{Rails.root}") do
|
23
|
+
system "cp #{File.open('./templates/data_sanity_criteria.yml').read} config/."
|
24
|
+
end
|
25
|
+
end
|
19
26
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
############################################
|
2
|
+
# This is a sample criteria.
|
3
|
+
# Start with Model Name and
|
4
|
+
#<Model Name>: # Criteria-Rule to be applied
|
5
|
+
# <field name>: # Anthing mentioned is considered for validations against mentioned below distinct values
|
6
|
+
# - 'Raju' # Various values field can take
|
7
|
+
# - 'Saju'
|
8
|
+
# - 'Taju'
|
9
|
+
# <age> # Anthing mentioned is considered for validations against all possible distinct values
|
10
|
+
############################################
|
data/lib/data_sanity/version.rb
CHANGED
@@ -7,21 +7,21 @@ describe "DataSanity::Inspector" do
|
|
7
7
|
it "should set all switch as default options and populate all models of the applications" do
|
8
8
|
inspector = DataSanity::Inspector.new
|
9
9
|
inspector.all.should be_true
|
10
|
-
inspector.models.should == ["Person"]
|
10
|
+
inspector.models.should == ["Car", "Person"]
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should set random switch, populate default records_per_model and populate all models of the applications" do
|
14
14
|
inspector = DataSanity::Inspector.new :validate => :random
|
15
15
|
inspector.random.should be_true
|
16
16
|
inspector.records_per_model.should == 1
|
17
|
-
inspector.models.should == ["Person"]
|
17
|
+
inspector.models.should == ["Car", "Person"]
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should set random switch, populate records_per_model and populate all models of the applications" do
|
21
21
|
inspector = DataSanity::Inspector.new :validate => :random, :records_per_model => 5
|
22
22
|
inspector.random.should be_true
|
23
23
|
inspector.records_per_model.should == 5
|
24
|
-
inspector.models.should == ["Person"]
|
24
|
+
inspector.models.should == ["Car", "Person"]
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -30,14 +30,14 @@ describe "DataSanity::Inspector" do
|
|
30
30
|
setup_data_inspector
|
31
31
|
end
|
32
32
|
|
33
|
-
it "should check for errors on the model and populate fields in DataInspector" do
|
34
|
-
inspector = DataSanity::Inspector.new
|
35
|
-
inspector.investigate
|
36
|
-
DataInspector.count.should == 0
|
37
|
-
end
|
38
|
-
|
39
33
|
describe "all" do
|
40
34
|
|
35
|
+
it "should check for models with no data" do
|
36
|
+
inspector = DataSanity::Inspector.new
|
37
|
+
inspector.investigate
|
38
|
+
DataInspector.count.should == 0
|
39
|
+
end
|
40
|
+
|
41
41
|
it "should check for errors on the model and populate fields in DataInspector" do
|
42
42
|
inspector = DataSanity::Inspector.new
|
43
43
|
|
@@ -57,10 +57,16 @@ describe "DataSanity::Inspector" do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
describe "random" do
|
60
|
+
it "should check for models with no data" do
|
61
|
+
inspector = DataSanity::Inspector.new :validate => :random
|
62
|
+
inspector.investigate
|
63
|
+
DataInspector.count.should == 0
|
64
|
+
end
|
65
|
+
|
60
66
|
it "should check for errors on the model and populate fields in DataInspector" do
|
61
67
|
inspector = DataSanity::Inspector.new(:validate => :random, :records_per_model => 2)
|
62
68
|
|
63
|
-
Person.new(:name => "
|
69
|
+
Person.new(:name => "InValid-Record").save(:validate => false)
|
64
70
|
Person.new(:name => "UnderAge", :age => 1).save(:validate => false)
|
65
71
|
Person.new(:age => 20).save(:validate => false)
|
66
72
|
Person.new(:age => 1).save(:validate => false)
|
@@ -68,6 +74,36 @@ describe "DataSanity::Inspector" do
|
|
68
74
|
inspector.investigate
|
69
75
|
DataInspector.count.should == 2
|
70
76
|
end
|
77
|
+
|
78
|
+
describe "criteria" do
|
79
|
+
before :each do
|
80
|
+
setup_data_sanity_criteria
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should check for models with no data" do
|
84
|
+
inspector = DataSanity::Inspector.new :validate => :random
|
85
|
+
inspector.investigate
|
86
|
+
DataInspector.count.should == 0
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should check for errors on model based on criteria picked from data_sanity_criteria.yml" do
|
90
|
+
inspector = DataSanity::Inspector.new(:validate => :random)
|
91
|
+
|
92
|
+
2.times { Person.new(:name => "Raju").save(:validate => false) }
|
93
|
+
2.times { Person.new(:name => "Saju").save(:validate => false) }
|
94
|
+
2.times { Car.new(:name => "Santro").save(:validate => false) }
|
95
|
+
Person.new(:age => 20).save(:validate => false)
|
96
|
+
car = Car.new(:name => "800", :make => "Maruti", :color => "Black", :person => Person.first).save(:validate => false)
|
97
|
+
|
98
|
+
inspector.investigate
|
99
|
+
DataInspector.count.should == 3
|
100
|
+
DataInspector.all.collect(&:table_name).should == ["Car", "Person", "Person"]
|
101
|
+
end
|
102
|
+
|
103
|
+
after :each do
|
104
|
+
cleanup_data_sanity_criteria
|
105
|
+
end
|
106
|
+
end
|
71
107
|
end
|
72
108
|
|
73
109
|
after :each do
|
data/spec/support/helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
def clean_data_inspector_migration
|
2
2
|
Dir.chdir("#{Rails.root}") do
|
3
3
|
system "rake db:rollback"
|
4
|
-
system "rake db:
|
4
|
+
system "rake data_sanity:db:rollback"
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
@@ -14,7 +14,27 @@ end
|
|
14
14
|
|
15
15
|
def setup_data_inspector
|
16
16
|
Dir.chdir("#{Rails.root}") do
|
17
|
-
system "rake db:
|
17
|
+
system "rake data_sanity:db:migrate"
|
18
18
|
system "rake db:migrate"
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
def setup_data_sanity_criteria
|
23
|
+
Dir.chdir("#{Rails.root}") do
|
24
|
+
system "rake data_sanity:criteria"
|
25
|
+
file = File.open("config/data_sanity_criteria.yml", "w")
|
26
|
+
file << template_yml
|
27
|
+
file.close
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def cleanup_data_sanity_criteria
|
32
|
+
Dir.chdir("#{Rails.root}") do
|
33
|
+
system "rm config/data_sanity_criteria.yml"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def template_yml
|
38
|
+
"Person:
|
39
|
+
name: ['Raju', 'Saju']"
|
40
|
+
end
|
@@ -10,7 +10,16 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended to check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(:version =>
|
13
|
+
ActiveRecord::Schema.define(:version => 20111205042922) do
|
14
|
+
|
15
|
+
create_table "cars", :force => true do |t|
|
16
|
+
t.string "name"
|
17
|
+
t.string "make"
|
18
|
+
t.string "color"
|
19
|
+
t.integer "person_id"
|
20
|
+
t.datetime "created_at"
|
21
|
+
t.datetime "updated_at"
|
22
|
+
end
|
14
23
|
|
15
24
|
create_table "data_inspectors", :force => true do |t|
|
16
25
|
t.string "table_name"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: data_sanity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Habibullah, Rahul, Jigyasa, Jyotsna, Hephzibah, Garima
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-12-
|
18
|
+
date: 2011-12-05 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|
@@ -33,11 +33,27 @@ dependencies:
|
|
33
33
|
- 6
|
34
34
|
version: 3.0.6
|
35
35
|
requirement: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
name: rake
|
40
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - "="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 49
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 8
|
49
|
+
- 7
|
50
|
+
version: 0.8.7
|
51
|
+
requirement: *id002
|
36
52
|
- !ruby/object:Gem::Dependency
|
37
53
|
type: :development
|
38
54
|
prerelease: false
|
39
55
|
name: rspec
|
40
|
-
version_requirements: &
|
56
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
41
57
|
none: false
|
42
58
|
requirements:
|
43
59
|
- - ">="
|
@@ -46,12 +62,12 @@ dependencies:
|
|
46
62
|
segments:
|
47
63
|
- 0
|
48
64
|
version: "0"
|
49
|
-
requirement: *
|
65
|
+
requirement: *id003
|
50
66
|
- !ruby/object:Gem::Dependency
|
51
67
|
type: :development
|
52
68
|
prerelease: false
|
53
69
|
name: sqlite3
|
54
|
-
version_requirements: &
|
70
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
55
71
|
none: false
|
56
72
|
requirements:
|
57
73
|
- - ">="
|
@@ -60,7 +76,7 @@ dependencies:
|
|
60
76
|
segments:
|
61
77
|
- 0
|
62
78
|
version: "0"
|
63
|
-
requirement: *
|
79
|
+
requirement: *id004
|
64
80
|
description: Gem for checking data sanity
|
65
81
|
email:
|
66
82
|
- ""
|
@@ -82,6 +98,7 @@ files:
|
|
82
98
|
- lib/data_sanity/models/data_inspector.rb
|
83
99
|
- lib/data_sanity/railtie.rb
|
84
100
|
- lib/data_sanity/tasks.rb
|
101
|
+
- lib/data_sanity/templates/data_sanity_criteria.yml
|
85
102
|
- lib/data_sanity/version.rb
|
86
103
|
- spec/data_sanity/inspector_spec.rb
|
87
104
|
- spec/data_sanity/models/data_inspector_spec.rb
|
@@ -92,6 +109,7 @@ files:
|
|
92
109
|
- spec/support/sample_app/README
|
93
110
|
- spec/support/sample_app/Rakefile
|
94
111
|
- spec/support/sample_app/app/helpers/application_helper.rb
|
112
|
+
- spec/support/sample_app/app/models/car.rb
|
95
113
|
- spec/support/sample_app/app/models/not_an_active_record_model.rb
|
96
114
|
- spec/support/sample_app/app/models/person.rb
|
97
115
|
- spec/support/sample_app/app/views/layouts/application.html.erb
|
@@ -111,6 +129,7 @@ files:
|
|
111
129
|
- spec/support/sample_app/config/locales/en.yml
|
112
130
|
- spec/support/sample_app/config/routes.rb
|
113
131
|
- spec/support/sample_app/db/migrate/20111130045224_create_people.rb
|
132
|
+
- spec/support/sample_app/db/migrate/20111205042538_create_cars.rb
|
114
133
|
- spec/support/sample_app/db/schema.rb
|
115
134
|
- spec/support/sample_app/db/seeds.rb
|
116
135
|
- spec/support/sample_app/lib/tasks/.gitkeep
|
@@ -129,10 +148,8 @@ files:
|
|
129
148
|
- spec/support/sample_app/public/robots.txt
|
130
149
|
- spec/support/sample_app/public/stylesheets/.gitkeep
|
131
150
|
- spec/support/sample_app/script/rails
|
132
|
-
- spec/support/sample_app/test/fixtures/people.yml
|
133
151
|
- spec/support/sample_app/test/performance/browsing_test.rb
|
134
152
|
- spec/support/sample_app/test/test_helper.rb
|
135
|
-
- spec/support/sample_app/test/unit/person_test.rb
|
136
153
|
- spec/support/sample_app/vendor/plugins/.gitkeep
|
137
154
|
homepage: ""
|
138
155
|
licenses: []
|
@@ -177,6 +194,7 @@ test_files:
|
|
177
194
|
- spec/support/sample_app/README
|
178
195
|
- spec/support/sample_app/Rakefile
|
179
196
|
- spec/support/sample_app/app/helpers/application_helper.rb
|
197
|
+
- spec/support/sample_app/app/models/car.rb
|
180
198
|
- spec/support/sample_app/app/models/not_an_active_record_model.rb
|
181
199
|
- spec/support/sample_app/app/models/person.rb
|
182
200
|
- spec/support/sample_app/app/views/layouts/application.html.erb
|
@@ -196,6 +214,7 @@ test_files:
|
|
196
214
|
- spec/support/sample_app/config/locales/en.yml
|
197
215
|
- spec/support/sample_app/config/routes.rb
|
198
216
|
- spec/support/sample_app/db/migrate/20111130045224_create_people.rb
|
217
|
+
- spec/support/sample_app/db/migrate/20111205042538_create_cars.rb
|
199
218
|
- spec/support/sample_app/db/schema.rb
|
200
219
|
- spec/support/sample_app/db/seeds.rb
|
201
220
|
- spec/support/sample_app/lib/tasks/.gitkeep
|
@@ -214,8 +233,6 @@ test_files:
|
|
214
233
|
- spec/support/sample_app/public/robots.txt
|
215
234
|
- spec/support/sample_app/public/stylesheets/.gitkeep
|
216
235
|
- spec/support/sample_app/script/rails
|
217
|
-
- spec/support/sample_app/test/fixtures/people.yml
|
218
236
|
- spec/support/sample_app/test/performance/browsing_test.rb
|
219
237
|
- spec/support/sample_app/test/test_helper.rb
|
220
|
-
- spec/support/sample_app/test/unit/person_test.rb
|
221
238
|
- spec/support/sample_app/vendor/plugins/.gitkeep
|