pacecar 1.5.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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