Skip to content

Commit

Permalink
Merge pull request #267 from winebarrel/add_ignore_option
Browse files Browse the repository at this point in the history
Add :ignore option
  • Loading branch information
winebarrel committed Jan 12, 2019
2 parents dfb1da4 + e7086e7 commit 883cade
Show file tree
Hide file tree
Showing 7 changed files with 329 additions and 2 deletions.
17 changes: 16 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ It defines DB schema using [Rails DSL](http://guides.rubyonrails.org/migrations.
* Fix polymorphic options ([pull#263](https://github.com/winebarrel/ridgepole/pull/263))
* Fix `--mysql-use-alter` option ([pull#246](https://github.com/winebarrel/ridgepole/pull/264))
* Fix Database URI parsing ([pull#265](https://github.com/winebarrel/ridgepole/pull/265))
* `>= 0.7.6`
* Fix database url check ([pull#266](https://github.com/winebarrel/ridgepole/pull/266))
* Add ignore option ([pull#267](https://github.com/winebarrel/ridgepole/pull/267))
</details>

## Installation
Expand Down Expand Up @@ -274,6 +277,18 @@ add_index "child", ["parent_id"], name: "par_ind", using: :btree
add_foreign_key "child", "parent", name: "child_ibfk_1"
```

## Ignore Column/Index/FK

```ruby
create_table "articles", force: :cascade do |t|
t.string "title", ignore: true # All changes are ignored
t.text "desc", renamed_from: "text"
t.text "author"
t.datetime "created_at"
t.datetime "updated_at"
end
```

## Collation/Charset
You can use the column collation by passing `--enable-mysql-awesome` ([activerecord-mysql-awesome](https://github.com/kamipo/activerecord-mysql-awesome) is required)

Expand Down Expand Up @@ -397,7 +412,7 @@ Apply `Schemafile`
...
```

## Running tests
## Run tests

```sh
docker-compose up -d
Expand Down
5 changes: 5 additions & 0 deletions lib/ridgepole/delta.rb
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,9 @@ def append_create_table(table_name, attrs, buf, post_buf_for_fk)
definition.each do |column_name, column_attrs|
column_type = column_attrs.fetch(:type)
column_options = column_attrs[:options] || {}
ignore_column = column_options[:ignore]
next if ignore_column

normalize_limit(column_type, column_options)

buf.puts(<<-RUBY)
Expand Down Expand Up @@ -419,6 +422,8 @@ def append_delete_indices(table_name, delta, buf)
def append_add_index(table_name, _index_name, attrs, buf, force_bulk_change = false)
column_name = attrs.fetch(:column_name)
options = attrs[:options] || {}
ignore_index = options[:ignore]
return if ignore_index

if force_bulk_change || @options[:bulk_change]
buf.puts(<<-RUBY)
Expand Down
12 changes: 11 additions & 1 deletion lib/ridgepole/diff.rb
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,11 @@ def scan_definition_change(from, to, from_indices, table_name, table_options, ta
end

to.each do |column_name, to_attrs|
if (from_attrs = from.delete(column_name))
ignore_column = to_attrs.fetch(:options, {}).delete(:ignore)
from_attrs = from.delete(column_name)
next if ignore_column

if from_attrs
to_attrs = build_attrs_if_changed(to_attrs, from_attrs, table_name)
if to_attrs
definition_delta[:change] ||= {}
Expand Down Expand Up @@ -296,6 +300,8 @@ def scan_indices_change(from, to, to_columns, table_delta, _from_table_options,
indices_delta = {}

to.each do |index_name, to_attrs|
ignore_index = to_attrs.fetch(:options, {}).delete(:ignore)

if index_name.is_a?(Array)
from_index_name, from_attrs = from.find { |_name, attrs| attrs[:column_name] == index_name }

Expand All @@ -307,6 +313,8 @@ def scan_indices_change(from, to, to_columns, table_delta, _from_table_options,
from_attrs = from.delete(index_name)
end

next if ignore_index

if from_attrs
normalize_index_options!(from_attrs[:options])
normalize_index_options!(to_attrs[:options])
Expand Down Expand Up @@ -391,7 +399,9 @@ def scan_foreign_keys_change(from, to, table_delta, options)
foreign_keys_delta = {}

to.each do |foreign_key_name_or_tables, to_attrs|
ignore_fk = to_attrs.fetch(:options, {}).delete(:ignore)
from_attrs = from.delete(foreign_key_name_or_tables)
next if ignore_fk

if from_attrs
if from_attrs != to_attrs
Expand Down
68 changes: 68 additions & 0 deletions spec/mysql/fk/migrate_ignore_fk_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
describe 'Ridgepole::Client#diff -> migrate' do
context 'when create fk with ignore:true' do
let(:actual_dsl) do
erbh(<<-ERB)
create_table "child", force: :cascade do |t|
t.integer "parent_id"
t.index ["parent_id"], name: "par_id", <%= i cond(5.0, using: :btree) %>
end
create_table "parent", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
end
ERB
end

let(:expected_dsl) do
erbh(actual_dsl + <<-ERB)
add_foreign_key "child", "parent", name: "child_ibfk_1", ignore: true
ERB
end

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_falsey
}
end

context 'when change fk with ignore:true' do
let(:actual_dsl) do
erbh(<<-ERB)
create_table "parent", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
end
create_table "child", force: :cascade do |t|
t.integer "parent_id"
t.index ["parent_id"], name: "par_id", <%= i cond(5.0, using: :btree) %>
end
add_foreign_key "child", "parent", name: "child_ibfk_1", on_delete: :cascade
ERB
end

let(:expected_dsl) do
erbh(<<-ERB)
create_table "child", force: :cascade do |t|
t.integer "parent_id"
t.index ["parent_id"], name: "par_id", <%= i cond(5.0, using: :btree) %>
end
create_table "parent", <%= i cond('>= 5.1',id: :integer) %>, force: :cascade do |t|
end
add_foreign_key "child", "parent", name: "child_ibfk_1", ignore: true
ERB
end

before { subject.diff(actual_dsl).migrate }

subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_falsey
}
end
end
43 changes: 43 additions & 0 deletions spec/mysql/migrate/migrate_create_table_with_ignore_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
describe 'Ridgepole::Client#diff -> migrate' do
context 'when create table with ignore:true' do
let(:dsl) do
erbh(<<-ERB)
create_table "departments", primary_key: "dept_no", force: :cascade do |t|
t.string "dept_name", limit: 40, null: false
t.index ["dept_name"], name: "dept_name", unique: true, <%= i cond(5.0, using: :btree) %>
end
create_table "dept_emp", primary_key: ["emp_no", "dept_no"], force: :cascade do |t|
t.integer "emp_no", null: false
t.string "dept_no", null: false
t.date "from_date", null: false, ignore: true
t.date "to_date", null: false
t.index ["dept_no"], name: "dept_no", <%= i cond(5.0, using: :btree) %>, ignore: true
t.index ["emp_no"], name: "emp_no", <%= i cond(5.0, using: :btree) %>
end
ERB
end

let(:actual_dsl) do
erbh(<<-ERB)
create_table "departments", primary_key: "dept_no", force: :cascade do |t|
t.string "dept_name", limit: 40, null: false
t.index ["dept_name"], name: "dept_name", unique: true, <%= i cond(5.0, using: :btree) %>
end
ERB
end

let(:expected_dsl) { dsl.each_line.reject { |l| l =~ /ignore/ }.join }

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_truthy
expect(subject.dump).to match_ruby actual_dsl
delta.migrate
expect(subject.dump).to match_ruby expected_dsl
}
end
end
96 changes: 96 additions & 0 deletions spec/mysql/migrate/migrate_ignore_column_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
describe 'Ridgepole::Client#diff -> migrate' do
context 'when add column with ignore:true' do
let(:actual_dsl) do
erbh(<<-ERB)
create_table "employee_clubs", force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "club_id", null: false
t.index ["emp_no", "club_id"], name: "idx_emp_no_club_id", <%= i cond(5.0, using: :btree) %>
end
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.string "gender", limit: 1, null: false
t.date "hire_date", null: false
end
ERB
end

let(:expected_dsl) do
erbh(<<-ERB)
create_table "employee_clubs", force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "club_id", null: false
t.string "any_col", null: false, ignore: true
t.index ["emp_no", "club_id"], name: "idx_emp_no_club_id", <%= i cond(5.0, using: :btree) %>
end
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.string "gender", limit: 1, null: false
t.date "hire_date", null: false
t.integer "age", null: false, ignore: true
t.date "updated_at", ignore: true
end
ERB
end

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_falsey
}
end

context 'when change column with ignore:true' do
let(:actual_dsl) do
erbh(<<-ERB)
create_table "employee_clubs", force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "club_id", null: false
t.index ["emp_no", "club_id"], name: "idx_emp_no_club_id", <%= i cond(5.0, using: :btree) %>
end
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.string "gender", limit: 1, null: false
t.date "hire_date", null: false
end
ERB
end

let(:expected_dsl) do
erbh(<<-ERB)
create_table "employee_clubs", force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "club_id", ignore: true
t.index ["emp_no", "club_id"], name: "idx_emp_no_club_id", <%= i cond(5.0, using: :btree) %>
end
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 20, default: "XXX", null: false, ignore: true
t.string "gender", limit: 2, null: false, ignore: true
t.date "hire_date", null: false
end
ERB
end

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_falsey
}
end
end
90 changes: 90 additions & 0 deletions spec/mysql/migrate/migrate_ignore_index_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
describe 'Ridgepole::Client#diff -> migrate' do
context 'when create index with ignore:true' do
let(:dsl) do
erbh(<<-ERB)
create_table "clubs", force: :cascade do |t|
t.string "name", default: "", null: false
t.index ["name"], name: "idx_name", unique: true, <%= i cond(5.0, using: :btree) %>, ignore: true
end
create_table "employee_clubs", force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "club_id", null: false
t.index ["emp_no", "club_id"], name: "idx_emp_no_club_id", <%= i cond(5.0, using: :btree) %>, ignore: true
end
create_table "titles", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.string "title", limit: 50, null: false
t.date "from_date", null: false
t.date "to_date"
t.index ["emp_no"], name: "emp_no", <%= i cond(5.0, using: :btree) %>, ignore: true
end
ERB
end

let(:actual_dsl) do
erbh(<<-ERB)
create_table "clubs", force: :cascade do |t|
t.string "name", default: "", null: false
end
create_table "employee_clubs", force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "club_id", null: false
end
create_table "titles", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.string "title", limit: 50, null: false
t.date "from_date", null: false
t.date "to_date"
end
ERB
end

let(:expected_dsl) { dsl }

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_falsey
}
end

context 'when change index with ignore:true' do
let(:actual_dsl) do
erbh(<<-ERB)
create_table "salaries", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "salary", null: false
t.date "from_date", null: false
t.date "to_date", null: false
t.index ["emp_no"], name: "emp_no", <%= i cond(5.0, using: :btree) %>
end
ERB
end

let(:expected_dsl) do
erbh(<<-ERB)
create_table "salaries", id: false, force: :cascade do |t|
t.integer "emp_no", null: false
t.integer "salary", null: false
t.date "from_date", null: false
t.date "to_date", null: false
t.index ["from_date"], name: "emp_no", <%= i cond(5.0, using: :btree) %>, ignore: true
end
ERB
end

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_falsey
}
end
end

0 comments on commit 883cade

Please sign in to comment.