peegee 0 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1 +1,5 @@
1
1
  tmp
2
+ peegee*.gem
3
+ *swp
4
+ *rbc
5
+ Gemfile.lock
data/CHANGES ADDED
@@ -0,0 +1,10 @@
1
+ Version 0.1 - Fri Sep 23 23:29:04 -0400 2011
2
+ ===============================================================================
3
+ Harold Gimenez and Mike Burns:
4
+
5
+ Initial release with support to various index types:
6
+
7
+ * Partial indexes
8
+ * Expression indexes
9
+ * Sorted indexes
10
+ * Building indexes concurrently: Since AR migrations are wrapped in a transaction, and concurrent index building cannot be in a transaction, we commit the transaction, issue the CREATE INDEX statement, and start a new transaction afterwards.
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ ## Peegee
2
+ Peegee aims to bring better support for PostgreSQL to ActiveRecord. Peegee is under active development.
3
+
4
+ ###Indexes
5
+
6
+ Peegee adds support for some indexing extensions allowed by Postgres. You can run these in your migrations.
7
+
8
+ #### Partial indexes
9
+ ```ruby
10
+ add_index :users, :column, :where => 'active = true'
11
+ ```
12
+
13
+ #### Expression indexes
14
+ ```ruby
15
+ add_index :users, :name => 'users_created_at_date' do |i|
16
+ i.expression 'DATE(created_at)'
17
+ end
18
+ ```
19
+
20
+ #### Sorted indexes
21
+ ```ruby
22
+ add_index :users, :name => 'users_created_at_date' do |i|
23
+ i.column :name, :asc
24
+ i.column :active, :desc
25
+ end
26
+ ```
27
+
28
+ #### Using [CONCURRENTLY](http://www.postgresql.org/docs/9.0/static/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY)
29
+ ```ruby
30
+ add_index :users, :name, :name => 'users_name', :concurrently => true
31
+ ```
32
+
33
+ *Note* that this cannot run inside of a transaction. This will commit your
34
+ running transaction, add the index concurrently, and start a new transaction.
35
+ Use with caution.
36
+
37
+ ### License
38
+
39
+ Peegee is distributed under the MIT license.
40
+
41
+ Copyright 2011 - Harold Giménez and Mike Burns
data/Rakefile CHANGED
@@ -1,2 +1,19 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ require 'cucumber/rake/task'
5
+ require 'rspec/core/rake_task'
6
+ require 'herodotus/tasks'
7
+
8
+ Herodotus::Configuration.run do |config|
9
+ config.base_path = File.dirname __FILE__
10
+ config.changelog_filename = 'CHANGES'
11
+ end
12
+
13
+ Cucumber::Rake::Task.new(:features) do |t|
14
+ t.cucumber_opts = "features --format progress"
15
+ end
16
+
17
+ RSpec::Core::RakeTask.new(:spec)
18
+
19
+ task :default => [:spec,:features]
data/TODO ADDED
@@ -0,0 +1,3 @@
1
+ * Write an integration test for CONCURRENTLY.
2
+ * Write an integration test for TABLESPACE.
3
+ * USING/WITH.
@@ -1,21 +1,102 @@
1
1
  Feature: Adding PostgreSQL specific indexes in a Rails migration
2
2
  As a developer
3
3
  I can add PostgreSQL index types in a migration
4
- So that I can make better use of PostgreSQL indexes
4
+ So that my application has better performance
5
5
 
6
- Scenario: Adding a partial index
6
+ Background:
7
7
  Given I create and configure the "peegee_test" rails app
8
8
  And I run `script/rails generate model User name:string active:boolean`
9
- And I run `script/rails generate migration add_index_to_active_users`
9
+
10
+ Scenario: Adding a partial index
11
+ Given I run `script/rails generate migration add_index_to_active_users`
10
12
  And I implement the latest migration as:
11
13
  """
12
14
  def self.up
13
15
  add_index :users, :name, :name => 'users_name_where_active_true', :where => 'active = true'
14
16
  end
15
- def self.down
16
- remove_index :users, :name
17
+ """
18
+ And I run `bundle exec rake db:migrate --trace`
19
+ Then the "users" table should have the following index:
20
+ | CREATE INDEX users_name_where_active_true ON users USING btree (name) WHERE active = true |
21
+
22
+ Scenario: Adding an expression index
23
+ Given I run `script/rails generate migration add_index_on_date_created_at`
24
+ And I implement the latest migration as:
25
+ """
26
+ def self.up
27
+ add_index :users, :name => 'users_created_at_date' do |i|
28
+ i.expression "DATE(created_at)"
29
+ end
17
30
  end
18
31
  """
19
32
  And I run `bundle exec rake db:migrate`
20
33
  Then the "users" table should have the following index:
21
- | CREATE INDEX users_name_where_active_true ON users USING btree (id) where active = true |
34
+ | CREATE INDEX users_created_at_date ON users USING btree (date(created_at)) |
35
+
36
+ Scenario: Adding an expression partial index
37
+ Given I run `script/rails generate migration add_index_on_date_created_at`
38
+ And I implement the latest migration as:
39
+ """
40
+ def self.up
41
+ add_index :users, :name => 'users_created_at_date_where_active_true', :where => 'active = true' do |i|
42
+ i.expression "DATE(created_at)"
43
+ end
44
+ end
45
+ """
46
+ And I run `bundle exec rake db:migrate`
47
+ Then the "users" table should have the following index:
48
+ | CREATE INDEX users_created_at_date_where_active_true ON users USING btree (date(created_at)) WHERE active = true |
49
+
50
+ Scenario: Adding a sort order to an index
51
+ Given I run `script/rails generate migration add_index_on_users_name_asc`
52
+ And I implement the latest migration as:
53
+ """
54
+ def self.up
55
+ add_index :users, :name => 'users_name_asc_active_desc' do |i|
56
+ i.column :name, :asc
57
+ i.column :active, :desc
58
+ end
59
+ end
60
+ """
61
+ And I run `bundle exec rake db:migrate --trace`
62
+ Then the "users" table should have the following index:
63
+ | CREATE INDEX users_name_asc_active_desc ON users USING btree (name, active DESC) |
64
+
65
+ Scenario: Adding an index with a sort order but with nulls sorted specifically
66
+ Given I run `script/rails generate migration add_index_on_users_nulls_sorted`
67
+ And I implement the latest migration as:
68
+ """
69
+ def self.up
70
+ add_index :users, :name => 'users_name_asc_active_desc' do |i|
71
+ i.column :name, :asc, :nulls => :first
72
+ i.column :active, :desc, :nulls => :last
73
+ end
74
+ end
75
+ """
76
+ And I run `bundle exec rake db:migrate --trace`
77
+ Then the "users" table should have the following index:
78
+ | CREATE INDEX users_name_asc_active_desc ON users USING btree (name NULLS FIRST, active DESC NULLS LAST) |
79
+
80
+ Scenario: Adding a unique index
81
+ Given I run `script/rails generate migration add_unique_index_to_active_users`
82
+ And I implement the latest migration as:
83
+ """
84
+ def self.up
85
+ add_index :users, :name, :name => 'users_name_where_active_true', :where => 'active = true', :unique => true
86
+ end
87
+ """
88
+ And I run `bundle exec rake db:migrate --trace`
89
+ Then the "users" table should have the following index:
90
+ | CREATE UNIQUE INDEX users_name_where_active_true ON users USING btree (name) WHERE active = true |
91
+
92
+ Scenario: Adding an index concurrently
93
+ Given I run `script/rails generate migration add_unique_index_to_active_users`
94
+ And I implement the latest migration as:
95
+ """
96
+ def self.up
97
+ add_index :users, :name, :name => 'users_name_concurrent', :concurrently => true
98
+ end
99
+ """
100
+ And I run `bundle exec rake db:migrate --trace`
101
+ Then the "users" table should have the following index:
102
+ | CREATE INDEX users_name_concurrent ON users USING btree (name) |
@@ -1,6 +1,6 @@
1
1
  Given /^I implement the latest migration as:$/ do |implementation|
2
2
  in_current_dir do
3
- migrations = Dir["db/migrate/*rb"].to_a
3
+ migrations = Dir["db/migrate/[0-9]*_*.rb"].sort.to_a
4
4
  path = migrations.last
5
5
  contents = IO.read(path)
6
6
  class_declaration = contents.split("\n").first
@@ -1,3 +1,9 @@
1
+ When /^I add the "([^"]*)" gem from this project as a dependency$/ do |gem_name|
2
+ in_current_dir do
3
+ append_to_file('Gemfile', %{\ngem "#{gem_name}", path => #{PROJECT_ROOT}})
4
+ end
5
+ end
6
+
1
7
  Given /^I create and configure the "(\w+)" rails app$/ do |name|
2
8
  Given %{I run `rails new #{name} --database=postgresql -J -T -G`}
3
9
  And %{I cd to "peegee_test"}
@@ -17,6 +23,7 @@ test:
17
23
  in_current_dir do
18
24
  File.open('config/database.yml', 'w') { |file| file.write(database_config) }
19
25
  end
26
+ And %{I add the "peegee" gem from this project as a dependency}
20
27
  And %{I run `bundle install`}
21
28
  And %{I run `bundle exec rake db:drop:all db:create:all`}
22
29
  end
@@ -1,6 +1,13 @@
1
1
  require 'aruba/cucumber'
2
2
  require 'ruby-debug'
3
3
 
4
+ PROJECT_ROOT = File.expand_path('../..', File.dirname(__FILE__))
5
+
4
6
  Before do
5
7
  @aruba_timeout_seconds = 10
6
8
  end
9
+
10
+ After do
11
+ FileUtils.rm_rf(File.join(PROJECT_ROOT, 'tmp', 'aruba', 'peegee_test'))
12
+ disconnect_test_db
13
+ end
@@ -1,30 +1,3 @@
1
- require 'active_record'
2
- module SqlHelpers
3
- def connection
4
- @connection || begin
5
- ActiveRecord::Base.establish_connection(
6
- :adapter => 'postgresql',
7
- :encoding => 'unicode',
8
- :database => 'peegee_development'
9
- )
10
- ActiveRecord::Base.connection
11
- end
12
- end
13
-
14
- def select_all(sql)
15
- connection.select_all sql
16
- end
17
-
18
- def oid(table_name)
19
- select_all(<<-SQL).first['oid']
20
- SELECT c.oid
21
- FROM pg_catalog.pg_class c
22
- LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
23
- WHERE c.relname = '#{table_name}'
24
- AND pg_catalog.pg_table_is_visible(c.oid);
25
- SQL
26
- end
27
-
28
- end
1
+ require 'spec/support/sql_helpers'
29
2
 
30
3
  World(SqlHelpers)
data/lib/peegee.rb CHANGED
@@ -1,3 +1,7 @@
1
- module Peegee
2
- # Your code goes here...
1
+ require 'peegee/index'
2
+ require 'peegee/schema_statement'
3
+ require 'peegee/quoting'
4
+
5
+ ActiveRecord::Migration.module_eval do
6
+ extend Peegee::SchemaStatement
3
7
  end
@@ -0,0 +1,115 @@
1
+ module Peegee
2
+ class Index
3
+
4
+ attr_accessor :index_name, :table_name, :options, :uniqueness
5
+ attr_accessor :columns_or_expressions
6
+
7
+ def initialize(options = {})
8
+ self.table_name = options[:table_name]
9
+ self.columns_or_expressions = options.key?(:column) ? [[:column, options[:column], []]] : []
10
+ self.options = options[:options]
11
+ end
12
+
13
+ def create_sql
14
+ check_index_name_length
15
+
16
+ sql = "CREATE #{uniqueness} INDEX #{concurrentliness} #{adapter.quote_column_name(index_name)} ON #{adapter.quote_table_name(table_name)} (#{columns_or_expressions_sql}) #{tablespace_sql}"
17
+ if @options.key?(:where)
18
+ sql += " WHERE #{options[:where]}"
19
+ end
20
+
21
+ sql
22
+ end
23
+
24
+ def column(name, *args)
25
+ columns_or_expressions << [:column, name, args]
26
+ end
27
+
28
+ def expression(expr, *args)
29
+ columns_or_expressions << [:expression, expr, args]
30
+ end
31
+
32
+ def column=(column)
33
+ columns_or_expressions << [:column, column, []]
34
+ end
35
+
36
+ def run_outside_transaction?
37
+ options[:concurrently]
38
+ end
39
+
40
+ private
41
+
42
+ def columns_or_expressions_sql
43
+ self.columns_or_expressions.map do |tag,column_or_expression,args|
44
+ column_or_expression_sql(tag, column_or_expression, args)
45
+ end.join(', ')
46
+ end
47
+
48
+ def column_or_expression_sql(tag, column_or_expression, args)
49
+ case tag
50
+ when :column
51
+ "#{Peegee::Quoting.quoted_columns_for_index(column_or_expression)} #{column_options_sql(args)}"
52
+ when :expression
53
+ column_or_expression
54
+ else
55
+ raise RuntimeError
56
+ end
57
+ end
58
+
59
+ def column_options_sql(options)
60
+ hash_options = options.last.respond_to?(:key?) ? options.pop : {}
61
+
62
+ "#{column_single_options_sql(options)} #{column_hash_options_sql(hash_options)}"
63
+ end
64
+
65
+ def column_single_options_sql(options)
66
+ options.first.try(:to_s).try(:upcase) || ""
67
+ end
68
+
69
+ def column_hash_options_sql(options)
70
+ options.inject("") do |acc, (k,v)|
71
+ "#{k.to_s.upcase} #{v.to_s.upcase} #{acc}"
72
+ end
73
+ end
74
+
75
+ def tablespace_sql
76
+ self.options[:tablespace] ? "TABLESPACE #{self.options[:tablespace]}" : ""
77
+ end
78
+
79
+ def uniqueness
80
+ self.options[:unique] ? "UNIQUE" : ""
81
+ end
82
+
83
+ def concurrentliness
84
+ self.options[:concurrently] ? "CONCURRENTLY" : ""
85
+ end
86
+
87
+ def index_name
88
+ options[:name] || default_index_name
89
+ end
90
+
91
+ def default_index_name
92
+ column_name = columns_or_expressions.select {|type, _, _| type == :column}.inject("") do |acc,(_,name,_)|
93
+ "#{acc}_#{name}"
94
+ end
95
+ adapter.index_name(table_name, :column => "#{column_name}_auto")
96
+ end
97
+
98
+ def check_index_name_length
99
+ if index_name.length > index_name_length
100
+ raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{index_name_length} characters"
101
+ end
102
+ if adapter.index_name_exists?(table_name, index_name, false)
103
+ raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists"
104
+ end
105
+ end
106
+
107
+ def index_name_length
108
+ adapter.index_name_length
109
+ end
110
+
111
+ def adapter
112
+ ActiveRecord::Base.connection
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,9 @@
1
+ module Peegee
2
+ module Quoting
3
+ extend self
4
+
5
+ def quoted_columns_for_index(column_name)
6
+ PGconn.quote_ident(column_name.to_s)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ module Peegee
2
+ module SchemaStatement
3
+ def add_index(table_name, *args)
4
+ options = args.last.respond_to?(:key?) ? args.pop : {}
5
+ column = args.first
6
+
7
+ index = Peegee::Index.new(:table_name => table_name,
8
+ :options => options)
9
+ if block_given?
10
+ yield index
11
+ else
12
+ index.column = column
13
+ end
14
+
15
+ if index.run_outside_transaction?
16
+ commit_db_transaction
17
+ execute(index.create_sql)
18
+ begin_db_transaction
19
+ else
20
+ execute(index.create_sql)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module Peegee
2
- VERSION = "0"
2
+ VERSION = "0.1"
3
3
  end
data/peegee.gemspec CHANGED
@@ -6,11 +6,11 @@ Gem::Specification.new do |s|
6
6
  s.name = "peegee"
7
7
  s.version = Peegee::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Harold Giménez"]
9
+ s.authors = ["Harold Giménez", "Mike Burns"]
10
10
  s.email = ["hgimenez@thoughtbot.com"]
11
11
  s.homepage = "http://github.com/peegee"
12
12
  s.summary = %q{PostgreSQL extensions for ActiveRecord}
13
- s.description = %q{Not much going on here yet.}
13
+ s.description = %q{Introduces ActiveRecord to PostgreSQL, adding support for PostgreSQL specific features.}
14
14
 
15
15
  s.add_dependency 'activerecord'
16
16
  s.add_development_dependency 'pg'
@@ -18,8 +18,9 @@ Gem::Specification.new do |s|
18
18
  s.add_development_dependency 'aruba'
19
19
  s.add_development_dependency 'rspec-core'
20
20
  s.add_development_dependency 'rspec-expectations'
21
- s.add_development_dependency 'rails', '3.0.7'
21
+ s.add_development_dependency 'rails', '3.0.10'
22
22
  s.add_development_dependency 'ruby-debug'
23
+ s.add_development_dependency 'herodotus'
23
24
 
24
25
  s.files = `git ls-files`.split("\n")
25
26
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Peegee::Index, "creating SQL for a concurrent index" do
4
+ let(:table_name) { "users" }
5
+ let(:column) { "name" }
6
+
7
+ let(:indexerizer) do
8
+ Peegee::Index.new(
9
+ :table_name => table_name,
10
+ :column => column,
11
+ :options => {:concurrently => true})
12
+ end
13
+
14
+ it "produces the proper SQL" do
15
+ indexerizer.create_sql.should == %{CREATE INDEX CONCURRENTLY "index_#{table_name}_on__#{column}_auto" ON "#{table_name}" ("#{column}" ) }
16
+ end
17
+
18
+ it "is to be run outside of a transaction" do
19
+ indexerizer.should be_run_outside_transaction
20
+ end
21
+ end
22
+
23
+ describe Peegee::Index, "creating SQL for an index specifying a tablespace" do
24
+ let(:table_name) { "users" }
25
+ let(:column) { "name" }
26
+ let(:tablespace) { "indexspace" }
27
+
28
+ let(:indexerizer) do
29
+ Peegee::Index.new(
30
+ :table_name => table_name,
31
+ :column => column,
32
+ :options => {:tablespace => tablespace})
33
+ end
34
+
35
+ it "produces the proper SQL" do
36
+ indexerizer.create_sql.should == %{CREATE INDEX "index_#{table_name}_on__#{column}_auto" ON "#{table_name}" ("#{column}" ) TABLESPACE #{tablespace}}
37
+ end
38
+
39
+ it "is to be run inside of a transaction" do
40
+ indexerizer.should_not be_run_outside_transaction
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ require 'active_support/core_ext'
2
+ require 'support/sql_helpers'
3
+ require 'peegee'
4
+
5
+ RSpec.configure do |c|
6
+ c.include SqlHelpers
7
+ c.before(:all) { create_db && connection }
8
+ c.after(:all) { disconnect_test_db }
9
+ end
@@ -0,0 +1,45 @@
1
+ require 'active_record'
2
+
3
+ module SqlHelpers
4
+ def connection
5
+ @connection ||= begin
6
+ ActiveRecord::Base.establish_connection(
7
+ :adapter => 'postgresql',
8
+ :encoding => 'unicode',
9
+ :database => 'peegee_development'
10
+ )
11
+ ActiveRecord::Base.connection
12
+ end
13
+ end
14
+
15
+ def select_all(sql)
16
+ connection.select_all sql
17
+ end
18
+
19
+ def oid(table_name)
20
+ select_all(<<-SQL).first['oid']
21
+ SELECT c.oid
22
+ FROM pg_catalog.pg_class c
23
+ LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
24
+ WHERE c.relname = '#{table_name}'
25
+ AND pg_catalog.pg_table_is_visible(c.oid);
26
+ SQL
27
+ end
28
+
29
+ def disconnect_test_db
30
+ @connection and @connection.disconnect!
31
+ @connection = nil
32
+ end
33
+
34
+ def create_db
35
+ ActiveRecord::Base.establish_connection(
36
+ :adapter => 'postgresql',
37
+ :encoding => 'unicode',
38
+ :database => 'template1'
39
+ )
40
+ result = ActiveRecord::Base.connection.select_all %{SELECT * FROM pg_catalog.pg_database WHERE datname = 'peegee_development'}
41
+ unless result.size > 0
42
+ ActiveRecord::Base.connection.execute 'CREATE DATABASE peegee_development;'
43
+ end
44
+ end
45
+ end
metadata CHANGED
@@ -1,19 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: peegee
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 9
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- version: "0"
8
+ - 1
9
+ version: "0.1"
9
10
  platform: ruby
10
11
  authors:
11
12
  - "Harold Gim\xC3\xA9nez"
13
+ - Mike Burns
12
14
  autorequire:
13
15
  bindir: bin
14
16
  cert_chain: []
15
17
 
16
- date: 2011-06-04 00:00:00 Z
18
+ date: 2011-09-24 00:00:00 Z
17
19
  dependencies:
18
20
  - !ruby/object:Gem::Dependency
19
21
  name: activerecord
@@ -107,12 +109,12 @@ dependencies:
107
109
  requirements:
108
110
  - - "="
109
111
  - !ruby/object:Gem::Version
110
- hash: 9
112
+ hash: 19
111
113
  segments:
112
114
  - 3
113
115
  - 0
114
- - 7
115
- version: 3.0.7
116
+ - 10
117
+ version: 3.0.10
116
118
  type: :development
117
119
  version_requirements: *id007
118
120
  - !ruby/object:Gem::Dependency
@@ -129,7 +131,21 @@ dependencies:
129
131
  version: "0"
130
132
  type: :development
131
133
  version_requirements: *id008
132
- description: Not much going on here yet.
134
+ - !ruby/object:Gem::Dependency
135
+ name: herodotus
136
+ prerelease: false
137
+ requirement: &id009 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ hash: 3
143
+ segments:
144
+ - 0
145
+ version: "0"
146
+ type: :development
147
+ version_requirements: *id009
148
+ description: Introduces ActiveRecord to PostgreSQL, adding support for PostgreSQL specific features.
133
149
  email:
134
150
  - hgimenez@thoughtbot.com
135
151
  executables: []
@@ -140,9 +156,11 @@ extra_rdoc_files: []
140
156
 
141
157
  files:
142
158
  - .gitignore
159
+ - CHANGES
143
160
  - Gemfile
144
- - Gemfile.lock
161
+ - README.md
145
162
  - Rakefile
163
+ - TODO
146
164
  - features/create_indexes_in_migrations.feature
147
165
  - features/step_definitions/migration_steps.rb
148
166
  - features/step_definitions/postgres_steps.rb
@@ -150,8 +168,14 @@ files:
150
168
  - features/support/env.rb
151
169
  - features/support/sql_helpers.rb
152
170
  - lib/peegee.rb
171
+ - lib/peegee/index.rb
172
+ - lib/peegee/quoting.rb
173
+ - lib/peegee/schema_statement.rb
153
174
  - lib/peegee/version.rb
154
175
  - peegee.gemspec
176
+ - spec/index_spec.rb
177
+ - spec/spec_helper.rb
178
+ - spec/support/sql_helpers.rb
155
179
  homepage: http://github.com/peegee
156
180
  licenses: []
157
181
 
@@ -181,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
205
  requirements: []
182
206
 
183
207
  rubyforge_project:
184
- rubygems_version: 1.7.2
208
+ rubygems_version: 1.8.6
185
209
  signing_key:
186
210
  specification_version: 3
187
211
  summary: PostgreSQL extensions for ActiveRecord
@@ -192,3 +216,6 @@ test_files:
192
216
  - features/step_definitions/rails_steps.rb
193
217
  - features/support/env.rb
194
218
  - features/support/sql_helpers.rb
219
+ - spec/index_spec.rb
220
+ - spec/spec_helper.rb
221
+ - spec/support/sql_helpers.rb
data/Gemfile.lock DELETED
@@ -1,118 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- peegee (0.0.1)
5
- activerecord
6
-
7
- GEM
8
- remote: http://rubygems.org/
9
- specs:
10
- abstract (1.0.0)
11
- actionmailer (3.0.7)
12
- actionpack (= 3.0.7)
13
- mail (~> 2.2.15)
14
- actionpack (3.0.7)
15
- activemodel (= 3.0.7)
16
- activesupport (= 3.0.7)
17
- builder (~> 2.1.2)
18
- erubis (~> 2.6.6)
19
- i18n (~> 0.5.0)
20
- rack (~> 1.2.1)
21
- rack-mount (~> 0.6.14)
22
- rack-test (~> 0.5.7)
23
- tzinfo (~> 0.3.23)
24
- activemodel (3.0.7)
25
- activesupport (= 3.0.7)
26
- builder (~> 2.1.2)
27
- i18n (~> 0.5.0)
28
- activerecord (3.0.7)
29
- activemodel (= 3.0.7)
30
- activesupport (= 3.0.7)
31
- arel (~> 2.0.2)
32
- tzinfo (~> 0.3.23)
33
- activeresource (3.0.7)
34
- activemodel (= 3.0.7)
35
- activesupport (= 3.0.7)
36
- activesupport (3.0.7)
37
- arel (2.0.10)
38
- aruba (0.3.6)
39
- childprocess (>= 0.1.7)
40
- cucumber (>= 0.10.0)
41
- rspec (>= 2.5.0)
42
- builder (2.1.2)
43
- childprocess (0.1.9)
44
- ffi (~> 1.0.6)
45
- columnize (0.3.2)
46
- cucumber (0.10.3)
47
- builder (>= 2.1.2)
48
- diff-lcs (>= 1.1.2)
49
- gherkin (>= 2.3.8)
50
- json (>= 1.4.6)
51
- term-ansicolor (>= 1.0.5)
52
- diff-lcs (1.1.2)
53
- erubis (2.6.6)
54
- abstract (>= 1.0.0)
55
- ffi (1.0.9)
56
- gherkin (2.3.10)
57
- json (>= 1.4.6)
58
- i18n (0.5.0)
59
- json (1.5.1)
60
- linecache (0.43)
61
- mail (2.2.19)
62
- activesupport (>= 2.3.6)
63
- i18n (>= 0.4.0)
64
- mime-types (~> 1.16)
65
- treetop (~> 1.4.8)
66
- mime-types (1.16)
67
- pg (0.11.0)
68
- polyglot (0.3.1)
69
- rack (1.2.3)
70
- rack-mount (0.6.14)
71
- rack (>= 1.0.0)
72
- rack-test (0.5.7)
73
- rack (>= 1.0)
74
- rails (3.0.7)
75
- actionmailer (= 3.0.7)
76
- actionpack (= 3.0.7)
77
- activerecord (= 3.0.7)
78
- activeresource (= 3.0.7)
79
- activesupport (= 3.0.7)
80
- bundler (~> 1.0)
81
- railties (= 3.0.7)
82
- railties (3.0.7)
83
- actionpack (= 3.0.7)
84
- activesupport (= 3.0.7)
85
- rake (>= 0.8.7)
86
- thor (~> 0.14.4)
87
- rake (0.8.7)
88
- rspec (2.6.0)
89
- rspec-core (~> 2.6.0)
90
- rspec-expectations (~> 2.6.0)
91
- rspec-mocks (~> 2.6.0)
92
- rspec-core (2.6.3)
93
- rspec-expectations (2.6.0)
94
- diff-lcs (~> 1.1.2)
95
- rspec-mocks (2.6.0)
96
- ruby-debug (0.10.4)
97
- columnize (>= 0.1)
98
- ruby-debug-base (~> 0.10.4.0)
99
- ruby-debug-base (0.10.4)
100
- linecache (>= 0.3)
101
- term-ansicolor (1.0.5)
102
- thor (0.14.6)
103
- treetop (1.4.9)
104
- polyglot (>= 0.3.1)
105
- tzinfo (0.3.27)
106
-
107
- PLATFORMS
108
- ruby
109
-
110
- DEPENDENCIES
111
- aruba
112
- cucumber
113
- peegee!
114
- pg
115
- rails (= 3.0.7)
116
- rspec-core
117
- rspec-expectations
118
- ruby-debug