schema_plus_core 0.3.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a59aa0134494234f7d1601e3f5c764035c00969
4
- data.tar.gz: d8af7c134c42e18f69f749d31bc3b9908179736e
3
+ metadata.gz: 6c31ad40eecda53151aef2e6b0faac2a6f99385e
4
+ data.tar.gz: eb7b4fa4146a8d2b6746391564b011f77f366b9a
5
5
  SHA512:
6
- metadata.gz: 07bb287598da65c41da7c50e7a0ae7711e45653012cebcb9e8bf69f66c4c9e96ff363ef6ebdbe0cfd8965d927b518aa2cefc84a2168f8f11ca847ae2cb653a31
7
- data.tar.gz: d0834cc8c8da80f8aa19395c5a25f06c6eee457bb0aabdde90d957fad0fad5879bf7d88d9925a716e1e826df3d4457f296fbba9af1530d9504e91a4440dacaba
6
+ metadata.gz: 90aad35397d7224e1ea32e712f27f4c1597b562245e9b6cdddb7d15add80e772d61bfbdfb7584b41e63192794ee110c354798cc119237870ac3dd3972bcf42dd
7
+ data.tar.gz: 2fbdbb53cd67cf6830caba374d039c7e4e1419cb1986008005f04363566ad794b47146d8aa86c139454b4177c69e611680fff25d5678245d6fc5646b8a5b82a2
data/README.md CHANGED
@@ -192,6 +192,7 @@ Stacks for operations that change the schema. In some cases the operation immed
192
192
  `:table_name` | The name of the table | *arg*
193
193
  `:column_name` | The name of the column | *arg*
194
194
  `:type` | The ActiveRecord column type (`:integer`, `:datetime`, etc.) | *arg*
195
+ `:implements_reference` | This implements a `migration.add_reference`, `t.references` or `t.belongs_to` [See below]| *context*
195
196
  `:options` | The column options | *arg*, default `{}`
196
197
 
197
198
  The base implementation performs the column operation. No value is returned.
@@ -207,7 +208,9 @@ Stacks for operations that change the schema. In some cases the operation immed
207
208
 
208
209
  2. In the case of a table definition using `t.references` or `t.belongs_to`, the `:type` field will be set to `:reference` and the `:column_name` will include the `"_id"` suffix
209
210
 
210
- 3. ActiveRecord's base implementation may make nested calls to column creation. For example: References result in a nested call to create an integer column; Polymorphic references nest calls to create two columns; Sqlite3 implements `:change` by a nested call to a new table definition. SchemaPlus::Core doesn't attempt to normalize or suppress these; each such nested call will result in its own `Migration::Column` stack execution.
211
+ 3. ActiveRecord's base implementation handles `migration.add_reference`, `t.references` and `t.belongs_to` by making nested calls to `migration.add_column` or `t.column` to create the resulting column (or two columns, for polymorphic references). SchemaPlus::Core invokes the `Migration::Column` stack for both the outer `migration.add_reference`, `t.references` or `t.belongs_to` call, as well as for the nested `migration.add_column` or `t.column` call; in the nested call, `env.implements_reference` will be truthy.
212
+
213
+ 4. Sqlite3 implements `change_column` by a creating a new table. This will result in nested calls to `add_column`, invoking the `Migration::Column` stack for each; SchemaPlus::Core does not currently provide a way to distinguish those calls from explicit top-level calls.
211
214
 
212
215
  * `Migration::CreateTable`
213
216
 
@@ -435,6 +438,7 @@ SchemaPlus::Core provides a state object and of callbacks to various phases of t
435
438
 
436
439
  ## History
437
440
 
441
+ * 0.4.0 Add `implements_reference` to `Migration::Column` stack env
438
442
  * 0.3.1 Pass along (undocumented) return values from association declarations
439
443
  * 0.3.0 Added `Model::Association::Declaration`
440
444
  * 0.2.1 Added `Migration::CreateTable` and `Schema::Define`; removed dependency on (defunct) `schema_monkey_rails` gem. [Oops, this should have been a minor version bump]
@@ -5,7 +5,8 @@ module SchemaPlus
5
5
  module AbstractAdapter
6
6
 
7
7
  def add_column(table_name, name, type, options = {})
8
- SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :add, table_name: table_name, column_name: name, type: type, options: options.deep_dup) do |env|
8
+ options = options.deep_dup
9
+ SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :add, table_name: table_name, column_name: name, type: type, implements_reference: options.delete(:_implements_reference), options: options) do |env|
9
10
  super env.table_name, env.column_name, env.type, env.options
10
11
  end
11
12
  end
@@ -18,7 +19,7 @@ module SchemaPlus
18
19
 
19
20
  def add_reference(table_name, name, options = {})
20
21
  SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :add, table_name: table_name, column_name: "#{name}_id", type: :reference, options: options.deep_dup) do |env|
21
- super env.table_name, env.column_name.sub(/_id$/, ''), env.options
22
+ super env.table_name, env.column_name.sub(/_id$/, ''), env.options.merge(_implements_reference: true)
22
23
  end
23
24
  end
24
25
 
@@ -5,20 +5,23 @@ module SchemaPlus
5
5
  module TableDefinition
6
6
 
7
7
  def column(name, type, options = {})
8
- SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: name, type: type, options: options.deep_dup) do |env|
8
+ options = options.deep_dup
9
+ SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: name, type: type, implements_reference: options.delete(:_implements_reference), options: options) do |env|
9
10
  super env.column_name, env.type, env.options
10
11
  end
11
12
  end
12
13
 
13
14
  def references(name, options = {})
14
- SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: "#{name}_id", type: :reference, options: options.deep_dup) do |env|
15
- super env.column_name.sub(/_id$/, ''), env.options
15
+ options = options.deep_dup
16
+ SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: "#{name}_id", type: :reference, options: options) do |env|
17
+ super env.column_name.sub(/_id$/, ''), env.options.merge(_implements_reference: true)
16
18
  end
17
19
  end
18
20
 
19
21
  def belongs_to(name, options = {})
20
- SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: "#{name}_id", type: :reference, options: options.deep_dup) do |env|
21
- super env.column_name.sub(/_id$/, ''), env.options
22
+ options = options.deep_dup
23
+ SchemaMonkey::Middleware::Migration::Column.start(caller: self, operation: :define, table_name: self.name, column_name: "#{name}_id", type: :reference, options: options) do |env|
24
+ super env.column_name.sub(/_id$/, ''), env.options.merge(_implements_reference: true)
22
25
  end
23
26
  end
24
27
 
@@ -26,7 +26,7 @@ module SchemaPlus
26
26
 
27
27
  module Migration
28
28
  module Column
29
- ENV = [:caller, :operation, :table_name, :column_name, :type, :options]
29
+ ENV = [:caller, :operation, :table_name, :column_name, :type, :implements_reference, :options]
30
30
  end
31
31
 
32
32
  module CreateTable
@@ -1,5 +1,5 @@
1
1
  module SchemaPlus
2
2
  module Core
3
- VERSION = "0.3.1"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+
3
+ module TestImplementsReference
4
+ module Middleware
5
+ module Migration
6
+ module Column
7
+ SPY = []
8
+
9
+ include Enableable
10
+
11
+ def before(env)
12
+ return unless middleware = enabled_middleware(TestImplementsReference, env)
13
+ SPY << env.to_hash.slice(:column_name, :type, :implements_reference)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ SchemaMonkey.register TestImplementsReference
21
+
22
+ describe SchemaMonkey::Middleware::Migration::Column do
23
+
24
+ let(:migration) { ::ActiveRecord::Migration }
25
+
26
+ context TestImplementsReference::Middleware::Migration::Column do
27
+ let (:spy) { described_class.const_get(:SPY) }
28
+
29
+ around(:each) do |example|
30
+ middleware = described_class
31
+ begin
32
+ spy.clear
33
+ middleware.enable once: false
34
+ example.run
35
+ ensure
36
+ middleware.disable
37
+ end
38
+ end
39
+
40
+ context "when add ordinary column" do
41
+ When { migration.create_table("things") { |t| t.integer "test_column" } }
42
+ Then { expect(spy).to eq [
43
+ { column_name: "id", type: :primary_key, implements_reference: nil },
44
+ { column_name: "test_column", type: :integer, implements_reference: nil }
45
+ ] }
46
+ end
47
+
48
+ [:references, :belongs_to].each do |method|
49
+
50
+ context "when add reference using t.#{method}" do
51
+ When { migration.create_table("things") { |t| t.send method, "test_reference" } }
52
+ Then { expect(spy).to eq [
53
+ { column_name: "id", type: :primary_key, implements_reference: nil },
54
+ { column_name: "test_reference_id", type: :reference, implements_reference: nil },
55
+ { column_name: "test_reference_id", type: :integer, implements_reference: true }
56
+ ] }
57
+ end
58
+
59
+ context "when add polymorphic reference using t.#{method}" do
60
+ When { migration.create_table("things") { |t| t.send method, "test_reference", polymorphic: true } }
61
+ Then { expect(spy).to eq [
62
+ { column_name: "id", type: :primary_key, implements_reference: nil },
63
+ { column_name: "test_reference_id", type: :reference, implements_reference: nil },
64
+ { column_name: "test_reference_id", type: :integer, implements_reference: true },
65
+ { column_name: "test_reference_type", type: :string, implements_reference: true }
66
+ ] }
67
+ end
68
+ end
69
+
70
+ context "with an existing table" do
71
+ Given {
72
+ migration.create_table("things") { |t| }
73
+ spy.clear
74
+ }
75
+
76
+ context "when add reference using migration.add_reference" do
77
+
78
+ When { migration.add_reference("things", "test_reference") }
79
+ Then { expect(spy).to eq [
80
+ { column_name: "test_reference_id", type: :reference, implements_reference: nil },
81
+ { column_name: "test_reference_id", type: :integer, implements_reference: true }
82
+ ] }
83
+ end
84
+
85
+ context "when add polymorphic reference using migration.add_reference" do
86
+
87
+ When {
88
+ migration.add_reference("things", "test_reference", polymorphic: true)
89
+ }
90
+ Then { expect(spy).to eq [
91
+ { column_name: "test_reference_id", type: :reference, implements_reference: nil },
92
+ { column_name: "test_reference_id", type: :integer, implements_reference: true },
93
+ { column_name: "test_reference_type", type: :string, implements_reference: true }
94
+ ] }
95
+ end
96
+
97
+ end
98
+
99
+ end
100
+ end
@@ -3,14 +3,15 @@ module Enableable
3
3
  def enabled_middleware(root, env)
4
4
  middleware = self.singleton_class.ancestors.find(&it.to_s.start_with?("#{root}::Middleware"))
5
5
  return nil unless middleware.enabled?(env)
6
- middleware.disable
6
+ middleware.disable if middleware.once?(env)
7
7
  middleware
8
8
  end
9
9
 
10
10
  def self.included(base)
11
11
  base.module_eval do
12
- def self.enable(condition = true)
12
+ def self.enable(condition = true, once:true)
13
13
  @enabled = condition
14
+ @once = once
14
15
  end
15
16
  def self.enabled?(env)
16
17
  case @enabled
@@ -18,6 +19,9 @@ module Enableable
18
19
  else @enabled
19
20
  end
20
21
  end
22
+ def self.once?(env)
23
+ @once
24
+ end
21
25
  def self.disable
22
26
  @enabled = false
23
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schema_plus_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ronen barzel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-26 00:00:00.000000000 Z
11
+ date: 2015-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -172,6 +172,7 @@ files:
172
172
  - lib/schema_plus/core/version.rb
173
173
  - schema_dev.yml
174
174
  - schema_plus_core.gemspec
175
+ - spec/column_spec.rb
175
176
  - spec/dumper_spec.rb
176
177
  - spec/middleware_spec.rb
177
178
  - spec/spec_helper.rb
@@ -204,6 +205,7 @@ signing_key:
204
205
  specification_version: 4
205
206
  summary: Provides an internal extension API to ActiveRecord
206
207
  test_files:
208
+ - spec/column_spec.rb
207
209
  - spec/dumper_spec.rb
208
210
  - spec/middleware_spec.rb
209
211
  - spec/spec_helper.rb