declare_schema 0.5.0 → 0.6.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
  SHA256:
3
- metadata.gz: 59ff5d6d1a71b80a0541e2430f77665914d0c354ec92f31db8bbf22630fa5bef
4
- data.tar.gz: dcaedebe325290c8c625c099b4d3cd6e2a87694f1d3cfec68811618f635715c1
3
+ metadata.gz: c0c13793a5b263a2f1134ee19168a42ceb57c472cf8fb656b8e86fcdd9500b79
4
+ data.tar.gz: ee92620b0a091538958957205ba940d97cd9f67bc606751cb52a8ae44370e541
5
5
  SHA512:
6
- metadata.gz: 0a62a4236edd68e1429d4949b6745f34ed186acc24935bb027d1108b59372c0b681abc514963730c8e9e092769aa4a614a286c8815aa704a8dc24378e6cbe4ee
7
- data.tar.gz: f8a9b7e40ffe14aa35e0a33d66c4e7dd820535ceacbc488bf159b386e28f5edf0d69896ff2e96a2c521e41e59c36fb9d7f47a6d1b6089a3625d8664a41be5b95
6
+ metadata.gz: 3bc0e18dd1b3a998640cc2e983c86182e19b855d8ce42b3f7233b3471a7849d0dc28fa2653d110b42d0544c513267f8066386496b1469085bb507541c068b87a
7
+ data.tar.gz: 34b9e31862291b85becf7eeb908c4ef1da5b29178b1ab387b35c6678680299cd921fa65b49e0ba89604518a66515092d3e7d6c38678267301c9399b4572d372e
@@ -0,0 +1,44 @@
1
+ ---
2
+ on: [push]
3
+
4
+ name: DeclareSchema Build
5
+
6
+ jobs:
7
+ build:
8
+ name: DeclareSchema Build
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ matrix:
12
+ ruby: [ 2.4.5, 2.5.8, 2.6.5, 2.7.1 ]
13
+ gemfile: [ gemfiles/rails_4.gemfile, gemfiles/rails_5.gemfile, gemfiles/rails_6.gemfile ]
14
+ exclude:
15
+ - { gemfile: gemfiles/rails_4.gemfile, ruby: 2.7.1 }
16
+ - { gemfile: gemfiles/rails_5.gemfile, ruby: 2.4.5 }
17
+ - { gemfile: gemfiles/rails_6.gemfile, ruby: 2.4.5 }
18
+ env:
19
+ BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
20
+ steps:
21
+ - name: Checkout Branch
22
+ id: checkout_branch
23
+ uses: actions/checkout@v2
24
+ - name: Setup Ruby
25
+ id: setup_ruby
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ bundler: 1.17.3
29
+ ruby-version: ${{matrix.ruby}}
30
+ - name: Remove Bundler 2
31
+ id: remove_bundler_2
32
+ if: ${{ matrix.ruby >= '2.6.5' }}
33
+ run: |
34
+ rm -f /opt/hostedtoolcache/Ruby/2.*/x64/lib/ruby/gems/2.*/specifications/default/bundler-2.*.gemspec
35
+ gem install bundler:1.17.3 --force --default
36
+ gem install bundler -v 1.17.3
37
+ - name: Appraisals
38
+ id: appraisals
39
+ run: |
40
+ bundle install --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle} --gemfile=${{ matrix.gemfile }}
41
+ git config --global user.email "dummy@example.com"
42
+ git config --global user.name "dummy"
43
+ bundle exec rake test:prepare_testapp[force]
44
+ bundle exec rake test:all < test_responses.txt
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
 
13
13
  # appraisal
14
14
  gemfiles/*.lock
15
+ .idea
@@ -4,6 +4,17 @@ 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.6.0] - 2020-12-23
8
+ ### Added
9
+ - Fields may now be declared with `:bigint` type which is identical to `:integer, limit 8`
10
+ - FieldSpec#initialize interface now includes `position` keyword argument and `**options` hash.
11
+
12
+ ### Fixed
13
+ - Fixed cycle in which FieldSpec#initialize was calling `model.field_specs`
14
+
15
+ ### Changed
16
+ - Changed ci support from Travis to Github Workflow
17
+
7
18
  ## [0.5.0] - 2020-12-21
8
19
  ### Added
9
20
  - Added support for configuring the character set and collation for MySQL databases
@@ -73,6 +84,7 @@ using the appropriate Rails configuration attributes.
73
84
  ### Added
74
85
  - Initial version from https://github.com/Invoca/hobo_fields v4.1.0.
75
86
 
87
+ [0.6.0]: https://github.com/Invoca/declare_schema/compare/v0.5.0...v0.6.0
76
88
  [0.5.0]: https://github.com/Invoca/declare_schema/compare/v0.4.2...v0.5.0
77
89
  [0.4.2]: https://github.com/Invoca/declare_schema/compare/v0.4.1...v0.4.2
78
90
  [0.4.1]: https://github.com/Invoca/declare_schema/compare/v0.4.0...v0.4.1
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- declare_schema (0.5.0)
4
+ declare_schema (0.6.0)
5
5
  rails (>= 4.2)
6
6
 
7
7
  GEM
@@ -88,7 +88,7 @@ module DeclareSchema
88
88
  add_formatting_for_field(name, type)
89
89
  add_validations_for_field(name, type, args, options)
90
90
  add_index_for_field(name, args, options)
91
- field_specs[name] = ::DeclareSchema::Model::FieldSpec.new(self, name, type, options)
91
+ field_specs[name] = ::DeclareSchema::Model::FieldSpec.new(self, name, type, position: field_specs.size, **options)
92
92
  attr_order << name unless attr_order.include?(name)
93
93
  end
94
94
 
@@ -33,7 +33,8 @@ module DeclareSchema
33
33
 
34
34
  attr_reader :model, :name, :type, :position, :options
35
35
 
36
- def initialize(model, name, type, options = {})
36
+ def initialize(model, name, type, position: 0, **options)
37
+ # TODO: TECH-5116
37
38
  # Invoca change - searching for the primary key was causing an additional database read on every model load. Assume
38
39
  # "id" which works for invoca.
39
40
  # raise ArgumentError, "you cannot provide a field spec for the primary key" if name == model.primary_key
@@ -43,9 +44,8 @@ module DeclareSchema
43
44
  @name = name.to_sym
44
45
  type.is_a?(Symbol) or raise ArgumentError, "type must be a Symbol; got #{type.inspect}"
45
46
  @type = type
46
- position_option = options.delete(:position)
47
+ @position = position
47
48
  @options = options
48
-
49
49
  case type
50
50
  when :text
51
51
  @options[:default] and raise "default may not be given for :text field #{model}##{@name}"
@@ -54,11 +54,15 @@ module DeclareSchema
54
54
  end
55
55
  when :string
56
56
  @options[:limit] or raise "limit must be given for :string field #{model}##{@name}: #{@options.inspect}; do you want `limit: 255`?"
57
- else
57
+ when :bigint
58
+ @type = :integer
59
+ @options = options.merge(limit: 8)
60
+ end
61
+
62
+ unless type.in?([:text, :string])
58
63
  @options[:collation] and raise "collation may only given for :string and :text fields"
59
64
  @options[:charset] and raise "charset may only given for :string and :text fields"
60
65
  end
61
- @position = position_option || model.field_specs.length
62
66
  end
63
67
 
64
68
  TYPE_SYNONYMS = { timestamp: :datetime }.freeze
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeclareSchema
4
- VERSION = "0.5.0"
4
+ VERSION = "0.6.0"
5
5
  end
@@ -37,11 +37,9 @@ module Generators
37
37
 
38
38
  def field_specs
39
39
  i = 0
40
- foreign_keys.reduce({}) do |h, v|
41
- # some trickery to avoid an infinite loop when FieldSpec#initialize tries to call model.field_specs
42
- h[v] = ::DeclareSchema::Model::FieldSpec.new(self, v, :integer, position: i, null: false)
40
+ foreign_keys.each_with_object({}) do |v, result|
41
+ result[v] = ::DeclareSchema::Model::FieldSpec.new(self, v, :integer, position: i, null: false)
43
42
  i += 1
44
- h
45
43
  end
46
44
  end
47
45
 
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'DeclareSchema Model FieldSpec' do
4
+ before do
5
+ load File.expand_path('prepare_testapp.rb', __dir__)
6
+ end
7
+
8
+ context 'There are no model columns to change' do
9
+ it '#different_to should return false for int8 == int8' do
10
+ subject = DeclareSchema::Model::FieldSpec.new(Object, :price, :integer, limit: 8, null: false, position: 0)
11
+
12
+ case Rails::VERSION::MAJOR
13
+ when 4
14
+ cast_type = ActiveRecord::Type::Integer.new(limit: 8)
15
+ col = ActiveRecord::ConnectionAdapters::Column.new("price", nil, cast_type, "integer(8)", false)
16
+ else
17
+ sql_type_metadata = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(sql_type: "integer(8)", type: :integer, limit: 8)
18
+ col = ActiveRecord::ConnectionAdapters::Column.new("price", nil, sql_type_metadata, false, "adverts")
19
+ end
20
+
21
+ expect(subject.different_to?(subject.name, col)).to eq(false)
22
+ end
23
+
24
+ it '#different_to should return false for bigint == bigint' do
25
+ subject = DeclareSchema::Model::FieldSpec.new(Object, :price, :bigint, null: false, position: 0)
26
+
27
+ case Rails::VERSION::MAJOR
28
+ when 4
29
+ cast_type = ActiveRecord::Type::BigInteger.new(limit: 8)
30
+ col = ActiveRecord::ConnectionAdapters::Column.new("price", nil, cast_type, "bigint(20)", false)
31
+ else
32
+ sql_type_metadata = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(sql_type: "bigint(20)", type: :integer, limit: 8)
33
+ col = ActiveRecord::ConnectionAdapters::Column.new("price", nil, sql_type_metadata, false, "adverts")
34
+ end
35
+
36
+ expect(subject.different_to?(subject.name, col)).to eq(false)
37
+ end
38
+
39
+ it '#different_to should return false for int8 == bigint' do
40
+ subject = DeclareSchema::Model::FieldSpec.new(Object, :price, :integer, limit: 8, null: false, position: 0)
41
+
42
+ case Rails::VERSION::MAJOR
43
+ when 4
44
+ cast_type = ActiveRecord::Type::BigInteger.new(limit: 8)
45
+ col = ActiveRecord::ConnectionAdapters::Column.new("price", nil, cast_type, "bigint(20)", false)
46
+ else
47
+ sql_type_metadata = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(sql_type: "bigint(20)", type: :integer, limit: 8)
48
+ col = ActiveRecord::ConnectionAdapters::Column.new("price", nil, sql_type_metadata, false, "adverts")
49
+ end
50
+
51
+ expect(subject.different_to?(subject.name, col)).to eq(false)
52
+ end
53
+
54
+ it '#different_to should return false for bigint == int8' do
55
+ subject = DeclareSchema::Model::FieldSpec.new(Object, :price, :bigint, null: false, position: 0)
56
+
57
+ case Rails::VERSION::MAJOR
58
+ when 4
59
+ cast_type = ActiveRecord::Type::Integer.new(limit: 8)
60
+ col = ActiveRecord::ConnectionAdapters::Column.new("price", nil, cast_type, "integer(8)", false)
61
+ else
62
+ sql_type_metadata = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(sql_type: "integer(8)", type: :integer, limit: 8)
63
+ col = ActiveRecord::ConnectionAdapters::Column.new("price", nil, sql_type_metadata, false, "adverts")
64
+ end
65
+
66
+ expect(subject.different_to?(subject.name, col)).to eq(false)
67
+ end
68
+ end
69
+ end
@@ -1093,4 +1093,29 @@ RSpec.describe 'DeclareSchema Migration Generator' do
1093
1093
  expect(base_class).to eq("(Rails::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[4.2] : ActiveRecord::Migration)")
1094
1094
  end
1095
1095
  end
1096
+
1097
+ context 'Does not generate migrations' do
1098
+ it 'for aliased fields bigint -> integer limit 8' do
1099
+ if Rails::VERSION::MAJOR >= 5 || !ActiveRecord::Base.connection.class.name.match?(/SQLite3Adapter/)
1100
+ class Advert < active_record_base_class.constantize
1101
+ fields do
1102
+ price :bigint
1103
+ end
1104
+ end
1105
+
1106
+ generate_migrations '-n', '-m'
1107
+
1108
+ migrations = Dir.glob('db/migrate/*declare_schema_migration*.rb')
1109
+ expect(migrations.size).to eq(1), migrations.inspect
1110
+
1111
+ class Advert < active_record_base_class.constantize
1112
+ fields do
1113
+ price :integer, limit: 8
1114
+ end
1115
+ end
1116
+
1117
+ expect { generate_migrations '-n', '-g' }.to output("Database and models match -- nothing to change\n").to_stdout
1118
+ end
1119
+ end
1120
+ end
1096
1121
  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.5.0
4
+ version: 0.6.0
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: 2020-12-21 00:00:00.000000000 Z
11
+ date: 2020-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -33,12 +33,12 @@ extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
35
  - ".github/dependabot.yml"
36
+ - ".github/workflows/declare_schema_build.yml"
36
37
  - ".github/workflows/gem_release.yml"
37
38
  - ".gitignore"
38
39
  - ".rspec"
39
40
  - ".rubocop.yml"
40
41
  - ".ruby-version"
41
- - ".travis.yml"
42
42
  - Appraisals
43
43
  - CHANGELOG.md
44
44
  - Gemfile
@@ -75,6 +75,7 @@ files:
75
75
  - lib/generators/declare_schema/support/thor_shell.rb
76
76
  - spec/lib/declare_schema/api_spec.rb
77
77
  - spec/lib/declare_schema/field_declaration_dsl_spec.rb
78
+ - spec/lib/declare_schema/field_spec_spec.rb
78
79
  - spec/lib/declare_schema/generator_spec.rb
79
80
  - spec/lib/declare_schema/interactive_primary_key_spec.rb
80
81
  - spec/lib/declare_schema/migration_generator_spec.rb
@@ -1,37 +0,0 @@
1
- ---
2
- dist: trusty
3
- os: linux
4
- language: ruby
5
- cache: bundler
6
- rvm:
7
- - 2.4.5
8
- - 2.5.8
9
- - 2.6.5
10
- - 2.7.1
11
- - ruby-head
12
- gemfile:
13
- - gemfiles/rails_4.gemfile
14
- - gemfiles/rails_5.gemfile
15
- - gemfiles/rails_6.gemfile
16
- jobs:
17
- fast_finish: false
18
- exclude:
19
- - gemfile: gemfiles/rails_4.gemfile
20
- rvm: 2.7.1
21
- - gemfile: gemfiles/rails_5.gemfile
22
- rvm: 2.4.5
23
- - gemfile: gemfiles/rails_6.gemfile
24
- rvm: 2.4.5
25
- allow_failures:
26
- - rvm: ruby-head
27
- before_install:
28
- - rm -f /home/travis/.rvm/rubies/ruby-2.*/lib/ruby/gems/2.*/specifications/default/bundler-2.*.gemspec
29
- - echo y | rvm @global do gem install bundler -v 1.17.3 --force --default
30
- - gem install bundler -v 1.17.3 --force --default
31
- - gem install bundler -v 1.17.3
32
- install:
33
- - bundle --version
34
- - bundle install --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle}
35
- script:
36
- - bundle exec rake test:prepare_testapp[force]
37
- - bundle exec rake test:all < test_responses.txt