pacecar 1.5.3 → 2.0.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.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.travis.yml +9 -1
  4. data/Appraisals +9 -17
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +93 -108
  7. data/MIT-LICENSE +1 -1
  8. data/README.md +10 -109
  9. data/Rakefile +9 -5
  10. data/TESTING.md +40 -0
  11. data/gemfiles/rails_4_mysql2_driver.gemfile +8 -0
  12. data/gemfiles/rails_4_pg_driver.gemfile +8 -0
  13. data/gemfiles/rails_4_sqlite3_driver.gemfile +8 -0
  14. data/lib/pacecar.rb +0 -10
  15. data/lib/pacecar/boolean.rb +8 -20
  16. data/lib/pacecar/helpers.rb +7 -16
  17. data/lib/pacecar/limit.rb +9 -9
  18. data/lib/pacecar/order.rb +9 -9
  19. data/lib/pacecar/polymorph.rb +5 -5
  20. data/lib/pacecar/presence.rb +8 -9
  21. data/lib/pacecar/search.rb +8 -32
  22. data/lib/pacecar/state.rb +13 -9
  23. data/lib/pacecar/version.rb +1 -1
  24. data/pacecar.gemspec +18 -16
  25. data/spec/boolean_spec.rb +6 -18
  26. data/spec/dummy/app/models/mammal.rb +1 -1
  27. data/spec/dummy/app/models/post.rb +2 -2
  28. data/spec/dummy/app/models/user.rb +1 -6
  29. data/spec/dummy/bin/bundle +3 -0
  30. data/spec/dummy/bin/rails +4 -0
  31. data/spec/dummy/bin/rake +4 -0
  32. data/spec/dummy/config/application.rb +4 -26
  33. data/spec/dummy/config/boot.rb +3 -9
  34. data/spec/dummy/config/database.yml +1 -7
  35. data/spec/dummy/config/environment.rb +2 -2
  36. data/spec/dummy/config/environments/development.rb +15 -12
  37. data/spec/dummy/config/environments/production.rb +57 -26
  38. data/spec/dummy/config/environments/test.rb +16 -15
  39. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  40. data/spec/dummy/config/initializers/inflections.rb +9 -3
  41. data/spec/dummy/config/initializers/secret_token.rb +7 -2
  42. data/spec/dummy/config/initializers/session_store.rb +1 -6
  43. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  44. data/spec/dummy/config/locales/en.yml +20 -2
  45. data/spec/dummy/config/routes.rb +22 -24
  46. data/spec/factories.rb +2 -2
  47. data/spec/helpers_spec.rb +18 -26
  48. data/spec/integration/navigation_spec.rb +4 -5
  49. data/spec/limit_spec.rb +11 -11
  50. data/spec/order_spec.rb +8 -8
  51. data/spec/pacecar_spec.rb +3 -3
  52. data/spec/polymorph_spec.rb +6 -6
  53. data/spec/presence_spec.rb +9 -9
  54. data/spec/search_spec.rb +14 -48
  55. data/spec/spec_helper.rb +11 -17
  56. data/spec/state_spec.rb +29 -29
  57. metadata +76 -70
  58. data/gemfiles/rails-3.0.11-database-mysql.gemfile +0 -8
  59. data/gemfiles/rails-3.0.11-database-mysql.gemfile.lock +0 -134
  60. data/gemfiles/rails-3.0.11-database-mysql2.gemfile +0 -8
  61. data/gemfiles/rails-3.0.11-database-mysql2.gemfile.lock +0 -134
  62. data/gemfiles/rails-3.0.11-database-pg.gemfile +0 -8
  63. data/gemfiles/rails-3.0.11-database-pg.gemfile.lock +0 -134
  64. data/gemfiles/rails-3.0.11-database-sqlite3-ruby.gemfile +0 -8
  65. data/gemfiles/rails-3.0.11-database-sqlite3-ruby.gemfile.lock +0 -136
  66. data/gemfiles/rails-3.0.11-database-sqlite3.gemfile +0 -8
  67. data/gemfiles/rails-3.0.11-database-sqlite3.gemfile.lock +0 -134
  68. data/gemfiles/rails-3.1.3-database-mysql.gemfile +0 -8
  69. data/gemfiles/rails-3.1.3-database-mysql.gemfile.lock +0 -144
  70. data/gemfiles/rails-3.1.3-database-mysql2.gemfile +0 -8
  71. data/gemfiles/rails-3.1.3-database-mysql2.gemfile.lock +0 -144
  72. data/gemfiles/rails-3.1.3-database-pg.gemfile +0 -8
  73. data/gemfiles/rails-3.1.3-database-pg.gemfile.lock +0 -144
  74. data/gemfiles/rails-3.1.3-database-sqlite3-ruby.gemfile +0 -8
  75. data/gemfiles/rails-3.1.3-database-sqlite3-ruby.gemfile.lock +0 -146
  76. data/gemfiles/rails-3.1.3-database-sqlite3.gemfile +0 -8
  77. data/gemfiles/rails-3.1.3-database-sqlite3.gemfile.lock +0 -144
  78. data/lib/pacecar/associations.rb +0 -39
  79. data/lib/pacecar/datetime.rb +0 -91
  80. data/lib/pacecar/duration.rb +0 -51
  81. data/lib/pacecar/numeric.rb +0 -29
  82. data/lib/pacecar/ranking.rb +0 -53
  83. data/spec/associations_spec.rb +0 -32
  84. data/spec/datetime_spec.rb +0 -92
  85. data/spec/duration_spec.rb +0 -22
  86. data/spec/numeric_spec.rb +0 -43
  87. data/spec/ranking_spec.rb +0 -63
data/Rakefile CHANGED
@@ -5,10 +5,14 @@ require 'appraisal'
5
5
  require 'rspec/core/rake_task'
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
- desc "Default: run the unit tests."
9
- task :default => [:all]
8
+ task :default do |t|
9
+ if ENV['BUNDLE_GEMFILE'] =~ /gemfiles/
10
+ exec 'rake spec'
11
+ else
12
+ Rake::Task['appraise'].execute
13
+ end
14
+ end
10
15
 
11
- desc 'Test the plugin under all supported Rails versions.'
12
- task :all => ["appraisal:install"] do |t|
13
- exec('rake appraisal spec')
16
+ task appraise: ['appraisal:install'] do |t|
17
+ exec 'rake appraisal'
14
18
  end
@@ -0,0 +1,40 @@
1
+ Running the test suite
2
+ ======================
3
+
4
+
5
+ Run the tests:
6
+
7
+ % rake
8
+
9
+ In order to do this you must have gems bundled, Appraisal set up, and
10
+ three databases configured.
11
+
12
+ bundler
13
+ -------
14
+
15
+ % bundle --binstubs
16
+
17
+ Appraisal
18
+ ---------
19
+
20
+ % rake appraisal:install
21
+
22
+ MySQL
23
+ -----
24
+
25
+ % echo create database pacecar_test | mysql
26
+ % cd spec/dummy
27
+ spec/dummy% RAILS_ENV=test BUNDLE_GEMFILE=../../gemfiles/rails_4_mysql2_driver.gemfile bundle exec rake db:migrate
28
+
29
+ Postgres
30
+ --------
31
+
32
+ % createdb pacecar_test
33
+ % cd spec/dummy
34
+ spec/dummy% RAILS_ENV=test BUNDLE_GEMFILE=../../gemfiles/rails_4_pg_driver.gemfile bundle exec rake db:migrate
35
+
36
+ sqlite
37
+ ------
38
+
39
+ % cd spec/dummy
40
+ spec/dummy% RAILS_ENV=test % BUNDLE_GEMFILE=../../gemfiles/rails_4_sqlite3_driver.gemfile bundle exec rake db:migrate
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "4.0.0"
6
+ gem "mysql2"
7
+
8
+ gemspec :path=>"../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "4.0.0"
6
+ gem "pg"
7
+
8
+ gemspec :path=>"../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "4.0.0"
6
+ gem "sqlite3"
7
+
8
+ gemspec :path=>"../"
@@ -1,33 +1,23 @@
1
- require 'pacecar/associations'
2
1
  require 'pacecar/boolean'
3
- require 'pacecar/datetime'
4
- require 'pacecar/duration'
5
2
  require 'pacecar/helpers'
6
3
  require 'pacecar/limit'
7
4
  require 'pacecar/order'
8
5
  require 'pacecar/polymorph'
9
6
  require 'pacecar/presence'
10
- require 'pacecar/ranking'
11
7
  require 'pacecar/search'
12
8
  require 'pacecar/state'
13
- require 'pacecar/numeric'
14
9
  require 'pacecar/version'
15
10
 
16
11
  module Pacecar
17
12
  def self.included(base)
18
13
  base.class_eval do
19
- include Pacecar::Associations
20
14
  include Pacecar::Boolean
21
- include Pacecar::Datetime
22
- include Pacecar::Duration
23
15
  include Pacecar::Limit
24
16
  include Pacecar::Order
25
17
  include Pacecar::Polymorph
26
18
  include Pacecar::Presence
27
- include Pacecar::Ranking
28
19
  include Pacecar::Search
29
20
  include Pacecar::State
30
- include Pacecar::Numeric
31
21
  end
32
22
  end
33
23
  end
@@ -1,31 +1,19 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Pacecar
2
4
  module Boolean
3
- def self.included(base)
4
- base.extend ClassMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ define_boolean_scopes
5
9
  end
6
10
 
7
11
  module ClassMethods
8
- def self.extended(base)
9
- base.send :define_boolean_scopes
10
- base.send :define_balance_count
11
- end
12
-
13
- protected
14
12
 
15
13
  def define_boolean_scopes
16
14
  boolean_column_names.each do |name|
17
- scope name.to_sym, :conditions => ["#{quoted_table_name}.#{connection.quote_column_name name} = ?", true]
18
- scope "not_#{name}".to_sym, :conditions => ["#{quoted_table_name}.#{connection.quote_column_name name} = ?", false]
19
- end
20
- end
21
-
22
- def define_balance_count
23
- boolean_column_names.each do |name|
24
- self.class_eval %Q{
25
- def self.#{name}_balance
26
- #{name}.count - not_#{name}.count
27
- end
28
- }
15
+ scope name, -> { where(name => true) }
16
+ scope "not_#{name}", -> { where(name => false) }
29
17
  end
30
18
  end
31
19
 
@@ -1,16 +1,15 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Pacecar
2
4
  module Helpers
5
+ extend ActiveSupport::Concern
3
6
 
4
7
  mattr_accessor :options
5
8
  self.options = {
6
- :state_pattern => /_(type|state)$/i,
7
- :default_limit => 10
9
+ state_pattern: /_(type|state)$/i,
10
+ default_limit: 10
8
11
  }
9
12
 
10
- def self.included(base)
11
- base.extend ClassMethods
12
- end
13
-
14
13
  module ClassMethods
15
14
 
16
15
  def safe_column_names
@@ -25,10 +24,6 @@ module Pacecar
25
24
  column_names_for_type :boolean
26
25
  end
27
26
 
28
- def datetime_column_names
29
- column_names_for_type :datetime, :date
30
- end
31
-
32
27
  def text_and_string_column_names
33
28
  column_names_for_type :text, :string
34
29
  end
@@ -37,10 +32,6 @@ module Pacecar
37
32
  text_and_string_column_names.reject { |name| name =~ Pacecar::Helpers.options[:state_pattern] }
38
33
  end
39
34
 
40
- def numeric_column_names
41
- column_names_for_type :integer, :float, :decimal
42
- end
43
-
44
35
  protected
45
36
 
46
37
  def safe_columns
@@ -71,8 +62,8 @@ module Pacecar
71
62
  end
72
63
 
73
64
  def column_names_without_type(*types)
74
- safe_columns.select { |column| ! types.include? column.type }.collect(&:name)
75
- end
65
+ safe_columns.reject { |column| types.include? column.type }.collect(&:name)
66
+ end
76
67
 
77
68
  end
78
69
  end
@@ -1,19 +1,19 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Pacecar
2
4
  module Limit
3
- def self.included(base)
4
- base.extend ClassMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ define_limit_scopes
5
9
  end
6
10
 
7
11
  module ClassMethods
8
- def self.extended(base)
9
- base.send :define_limit_scopes
10
- end
11
-
12
- protected
13
12
 
14
13
  def define_limit_scopes
15
- scope :limited, lambda { |*args|
16
- { :limit => args.flatten.first || (defined?(per_page) ? per_page : Pacecar::Helpers.options[:default_limit]) }
14
+ scope :limited, ->(*args) {
15
+ value = args.flatten.first || (defined?(per_page) ? per_page : Pacecar::Helpers.options[:default_limit])
16
+ limit(value)
17
17
  }
18
18
  end
19
19
 
@@ -1,20 +1,20 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Pacecar
2
4
  module Order
3
- def self.included(base)
4
- base.extend ClassMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ define_order_scopes
5
9
  end
6
10
 
7
11
  module ClassMethods
8
- def self.extended(base)
9
- base.send :define_order_scopes
10
- end
11
-
12
- protected
13
12
 
14
13
  def define_order_scopes
15
14
  safe_column_names.each do |name|
16
- scope "by_#{name}".to_sym, lambda { |*args|
17
- { :order => "#{quoted_table_name}.#{connection.quote_column_name name} #{args.flatten.first || 'asc'}" }
15
+ scope "by_#{name}", ->(*args) {
16
+ direction = args.flatten.first || 'asc'
17
+ order("#{name} #{direction}")
18
18
  }
19
19
  end
20
20
  end
@@ -1,15 +1,15 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Pacecar
2
4
  module Polymorph
3
- def self.included(base)
4
- base.extend ClassMethods
5
- end
5
+ extend ActiveSupport::Concern
6
6
 
7
7
  module ClassMethods
8
8
 
9
9
  def has_polymorph(name)
10
- scope "for_#{name}_type".to_sym, lambda { |type|
10
+ scope "for_#{name}_type", ->(type) {
11
11
  polymorph_type = "#{name}_type"
12
- { :conditions => ["#{quoted_table_name}.#{connection.quote_column_name polymorph_type} = ?", type.to_s] }
12
+ where(polymorph_type => type)
13
13
  }
14
14
  end
15
15
 
@@ -1,20 +1,19 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Pacecar
2
4
  module Presence
3
- def self.included(base)
4
- base.extend ClassMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ define_presence_scopes
5
9
  end
6
10
 
7
11
  module ClassMethods
8
- def self.extended(base)
9
- base.send :define_presence_scopes
10
- end
11
-
12
- protected
13
12
 
14
13
  def define_presence_scopes
15
14
  non_boolean_column_names.each do |name|
16
- scope "#{name}_present".to_sym, :conditions => "#{quoted_table_name}.#{connection.quote_column_name name} IS NOT NULL"
17
- scope "#{name}_missing".to_sym, :conditions => "#{quoted_table_name}.#{connection.quote_column_name name} IS NULL"
15
+ scope "#{name}_present", -> { where(arel_table[name].not_eq nil) }
16
+ scope "#{name}_missing", -> { where(arel_table[name].eq nil) }
18
17
  end
19
18
  end
20
19
 
@@ -1,47 +1,23 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Pacecar
2
4
  module Search
3
- def self.included(base)
4
- base.extend ClassMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ define_search_scopes
5
9
  end
6
10
 
7
11
  module ClassMethods
8
- def self.extended(base)
9
- base.send :define_search_scopes
10
- base.send :define_basic_search_scope
11
- end
12
-
13
- protected
14
12
 
15
13
  def define_search_scopes
16
14
  safe_column_names.each do |name|
17
- scope "#{name}_equals".to_sym, lambda { |query|
18
- { :conditions => { table_name => { name.to_sym => query} } }
19
- }
20
- end
21
- text_and_string_column_names.each do |name|
22
- scope "#{name}_matches".to_sym, lambda { |query|
23
- { :conditions => ["lower(#{quoted_table_name}.#{connection.quote_column_name(name)}) LIKE lower(:query)", { :query => "%#{query}%" }] }
24
- }
25
- scope "#{name}_starts_with".to_sym, lambda { |query|
26
- { :conditions => ["lower(#{quoted_table_name}.#{connection.quote_column_name(name)}) LIKE lower(:query)", { :query => "#{query}%" }] }
27
- }
28
- scope "#{name}_ends_with".to_sym, lambda { |query|
29
- { :conditions => ["lower(#{quoted_table_name}.#{connection.quote_column_name(name)}) LIKE lower(:query)", { :query => "%#{query}" }] }
15
+ scope "#{name}_equals", ->(query) {
16
+ where(name => query)
30
17
  }
31
18
  end
32
19
  end
33
20
 
34
- def define_basic_search_scope
35
- scope :search_for, lambda { |*args|
36
- opts = args.extract_options!
37
- query = args.flatten.first
38
- columns = opts[:on] || non_state_text_and_string_columns
39
- joiner = opts[:require].eql?(:all) ? 'AND' : 'OR'
40
- match = columns.collect { |name| "lower(#{quoted_table_name}.#{connection.quote_column_name(name)}) LIKE lower(:query)" }.join(" #{joiner} ")
41
- { :conditions => [match, { :query => "%#{query}%" } ] }
42
- }
43
- end
44
-
45
21
  end
46
22
  end
47
23
  end
@@ -1,8 +1,8 @@
1
+ require 'active_support/concern'
2
+
1
3
  module Pacecar
2
4
  module State
3
- def self.included(base)
4
- base.extend ClassMethods
5
- end
5
+ extend ActiveSupport::Concern
6
6
 
7
7
  module ClassMethods
8
8
 
@@ -11,8 +11,12 @@ module Pacecar
11
11
  names.each do |name|
12
12
  constant = opts[:with] || const_get(name.to_s.pluralize.upcase)
13
13
  constant.each do |state|
14
- scope "#{name}_#{state.downcase}".to_sym, :conditions => ["#{quoted_table_name}.#{connection.quote_column_name name} = ?", state]
15
- scope "#{name}_not_#{state.downcase}".to_sym, :conditions => ["#{quoted_table_name}.#{connection.quote_column_name name} <> ?", state]
14
+ scope "#{name}_#{state.downcase}", -> {
15
+ where(arel_table[name].eq state)
16
+ }
17
+ scope "#{name}_not_#{state.downcase}", -> {
18
+ where(arel_table[name].not_eq state)
19
+ }
16
20
  self.class_eval %Q{
17
21
  def #{name}_#{state.downcase}?
18
22
  #{name} == '#{state}'
@@ -22,11 +26,11 @@ module Pacecar
22
26
  end
23
27
  }
24
28
  end
25
- scope "#{name}".to_sym, lambda { |state|
26
- { :conditions => ["#{quoted_table_name}.#{connection.quote_column_name name} = ?", state] }
29
+ scope "#{name}", ->(state) {
30
+ where(arel_table[name].eq state)
27
31
  }
28
- scope "#{name}_not".to_sym, lambda { |state|
29
- { :conditions => ["#{quoted_table_name}.#{connection.quote_column_name name} <> ?", state] }
32
+ scope "#{name}_not", ->(state) {
33
+ where(arel_table[name].not_eq state)
30
34
  }
31
35
  end
32
36
  end
@@ -1,3 +1,3 @@
1
1
  module Pacecar
2
- VERSION = '1.5.3'.freeze
2
+ VERSION = '2.0.0'.freeze
3
3
  end
@@ -1,25 +1,27 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "pacecar/version"
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'pacecar/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = 'pacecar'
7
- s.version = Pacecar::VERSION.dup
8
- s.platform = Gem::Platform::RUBY
9
- s.authors = ['Matt Jankowski', 'Gabe Berke-Williams', 'Chad Pytel', 'Ryan McGeary', 'Mike Burns', 'Ryan Sonnek', 'Thomas Dippel', 'Tristan Dunn']
10
- s.email = 'support@thoughtbot.com'
11
- s.homepage = 'http://github.com/thoughtbot/pacecar'
12
- s.summary = 'Pacecar adds scope methods to ActiveRecord classes via database column introspection.'
13
- s.description = 'Generated scopes for ActiveRecord classes.'
6
+ s.name = 'pacecar'
7
+ s.version = Pacecar::VERSION.dup
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Matt Jankowski', 'Gabe Berke-Williams', 'Chad Pytel', 'Ryan McGeary', 'Mike Burns', 'Ryan Sonnek', 'Thomas Dippel', 'Tristan Dunn']
10
+ s.email = 'support@thoughtbot.com'
11
+ s.homepage = 'http://github.com/thoughtbot/pacecar'
12
+ s.summary = 'Pacecar adds scope methods to ActiveRecord classes via database column introspection.'
13
+ s.description = 'Generated scopes for ActiveRecord classes.'
14
14
 
15
15
  s.files = `git ls-files`.split("\n")
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
- s.require_paths = ["lib"]
18
+ s.require_paths = ['lib']
19
19
 
20
- s.add_development_dependency("appraisal", "~> 0.4")
21
- s.add_development_dependency("capybara", ">= 0.4.0")
22
- s.add_development_dependency("mocha")
23
- s.add_development_dependency("rspec-rails", ">= 2.4.0")
24
- s.add_development_dependency("factory_girl_rails")
20
+ s.add_dependency('activerecord', '>= 4.0.0')
21
+
22
+ s.add_development_dependency('appraisal')
23
+ s.add_development_dependency('mocha')
24
+ s.add_development_dependency('rspec-rails')
25
+ s.add_development_dependency('factory_girl_rails')
26
+ s.add_development_dependency('rails')
25
27
  end