groundswell_schema_plus_columns 0.3.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.
@@ -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