dase 3.2.9 → 4.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: 0caefe9687496a603d4b8a1812f0a3a89320bc58
4
- data.tar.gz: fe0dd23b22c989fefade0b8cd4555925083c19a3
3
+ metadata.gz: fa21a89c14adc39b8906ec72c7b4b4c53dfefbe2
4
+ data.tar.gz: 1742ddc3cfa7c83952d008ec7d3421e9946883c7
5
5
  SHA512:
6
- metadata.gz: 7cd235f4fa1de0ee5ea6c4c36cbe73beeb295d3665aa1532e4ac2740ab42c9008770c3627a3df30ab17535743ce4d6e77737f5df1a04b19ed4e6cdc51847d67b
7
- data.tar.gz: 02d35d30617d7805da0ebc6f9b894b31594bf40c2a0af2622ce672f20e6c0eff410052ef621abdf25dde3d10f12dc366b0253cd293fc6432a59af51fe635f3bc
6
+ metadata.gz: 4a3383ce22ef7a04bc1363a09b15037dd7b92417bf4a65abb12a4f7027a4895c8e7dd3d62e4cd52687acd93d3653c02a18c8301530a986d1ce2a2de80da3e5af
7
+ data.tar.gz: ce0941ab55f4c38e9fe21b3e559f93640d9e0b61920d3ff744158a91fa1da524ecbf17b202b7d54bba61a3728dc2f7add3519de7dd551fc2ebdf630b0042e2cc
data/dase.gemspec CHANGED
@@ -15,19 +15,18 @@ Gem::Specification.new do |gem|
15
15
  gem.summary = %q{Provides includes_count_of method on ActiveRecord::Relation to count associated records efficiently}
16
16
  gem.homepage = "https://github.com/vovayartsev/dase"
17
17
 
18
- gem.add_runtime_dependency "activesupport", "~> 3.2.0"
19
- gem.add_development_dependency 'shoulda'
20
-
18
+ gem.add_runtime_dependency "activesupport", ">= 4.0", "<= 4.2"
19
+
21
20
  if defined? JRUBY_VERSION
22
21
  gem.add_development_dependency 'activerecord-jdbcsqlite3-adapter'
23
22
  else
24
- gem.add_runtime_dependency "activerecord", "~> 3.2.0"
25
- gem.add_development_dependency 'sqlite3', '~> 1.3.3'
23
+ gem.add_runtime_dependency "activerecord", ">= 4.0", "<= 4.2"
24
+ gem.add_development_dependency 'sqlite3', '~> 1.3'
26
25
  end
27
26
 
28
27
  # gem.add_development_dependency 'pry'
29
- gem.add_development_dependency 'rake'
30
- gem.add_development_dependency 'rspec-core'
28
+ gem.add_development_dependency 'rake', '~> 10.3'
29
+ gem.add_development_dependency 'rspec-core', '~> 3.1'
31
30
 
32
31
  gem.files = `git ls-files`.split($/)
33
32
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
data/lib/dase.rb CHANGED
@@ -6,4 +6,11 @@ require "dase/mp_active_record"
6
6
  module Dase
7
7
  # take a look at mp_active_record files
8
8
  # (there we monkey-patch Active Record)
9
+
10
+ # Syntax definition
11
+ VALID_DASE_OPTIONS = [:as]
12
+ VALID_ASSOCIATION_OPTIONS = [:proc, :where, :group, :having, :joins, :merge, :includes, :from]
13
+
14
+ # Legacy syntax support
15
+ VALID_SYNONYMS = {:only => :merge, :conditions => :where}
9
16
  end
@@ -1,12 +1,13 @@
1
1
  module Dase
2
- module ARRelationInstanceMethods
2
+ module RelationInstanceMethods
3
3
  def dase_values
4
4
  @dase_values ||= {}
5
5
  end
6
6
 
7
7
  def includes_count_of(*args)
8
8
  options = args.extract_options!
9
- sanitize_includes_count_of_options(args, options)
9
+ sanitize_dase_options(args, options)
10
+ apply_synonyms(options)
10
11
  return self if args.empty?
11
12
  clone.tap do |relation|
12
13
  args.each do |arg|
@@ -24,8 +25,18 @@ module Dase
24
25
 
25
26
  private
26
27
 
27
- def sanitize_includes_count_of_options(args, options)
28
- options.assert_valid_keys(:proc, :as, :only, :conditions, :group, :having, :limit, :offset, :joins, :include, :from, :lock)
28
+ # legacy syntax support
29
+ def apply_synonyms(options)
30
+ VALID_SYNONYMS.each do |old, new|
31
+ if options.has_key?(old)
32
+ raise "Don't use #{old} and #{new} together" if options.has_key?(new)
33
+ options[new] = options.delete(old)
34
+ end
35
+ end
36
+ end
37
+
38
+ def sanitize_dase_options(args, options)
39
+ options.assert_valid_keys *(VALID_DASE_OPTIONS + VALID_ASSOCIATION_OPTIONS + VALID_SYNONYMS.keys)
29
40
  if options.present? and args.many?
30
41
  raise ArgumentError, 'includes_count_of takes either multiple associations OR single association + options'
31
42
  end
@@ -33,14 +44,14 @@ module Dase
33
44
 
34
45
  def attach_dase_counters_to_records
35
46
  (dase_values || {}).each do |_, options|
36
- Dase::Preloader.new(@records, options[:association], options).run
47
+ Dase::Preloader.new(options).preload(@records, options[:association])
37
48
  end
38
49
  end
39
50
  end
40
51
  end
41
52
 
42
53
  ActiveRecord::Relation.class_eval do
43
- include Dase::ARRelationInstanceMethods
54
+ include Dase::RelationInstanceMethods
44
55
 
45
56
  private
46
57
 
@@ -54,6 +65,6 @@ ActiveRecord::Relation.class_eval do
54
65
  end
55
66
 
56
67
  class << ActiveRecord::Base
57
- delegate :includes_count_of, :to => :scoped
68
+ delegate :includes_count_of, :to => :all
58
69
  end
59
70
 
@@ -7,39 +7,42 @@ module Dase
7
7
  include Dase::PreloaderMethods
8
8
  end
9
9
 
10
- class HasAndBelongsToMany < ::ActiveRecord::Associations::Preloader::HasAndBelongsToMany
11
- include Dase::PreloaderMethods
12
- end
13
-
14
10
  # Not fully implemented yet
15
11
  class HasManyThrough < ::ActiveRecord::Associations::Preloader::HasManyThrough
16
12
  include Dase::PreloaderMethods
17
13
 
18
- def prefixed_foreign_key
14
+ def foreign_key
19
15
  "#{reflection.active_record.table_name}.#{reflection.active_record_primary_key}"
20
16
  end
21
17
 
22
18
  def records_for(ids)
23
19
  reflection.active_record.joins(reflection.name).
24
- where(prefixed_foreign_key => ids)
20
+ where(foreign_key => ids)
25
21
  end
26
22
  end
27
23
 
24
+ attr_reader :options
25
+
26
+ def initialize(options)
27
+ @options = options
28
+ end
29
+
28
30
  # an overloaded version of ActiveRecord::Associations::Preloader's preloader_for
29
31
  # which returns a class of a custom preloader for a given association
30
- def preloader_for(reflection)
32
+ def preloader_for(reflection, owners, rhs_klass)
33
+ return NullPreloader unless rhs_klass
34
+
35
+ if owners.first.association(reflection.name).loaded?
36
+ return AlreadyLoaded
37
+ end
38
+
31
39
  case reflection.macro
32
40
  when :has_many
33
- if reflection.options[:through]
34
- HasManyThrough
35
- #raise NotImplementedError, "The support for HasManyThrough associations is not implemented yet"
36
- else
37
- HasMany
38
- end
41
+ reflection.options[:through] ? HasManyThrough : HasMany
39
42
  when :has_one, :belongs_to
40
43
  raise ArgumentError, "You can't use includes_count_of with a #{reflection.macro} association"
41
- when :has_and_belongs_to_many
42
- HasAndBelongsToMany
44
+ else
45
+ raise NotImplementedError, "#{reflection.macro} not supported"
43
46
  end
44
47
  end
45
48
  end
@@ -1,29 +1,38 @@
1
1
  module Dase
2
2
  module PreloaderMethods
3
-
4
- def initialize(klass, owners, reflection, preload_options)
5
- preload_options = preload_options.reject { |k, _| k == :association }
6
- @dase_counter_name = preload_options.delete(:as)
7
- @dase_scope_to_merge = preload_options.delete(:only)
8
- super(klass, owners, reflection, preload_options)
9
- end
10
-
11
- def prefixed_foreign_key
12
- "#{scoped.quoted_table_name}.#{reflection.foreign_key}"
3
+ def foreign_key
4
+ reflection.klass.arel_table[reflection.foreign_key]
13
5
  end
14
6
 
15
- def preload
7
+ def preload(preloader)
16
8
  pk = model.primary_key.to_sym
17
9
  ids = owners.map(&pk)
18
10
  scope = records_for(ids)
19
- scope = scope.merge(@dase_scope_to_merge) if @dase_scope_to_merge
20
- counters_hash = scope.count(group: prefixed_foreign_key)
11
+
12
+ # applying options like :where => ... or :conditions => ..., or -> {....}
13
+ scope = apply_association_options(preloader.options.clone, scope)
14
+
15
+ # the actual magic of attaching counters to the records comes here
16
+ counters_hash = scope.group(foreign_key).count(Arel.star)
21
17
  owners.each do |owner|
22
- owner.define_singleton_method(@dase_counter_name) do
18
+ owner.define_singleton_method(preloader.options[:as]) do
23
19
  counters_hash[owner[pk]] || 0
24
20
  end
25
21
  end
26
22
  end
27
23
 
24
+ def apply_association_options(options, scope)
25
+ proc = options.delete(:proc)
26
+
27
+ # applying proc syntax: -> {...}
28
+ scope = scope.instance_eval(&proc) if proc
29
+
30
+ options.slice(*VALID_ASSOCIATION_OPTIONS).each do |key, value|
31
+ scope = scope.send(key, value)
32
+ end
33
+
34
+ scope
35
+ end
36
+
28
37
  end
29
38
  end
data/lib/dase/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dase
2
- VERSION = '3.2.9'
2
+ VERSION = '4.1.0'
3
3
  end
@@ -1,8 +1,6 @@
1
1
  class Author < ActiveRecord::Base
2
- attr_accessible :name
3
-
4
2
  has_many :books
5
- has_many :old_books, :class_name => "Book", :conditions => {:year => 1990}
3
+ has_many :old_books, -> { where year: 1990 }, class_name: 'Book'
6
4
 
7
5
  has_many :quotes, :through => :books
8
6
  has_many :scores, :through => :quotes
@@ -1,6 +1,4 @@
1
1
  class Book < ActiveRecord::Base
2
- attr_accessible :title, :year
3
-
4
2
  belongs_to :author
5
3
  has_many :quotes
6
4
 
data/test/helper.rb CHANGED
@@ -1,12 +1,11 @@
1
- # borrowed from https://github.com/ernie/meta_where/blob/master/test/helper.rb
2
- # with slight modifications
3
- require "rubygems"
4
- require "bundler"
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
5
4
  Bundler.setup
6
- require 'test/unit'
7
- require 'shoulda'
5
+
8
6
  require 'active_record'
9
7
  require 'active_record/fixtures'
8
+
10
9
  require 'dase'
11
10
 
12
11
  FIXTURES_PATH = File.join(File.dirname(__FILE__), 'fixtures')
@@ -19,12 +18,10 @@ ActiveRecord::Base.establish_connection(
19
18
  dep = defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : ::Dependencies
20
19
  dep.autoload_paths.unshift FIXTURES_PATH
21
20
 
22
- ActiveRecord::Base.silence do
23
- ActiveRecord::Migration.verbose = false
24
- load File.join(FIXTURES_PATH, 'schema.rb')
25
- end
21
+ ActiveRecord::Migration.verbose = false
22
+ load File.join(FIXTURES_PATH, 'schema.rb')
26
23
 
27
- ActiveRecord::Fixtures.create_fixtures(FIXTURES_PATH, ActiveRecord::Base.connection.tables)
24
+ ActiveRecord::FixtureSet.create_fixtures(FIXTURES_PATH, ActiveRecord::Base.connection.tables)
28
25
 
29
- class Test::Unit::TestCase
30
- end
26
+ # require 'pry' rescue nil # use it when enabled in gemspec
27
+ require 'minitest/autorun'
data/test/test_dase.rb CHANGED
@@ -1,104 +1,108 @@
1
1
  require 'helper'
2
2
 
3
- class TestBase < Test::Unit::TestCase
4
-
3
+ describe 'includes_count_of' do
5
4
  def compare_counts(traditional, dase, true_counts)
6
5
  assert_equal true_counts, traditional, "traditional counting failed - fixtures not loaded"
7
6
  assert_equal true_counts, dase, "dase countings failed"
8
7
  end
9
8
 
10
- context "includes_count_of" do
11
- setup do
12
- @bobby, @joe, @teddy = Author.order(:name).all
13
- end
14
-
15
- should "count books" do
16
- traditional_counts = Author.order(:name).map { |a| a.books.count }
17
- dase_counts = Author.includes_count_of(:books).order(:name).map { |a| a.books_count }
18
- # the order is: Bobby, Joe, Teddy - due to order(:name)
19
- true_counts = [1, 3, 0] # see books.yml
20
- compare_counts(traditional_counts, dase_counts, true_counts)
21
- end
22
-
23
- should "respond_to the counter method" do
24
- assert_equal true, Author.includes_count_of(:books).first.respond_to?(:books_count), "doesn't respond'"
25
- end
26
-
27
- should "sneeze through scope definitions" do
28
- assert_equal true, Author.with_count_of_books.first.respond_to?(:books_count), "doesn't respond'"
29
- end
30
-
31
- should "support :as option" do
32
- assert_equal true, Author.includes_count_of(:books, :as => :my_count).first.respond_to?(:my_count), "doesn't respond'"
33
- end
34
-
35
- should "support old_books_count and new_books_count simultaneously using :as option" do
36
- scope = Author.includes_count_of(:books, :conditions => {:year => 2012}, :as => :new_books_count).
37
- includes_count_of(:books, :conditions => {:year => 1990}, :as => :old_books_count)
38
- dase_counts = scope.order(:name).map{ |a| [a.old_books_count, a.new_books_count] }
39
- # the order is Bobby[:old, :new], Joe[:old, :new], Teddy[:old, :new]
40
- true_counts = [[1, 0], [2, 1], [0, 0]] # see books.yml
41
- assert_equal true_counts, dase_counts, "results mismatch"
42
- end
43
-
44
- should "count old books" do
45
- traditional_counts = Author.order(:name).map { |a| a.old_books.count }
46
- dase_counts = Author.includes_count_of(:old_books).order(:name).map { |a| a.old_books_count }
47
- # the order is: Bobby, Joe, Teddy - due to order(:name)
48
- true_counts = [1, 2, 0] # see books.yml
49
- compare_counts(traditional_counts, dase_counts, true_counts)
50
- end
51
-
52
- should "count books for year 1990" do
53
- traditional_counts = Author.order(:name).map { |a| a.books.where(:year => 1990).count }
54
- dase_counts = Author.includes_count_of(:books, :conditions => {:year => 1990}).order(:name).map { |a| a.books_count }
55
- # the order is: Bobby, Joe, Teddy - due to order(:name)
56
- true_counts = [1, 2, 0] # see books.yml
57
- compare_counts(traditional_counts, dase_counts, true_counts)
58
- end
59
-
60
- should "count books for year 2012 using :only option" do
61
- dase_counts = Author.includes_count_of(:books, :only => Book.year2012).order(:name).map { |a| a.books_count }
62
- # the order is: Bobby, Joe, Teddy - due to order(:name)
63
- true_counts = [0, 1, 0] # see books.yml
64
- assert_equal true_counts, dase_counts, "results mismatch"
65
- end
66
-
67
- should "allow merge (nil) on a scope with includes_count_of" do
68
- assert_equal 3, Author.includes_count_of(:books).merge(nil).all.size
69
- end
70
-
71
- # pending "apply: lambda {where...}"
72
-
73
- should "count likes" do
74
- dase_counts = Author.order(:name).includes_count_of(:scores).map { |a| a.scores_count }
75
- # the order is: Bobby, Joe, Teddy - due to order(:name)
76
- true_counts = [0, 2, 0] # see likes.yml
77
- assert_equal true_counts, dase_counts, "results mismatch"
78
- end
79
-
80
- should "count quotations" do
81
- traditional_counts = Author.order(:name).map { |a| a.quotes.count }
82
- dase_counts = Author.order(:name).includes_count_of(:quotes).map { |a| a.quotes_count }
83
- # the order is: Bobby, Joe, Teddy - due to order(:name)
84
- true_counts = [2, 1, 0] # see quotes.yml
85
- compare_counts(traditional_counts, dase_counts, true_counts)
86
- end
87
-
88
- should 'support multiple arguments' do
89
- joe = Author.includes_count_of(:books, :old_books).where(:name => 'Joe').first
90
- assert_equal 3, joe.books_count, "Invalid books_count"
91
- assert_equal 2, joe.old_books_count, "Invalid old_books_count"
92
- end
93
- end
94
-
95
- context 'test' do
96
- should 'work with find_each' do
97
- # the order is: Bobby, Joe, Teddy - due to sort_by(:name)
98
- records = []
99
- Author.includes_count_of(:books).find_each(batch_size: 2) { |r| records << r }
100
- dase_count = records.sort_by(&:name).map { |a| a.books_count }
101
- assert_equal [1, 3, 0], dase_count, "dase countings failed" # see books.yml
102
- end
9
+ before do
10
+ @bobby, @joe, @teddy = Author.order(:name).all
11
+ end
12
+
13
+ it 'should count books' do
14
+ traditional_counts = Author.order(:name).map { |a| a.books.count }
15
+ dase_counts = Author.includes_count_of(:books).order(:name).map { |a| a.books_count }
16
+ # the order is: Bobby, Joe, Teddy - due to order(:name)
17
+ true_counts = [1, 3, 0] # see books.yml
18
+ compare_counts(traditional_counts, dase_counts, true_counts)
19
+ end
20
+
21
+ it 'should respond_to the counter method' do
22
+ assert_equal true, Author.includes_count_of(:books).first.respond_to?(:books_count), "doesn't respond'"
23
+ end
24
+
25
+ it 'should sneeze through scope definitions' do
26
+ assert_equal true, Author.with_count_of_books.first.respond_to?(:books_count), "doesn't respond'"
27
+ end
28
+
29
+ it 'should support :as option' do
30
+ assert_equal true, Author.includes_count_of(:books, :as => :my_count).first.respond_to?(:my_count), "doesn't respond'"
31
+ end
32
+
33
+ it 'should support old_books_count and new_books_count simultaneously using :as option' do
34
+ scope = Author.includes_count_of(:books, :conditions => {:year => 2012}, :as => :new_books_count).
35
+ includes_count_of(:books, :conditions => {:year => 1990}, :as => :old_books_count)
36
+ dase_counts = scope.order(:name).map { |a| [a.old_books_count, a.new_books_count] }
37
+ # the order is Bobby[:old, :new], Joe[:old, :new], Teddy[:old, :new]
38
+ true_counts = [[1, 0], [2, 1], [0, 0]] # see books.yml
39
+ assert_equal true_counts, dase_counts, "results mismatch"
40
+ end
41
+
42
+ it 'should count old books' do
43
+ traditional_counts = Author.order(:name).map { |a| a.old_books.count }
44
+ dase_counts = Author.includes_count_of(:old_books).order(:name).map { |a| a.old_books_count }
45
+ # the order is: Bobby, Joe, Teddy - due to order(:name)
46
+ true_counts = [1, 2, 0] # see books.yml
47
+ compare_counts(traditional_counts, dase_counts, true_counts)
48
+ end
49
+
50
+ it 'should count books for year 1990' do
51
+ traditional_counts = Author.order(:name).map { |a| a.books.where(:year => 1990).count }
52
+ dase_counts = Author.includes_count_of(:books, :conditions => {:year => 1990}).order(:name).map { |a| a.books_count }
53
+ # the order is: Bobby, Joe, Teddy - due to order(:name)
54
+ true_counts = [1, 2, 0] # see books.yml
55
+ compare_counts(traditional_counts, dase_counts, true_counts)
56
+ end
57
+
58
+ it 'should support :proc option (where year 1990)' do
59
+ traditional_counts = Author.order(:name).map { |a| a.books.where(:year => 1990).count }
60
+ dase_counts = Author.includes_count_of(:books, :proc => proc { where(:year => 1990) }).order(:name).map { |a| a.books_count }
61
+ # the order is: Bobby, Joe, Teddy - due to order(:name)
62
+ true_counts = [1, 2, 0] # see books.yml
63
+ compare_counts(traditional_counts, dase_counts, true_counts)
64
+ end
65
+
66
+ it 'should count books for year 2012 using :only option' do
67
+ dase_counts = Author.includes_count_of(:books, :only => Book.year2012).order(:name).map { |a| a.books_count }
68
+ # the order is: Bobby, Joe, Teddy - due to order(:name)
69
+ true_counts = [0, 1, 0] # see books.yml
70
+ assert_equal true_counts, dase_counts, "results mismatch"
71
+ end
72
+
73
+ it 'should allow merge (nil) on a scope with includes_count_of' do
74
+ assert_equal 3, Author.includes_count_of(:books).merge(nil).all.size
75
+ end
76
+
77
+ # pending "apply: lambda {where...}"
78
+
79
+ it 'should count likes' do
80
+ dase_counts = Author.order(:name).includes_count_of(:scores).map { |a| a.scores_count }
81
+ # the order is: Bobby, Joe, Teddy - due to order(:name)
82
+ true_counts = [0, 2, 0] # see likes.yml
83
+ assert_equal true_counts, dase_counts, "results mismatch"
84
+ end
85
+
86
+ it 'should count quotations' do
87
+ traditional_counts = Author.order(:name).map { |a| a.quotes.count }
88
+ dase_counts = Author.order(:name).includes_count_of(:quotes).map { |a| a.quotes_count }
89
+ # the order is: Bobby, Joe, Teddy - due to order(:name)
90
+ true_counts = [2, 1, 0] # see quotes.yml
91
+ compare_counts(traditional_counts, dase_counts, true_counts)
92
+ end
93
+
94
+ it 'should support multiple arguments' do
95
+ joe = Author.includes_count_of(:books, :old_books).where(:name => 'Joe').first
96
+ assert_equal 3, joe.books_count, "Invalid books_count"
97
+ assert_equal 2, joe.old_books_count, "Invalid old_books_count"
98
+ end
99
+
100
+ it 'should work with find_each' do
101
+ # the order is: Bobby, Joe, Teddy - due to sort_by(:name)
102
+ records = []
103
+ Author.includes_count_of(:books).find_each(batch_size: 2) { |r| records << r }
104
+ dase_count = records.sort_by(&:name).map { |a| a.books_count }
105
+ assert_equal [1, 3, 0], dase_count, "dase countings failed" # see books.yml
103
106
  end
104
107
  end
108
+
metadata CHANGED
@@ -1,99 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dase
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.9
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Yartsev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-30 00:00:00.000000000 Z
11
+ date: 2014-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.2.0
19
+ version: '4.0'
20
+ - - "<="
21
+ - !ruby/object:Gem::Version
22
+ version: '4.2'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 3.2.0
27
- - !ruby/object:Gem::Dependency
28
- name: shoulda
29
- requirement: !ruby/object:Gem::Requirement
30
26
  requirements:
31
27
  - - ">="
32
28
  - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
29
+ version: '4.0'
30
+ - - "<="
39
31
  - !ruby/object:Gem::Version
40
- version: '0'
32
+ version: '4.2'
41
33
  - !ruby/object:Gem::Dependency
42
34
  name: activerecord
43
35
  requirement: !ruby/object:Gem::Requirement
44
36
  requirements:
45
- - - "~>"
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '4.0'
40
+ - - "<="
46
41
  - !ruby/object:Gem::Version
47
- version: 3.2.0
42
+ version: '4.2'
48
43
  type: :runtime
49
44
  prerelease: false
50
45
  version_requirements: !ruby/object:Gem::Requirement
51
46
  requirements:
52
- - - "~>"
47
+ - - ">="
53
48
  - !ruby/object:Gem::Version
54
- version: 3.2.0
49
+ version: '4.0'
50
+ - - "<="
51
+ - !ruby/object:Gem::Version
52
+ version: '4.2'
55
53
  - !ruby/object:Gem::Dependency
56
54
  name: sqlite3
57
55
  requirement: !ruby/object:Gem::Requirement
58
56
  requirements:
59
57
  - - "~>"
60
58
  - !ruby/object:Gem::Version
61
- version: 1.3.3
59
+ version: '1.3'
62
60
  type: :development
63
61
  prerelease: false
64
62
  version_requirements: !ruby/object:Gem::Requirement
65
63
  requirements:
66
64
  - - "~>"
67
65
  - !ruby/object:Gem::Version
68
- version: 1.3.3
66
+ version: '1.3'
69
67
  - !ruby/object:Gem::Dependency
70
68
  name: rake
71
69
  requirement: !ruby/object:Gem::Requirement
72
70
  requirements:
73
- - - ">="
71
+ - - "~>"
74
72
  - !ruby/object:Gem::Version
75
- version: '0'
73
+ version: '10.3'
76
74
  type: :development
77
75
  prerelease: false
78
76
  version_requirements: !ruby/object:Gem::Requirement
79
77
  requirements:
80
- - - ">="
78
+ - - "~>"
81
79
  - !ruby/object:Gem::Version
82
- version: '0'
80
+ version: '10.3'
83
81
  - !ruby/object:Gem::Dependency
84
82
  name: rspec-core
85
83
  requirement: !ruby/object:Gem::Requirement
86
84
  requirements:
87
- - - ">="
85
+ - - "~>"
88
86
  - !ruby/object:Gem::Version
89
- version: '0'
87
+ version: '3.1'
90
88
  type: :development
91
89
  prerelease: false
92
90
  version_requirements: !ruby/object:Gem::Requirement
93
91
  requirements:
94
- - - ">="
92
+ - - "~>"
95
93
  - !ruby/object:Gem::Version
96
- version: '0'
94
+ version: '3.1'
97
95
  description: "Dase gem creates includes_count_of method in ActiveRecord::Relation\n
98
96
  \ to count associated records efficiently. See examples at
99
97
  https://github.com/vovayartsev/dase\n "