groundswell_schema_plus_columns 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ad453a456a7412e8397e5e2ec55e9e37f7351fdc
4
+ data.tar.gz: c3f4804ce0135a9a7db011dc46fb47834fb442a4
5
+ SHA512:
6
+ metadata.gz: 29a0f7d2d203709c101c6221c92b0174f4f64a8b2dae983483c0c898f52a8387c2f33a5faeec56759605c6ec256b0c3ae689d0ba3adfa7f43a480e0addb462a0
7
+ data.tar.gz: 2ac1e431cc656ca7c15203c78648471eb77d8d167f22833ca4fa4c73ab95fb695721518766bfc814be5aeb16d51beaf668572d048259e0fe510757244928e71e
@@ -0,0 +1,9 @@
1
+ /coverage
2
+ /tmp
3
+ /pkg
4
+ /Gemfile.local
5
+
6
+ *.lock
7
+ *.log
8
+ *.sqlite3
9
+ !gemfiles/**/*.sqlite3
@@ -0,0 +1,24 @@
1
+ # This file was auto-generated by the schema_dev tool, based on the data in
2
+ # ./schema_dev.yml
3
+ # Please do not edit this file; any changes will be overwritten next time
4
+ # schema_dev gets run.
5
+ ---
6
+ sudo: false
7
+ rvm:
8
+ - 2.3.1
9
+ gemfile:
10
+ - gemfiles/activerecord-4.2/Gemfile.mysql2
11
+ - gemfiles/activerecord-4.2/Gemfile.postgresql
12
+ - gemfiles/activerecord-4.2/Gemfile.sqlite3
13
+ - gemfiles/activerecord-5.0/Gemfile.mysql2
14
+ - gemfiles/activerecord-5.0/Gemfile.postgresql
15
+ - gemfiles/activerecord-5.0/Gemfile.sqlite3
16
+ - gemfiles/activerecord-5.1/Gemfile.mysql2
17
+ - gemfiles/activerecord-5.1/Gemfile.postgresql
18
+ - gemfiles/activerecord-5.1/Gemfile.sqlite3
19
+ env: POSTGRESQL_DB_USER=postgres MYSQL_DB_USER=travis
20
+ addons:
21
+ postgresql: '9.4'
22
+ before_script: bundle exec rake create_databases
23
+ after_script: bundle exec rake drop_databases
24
+ script: bundle exec rake travis
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ File.exist?(gemfile_local = File.expand_path('../Gemfile.local', __FILE__)) and eval File.read(gemfile_local), binding, gemfile_local
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 ronen barzel
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,122 @@
1
+ [![Gem Version](https://badge.fury.io/rb/schema_plus_columns.svg)](http://badge.fury.io/rb/schema_plus_columns)
2
+ [![Build Status](https://secure.travis-ci.org/SchemaPlus/schema_plus_columns.svg)](http://travis-ci.org/SchemaPlus/schema_plus_columns)
3
+ [![Coverage Status](https://img.shields.io/coveralls/SchemaPlus/schema_plus_columns.svg)](https://coveralls.io/r/SchemaPlus/schema_plus_columns)
4
+ [![Dependency Status](https://gemnasium.com/lomba/schema_plus_columns.svg)](https://gemnasium.com/SchemaPlus/schema_plus_columns)
5
+
6
+ # SchemaPlus::Columns
7
+
8
+ SchemaPlus::Columns adds some useful accessors the objects returned by ActiveRecord's [`Model.columns`](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQL/SchemaStatements.html#method-i-columns) database introspection query.
9
+
10
+ SchemaPlus::Columns is part of the [SchemaPlus](https://github.com/SchemaPlus/) family of Ruby on Rails extension gems.
11
+
12
+ ## Installation
13
+
14
+ <!-- SCHEMA_DEV: TEMPLATE INSTALLATION - begin -->
15
+ <!-- These lines are auto-inserted from a schema_dev template -->
16
+ As usual:
17
+
18
+ ```ruby
19
+ gem "schema_plus_columns" # in a Gemfile
20
+ gem.add_dependency "schema_plus_columns" # in a .gemspec
21
+ ```
22
+
23
+ <!-- SCHEMA_DEV: TEMPLATE INSTALLATION - end -->
24
+
25
+ ## Usage
26
+
27
+ SchemaPlus::Columns makes these accessors available:
28
+
29
+ #### `column.indexes`
30
+
31
+ Returns a list of index definitions for each index that refers to this column. Returns an empty list if there are no such indexes.
32
+
33
+ #### `column.unique?`
34
+
35
+ Returns true if the column is in a unique index.
36
+
37
+ #### `column.unique_scope`
38
+
39
+ If the column is in a unique index, returns a list of names of other columns in the index. Returns an empty list if it's a single-column index. Returns nil if the column is not in a unique index.
40
+
41
+ #### `column.case_sensitive?`
42
+
43
+ Returns true if the column is in one or more indexes that are case sensitive. *Requires the index definitions to respond to `:case_sensitive?`* -- i.e. Only works with `schema_plus_pg_indexes` having been loaded.
44
+
45
+ #### `column.required_on`
46
+
47
+ Returns an indicator of the circumstance in which the column must have a value:
48
+
49
+ * `nil` If the column may be null
50
+ * `:save` If the column has no default value
51
+ * `:update` Otherwise
52
+
53
+
54
+ ## Compatibility
55
+
56
+ SchemaPlus::Columns is tested on:
57
+
58
+ <!-- SCHEMA_DEV: MATRIX - begin -->
59
+ <!-- These lines are auto-generated by schema_dev based on schema_dev.yml -->
60
+ * ruby **2.3.1** with activerecord **4.2**, using **mysql2**, **sqlite3** or **postgresql**
61
+ * ruby **2.3.1** with activerecord **5.0**, using **mysql2**, **sqlite3** or **postgresql**
62
+ * ruby **2.3.1** with activerecord **5.1**, using **mysql2**, **sqlite3** or **postgresql**
63
+
64
+ <!-- SCHEMA_DEV: MATRIX - end -->
65
+
66
+
67
+ ## Release Notes
68
+
69
+ * 0.2.0 - AR 5.1 Support
70
+ * 0.1.3 - AR 5.0 Support
71
+ * 0.1.2 - Missing require
72
+ * 0.1.1 - Explicit gem dependencies
73
+ * 0.1.0 - Initial release, extracted from SchemaPlus 1.x
74
+
75
+ ## Development & Testing
76
+
77
+ Are you interested in contributing to SchemaPlus::Columns? Thanks! Please follow
78
+ the standard protocol: fork, feature branch, develop, push, and issue pull
79
+ request.
80
+
81
+ Some things to know about to help you develop and test:
82
+
83
+ <!-- SCHEMA_DEV: TEMPLATE USES SCHEMA_DEV - begin -->
84
+ <!-- These lines are auto-inserted from a schema_dev template -->
85
+ * **schema_dev**: SchemaPlus::Columns uses [schema_dev](https://github.com/SchemaPlus/schema_dev) to
86
+ facilitate running rspec tests on the matrix of ruby, activerecord, and database
87
+ versions that the gem supports, both locally and on
88
+ [travis-ci](http://travis-ci.org/SchemaPlus/schema_plus_columns)
89
+
90
+ To to run rspec locally on the full matrix, do:
91
+
92
+ $ schema_dev bundle install
93
+ $ schema_dev rspec
94
+
95
+ You can also run on just one configuration at a time; For info, see `schema_dev --help` or the [schema_dev](https://github.com/SchemaPlus/schema_dev) README.
96
+
97
+ The matrix of configurations is specified in `schema_dev.yml` in
98
+ the project root.
99
+
100
+
101
+ <!-- SCHEMA_DEV: TEMPLATE USES SCHEMA_DEV - end -->
102
+
103
+ <!-- SCHEMA_DEV: TEMPLATE USES SCHEMA_PLUS_CORE - begin -->
104
+ <!-- These lines are auto-inserted from a schema_dev template -->
105
+ * **schema_plus_core**: SchemaPlus::Columns uses the SchemaPlus::Core API that
106
+ provides middleware callback stacks to make it easy to extend
107
+ ActiveRecord's behavior. If that API is missing something you need for
108
+ your contribution, please head over to
109
+ [schema_plus_core](https://github.com/SchemaPlus/schema_plus_core) and open
110
+ an issue or pull request.
111
+
112
+ <!-- SCHEMA_DEV: TEMPLATE USES SCHEMA_PLUS_CORE - end -->
113
+
114
+ <!-- SCHEMA_DEV: TEMPLATE USES SCHEMA_MONKEY - begin -->
115
+ <!-- These lines are auto-inserted from a schema_dev template -->
116
+ * **schema_monkey**: SchemaPlus::Columns is implemented as a
117
+ [schema_monkey](https://github.com/SchemaPlus/schema_monkey) client,
118
+ using [schema_monkey](https://github.com/SchemaPlus/schema_monkey)'s
119
+ convention-based protocols for extending ActiveRecord and using middleware stacks.
120
+
121
+ <!-- SCHEMA_DEV: TEMPLATE USES SCHEMA_MONKEY - end -->
122
+
@@ -0,0 +1,9 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'schema_dev/tasks'
5
+
6
+ task :default => :spec
7
+
8
+ require 'rspec/core/rake_task'
9
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => File.expand_path('..', __FILE__)
3
+
4
+ File.exist?(gemfile_local = File.expand_path('../Gemfile.local', __FILE__)) and eval File.read(gemfile_local), binding, gemfile_local
@@ -0,0 +1,3 @@
1
+ eval File.read File.expand_path('../../Gemfile.base', __FILE__)
2
+
3
+ gem "activerecord", "~> 4.2.6"
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "mysql2", '>= 0.3.18', '< 0.5'
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcmysql-adapter'
10
+ end
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "pg"
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcpostgresql-adapter'
10
+ end
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "sqlite3"
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcsqlite3-adapter', '>=1.3.0.beta2'
10
+ end
@@ -0,0 +1,3 @@
1
+ eval File.read File.expand_path('../../Gemfile.base', __FILE__)
2
+
3
+ gem "activerecord", "~> 5.0.1"
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "mysql2"
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcmysql-adapter'
10
+ end
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "pg"
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcpostgresql-adapter'
10
+ end
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "sqlite3"
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcsqlite3-adapter', '>=1.3.0.beta2'
10
+ end
@@ -0,0 +1,3 @@
1
+ eval File.read File.expand_path('../../Gemfile.base', __FILE__)
2
+
3
+ gem "activerecord", "~> 5.1.0"
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "mysql2"
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcmysql-adapter'
10
+ end
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "pg"
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcpostgresql-adapter'
10
+ end
@@ -0,0 +1,10 @@
1
+ require "pathname"
2
+ eval(Pathname.new(__FILE__).dirname.join("Gemfile.base").read, binding)
3
+
4
+ platform :ruby do
5
+ gem "sqlite3"
6
+ end
7
+
8
+ platform :jruby do
9
+ gem 'activerecord-jdbcsqlite3-adapter', '>=1.3.0.beta2'
10
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'schema_plus/columns/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "groundswell_schema_plus_columns"
8
+ gem.version = SchemaPlus::Columns::VERSION
9
+ gem.authors = ["ronen barzel", "Ryan Murphy"]
10
+ gem.email = ["ryan@groundswell.legal"]
11
+ gem.summary = %q{Adds useful accessors to ActiveRecord's Column object.}
12
+ gem.homepage = "https://github.com/groundswell-productivity/schema_plus_columns.git"
13
+ gem.license = "MIT"
14
+
15
+ gem.files = `git ls-files -z`.split("\x0")
16
+ gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency "activerecord", ">= 4.2", "< 5.2"
21
+ gem.add_dependency "schema_plus_core"
22
+ gem.add_dependency "schema_plus_indexes", "~> 0.2"
23
+ gem.add_dependency "its-it", "~> 1.2"
24
+
25
+ gem.add_development_dependency "bundler", "~> 1.7"
26
+ gem.add_development_dependency "rake", "~> 10.0"
27
+ gem.add_development_dependency "rspec", "~> 3.0"
28
+ gem.add_development_dependency "schema_dev", "~> 3.6"
29
+ gem.add_development_dependency "simplecov"
30
+ gem.add_development_dependency "simplecov-gem-profile"
31
+ end
@@ -0,0 +1 @@
1
+ require_relative 'schema_plus/columns'
@@ -0,0 +1,8 @@
1
+ require 'schema_plus/indexes'
2
+ require 'its-it'
3
+
4
+ require_relative 'columns/active_record/connection_adapters/column'
5
+ require_relative 'columns/middleware/model'
6
+ require_relative 'columns/version'
7
+
8
+ SchemaMonkey.register SchemaPlus::Columns
@@ -0,0 +1,65 @@
1
+ module SchemaPlus::Columns
2
+ module ActiveRecord
3
+ module ConnectionAdapters
4
+
5
+ #
6
+ # SchemaPlus::Index adds several methods to Column
7
+ #
8
+ module Column
9
+
10
+ attr_writer :model # model assigned set by Middleware::Model::Columns
11
+
12
+ # Returns the list of IndexDefinition instances for each index that
13
+ # refers to this column. Returns an empty list if there are no
14
+ # such indexes.
15
+ def indexes
16
+ @indexes ||= @model.indexes.select{|index| index.columns.include? self.name}
17
+ end
18
+
19
+ # If the column is in a unique index, returns a list of names of other columns in
20
+ # the index. Returns an empty list if it's a single-column index.
21
+ # Returns nil if the column is not in a unique index.
22
+ def unique_scope
23
+ if index = indexes.select{|i| i.unique}.sort_by{|i| i.columns.size}.first
24
+ index.columns.reject{|name| name == self.name}
25
+ end
26
+ end
27
+
28
+ # Returns true if the column is in a unique index. See also
29
+ # unique_scope
30
+ def unique?
31
+ indexes.any?{|i| i.unique}
32
+ end
33
+
34
+ # Returns true if the column is in one or more indexes that are
35
+ # case sensitive. Will raise exception if
36
+ # IndexDefinition#case_sensitive? isn't defined, i.e. if
37
+ # schema_plus_pg_indexes hasn't been loaded.
38
+ def case_sensitive?
39
+ indexes.any?{|i| i.case_sensitive?}
40
+ end
41
+
42
+ # The default as_jon includes all instance variables. but
43
+ # @model can't be dumped (it contains circular references)
44
+ def as_json(options=nil)
45
+ instance_values.except "model", "adapter"
46
+ end
47
+
48
+ # Returns the circumstance in which the column must have a value:
49
+ # nil if the column may be null
50
+ # :save if the column has no default value
51
+ # :update otherwise
52
+ def required_on
53
+ if null
54
+ nil
55
+ elsif default.nil?
56
+ :save
57
+ else
58
+ :update
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,16 @@
1
+ module SchemaPlus::Columns
2
+ module Middleware
3
+ module Model
4
+
5
+ module Columns
6
+
7
+ def after(env)
8
+ env.columns.each do |column|
9
+ column.model = env.model
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ module SchemaPlus
2
+ module Columns
3
+ VERSION = "0.3.0"
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ ruby:
2
+ - 2.3.1
3
+ activerecord:
4
+ - 4.2
5
+ - 5.0
6
+ - 5.1
7
+ db:
8
+ - mysql2
9
+ - sqlite3
10
+ - postgresql
@@ -0,0 +1,163 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Column" do
4
+
5
+ before(:all) do
6
+ class User < ::ActiveRecord::Base ; end
7
+ end
8
+
9
+ let(:migration) { ::ActiveRecord::Migration }
10
+
11
+ context "JSON serialization" do
12
+ before(:each) do
13
+ create_table(User, :login => { :index => true})
14
+ @login = User.columns.find{|column| column.name == "login"}
15
+ end
16
+ it "works properly" do
17
+ type = case
18
+ when SchemaDev::Rspec::Helpers.mysql?
19
+ { "sql_type" => "varchar(255)" }
20
+ when SchemaDev::Rspec::Helpers.postgresql?
21
+ { "sql_type" => "character varying" }
22
+ when SchemaDev::Rspec::Helpers.sqlite3?
23
+ { "sql_type" => "varchar" }
24
+ end
25
+ if Gem::Requirement.new('< 5.0.0.alpha.1').satisfied_by?(::ActiveRecord.version)
26
+ expect(JSON.parse(@login.to_json)).to include(type.merge("name" => "login"))
27
+ else
28
+ expect(JSON.parse(@login.to_json)).to include(
29
+ "name" => "login",
30
+ "sql_type_metadata" => a_hash_including(type)
31
+ )
32
+ end
33
+ end
34
+ end
35
+
36
+ context "regarding indexes" do
37
+
38
+ context "if not unique" do
39
+
40
+ before(:each) do
41
+ create_table(User, :login => { :index => true})
42
+ @login = User.columns.find{|column| column.name == "login"}
43
+ end
44
+
45
+ it "should report not unique" do
46
+ expect(@login).not_to be_unique
47
+ end
48
+
49
+ it "should report nil unique scope" do
50
+ create_table(User, :login => { :index => true})
51
+ expect(@login.unique_scope).to be_nil
52
+ end
53
+ end
54
+
55
+ context "if unique single column" do
56
+ before(:each) do
57
+ create_table(User, :login => { :index => :unique})
58
+ @login = User.columns.find{|column| column.name == "login"}
59
+ end
60
+
61
+ it "should report unique" do
62
+ expect(@login).to be_unique
63
+ end
64
+
65
+ it "should report an empty unique scope" do
66
+ expect(@login.unique_scope).to eq([])
67
+ end
68
+ end
69
+
70
+ context "if unique multicolumn" do
71
+
72
+ before(:each) do
73
+ create_table(User, :first => {}, :middle => {}, :last => { :index => {:with => [:first, :middle], :unique => true}})
74
+ @first = User.columns.find{|column| column.name == "first"}
75
+ @middle = User.columns.find{|column| column.name == "middle"}
76
+ @last = User.columns.find{|column| column.name == "last"}
77
+ end
78
+
79
+ it "should report unique for each" do
80
+ expect(@first).to be_unique
81
+ expect(@middle).to be_unique
82
+ expect(@last).to be_unique
83
+ end
84
+
85
+ it "should report unique scope for each" do
86
+ expect(@first.unique_scope).to match_array(%W[middle last])
87
+ expect(@middle.unique_scope).to match_array(%W[first last])
88
+ expect(@last.unique_scope).to match_array(%W[first middle])
89
+ end
90
+ end
91
+
92
+ context "with case insensitive" do
93
+ before(:each) do
94
+ create_table(User, :login => { :index => {}})
95
+ User.reset_column_information
96
+ @column = User.columns.find(&its.name == "login")
97
+ end
98
+
99
+ context "index", :mysql => :skip do
100
+
101
+ it "reports column as case insensitive" do
102
+ allow(User.indexes.first).to receive(:case_sensitive?).and_return(false);
103
+ expect(@column).not_to be_case_sensitive
104
+ end
105
+ end
106
+
107
+ context "database", :mysql => :only do
108
+
109
+ # make sure we haven't broken mysql's method
110
+ it "reports column as case insensitive" do
111
+ allow(migration).to receive(:collation).and_return("utf8_unicode_ci") # mysql determines case insensitivity its own way
112
+ expect(@column).not_to be_case_sensitive
113
+ end
114
+ end
115
+ end
116
+
117
+ end
118
+
119
+ context "regarding when it requires a value" do
120
+
121
+ it "not required if the column can be null" do
122
+ create_table(User, :login => { :null => true})
123
+ expect(User.columns.find{|column| column.name == "login"}.required_on).to be_nil
124
+ end
125
+
126
+ it "must have a value on :save if there's no default" do
127
+ create_table(User, :login => { :null => false })
128
+ expect(User.columns.find{|column| column.name == "login"}.required_on).to eq(:save)
129
+ end
130
+
131
+ it "must have a value on :update if there's default" do
132
+ create_table(User, :login => { :null => false, :default => "foo" })
133
+ expect(User.columns.find{|column| column.name == "login"}.required_on).to eq(:update)
134
+ end
135
+
136
+ end
137
+
138
+ context "Postgresql array", :postgresql => :only do
139
+
140
+ before(:each) do
141
+ create_table(User, :alpha => { :default => [], :array => true })
142
+ end
143
+
144
+ it "respects array: true" do
145
+ column = User.columns.find(&its.name == "alpha")
146
+ expect(column.array).to be_truthy
147
+ end
148
+ end
149
+
150
+ protected
151
+
152
+ def create_table(model, columns_with_options)
153
+ migration.suppress_messages do
154
+ migration.create_table model.table_name, :force => :cascade do |t|
155
+ columns_with_options.each_pair do |column, options|
156
+ t.send :string, column, options
157
+ end
158
+ end
159
+ model.reset_column_information
160
+ end
161
+ end
162
+
163
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ # A basic sanity check to have as a spec when first starting. Feel free to delete this
5
+ # once you've got real content.
6
+
7
+ describe "Sanity Check" do
8
+
9
+ it "database is connected" do
10
+ expect(ActiveRecord::Base).to be_connected
11
+ end
12
+
13
+ end
@@ -0,0 +1,22 @@
1
+ require 'simplecov'
2
+ require 'simplecov-gem-profile'
3
+ SimpleCov.start "gem"
4
+
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+
8
+ require 'rspec'
9
+ require 'active_record'
10
+ require 'groundswell_schema_plus_columns'
11
+ require 'schema_dev/rspec'
12
+
13
+ SchemaDev::Rspec.setup
14
+
15
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
16
+
17
+ RSpec.configure do |config|
18
+ config.warnings = true
19
+ end
20
+
21
+ SimpleCov.command_name "[ruby #{RUBY_VERSION} - ActiveRecord #{::ActiveRecord::VERSION::STRING} - #{ActiveRecord::Base.connection.adapter_name}]"
22
+
metadata ADDED
@@ -0,0 +1,223 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: groundswell_schema_plus_columns
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - ronen barzel
8
+ - Ryan Murphy
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-06-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '4.2'
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: '5.2'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: '4.2'
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.2'
34
+ - !ruby/object:Gem::Dependency
35
+ name: schema_plus_core
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: schema_plus_indexes
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.2'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.2'
62
+ - !ruby/object:Gem::Dependency
63
+ name: its-it
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.2'
69
+ type: :runtime
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.2'
76
+ - !ruby/object:Gem::Dependency
77
+ name: bundler
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.7'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.7'
90
+ - !ruby/object:Gem::Dependency
91
+ name: rake
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10.0'
104
+ - !ruby/object:Gem::Dependency
105
+ name: rspec
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ - !ruby/object:Gem::Dependency
119
+ name: schema_dev
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.6'
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.6'
132
+ - !ruby/object:Gem::Dependency
133
+ name: simplecov
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ - !ruby/object:Gem::Dependency
147
+ name: simplecov-gem-profile
148
+ requirement: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ description:
161
+ email:
162
+ - ryan@groundswell.legal
163
+ executables: []
164
+ extensions: []
165
+ extra_rdoc_files: []
166
+ files:
167
+ - ".gitignore"
168
+ - ".travis.yml"
169
+ - Gemfile
170
+ - LICENSE.txt
171
+ - README.md
172
+ - Rakefile
173
+ - gemfiles/Gemfile.base
174
+ - gemfiles/activerecord-4.2/Gemfile.base
175
+ - gemfiles/activerecord-4.2/Gemfile.mysql2
176
+ - gemfiles/activerecord-4.2/Gemfile.postgresql
177
+ - gemfiles/activerecord-4.2/Gemfile.sqlite3
178
+ - gemfiles/activerecord-5.0/Gemfile.base
179
+ - gemfiles/activerecord-5.0/Gemfile.mysql2
180
+ - gemfiles/activerecord-5.0/Gemfile.postgresql
181
+ - gemfiles/activerecord-5.0/Gemfile.sqlite3
182
+ - gemfiles/activerecord-5.1/Gemfile.base
183
+ - gemfiles/activerecord-5.1/Gemfile.mysql2
184
+ - gemfiles/activerecord-5.1/Gemfile.postgresql
185
+ - gemfiles/activerecord-5.1/Gemfile.sqlite3
186
+ - groundswell_schema_plus_columns.gemspec
187
+ - lib/groundswell_schema_plus_columns.rb
188
+ - lib/schema_plus/columns.rb
189
+ - lib/schema_plus/columns/active_record/connection_adapters/column.rb
190
+ - lib/schema_plus/columns/middleware/model.rb
191
+ - lib/schema_plus/columns/version.rb
192
+ - schema_dev.yml
193
+ - spec/column_spec.rb
194
+ - spec/sanity_spec.rb
195
+ - spec/spec_helper.rb
196
+ homepage: https://github.com/groundswell-productivity/schema_plus_columns.git
197
+ licenses:
198
+ - MIT
199
+ metadata: {}
200
+ post_install_message:
201
+ rdoc_options: []
202
+ require_paths:
203
+ - lib
204
+ required_ruby_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ required_rubygems_version: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ requirements: []
215
+ rubyforge_project:
216
+ rubygems_version: 2.5.2
217
+ signing_key:
218
+ specification_version: 4
219
+ summary: Adds useful accessors to ActiveRecord's Column object.
220
+ test_files:
221
+ - spec/column_spec.rb
222
+ - spec/sanity_spec.rb
223
+ - spec/spec_helper.rb