updateable_views_inheritance 1.1.2 → 1.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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmZhMjYwNzIwZjgxZGQwNTEyOWFlN2YwYzQwNjkzYmNhZmJlZTk5Zg==
5
+ data.tar.gz: !binary |-
6
+ NDQ2YWIwNmNmODRkODZjNzY5N2ZhYzIxN2QwMjk1NmNmMzk5N2IwMw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NGJiODc3MWQ3MTgwMThlZTcwOGM0OWMwNzNhMTk1NzdkZjRiZjg1NTNlN2Mw
10
+ MDkzYzAyMTVlZWNjODE1YmU1ZWVmMDQ1Y2IzOGE3NGQ0Njc4MjUyNWYwMTRl
11
+ ODQwODY4NmRkZTcyMGZjMjg0MTkwMjlmZDE3NDk3NWUxZTdhMGU=
12
+ data.tar.gz: !binary |-
13
+ MTIzMWViYTE2YWEwMmUxNDY2NDc2MDAwZDFiZTI5ZjVjMzI5ZWIyNTJjM2U2
14
+ NDRkZTE4YzgyMWI2Mzg5NWFlY2I4NThjNDI4YzkzYjMwYWM5Y2MyNTA3NjVk
15
+ YTFjZmQxYTI1YTFlMTUyNDFmMThmN2NkMmRhZDE5YTg2MDU4NDY=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 1.2.0 (27 August 2014)
2
+
3
+ Features:
4
+
5
+ - support for PostgreSQL schemas
6
+
1
7
  ## 1.1.2 (14 June 2013)
2
8
 
3
9
  Bugfixes:
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in updateable_views_inheritance.gemspec
4
4
  gemspec
5
+
6
+ gem 'debugger'
data/README.rdoc CHANGED
@@ -110,7 +110,12 @@ The approach of this gem is completely independent from Rails built-in Single Ta
110
110
  If you use fixtures, you must run <tt>rake updateable_views_inheritance:fixture</tt> to generate fixture for the updateable_views_inheritance table after you add/remove
111
111
  classes from the hierarchy or change underlying table or view names. <b>Without it primary key sequence for inheritors' tables won't be bumped to the max and it might not be possible to save objects!</b> If you don't use fixtures for the classes in the hierarchy you don't need to do that.
112
112
 
113
- This gem re-enables referential integrity on fixture loading, so if you are using foreign keys you will have to explicitly declare fixture load order in test_helper.rb, for
114
- example:
113
+ This gem re-enables referential integrity on fixture loading. This means that
115
114
 
116
- fixtures(:roots, :trunks, :leafs, ...)
115
+ fixtures :all
116
+
117
+ may fail when there are foreign key constraints on tables. To fix this, explicitly declare fixture load order in <tt>test_helper.rb</tt>:
118
+
119
+ fixtures :roots, :trunks, :leafs, ...
120
+
121
+ for all fixtures you want to load.
@@ -9,15 +9,19 @@ module ActiveRecord #:nodoc:
9
9
  # default is <tt>"#{child_view}_data"</tt>
10
10
  def create_child(child_view, options)
11
11
  raise 'Please call me with a parent, for example: create_child(:steam_locomotives, :parent => :locomotives)' unless options[:parent]
12
+
13
+ schema, unqualified_child_view_name = Utils.extract_schema_and_table(child_view)
14
+
12
15
  parent_relation = options[:parent].to_s
13
16
  if tables.include?(parent_relation)
14
17
  parent_table = parent_relation
15
18
  else # view, interpreted as inheritance chain deeper than two levels
16
19
  parent_table = query("SELECT child_relation FROM updateable_views_inheritance WHERE child_aggregate_view = #{quote(parent_relation)}")[0][0]
17
20
  end
18
- child_table = options[:table] || "#{child_view}_data"
19
- child_table_pk = "#{child_view.singularize}_id"
20
-
21
+
22
+ child_table = options[:table] || quote_table_name("#{child_view}_data")
23
+ child_table_pk = "#{unqualified_child_view_name.singularize}_id"
24
+
21
25
  create_table(child_table, :id => false) do |t|
22
26
  t.integer child_table_pk, :null => false
23
27
  yield t
@@ -58,8 +62,8 @@ module ActiveRecord #:nodoc:
58
62
  make_child_view_updateable(parent_table, parent_column_names, parent_pk, parent_pk_seq, child_view, child_column_names, child_pk, child_table)
59
63
 
60
64
  # assign default values for table columns on the view - it is not automatic in Postgresql 8.1
61
- set_defaults(child_view, parent_table, parent_columns)
62
- set_defaults(child_view, child_table, child_columns)
65
+ set_defaults(child_view, parent_table)
66
+ set_defaults(child_view, child_table)
63
67
  create_system_table_records(parent_table, child_view, child_table)
64
68
  end
65
69
 
@@ -288,8 +292,8 @@ module ActiveRecord #:nodoc:
288
292
  # insert
289
293
  # NEW.#{parent_pk} can be explicitly specified and when it is null every call to it increments the sequence.
290
294
  # Setting the sequence to its value (explicitly supplied or the default) covers both cases.
291
- execute <<-end_sql
292
- CREATE OR REPLACE RULE #{child_view}_insert AS
295
+ execute <<-end_sql
296
+ CREATE OR REPLACE RULE #{quote_column_name("#{child_view}_insert")} AS
293
297
  ON INSERT TO #{child_view} DO INSTEAD (
294
298
  SELECT setval('#{parent_pk_seq}', NEW.#{parent_pk});
295
299
  INSERT INTO #{parent_table}
@@ -304,14 +308,14 @@ module ActiveRecord #:nodoc:
304
308
 
305
309
  # delete
306
310
  execute <<-end_sql
307
- CREATE OR REPLACE RULE #{child_view}_delete AS
311
+ CREATE OR REPLACE RULE #{quote_column_name("#{child_view}_delete")} AS
308
312
  ON DELETE TO #{child_view} DO INSTEAD
309
313
  DELETE FROM #{parent_table} WHERE #{parent_pk} = OLD.#{parent_pk}
310
314
  end_sql
311
315
 
312
316
  # update
313
317
  execute <<-end_sql
314
- CREATE OR REPLACE RULE #{child_view}_update AS
318
+ CREATE OR REPLACE RULE #{quote_column_name("#{child_view}_update")} AS
315
319
  ON UPDATE TO #{child_view} DO INSTEAD (
316
320
  #{ parent_columns.empty? ? '':
317
321
  "UPDATE #{parent_table}
@@ -338,34 +342,14 @@ module ActiveRecord #:nodoc:
338
342
  end
339
343
 
340
344
  # Set default values from the table columns for a view
341
- def set_defaults(view_name, table_name, columns)
342
- columns.each do |column|
343
- if !(default_value = get_default_value(table_name, column.name)).nil?
344
- execute("ALTER TABLE #{view_name} ALTER #{column.name} SET DEFAULT #{default_value}")
345
+ def set_defaults(view_name, table_name)
346
+ column_definitions(table_name).each do |column_name, type, default, notnull|
347
+ if !default.nil?
348
+ execute("ALTER TABLE #{quote_table_name(view_name)} ALTER #{quote_column_name(column_name)} SET DEFAULT #{default}")
345
349
  end
346
350
  end
347
351
  end
348
352
 
349
- # ActiveRecord::ConnectionAdapters::Column objects have nil default value for serial primary key
350
- def get_default_value(table_name, column_name)
351
- result = query(<<-end_sql, 'Column default value')[0]
352
- SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid) as constraint
353
- FROM pg_catalog.pg_attrdef d, pg_catalog.pg_attribute a, pg_catalog.pg_class c
354
- WHERE d.adrelid = a.attrelid
355
- AND d.adnum = a.attnum
356
- AND a.atthasdef
357
- AND c.relname = '#{table_name}'
358
- AND a.attrelid = c.oid
359
- AND a.attname = '#{column_name}'
360
- AND a.attnum > 0 AND NOT a.attisdropped
361
- end_sql
362
- if !result.nil? && !result.empty?
363
- result[0]
364
- else
365
- nil
366
- end
367
- end
368
-
369
353
  def create_system_table_records(parent_relation, child_aggregate_view, child_relation)
370
354
  parent_relation, child_aggregate_view, child_relation = [parent_relation, child_aggregate_view, child_relation].collect{|rel| quote(rel.to_s)}
371
355
  exists = query <<-end_sql
@@ -1,3 +1,3 @@
1
1
  module UpdateableViewsInheritance
2
- VERSION = "1.1.2"
2
+ VERSION = "1.2.0"
3
3
  end
data/test/schema_test.rb CHANGED
@@ -176,4 +176,20 @@ class UpdateableViewsInheritanceSchemaTest < ActiveSupport::TestCase
176
176
  def test_table_exists
177
177
  #TODO: test table_exists? monkey patch
178
178
  end
179
+
180
+ class CreateChildInSchema < ActiveRecord::Migration
181
+ def self.up
182
+ execute "CREATE SCHEMA interrail"
183
+ create_child("interrail.steam_locomotives", :parent => :locomotives) do |t|
184
+ t.decimal :interrail_water_consumption, :precision => 6, :scale => 2
185
+ t.decimal :interrail_coal_consumption, :precision => 6, :scale => 2
186
+ end
187
+ end
188
+ end
189
+
190
+ def test_create_child_in_schema
191
+ CreateChildInSchema.up
192
+ assert_equal %w(id interrail_coal_consumption interrail_water_consumption max_speed name type),
193
+ @connection.columns('interrail.steam_locomotives').map{ |c| c.name }.sort
194
+ end
179
195
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: updateable_views_inheritance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
5
- prerelease:
4
+ version: 1.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Sava Chankov
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-06-14 00:00:00.000000000 Z
12
+ date: 2014-08-27 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: activerecord
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,7 +28,6 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: pg
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
32
  - - ! '>='
37
33
  - !ruby/object:Gem::Version
@@ -39,7 +35,6 @@ dependencies:
39
35
  type: :runtime
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
39
  - - ! '>='
45
40
  - !ruby/object:Gem::Version
@@ -47,7 +42,6 @@ dependencies:
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: rails
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
46
  - - ~>
53
47
  - !ruby/object:Gem::Version
@@ -55,7 +49,6 @@ dependencies:
55
49
  type: :development
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
53
  - - ~>
61
54
  - !ruby/object:Gem::Version
@@ -63,7 +56,6 @@ dependencies:
63
56
  - !ruby/object:Gem::Dependency
64
57
  name: bundler
65
58
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
59
  requirements:
68
60
  - - ~>
69
61
  - !ruby/object:Gem::Version
@@ -71,7 +63,6 @@ dependencies:
71
63
  type: :development
72
64
  prerelease: false
73
65
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
66
  requirements:
76
67
  - - ~>
77
68
  - !ruby/object:Gem::Version
@@ -79,7 +70,6 @@ dependencies:
79
70
  - !ruby/object:Gem::Dependency
80
71
  name: rake
81
72
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
73
  requirements:
84
74
  - - ! '>='
85
75
  - !ruby/object:Gem::Version
@@ -87,7 +77,6 @@ dependencies:
87
77
  type: :development
88
78
  prerelease: false
89
79
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
80
  requirements:
92
81
  - - ! '>='
93
82
  - !ruby/object:Gem::Version
@@ -194,27 +183,26 @@ files:
194
183
  homepage: http://github.com/tutuf/updateable_views_inheritance
195
184
  licenses:
196
185
  - MIT
186
+ metadata: {}
197
187
  post_install_message:
198
188
  rdoc_options: []
199
189
  require_paths:
200
190
  - lib
201
191
  required_ruby_version: !ruby/object:Gem::Requirement
202
- none: false
203
192
  requirements:
204
193
  - - ! '>='
205
194
  - !ruby/object:Gem::Version
206
195
  version: '0'
207
196
  required_rubygems_version: !ruby/object:Gem::Requirement
208
- none: false
209
197
  requirements:
210
198
  - - ! '>='
211
199
  - !ruby/object:Gem::Version
212
200
  version: '0'
213
201
  requirements: []
214
202
  rubyforge_project:
215
- rubygems_version: 1.8.25
203
+ rubygems_version: 2.4.1
216
204
  signing_key:
217
- specification_version: 3
205
+ specification_version: 4
218
206
  summary: Class table inheritance for ActiveRecord
219
207
  test_files:
220
208
  - test/config/database.yml
@@ -292,4 +280,3 @@ test_files:
292
280
  - test/schema_test.rb
293
281
  - test/single_table_inheritance.rb
294
282
  - test/test_helper.rb
295
- has_rdoc: