declare_schema 0.7.0 → 0.7.1

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
  SHA256:
3
- metadata.gz: 640e3580d2babdce916a3127b95cd1c84eb8d87b89ca67116496cd3729eea33c
4
- data.tar.gz: 30b86c95f516f37ce979ac558e64ac84f0150493392a0626495e83e68b5dc14d
3
+ metadata.gz: 6317ef2d7c038120278bbff6547c042a3418369d1e0bd8527f10ab57d58aef62
4
+ data.tar.gz: 66ce3ad03f6fde8365b287deb682d85b4fd7e983d283447af769aed0ade61571
5
5
  SHA512:
6
- metadata.gz: 60e109345bc7d2551e441a7c5618f69b3e4df28551bc6c7807329f8831eb3090770fc70c2692487495935bd7c3394f83ccb77cfff1370afccb5a33105229f790
7
- data.tar.gz: 5f4cf408c53d963995795786ea847f6e5e4c7319fe91fd95d8eb6d4c05348ddb6cf1fcbbded15764e9b80af0e0903ec26b984d82c467a3a0a6956e421f7d5ace
6
+ metadata.gz: 1a87ecf0479b94324f43c42d309f254e8a3ca10f3766cc90a756b94505cb559406871eee47a58fa376640ad85acda3e81d771cb03ab92dc08f5253d81bd88079
7
+ data.tar.gz: 4cd449cb9543819dd78e51267357f676a7439c89f2ad021f59a5d0f49664a8c8b8141eeebde4184e3eaf1f3f616dfef8a7092f59cc6382c73504de5ffeb41dc3
data/CHANGELOG.md CHANGED
@@ -4,16 +4,22 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
5
  Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [0.7.0] - 2020-02-14
7
+ ## [0.7.1] - 2021-02-17
8
+ ### Fixed
9
+ - Exclude unknown options from FieldSpec#sql_options and #schema_attributes.
10
+ - Fixed a bug where fk_field_options were getting merged into spec_attrs after checking for equivalence,
11
+ leading to phantom migrations with no changes, or missing migrations when just the fk_field_options changed.
12
+
13
+ ## [0.7.0] - 2021-02-14
8
14
  ### Changed
9
15
  - Use `schema_attributes` for generating both up and down change migrations, so they are guaranteed to be symmetrical.
10
16
  Note: Rails schema dumper is still used for the down migration to replace a model that has been dropped.
11
17
 
12
- ## [0.6.4] - 2020-02-08
18
+ ## [0.6.4] - 2021-02-08
13
19
  - Fixed a bug where the generated call to add_foreign_key() was not setting `column:`,
14
20
  so it only worked in cases where Rails could infer the foreign key by convention.
15
21
 
16
- ## [0.6.3] - 2020-01-21
22
+ ## [0.6.3] - 2021-01-21
17
23
  ### Added
18
24
  - Added `add_foreign_key` native rails call in `DeclareSchema::Model::ForeignKeyDefinition#to_add_statement`.
19
25
 
@@ -119,6 +125,7 @@ using the appropriate Rails configuration attributes.
119
125
  ### Added
120
126
  - Initial version from https://github.com/Invoca/hobo_fields v4.1.0.
121
127
 
128
+ [0.7.1]: https://github.com/Invoca/declare_schema/compare/v0.7.0...v0.7.1
122
129
  [0.7.0]: https://github.com/Invoca/declare_schema/compare/v0.6.3...v0.7.0
123
130
  [0.6.4]: https://github.com/Invoca/declare_schema/compare/v0.6.3...v0.6.4
124
131
  [0.6.3]: https://github.com/Invoca/declare_schema/compare/v0.6.2...v0.6.3
data/Gemfile.lock CHANGED
@@ -1,49 +1,49 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- declare_schema (0.7.0)
4
+ declare_schema (0.7.1)
5
5
  rails (>= 4.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actioncable (5.2.4.4)
11
- actionpack (= 5.2.4.4)
10
+ actioncable (5.2.4.5)
11
+ actionpack (= 5.2.4.5)
12
12
  nio4r (~> 2.0)
13
13
  websocket-driver (>= 0.6.1)
14
- actionmailer (5.2.4.4)
15
- actionpack (= 5.2.4.4)
16
- actionview (= 5.2.4.4)
17
- activejob (= 5.2.4.4)
14
+ actionmailer (5.2.4.5)
15
+ actionpack (= 5.2.4.5)
16
+ actionview (= 5.2.4.5)
17
+ activejob (= 5.2.4.5)
18
18
  mail (~> 2.5, >= 2.5.4)
19
19
  rails-dom-testing (~> 2.0)
20
- actionpack (5.2.4.4)
21
- actionview (= 5.2.4.4)
22
- activesupport (= 5.2.4.4)
20
+ actionpack (5.2.4.5)
21
+ actionview (= 5.2.4.5)
22
+ activesupport (= 5.2.4.5)
23
23
  rack (~> 2.0, >= 2.0.8)
24
24
  rack-test (>= 0.6.3)
25
25
  rails-dom-testing (~> 2.0)
26
26
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
27
- actionview (5.2.4.4)
28
- activesupport (= 5.2.4.4)
27
+ actionview (5.2.4.5)
28
+ activesupport (= 5.2.4.5)
29
29
  builder (~> 3.1)
30
30
  erubi (~> 1.4)
31
31
  rails-dom-testing (~> 2.0)
32
32
  rails-html-sanitizer (~> 1.0, >= 1.0.3)
33
- activejob (5.2.4.4)
34
- activesupport (= 5.2.4.4)
33
+ activejob (5.2.4.5)
34
+ activesupport (= 5.2.4.5)
35
35
  globalid (>= 0.3.6)
36
- activemodel (5.2.4.4)
37
- activesupport (= 5.2.4.4)
38
- activerecord (5.2.4.4)
39
- activemodel (= 5.2.4.4)
40
- activesupport (= 5.2.4.4)
36
+ activemodel (5.2.4.5)
37
+ activesupport (= 5.2.4.5)
38
+ activerecord (5.2.4.5)
39
+ activemodel (= 5.2.4.5)
40
+ activesupport (= 5.2.4.5)
41
41
  arel (>= 9.0)
42
- activestorage (5.2.4.4)
43
- actionpack (= 5.2.4.4)
44
- activerecord (= 5.2.4.4)
42
+ activestorage (5.2.4.5)
43
+ actionpack (= 5.2.4.5)
44
+ activerecord (= 5.2.4.5)
45
45
  marcel (~> 0.3.1)
46
- activesupport (5.2.4.4)
46
+ activesupport (5.2.4.5)
47
47
  concurrent-ruby (~> 1.0, >= 1.0.2)
48
48
  i18n (>= 0.7, < 2)
49
49
  minitest (~> 5.1)
@@ -60,19 +60,19 @@ GEM
60
60
  byebug (11.1.3)
61
61
  climate_control (0.2.0)
62
62
  coderay (1.1.3)
63
- concurrent-ruby (1.1.7)
63
+ concurrent-ruby (1.1.8)
64
64
  crass (1.0.6)
65
65
  diff-lcs (1.4.4)
66
- erubi (1.9.0)
66
+ erubi (1.10.0)
67
67
  ffi (1.14.2)
68
68
  globalid (0.4.2)
69
69
  activesupport (>= 4.2.0)
70
- i18n (1.8.5)
70
+ i18n (1.8.9)
71
71
  concurrent-ruby (~> 1.0)
72
72
  listen (3.4.1)
73
73
  rb-fsevent (~> 0.10, >= 0.10.3)
74
74
  rb-inotify (~> 0.9, >= 0.9.10)
75
- loofah (2.7.0)
75
+ loofah (2.9.0)
76
76
  crass (~> 1.0.2)
77
77
  nokogiri (>= 1.5.9)
78
78
  mail (2.7.1)
@@ -82,12 +82,13 @@ GEM
82
82
  method_source (1.0.0)
83
83
  mimemagic (0.3.5)
84
84
  mini_mime (1.0.2)
85
- mini_portile2 (2.4.0)
86
- minitest (5.14.2)
85
+ mini_portile2 (2.5.0)
86
+ minitest (5.14.3)
87
87
  msgpack (1.4.2)
88
- nio4r (2.5.4)
89
- nokogiri (1.10.10)
90
- mini_portile2 (~> 2.4.0)
88
+ nio4r (2.5.5)
89
+ nokogiri (1.11.1)
90
+ mini_portile2 (~> 2.5.0)
91
+ racc (~> 1.4)
91
92
  parallel (1.19.2)
92
93
  parser (2.7.1.4)
93
94
  ast (~> 2.4.1)
@@ -97,35 +98,36 @@ GEM
97
98
  pry-byebug (3.9.0)
98
99
  byebug (~> 11.0)
99
100
  pry (~> 0.13.0)
101
+ racc (1.5.2)
100
102
  rack (2.2.3)
101
103
  rack-test (1.1.0)
102
104
  rack (>= 1.0, < 3)
103
- rails (5.2.4.4)
104
- actioncable (= 5.2.4.4)
105
- actionmailer (= 5.2.4.4)
106
- actionpack (= 5.2.4.4)
107
- actionview (= 5.2.4.4)
108
- activejob (= 5.2.4.4)
109
- activemodel (= 5.2.4.4)
110
- activerecord (= 5.2.4.4)
111
- activestorage (= 5.2.4.4)
112
- activesupport (= 5.2.4.4)
105
+ rails (5.2.4.5)
106
+ actioncable (= 5.2.4.5)
107
+ actionmailer (= 5.2.4.5)
108
+ actionpack (= 5.2.4.5)
109
+ actionview (= 5.2.4.5)
110
+ activejob (= 5.2.4.5)
111
+ activemodel (= 5.2.4.5)
112
+ activerecord (= 5.2.4.5)
113
+ activestorage (= 5.2.4.5)
114
+ activesupport (= 5.2.4.5)
113
115
  bundler (>= 1.3.0)
114
- railties (= 5.2.4.4)
116
+ railties (= 5.2.4.5)
115
117
  sprockets-rails (>= 2.0.0)
116
118
  rails-dom-testing (2.0.3)
117
119
  activesupport (>= 4.2.0)
118
120
  nokogiri (>= 1.6)
119
121
  rails-html-sanitizer (1.3.0)
120
122
  loofah (~> 2.3)
121
- railties (5.2.4.4)
122
- actionpack (= 5.2.4.4)
123
- activesupport (= 5.2.4.4)
123
+ railties (5.2.4.5)
124
+ actionpack (= 5.2.4.5)
125
+ activesupport (= 5.2.4.5)
124
126
  method_source
125
127
  rake (>= 0.8.7)
126
128
  thor (>= 0.19.0, < 2.0)
127
129
  rainbow (3.0.0)
128
- rake (13.0.1)
130
+ rake (13.0.3)
129
131
  rb-fsevent (0.10.4)
130
132
  rb-inotify (0.10.1)
131
133
  ffi (~> 1.0)
@@ -167,9 +169,9 @@ GEM
167
169
  activesupport (>= 4.0)
168
170
  sprockets (>= 3.0.0)
169
171
  sqlite3 (1.4.2)
170
- thor (1.0.1)
172
+ thor (1.1.0)
171
173
  thread_safe (0.3.6)
172
- tzinfo (1.2.7)
174
+ tzinfo (1.2.9)
173
175
  thread_safe (~> 0.1)
174
176
  unicode-display_width (1.7.0)
175
177
  websocket-driver (0.7.3)
@@ -28,13 +28,12 @@ module DeclareSchema
28
28
  field(:lock_version, :integer, default: 1, null: false)
29
29
  end
30
30
 
31
- def field(name, type, *args)
32
- options = args.extract_options!
33
- @model.declare_field(name, type, *(args + [@options.merge(options)]))
31
+ def field(name, type, *args, **options)
32
+ @model.declare_field(name, type, *[*args, @options.merge(options)])
34
33
  end
35
34
 
36
35
  def method_missing(name, *args)
37
- field(name, args.first, *args[1..-1])
36
+ field(name, *args)
38
37
  end
39
38
  end
40
39
  end
@@ -81,8 +81,7 @@ module DeclareSchema
81
81
  # arguments. The arguments are forwarded to the #field_added
82
82
  # callback, allowing custom metadata to be added to field
83
83
  # declarations.
84
- def declare_field(name, type, *args)
85
- options = args.extract_options!
84
+ def declare_field(name, type, *args, **options)
86
85
  try(:field_added, name, type, args, options)
87
86
  add_serialize_for_field(name, type, options)
88
87
  add_formatting_for_field(name, type)
@@ -73,44 +73,43 @@ module DeclareSchema
73
73
  end
74
74
  end
75
75
 
76
- # Normalizes schema attributes for the specific database adapter that is currently running
76
+ # Normalizes schema attributes for the given database adapter name.
77
77
  # Note that the un-normalized attributes are still useful for generating migrations because those
78
78
  # may be run with a different adapter.
79
- # This method never mutates its argument. In fact it freezes it to be certain.
80
- def normalize_schema_attributes(schema_attributes)
81
- schema_attributes[:type] or raise ArgumentError, ":type key not found; keys: #{schema_attributes.keys.inspect}"
82
- schema_attributes.freeze
83
-
84
- case ActiveRecord::Base.connection.class.name
85
- when /mysql/i
86
- schema_attributes
87
- when /sqlite/i
88
- case schema_attributes[:type]
89
- when :text
90
- schema_attributes = schema_attributes.merge(limit: nil)
91
- when :integer
92
- schema_attributes = schema_attributes.dup
93
- schema_attributes[:limit] ||= 8
94
- end
95
- schema_attributes
96
- else
97
- schema_attributes
98
- end
79
+ # This method never mutates its argument.
80
+ def normalize_schema_attributes(schema_attributes, db_adapter_name)
81
+ case schema_attributes[:type]
82
+ when :boolean
83
+ schema_attributes.reverse_merge(limit: 1)
84
+ when :integer
85
+ schema_attributes.reverse_merge(limit: 8) if db_adapter_name.match?(/sqlite/i)
86
+ when :float
87
+ schema_attributes.except(:limit)
88
+ when :text
89
+ schema_attributes.except(:limit) if db_adapter_name.match?(/sqlite/i)
90
+ when :datetime
91
+ schema_attributes.reverse_merge(precision: 0)
92
+ when NilClass
93
+ raise ArgumentError, ":type key not found; keys: #{schema_attributes.keys.inspect}"
94
+ end || schema_attributes
99
95
  end
100
96
 
101
97
  def equivalent_schema_attributes?(schema_attributes_lhs, schema_attributes_rhs)
102
- normalize_schema_attributes(schema_attributes_lhs) == normalize_schema_attributes(schema_attributes_rhs)
98
+ db_adapter_name = ActiveRecord::Base.connection.class.name
99
+ normalized_lhs = normalize_schema_attributes(schema_attributes_lhs, db_adapter_name)
100
+ normalized_rhs = normalize_schema_attributes(schema_attributes_rhs, db_adapter_name)
101
+
102
+ normalized_lhs == normalized_rhs
103
103
  end
104
104
  end
105
105
 
106
+ attr_reader :sql_type
107
+
106
108
  def initialize(model, current_table_name, column)
107
109
  @model = model or raise ArgumentError, "must pass model"
108
110
  @current_table_name = current_table_name or raise ArgumentError, "must pass current_table_name"
109
111
  @column = column or raise ArgumentError, "must pass column"
110
- end
111
-
112
- def sql_type
113
- @sql_type ||= self.class.sql_type(@column.type)
112
+ @sql_type = self.class.sql_type(@column.type)
114
113
  end
115
114
 
116
115
  SCHEMA_KEYS = [:type, :limit, :precision, :scale, :null, :default].freeze
@@ -121,7 +120,7 @@ module DeclareSchema
121
120
  value =
122
121
  case key
123
122
  when :default
124
- self.class.deserialize_default_value(@column, sql_type, @column.default)
123
+ self.class.deserialize_default_value(@column, @sql_type, @column.default)
125
124
  else
126
125
  col_value = @column.send(key)
127
126
  if col_value.nil? && (native_type = self.class.native_types[@column.type])
@@ -112,14 +112,14 @@ module DeclareSchema
112
112
 
113
113
  @options = Hash[@options.sort_by { |k, _v| OPTION_INDEXES[k] || 9999 }]
114
114
 
115
- @sql_options = @options.except(*NON_SQL_OPTIONS)
115
+ @sql_options = @options.slice(*SQL_OPTIONS)
116
116
  end
117
117
 
118
118
  # returns the attributes for schema migrations as a Hash
119
119
  # omits name and position since those are meta-data above the schema
120
120
  # omits keys with nil values
121
121
  def schema_attributes(col_spec)
122
- @options.merge(type: @type).tap do |attrs|
122
+ @sql_options.merge(type: @type).tap do |attrs|
123
123
  attrs[:default] = Column.deserialize_default_value(col_spec, @sql_type, attrs[:default])
124
124
  end.compact
125
125
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeclareSchema
4
- VERSION = "0.7.0"
4
+ VERSION = "0.7.1"
5
5
  end
@@ -444,12 +444,12 @@ module Generators
444
444
  spec_attrs = spec.schema_attributes(column)
445
445
  column_declaration = ::DeclareSchema::Model::Column.new(model, current_table_name, column)
446
446
  col_attrs = column_declaration.schema_attributes
447
- if !::DeclareSchema::Model::Column.equivalent_schema_attributes?(spec_attrs, col_attrs)
448
- normalized_schema_attributes = spec_attrs.merge(fk_field_options(model, col_name_to_change))
447
+ normalized_schema_attrs = spec_attrs.merge(fk_field_options(model, col_name_to_change))
449
448
 
450
- type = normalized_schema_attributes.delete(:type) or raise "no :type found in #{normalized_schema_attributes.inspect}"
449
+ if !::DeclareSchema::Model::Column.equivalent_schema_attributes?(normalized_schema_attrs, col_attrs)
450
+ type = normalized_schema_attrs.delete(:type) or raise "no :type found in #{normalized_schema_attrs.inspect}"
451
451
  changes << ["change_column #{new_table_name.to_sym.inspect}", col_name_to_change.to_sym.inspect,
452
- type.to_sym.inspect, *format_options(normalized_schema_attributes)].join(", ")
452
+ type.to_sym.inspect, *format_options(normalized_schema_attrs)].join(", ")
453
453
  undo_changes << change_column_back(model, current_table_name, orig_col_name)
454
454
  end
455
455
  end
@@ -149,8 +149,8 @@ RSpec.describe DeclareSchema::Model::FieldSpec do
149
149
  end
150
150
  end
151
151
 
152
- it 'returns the attributes except name, position' do
153
- subject = described_class.new(model, :price, :bigint, null: true, default: 0, position: 2)
152
+ it 'returns the attributes except name, position, and non-SQL options' do
153
+ subject = described_class.new(model, :price, :bigint, null: true, default: 0, ruby_default: -> { }, encrypt_using: -> { }, position: 2)
154
154
  expect(subject.schema_attributes(col_spec)).to eq(type: :integer, limit: 8, null: true, default: 0)
155
155
  end
156
156
 
@@ -163,4 +163,11 @@ RSpec.describe DeclareSchema::Model::FieldSpec do
163
163
  expect(bigint.schema_attributes(col_spec)).to eq(expected_attributes)
164
164
  end
165
165
  end
166
+
167
+ describe '#sql_options' do
168
+ subject { described_class.new(model, :price, :integer, limit: 4, null: true, default: 0, position: 2, encrypt_using: ->(field) { field }) }
169
+ it 'excludes non-sql options' do
170
+ expect(subject.sql_options).to eq(limit: 4, null: true, default: 0)
171
+ end
172
+ end
166
173
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: declare_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Invoca Development adapted from hobo_fields by Tom Locke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-14 00:00:00.000000000 Z
11
+ date: 2021-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails