activerecord-pg_array 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 172e09d68f70267cfa5a3006fed692028654160e
4
- data.tar.gz: acc747b399b0329544ca3aa5528fa925ce05709c
3
+ metadata.gz: 5469d83f3321a3a99f615391b6561474db1cf71f
4
+ data.tar.gz: 866d1ca55c92eec1b9200d875f58d33adb4c272d
5
5
  SHA512:
6
- metadata.gz: 259b080e1115a99c55869a1426b425b1c860817255a4fd075f82812731e3d4064880d2a8a6b3ecab38f3fbadacb4b7d716b393896ef55c3f87dd4d7f33081180
7
- data.tar.gz: 53051ee448a0aa5c0b288825391390eea2fb359d5d40c95051de82bf24db51abbf58ce6138fe7a89c33177a8032f7e09902dccb0383a8e5e7eeb89b2c0c5dca6
6
+ metadata.gz: 44adb77c3d1ec61dabec9b7b81354091710182f24d8185fae634b2cd15d467b68b04a71fdcdefa2df557e54611623050e72c1800ac8d8c64aa888f8ec3ec1941
7
+ data.tar.gz: 44f69af520b86d204595551b70d8a62081f1c1143f596b8531f1ac84cfd6bd518f8369c57b7e1d592480372df82d8387f9ba0dc3e6d3ed4f8968c6b6e82f6155
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+
9
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
10
+ end
11
+
data/README.md CHANGED
@@ -1,52 +1,81 @@
1
- # Activerecord::PgArray
1
+ # ActiveRecord::PGArray
2
2
 
3
- This gem defines methods in your models for ActiveRecord attributes that use Postgres's arrays.
3
+ This gem defines methods in your models for ActiveRecord attributes that use Postgresql's arrays.
4
4
 
5
- I wrote this gem because I realized that working with Postgresql arrays was not as straight-forward as I had hoped.
5
+ I wrote this gem because I realized that working with Postgresql arrays was not as straight-forward as I had hoped.
6
6
 
7
7
  ## Installation
8
8
 
9
9
  Add this line to your application's Gemfile:
10
10
 
11
- gem 'activerecord-pg_array'
11
+ ```ruby
12
+ gem 'activerecord-pg_array'
13
+ ```
12
14
 
13
15
  ## Usage
14
16
 
15
17
  Then in your classes that inherit from ActiveRecord `include ActiveRecord::PGArray`
16
18
 
17
- ### Example:
19
+ ### Silly Example:
18
20
 
19
21
  Given the following migration:
20
22
 
21
- class CreateMyModel < ActiveRecord::Migration
22
- def change
23
- create_table :my_models do |t|
24
- t.string :name
25
- t.integer :friend_ids, array: true, default: []
26
- end
27
-
28
- add_index :my_models, :friend_ids, using: 'gin'
29
- end
23
+ ```ruby
24
+ class CreateWoldTracker < ActiveRecord::Migration
25
+ def change
26
+ create_table :wolf_trackers do |t|
27
+ t.string :name
28
+ t.integer :wolf_ids, array: true, default: []
29
+ t.string :pack_names, array: true, default: []
30
30
  end
31
31
 
32
+ add_index :wolf_trackers, :wolf_ids, using: 'gin'
33
+ end
34
+ end
35
+ ```
36
+
32
37
  And class:
33
38
 
34
- class MyClass < ActiveRecord::Base
35
- include ActiveRecord::PGArray
36
- end
39
+ ```ruby
40
+ class WolfTracker < ActiveRecord::Base
41
+ include ActiveRecord::PGArray
42
+ end
43
+ ```
37
44
 
38
45
  The following methods are automatically defined for "friend_ids":
39
46
 
40
- * add_friend(object)
41
- * add_friend!(object)
42
- * add_friends(objects)
43
- * remove_friend(object)
44
- * remove_friend!(object)
47
+ ```ruby
48
+ add_wolf(wolfy) # ActiveRecord object wolfy's id is appended to wolf_ids
49
+ add_wolf!(son_of_wolfy) # wolf_ids appended with atomic update
50
+ add_wolves([wolfia, 4]) # add multiple to wolf_ids. Note: irregular plural method name and mixed input
51
+ remove_wolf(wolfia) # wolf_ids is modified but not saved
52
+ remove_wolf!(3) # wolf_ids atomic removal
53
+ wolves # looks up wolf objects with ids wolf_ids
54
+ ```
55
+
56
+ The same is true for pack_names:
57
+
58
+ ```ruby
59
+ add_pack_name('Stark')
60
+ add_pack_name!('Karstark')
61
+ add_pack_names(['Greyjoy', 'Bolton'])
62
+ remove_pack_name('Greyjoy')
63
+ remove_pack_name!('Bolton')
64
+ # does not define a finder method based on pack_names
65
+ ```
66
+
67
+ ## Dynamically created method rules
68
+
69
+ * If an ActiveRecord attribute ends with "_ids", that suffix will be removed from the method name.
70
+ * If the attribute is an array of integers ending with "_ids", then if an ActiveRecord object is passed to it, the id of that object will used.
71
+ * Method names will use the singular or plural form of the attribute name when defining the method.
45
72
 
46
73
  ## Roadmap
47
74
 
48
- * TESTS! Yes I plan on writing tests for this. This gem was pulled out of a rails project and that is where my tests for this are right now. When I have an opportunity, I will add tests.
49
- * Atomic operations
75
+ * Finish writing all specs
76
+ * Actual atomic operations :)
77
+ * Perhaps add some handy query interface stuff or at least document how query arrays with ActiveRecord.
78
+ * rdoc documentation
50
79
 
51
80
  ## Contributing
52
81
 
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ task :default => :spec
@@ -19,7 +19,12 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency 'activerecord'
22
+ spec.add_dependency "activerecord", "~> 3.0"
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
- spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "rake", "~> 10.1"
25
+ spec.add_development_dependency "rspec", "~> 2.14"
26
+ spec.add_development_dependency "pg", "~> 0.17"
27
+ spec.add_development_dependency "pry", "~> 0.9"
28
+ spec.add_development_dependency "guard", "~> 2.4"
29
+ spec.add_development_dependency "guard-rspec", "~> 4.2"
25
30
  end
@@ -1,5 +1,5 @@
1
1
  module Activerecord
2
2
  module PgArray
3
- VERSION = "0.0.1"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -5,9 +5,9 @@ module ActiveRecord
5
5
 
6
6
  def self.included(base)
7
7
  base.class_eval do
8
- self.column_types.to_a.select { |c| c[1].instance_variable_get('@array') }.map(&:first).each do |array_column_name|
8
+ self.column_types.to_a.select { |c| c[1].instance_variable_get('@array') }.map(&:first).each do |attr_name|
9
9
  ids_regex = /_ids$/
10
- friendly_attr = array_column_name.sub(ids_regex,'')
10
+ friendly_attr = attr_name.sub(ids_regex,'')
11
11
  segs = friendly_attr.split('_')
12
12
  segs[-1] = segs[-1].singularize
13
13
  friendly_attr_singular = segs.join('_')
@@ -15,16 +15,17 @@ module ActiveRecord
15
15
  friendly_attr_plural = segs.join('_')
16
16
 
17
17
  obj_convert = ->(obj) do
18
- if array_column_name =~ ids_regex && obj.kind_of?(ActiveRecord::Base)
18
+ if attr_name =~ ids_regex && obj.kind_of?(ActiveRecord::Base) and
19
+ self.column_types[attr_name].type == :integer
19
20
  obj = obj.id
20
21
  end
21
22
  obj
22
23
  end
23
24
  atr = ->(slf) do
24
- slf.send array_column_name.to_sym
25
+ slf.send attr_name.to_sym
25
26
  end
26
27
  atr_will_change = ->(slf) do
27
- slf.send(:"#{array_column_name}_will_change!")
28
+ slf.send(:"#{attr_name}_will_change!")
28
29
  end
29
30
 
30
31
  define_method :"add_#{friendly_attr_singular}" do |obj|
@@ -36,8 +37,15 @@ module ActiveRecord
36
37
  end
37
38
 
38
39
  define_method :"add_#{friendly_attr_singular}!" do |obj|
39
- self.send :"add_#{friendly_attr_singular}", obj
40
- self.save!
40
+ obj = obj_convert[obj]
41
+ atr_will_change[self] # seems strange that calling this is needed
42
+
43
+ # There are two external issues that block atomic updates to one attribute.
44
+ # 1. ActiveRecord update_attribute actually updates all attributes that are dirty! This surprised me.
45
+ # 2. update_column doesn't work on pg arrays for rails < 4.0.4 (which is not yet released)
46
+ # https://github.com/rails/rails/issues/12261
47
+ atr[self].push(obj).uniq!
48
+ self.update_attribute attr_name.to_sym, atr[self]
41
49
  end
42
50
 
43
51
  define_method :"add_#{friendly_attr_plural}" do |objs|
@@ -49,7 +57,7 @@ module ActiveRecord
49
57
  define_method :"remove_#{friendly_attr_singular}" do |obj|
50
58
  obj = obj_convert.call(obj)
51
59
  if atr[self].include?(obj)
52
- atr[self].remove(obj)
60
+ atr[self].delete(obj)
53
61
  atr_will_change[self]
54
62
  end
55
63
  end
@@ -59,6 +67,26 @@ module ActiveRecord
59
67
  self.save!
60
68
  end
61
69
 
70
+
71
+ # define basic relational lookup methods
72
+ # example:
73
+ # Given wolf_ids is the attribute
74
+ # Then it will try to define method wolves that retrieves wolf objects
75
+ if attr_name =~ ids_regex
76
+ if defined?(friendly_attr_singular.camelize.to_sym) and
77
+ self.column_types[attr_name].type == :integer
78
+ begin
79
+ klass = friendly_attr_singular.camelize.constantize
80
+
81
+ # it might be better to define a scope instead
82
+ define_method friendly_attr_plural.to_sym do
83
+ klass.where(id: [atr[self]])
84
+ end
85
+ rescue NameError
86
+ end
87
+ end
88
+ end
89
+
62
90
  end
63
91
  end # base.class_eval
64
92
  end # self.include
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+ require 'active_record'
3
+
4
+ class Wolf < ActiveRecord::Base
5
+ end
6
+ class Chicken < ActiveRecord::Base
7
+ end
8
+
9
+ require 'support/active_record'
10
+ require 'pry'
11
+
12
+ class WolfTracker < ActiveRecord::Base
13
+ include ActiveRecord::PGArray
14
+ end
15
+
16
+ describe WolfTracker do
17
+ let(:wolf_tracker) { WolfTracker.create(name: 'Wolfram') }
18
+ let(:wolfy) { Wolf.create(name: 'Wolfy') }
19
+ let(:son_of_wolfy) { Wolf.create(name: 'Son of Wolfy') }
20
+ let(:wolfia) { Wolf.create(name: 'Wolfia') }
21
+
22
+ context 'base state' do
23
+ it "should have empty wolf_ids" do
24
+ expect(wolf_tracker.wolf_ids).to be_empty
25
+ end
26
+
27
+ it "should have empty pack_names" do
28
+ expect(wolf_tracker.pack_names).to be_empty
29
+ end
30
+ end
31
+
32
+ context 'method names' do
33
+ subject { WolfTracker.new }
34
+
35
+ it { should respond_to(:add_wolf) }
36
+ it { should respond_to(:add_wolf!) }
37
+ it { should respond_to(:add_wolves) }
38
+ it { should respond_to(:remove_wolf) }
39
+ it { should respond_to(:remove_wolf!) }
40
+
41
+ it { should respond_to(:add_pack_name) }
42
+ it { should respond_to(:add_pack_name!) }
43
+ it { should respond_to(:add_pack_names) }
44
+ it { should respond_to(:remove_pack_name) }
45
+ it { should respond_to(:remove_pack_name!) }
46
+ end
47
+
48
+ context 'persistence' do
49
+
50
+ context "add_<attr_name>" do
51
+ it "should add_<attr>" do
52
+ wolf_tracker.add_wolf(wolfy)
53
+ wolf_tracker.save!
54
+ wolf_tracker.reload
55
+ expect(wolf_tracker.wolf_ids).to eq [wolfy.id]
56
+ end
57
+
58
+ it "should add_<attr>! " do
59
+ wolf_tracker.add_wolf!(wolfy)
60
+ wolf_tracker.reload
61
+ expect(wolf_tracker.wolf_ids).to eq [wolfy.id]
62
+ end
63
+
64
+ it "should not update other changed attributes if atomic" do
65
+ wolf_tracker.name = 'Big Bad Wolf'
66
+ wolf_tracker.add_wolf!(wolfy)
67
+ pending "see note where add_<attr_name>! is defined. blocked by external issues"
68
+ wolf_tracker.reload
69
+ expect(wolf_tracker.name).to eq 'Wolfram'
70
+ end
71
+
72
+ it "should add with regular integer value" do
73
+ wolf_tracker.add_wolf(1)
74
+ wolf_tracker.save!
75
+ wolf_tracker.reload
76
+ expect(wolf_tracker.wolf_ids).to eq [1]
77
+ end
78
+
79
+ it "should add with regular string value" do
80
+ wolf_tracker.add_pack_name('of one')
81
+ wolf_tracker.save!
82
+ expect(wolf_tracker.reload.pack_names).to eq ['of one']
83
+ end
84
+
85
+ end # with ActiveRecord object
86
+
87
+ context "remove" do
88
+ before do
89
+ wolf_tracker.add_wolf!(wolfy)
90
+ wolf_tracker.reload
91
+ expect(wolf_tracker.wolf_ids).to eq [wolfy.id]
92
+ end
93
+
94
+ it "should remove_<attr>" do
95
+ wolf_tracker.remove_wolf(wolfy)
96
+ wolf_tracker.save!
97
+ expect(wolf_tracker.reload.wolf_ids).to be_empty
98
+ end
99
+
100
+ it "should remove_<attr>!" do
101
+ wolf_tracker.remove_wolf!(wolfy.id)
102
+ expect(wolf_tracker.reload.wolf_ids).to be_empty
103
+ end
104
+ end # remove
105
+
106
+ it 'should have more specs' do
107
+ pending 'you\'re not done writing specs'
108
+ end
109
+
110
+ end # persistence
111
+
112
+ describe "finder methods" do
113
+ before do
114
+ wolf_tracker.add_wolves([wolfy, son_of_wolfy])
115
+ wolf_tracker.save!
116
+ end
117
+
118
+ it { should respond_to(:wolves) }
119
+ it { should_not respond_to(:chickens) }
120
+
121
+ it "should have a wolves finder method and return a wolf" do
122
+ expect(wolf_tracker.wolves).to eq [wolfy, son_of_wolfy]
123
+ end
124
+
125
+ end # scopes
126
+ end
data/spec/schema.rb ADDED
@@ -0,0 +1,32 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended that you check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(version: 20140227091226) do
15
+
16
+ # These are extensions that must be enabled in order to support this database
17
+ enable_extension "plpgsql"
18
+
19
+ create_table "wolf_trackers", force: true do |t|
20
+ t.string "name"
21
+ t.integer "wolf_ids", default: [], array: true
22
+ t.string "pack_names", default: [], array: true
23
+ t.string "chicken_ids", default: [], array: true # this is intentionally an array of strings
24
+ end
25
+
26
+ add_index "wolf_trackers", ["wolf_ids"], name: "index_wolf_trackers_on_wolf_ids", using: :gin
27
+
28
+ create_table "wolves", force: true do |t|
29
+ t.string "name"
30
+ end
31
+
32
+ end
@@ -0,0 +1,19 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
6
+
7
+ require 'activerecord/pg_array'
8
+
9
+ RSpec.configure do |config|
10
+ config.treat_symbols_as_metadata_keys_with_true_values = true
11
+ config.run_all_when_everything_filtered = true
12
+ config.filter_run :focus
13
+
14
+ # Run specs in random order to surface order dependencies. If you find an
15
+ # order dependency and want to debug it, you can fix the order by providing
16
+ # the seed, which is printed after each run.
17
+ # --seed 1234
18
+ config.order = 'random'
19
+ end
@@ -0,0 +1,17 @@
1
+ require 'active_record'
2
+
3
+ # create a postgresql database:
4
+ # createdb pg_array_test
5
+ ActiveRecord::Base.establish_connection adapter: :postgresql, database: 'pg_array_test', username: ENV['PG_DB_USERNAME'], password: ENV['PG_DB_PASSWORD']
6
+
7
+ load 'schema.rb'
8
+
9
+ RSpec.configure do |config|
10
+ config.around do |example|
11
+ ActiveRecord::Base.transaction do
12
+ example.run
13
+ raise ActiveRecord::Rollback
14
+ end
15
+ end
16
+ end
17
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-pg_array
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean McCleary
@@ -14,16 +14,16 @@ dependencies:
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '3.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '3.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -42,16 +42,86 @@ dependencies:
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.14'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.14'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pg
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: '0'
75
+ version: '0.17'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - ">="
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.17'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.4'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.4'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '4.2'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
53
123
  - !ruby/object:Gem::Version
54
- version: '0'
124
+ version: '4.2'
55
125
  description: A ruby gem that makes working with Postgres arrays in ActiveRecord easier
56
126
  email:
57
127
  - seanmcc@gmail.com
@@ -60,13 +130,19 @@ extensions: []
60
130
  extra_rdoc_files: []
61
131
  files:
62
132
  - ".gitignore"
133
+ - ".rspec"
63
134
  - Gemfile
135
+ - Guardfile
64
136
  - LICENSE.txt
65
137
  - README.md
66
138
  - Rakefile
67
139
  - activerecord-pg_array.gemspec
68
140
  - lib/activerecord/pg_array.rb
69
141
  - lib/activerecord/pg_array/version.rb
142
+ - spec/lib/pg_array_spec.rb
143
+ - spec/schema.rb
144
+ - spec/spec_helper.rb
145
+ - spec/support/active_record.rb
70
146
  homepage: https://github.com/mrinterweb/activerecord-pg_array
71
147
  licenses:
72
148
  - MIT
@@ -87,10 +163,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
163
  version: '0'
88
164
  requirements: []
89
165
  rubyforge_project:
90
- rubygems_version: 2.2.2
166
+ rubygems_version: 2.2.1
91
167
  signing_key:
92
168
  specification_version: 4
93
169
  summary: This gem defines methods in your models for ActiveRecord attributes that
94
170
  use Postgres's arrays
95
- test_files: []
171
+ test_files:
172
+ - spec/lib/pg_array_spec.rb
173
+ - spec/schema.rb
174
+ - spec/spec_helper.rb
175
+ - spec/support/active_record.rb
96
176
  has_rdoc: