schema_expectations 0.0.1 → 0.2.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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.travis.yml +19 -5
  4. data/Appraisals +33 -0
  5. data/CHANGELOG.md +17 -1
  6. data/README.md +4 -0
  7. data/Rakefile +12 -0
  8. data/gemfiles/activerecord_3.1.gemfile +7 -0
  9. data/gemfiles/activerecord_3.2.gemfile +7 -0
  10. data/gemfiles/activerecord_4.0.gemfile +7 -0
  11. data/gemfiles/activerecord_4.1.gemfile +7 -0
  12. data/gemfiles/activerecord_4.2.gemfile +7 -0
  13. data/gemfiles/default.gemfile +5 -0
  14. data/gemfiles/rspec_3.0.gemfile +7 -0
  15. data/gemfiles/rspec_3.1.gemfile +7 -0
  16. data/gemfiles/rspec_3.2.gemfile +7 -0
  17. data/lib/schema_expectations/active_record/column_reflector.rb +92 -0
  18. data/lib/schema_expectations/active_record/validation_reflector.rb +59 -0
  19. data/lib/schema_expectations/config.rb +25 -0
  20. data/lib/schema_expectations/rspec_matchers/validate_schema_nullable.rb +49 -58
  21. data/lib/schema_expectations/util.rb +9 -0
  22. data/lib/schema_expectations/version.rb +1 -1
  23. data/lib/schema_expectations.rb +1 -0
  24. data/schema_expectations.gemspec +12 -3
  25. data/spec/db/database.yml +13 -0
  26. data/spec/lib/schema_expectations/active_record/column_reflector_spec.rb +150 -0
  27. data/spec/lib/schema_expectations/active_record/validation_reflector_spec.rb +62 -0
  28. data/spec/lib/schema_expectations/config_spec.rb +22 -0
  29. data/spec/lib/schema_expectations/rspec_matchers/validate_schema_nullable_spec.rb +260 -77
  30. data/spec/lib/schema_expectations/util_spec.rb +16 -0
  31. data/spec/meta_spec.rb +44 -0
  32. data/spec/spec_helper.rb +11 -2
  33. data/spec/support/active_record.rb +34 -12
  34. data/spec/support/active_record_helpers.rb +51 -0
  35. data/spec/support/gem_filters.rb +6 -0
  36. metadata +162 -10
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,14 @@
1
- require 'codeclimate-test-reporter'
2
- CodeClimate::TestReporter.start
1
+ if !ENV['BUNDLE_GEMFILE'] || ENV['BUNDLE_GEMFILE'] =~ /default.gemfile\z/
2
+ if ENV['CI']
3
+ require 'codeclimate-test-reporter'
4
+ CodeClimate::TestReporter.start
5
+ else
6
+ require 'simplecov'
7
+ SimpleCov.start do
8
+ add_filter 'vendor'
9
+ end
10
+ end
11
+ end
3
12
 
4
13
  require 'rspec'
5
14
  require 'pry'
@@ -1,25 +1,47 @@
1
- require 'active_record'
1
+ require 'yaml'
2
+ require_relative 'active_record_helpers'
2
3
 
3
- module ActiveRecordHelpers
4
- extend Forwardable
4
+ RSpec.configure do |config|
5
+ DATABASE_YAML_FILE = File.join(File.dirname(__FILE__), '../db/database.yml')
6
+ DATABASE_YAML = YAML::load(File.open(DATABASE_YAML_FILE))
7
+ DB = (ENV['DB'] || 'sqlite3').to_sym
5
8
 
6
- CONNECTION_DELEGATES = %i(create_table)
9
+ config.before(:suite) do
10
+ require 'active_record'
7
11
 
8
- def connection
9
- ActiveRecord::Base.connection
12
+ ActiveRecord::Base.configurations = DATABASE_YAML
10
13
  end
11
14
 
12
- delegate CONNECTION_DELEGATES => :connection
13
- end
15
+ DATABASE_YAML.keys.each do |db|
16
+ config.before(:all, active_record: true, db.to_sym => true) do
17
+ connect_to_database! db.to_sym
18
+ end
19
+ end
14
20
 
15
- RSpec.configure do |config|
16
21
  config.before(:each, active_record: true) do |example|
17
- ActiveRecord::Base.establish_connection(
18
- adapter: 'sqlite3', database: ':memory:')
22
+ require 'database_cleaner'
23
+
24
+ already_connected = example.metadata.detect do |meta, value|
25
+ value && DATABASE_YAML.keys.include?(meta.to_s)
26
+ end
27
+ connect_to_database! DB unless already_connected
28
+
29
+ DatabaseCleaner.strategy = :transaction
30
+ DatabaseCleaner.start
19
31
  end
20
32
 
21
33
  config.after(:each, active_record: true) do
22
- ActiveRecord::Base.remove_connection
34
+ DatabaseCleaner.clean
35
+
36
+ # mysql can't do tables in transactions properly
37
+ db_config = ActiveRecord::Base.connection_config
38
+ if db_config[:adapter] == 'mysql2'
39
+ ActiveRecord::Base.connection.drop_database(db_config[:database])
40
+ ActiveRecord::Base.connection.create_database(db_config[:database], db_config)
41
+ execute "USE #{db_config[:database]}"
42
+ end
43
+
44
+ ActiveRecord::Base.connection.schema_cache.clear!
23
45
  end
24
46
 
25
47
  config.include ActiveRecordHelpers, active_record: true
@@ -0,0 +1,51 @@
1
+ require 'active_support/core_ext/hash/keys'
2
+
3
+ module ActiveRecordHelpers
4
+ extend Forwardable
5
+
6
+ CONNECTION_DELEGATES = %i(create_table execute)
7
+
8
+ def connection
9
+ ActiveRecord::Base.connection
10
+ end
11
+
12
+ delegate CONNECTION_DELEGATES => :connection
13
+
14
+ def setup_postgresql!
15
+ ActiveRecord::Base.connection.execute <<-SQL
16
+ CREATE EXTENSION "uuid-ossp";
17
+ SQL
18
+ end
19
+
20
+ # see https://github.com/pat/combustion/blob/master/lib/combustion/database.rb
21
+ def connect_to_database!(db)
22
+ db_config = ActiveRecord::Base.configurations[db.to_s].symbolize_keys
23
+
24
+ if ActiveRecord::Base.connected?
25
+ return if ActiveRecord::Base.connection_config == db_config
26
+ ActiveRecord::Base.remove_connection
27
+ end
28
+
29
+ case db_config[:adapter]
30
+ when 'sqlite3'
31
+ fail 'only support sqlite3 in-memory' unless db_config[:database] == ':memory:'
32
+ when 'postgresql'
33
+ ActiveRecord::Base.establish_connection(db_config.merge(database: 'postgres'))
34
+ ActiveRecord::Base.connection.drop_database(db_config[:database])
35
+ ActiveRecord::Base.connection.create_database(db_config[:database], db_config)
36
+ ActiveRecord::Base.remove_connection
37
+ when 'mysql2'
38
+ require 'mysql2'
39
+ ActiveRecord::Base.establish_connection(db_config.merge(database: nil))
40
+ ActiveRecord::Base.connection.drop_database(db_config[:database])
41
+ ActiveRecord::Base.connection.create_database(db_config[:database], db_config)
42
+ ActiveRecord::Base.remove_connection
43
+ end
44
+
45
+ ActiveRecord::Base.establish_connection(db)
46
+ ActiveRecord::Base.connection # triggers connection to actually happen
47
+ fail "failed to connect to #{db_config.inspect}" unless ActiveRecord::Base.connected?
48
+
49
+ setup_postgresql! if db_config[:adapter] == 'postgresql'
50
+ end
51
+ end
@@ -0,0 +1,6 @@
1
+ RSpec.configure do |config|
2
+ config.filter_run_excluding active_record_version: ->(version) {
3
+ dependency = Gem::Dependency.new 'activerecord', *Array(version)
4
+ !dependency.match?(Gem.loaded_specs['activerecord'])
5
+ }
6
+ end
metadata CHANGED
@@ -1,29 +1,75 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schema_expectations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emma Borhanian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-12 00:00:00.000000000 Z
11
+ date: 2015-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.2'
19
+ version: '3.1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '4.3'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: '4.2'
32
+ version: '4.3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '3.1'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '4.3'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '3.1'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '4.3'
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '3.0'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '3.3'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '3.3'
27
73
  - !ruby/object:Gem::Dependency
28
74
  name: pry
29
75
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +113,7 @@ dependencies:
67
113
  - !ruby/object:Gem::Version
68
114
  version: 0.8.7
69
115
  - !ruby/object:Gem::Dependency
70
- name: codeclimate-test-reporter
116
+ name: wwtd
71
117
  requirement: !ruby/object:Gem::Requirement
72
118
  requirements:
73
119
  - - ">="
@@ -81,19 +127,53 @@ dependencies:
81
127
  - !ruby/object:Gem::Version
82
128
  version: '0'
83
129
  - !ruby/object:Gem::Dependency
84
- name: rspec
130
+ name: appraisal
85
131
  requirement: !ruby/object:Gem::Requirement
86
132
  requirements:
87
133
  - - "~>"
88
134
  - !ruby/object:Gem::Version
89
- version: '3.2'
135
+ version: '1.0'
90
136
  type: :development
91
137
  prerelease: false
92
138
  version_requirements: !ruby/object:Gem::Requirement
93
139
  requirements:
94
140
  - - "~>"
95
141
  - !ruby/object:Gem::Version
96
- version: '3.2'
142
+ version: '1.0'
143
+ - !ruby/object:Gem::Dependency
144
+ name: codeclimate-test-reporter
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '0.4'
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 0.4.6
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.4'
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: 0.4.6
163
+ - !ruby/object:Gem::Dependency
164
+ name: simplecov
165
+ requirement: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ type: :development
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
97
177
  - !ruby/object:Gem::Dependency
98
178
  name: guard-rspec
99
179
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +202,48 @@ dependencies:
122
202
  - - "~>"
123
203
  - !ruby/object:Gem::Version
124
204
  version: '1.3'
205
+ - !ruby/object:Gem::Dependency
206
+ name: pg
207
+ requirement: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - "~>"
210
+ - !ruby/object:Gem::Version
211
+ version: '0.18'
212
+ type: :development
213
+ prerelease: false
214
+ version_requirements: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - "~>"
217
+ - !ruby/object:Gem::Version
218
+ version: '0.18'
219
+ - !ruby/object:Gem::Dependency
220
+ name: mysql2
221
+ requirement: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - "~>"
224
+ - !ruby/object:Gem::Version
225
+ version: 0.3.18
226
+ type: :development
227
+ prerelease: false
228
+ version_requirements: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - "~>"
231
+ - !ruby/object:Gem::Version
232
+ version: 0.3.18
233
+ - !ruby/object:Gem::Dependency
234
+ name: database_cleaner
235
+ requirement: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - "~>"
238
+ - !ruby/object:Gem::Version
239
+ version: '1.4'
240
+ type: :development
241
+ prerelease: false
242
+ version_requirements: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - "~>"
245
+ - !ruby/object:Gem::Version
246
+ version: '1.4'
125
247
  description: "\n Allows you to test whether your database schema\n matches the
126
248
  validations in your ActiveRecord models.'\n "
127
249
  email: emma.borhanian+schema_expectations@gmail.com
@@ -133,21 +255,43 @@ files:
133
255
  - ".rspec"
134
256
  - ".ruby-version"
135
257
  - ".travis.yml"
258
+ - Appraisals
136
259
  - CHANGELOG.md
137
260
  - Gemfile
138
261
  - Guardfile
139
262
  - LICENSE
140
263
  - README.md
141
264
  - Rakefile
265
+ - gemfiles/activerecord_3.1.gemfile
266
+ - gemfiles/activerecord_3.2.gemfile
267
+ - gemfiles/activerecord_4.0.gemfile
268
+ - gemfiles/activerecord_4.1.gemfile
269
+ - gemfiles/activerecord_4.2.gemfile
270
+ - gemfiles/default.gemfile
271
+ - gemfiles/rspec_3.0.gemfile
272
+ - gemfiles/rspec_3.1.gemfile
273
+ - gemfiles/rspec_3.2.gemfile
142
274
  - lib/schema_expectations.rb
275
+ - lib/schema_expectations/active_record/column_reflector.rb
276
+ - lib/schema_expectations/active_record/validation_reflector.rb
277
+ - lib/schema_expectations/config.rb
143
278
  - lib/schema_expectations/rspec.rb
144
279
  - lib/schema_expectations/rspec_matchers.rb
145
280
  - lib/schema_expectations/rspec_matchers/validate_schema_nullable.rb
281
+ - lib/schema_expectations/util.rb
146
282
  - lib/schema_expectations/version.rb
147
283
  - schema_expectations.gemspec
284
+ - spec/db/database.yml
285
+ - spec/lib/schema_expectations/active_record/column_reflector_spec.rb
286
+ - spec/lib/schema_expectations/active_record/validation_reflector_spec.rb
287
+ - spec/lib/schema_expectations/config_spec.rb
148
288
  - spec/lib/schema_expectations/rspec_matchers/validate_schema_nullable_spec.rb
289
+ - spec/lib/schema_expectations/util_spec.rb
290
+ - spec/meta_spec.rb
149
291
  - spec/spec_helper.rb
150
292
  - spec/support/active_record.rb
293
+ - spec/support/active_record_helpers.rb
294
+ - spec/support/gem_filters.rb
151
295
  homepage: https://github.com/emma-borhanian/schema_expectations
152
296
  licenses:
153
297
  - MIT
@@ -173,7 +317,15 @@ signing_key:
173
317
  specification_version: 4
174
318
  summary: Database Schema Expectations
175
319
  test_files:
320
+ - spec/db/database.yml
321
+ - spec/lib/schema_expectations/active_record/column_reflector_spec.rb
322
+ - spec/lib/schema_expectations/active_record/validation_reflector_spec.rb
323
+ - spec/lib/schema_expectations/config_spec.rb
176
324
  - spec/lib/schema_expectations/rspec_matchers/validate_schema_nullable_spec.rb
325
+ - spec/lib/schema_expectations/util_spec.rb
326
+ - spec/meta_spec.rb
177
327
  - spec/spec_helper.rb
178
328
  - spec/support/active_record.rb
329
+ - spec/support/active_record_helpers.rb
330
+ - spec/support/gem_filters.rb
179
331
  has_rdoc: