active_collection 0.2.3 → 0.2.4

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.
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 3
2
+ :patch: 4
3
3
  :major: 0
4
4
  :minor: 2
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{active_collection}
8
- s.version = "0.2.3"
8
+ s.version = "0.2.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Martin Emde"]
12
- s.date = %q{2009-09-16}
12
+ s.date = %q{2009-10-12}
13
13
  s.description = %q{A lazy-loading, Array-like collection proxy for ActiveRecord that understands conditions and paging.}
14
14
  s.email = %q{martin.emde@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -26,14 +26,18 @@ Gem::Specification.new do |s|
26
26
  "active_collection.gemspec",
27
27
  "lib/active_collection.rb",
28
28
  "lib/active_collection/base.rb",
29
+ "lib/active_collection/conditions.rb",
29
30
  "lib/active_collection/includes.rb",
30
31
  "lib/active_collection/member_class.rb",
32
+ "lib/active_collection/new_scope.rb",
31
33
  "lib/active_collection/order.rb",
32
34
  "lib/active_collection/pagination.rb",
33
35
  "lib/active_collection/scope.rb",
34
36
  "lib/active_collection/serialization.rb",
35
- "spec/active_collection_spec.rb",
37
+ "spec/base_spec.rb",
38
+ "spec/member_class_spec.rb",
36
39
  "spec/pagination_spec.rb",
40
+ "spec/proxy_spec.rb",
37
41
  "spec/spec.opts",
38
42
  "spec/spec_helper.rb"
39
43
  ]
@@ -44,8 +48,10 @@ Gem::Specification.new do |s|
44
48
  s.rubygems_version = %q{1.3.5}
45
49
  s.summary = %q{A lazy-loading, Array-like collection proxy for ActiveRecord that understands conditions and paging.}
46
50
  s.test_files = [
47
- "spec/active_collection_spec.rb",
51
+ "spec/base_spec.rb",
52
+ "spec/member_class_spec.rb",
48
53
  "spec/pagination_spec.rb",
54
+ "spec/proxy_spec.rb",
49
55
  "spec/spec_helper.rb"
50
56
  ]
51
57
 
@@ -51,16 +51,19 @@ module ActiveCollection
51
51
  end
52
52
  end
53
53
 
54
+ # dup that doesn't include the collection if it's loaded
55
+ def unloading_dup
56
+ d = super
57
+ d.unload!
58
+ yield d if block_given?
59
+ d
60
+ end
61
+
54
62
  # Implements Enumerable
55
63
  def each(&block)
56
64
  collection.each(&block)
57
65
  end
58
66
 
59
- # Grab the raw collection.
60
- def all
61
- collection
62
- end
63
-
64
67
  # The emptiness of the collection (limited by query and pagination)
65
68
  def empty?
66
69
  size.zero?
@@ -69,11 +72,13 @@ module ActiveCollection
69
72
  # The size of the collection (limited by query and pagination)
70
73
  #
71
74
  # It will avoid using a count query if the collection is already loaded.
75
+ #
76
+ # (Note that the paginated count is added in the pagination module)
72
77
  def size
73
- loaded?? collection.size : total_entries
78
+ loaded?? length : total_entries
74
79
  end
75
80
 
76
- # Always returns the total count regardless of pagination.
81
+ # Always returns the total count of all records that can be in this collection.
77
82
  def total_entries
78
83
  @total_entries ||= load_count
79
84
  end
@@ -90,6 +95,10 @@ module ActiveCollection
90
95
  !!@collection
91
96
  end
92
97
 
98
+ def unload!
99
+ @collection = nil
100
+ end
101
+
93
102
  protected
94
103
 
95
104
  # Pass methods on to the collection.
@@ -114,16 +123,6 @@ module ActiveCollection
114
123
  @collection ||= load_collection
115
124
  end
116
125
 
117
- # Overload this method to add extra find options.
118
- #
119
- # :offset and :limit will be overwritten by the pagination_options if the
120
- # collection is paginated, because you shouldn't be changing the paging
121
- # directly if you're working with a paginated collection
122
- #
123
- def query_options
124
- {}
125
- end
126
-
127
126
  def load_count
128
127
  model_class.count(count_options)
129
128
  end
@@ -0,0 +1,59 @@
1
+ module ActiveCollection
2
+ module Conditions
3
+
4
+ def self.conditiond(mod)
5
+ mod.extend ClassMethods
6
+ mod.class_eval do
7
+ find_scope :conditions_options
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ def conditions(*conditions)
13
+ write_inheritable_attribute(:default_conditions, conditions)
14
+ end
15
+
16
+ def default_conditions
17
+ read_inheritable_attribute(:default_conditions) ||
18
+ write_inheritable_attribute(:default_conditions, [])
19
+ end
20
+
21
+ def merge_conditions(a, b)
22
+ (safe_to_array(a) + safe_to_array(b)).uniq
23
+ end
24
+ end
25
+
26
+ def each_condition(&block)
27
+ @conditions ||= self.class.default_conditions
28
+ end
29
+
30
+ def conditions(*conds)
31
+ unloading_dup { |ac| ac.condition!(*conds) }
32
+ end
33
+
34
+ def condition!(*new_conditions)
35
+ raise_if_loaded
36
+ @conditions = self.class.merge_conditions(new_conditions, conditions).uniq
37
+ end
38
+
39
+ def conditions_options
40
+ { :conditions => @conditions } unless @conditions.blank?
41
+ end
42
+
43
+ protected
44
+
45
+ # Taken from ActiveRecord::Base
46
+ #
47
+ # Object#to_a is deprecated, though it does have the desired behavior
48
+ def safe_to_array(o)
49
+ case o
50
+ when NilClass
51
+ []
52
+ when Array
53
+ o
54
+ else
55
+ [o]
56
+ end
57
+ end
58
+ end
59
+ end
@@ -19,18 +19,18 @@ module ActiveCollection
19
19
  end
20
20
 
21
21
  def includes
22
- @includes = self.class.default_includes
22
+ @includes ||= self.class.default_includes
23
23
  end
24
24
 
25
- def include(*includes)
26
- ac = dup
27
- ac.include! *includes
25
+ def include(*new_includes)
26
+ ac = unloading_dup
27
+ ac.include! *new_includes
28
28
  ac
29
29
  end
30
30
 
31
- def include!(*includes)
31
+ def include!(*new_includes)
32
32
  raise_if_loaded
33
- @includes = (safe_to_array(includes) + safe_to_array(includes)).uniq
33
+ @includes = (safe_to_array(new_includes) + safe_to_array(includes)).uniq
34
34
  end
35
35
 
36
36
  def include_options
@@ -5,27 +5,61 @@ module ActiveCollection
5
5
  end
6
6
 
7
7
  module ClassMethods
8
+ #
9
+ # If the name of the class held by your collection cannot be derived from
10
+ # the name of the collection class (by removing the word Collection from
11
+ # the end of the collection class name) then use model to set it.
12
+ #
13
+ # Example:
14
+ #
15
+ # class WeirdNamedCollection
16
+ # model "Normal"
17
+ # end
18
+ #
19
+ # This will use the class Normal to do counts and finds.
20
+ def model(class_name)
21
+ (@model_class_name = class_name) && @model_class = nil
22
+ end
23
+
24
+ # The actual member class.
25
+ #
26
+ # Prints a useful error message if you define your model class wrong.
8
27
  def model_class
9
- @model_class ||= name.sub(/Collection$/,'').constantize
28
+ begin
29
+ @model_class ||= model_class_name.constantize
30
+ rescue NameError => e
31
+ raise NameError, %|#{e} - Use 'model "Class"' in the collection to declare the correct model class for #{name}|
32
+ end
10
33
  end
11
34
 
35
+ # Table name of the member class.
12
36
  def table_name
13
37
  model_class.table_name
14
38
  end
15
39
 
40
+ # Plural human name of the member class.
16
41
  def human_name(*args)
17
42
  model_class.human_name(*args).pluralize
18
43
  end
44
+
45
+ protected
46
+
47
+ def model_class_name
48
+ @model_class_name || name.sub(/Collection$/,'')
49
+ end
19
50
  end
20
51
 
52
+ # The actual member class.
21
53
  def model_class
22
54
  self.class.model_class
23
55
  end
24
56
 
57
+ # Table name of the member class.
25
58
  def table_name
26
59
  self.class.table_name
27
60
  end
28
61
 
62
+ # Plural human name of the member class.
29
63
  def human_name(*args)
30
64
  self.class.human_name(*args)
31
65
  end
@@ -0,0 +1,140 @@
1
+ require 'active_support/core_ext/array/extract_options'
2
+ require 'active_support/core_ext/hash/deep_merge'
3
+
4
+ module ActiveCollection
5
+ module Scope
6
+ #extend ActiveSupport::Concern
7
+
8
+ def self.included(mod)
9
+ mod.extend ClassMethods
10
+ end
11
+
12
+ # Find options for loading the collection.
13
+ #
14
+ # To add more options, define a method that returns a hash with the
15
+ # additional options for find and then add it like this:
16
+ #
17
+ # class BeerCollection
18
+ # find_scope :awesome_beer_only
19
+ #
20
+ # def awesome_beer_only
21
+ # { :conditions => "beer = 'awesome'" }
22
+ # end
23
+ # end
24
+ #
25
+ def find_options
26
+ self.class.scope_for_find.to_options(self)
27
+ end
28
+
29
+ # Count options for loading the total count.
30
+ #
31
+ # To add more options, define a method that returns a hash with the
32
+ # additional options for count and then add it like this:
33
+ #
34
+ # class BeerCollection
35
+ # count_scope :awesome_beer_only
36
+ #
37
+ # def awesome_beer_only
38
+ # { :conditions => "beer = 'awesome'" }
39
+ # end
40
+ # end
41
+ #
42
+ def count_options
43
+ self.class.scope_for_count.to_options(self)
44
+ end
45
+
46
+ module ClassMethods
47
+ def scopes_for_find
48
+ ScopeBuilder.new(scope_builder + find_scope_builder)
49
+ end
50
+
51
+ def scopes_for_count
52
+ ScopeBuilder.new(scope_builder + count_scope_builder)
53
+ end
54
+
55
+ [:scope, :find_scope, :count_scope].each do |scope|
56
+ module_eval <<-SCOPE, __FILE__, __LINE__
57
+ def #{scope}(*methods, &block)
58
+ #{scope} = ScopeBuilder.build(:#{scope}, *methods, &block)
59
+ @#{scope}_builder ||= ScopeBuilder.new
60
+ @#{scope}_builder.concat #{scope}
61
+ end
62
+
63
+ def #{scope}_builder
64
+ @#{scope}_builder ||= ScopeBuilder.new
65
+ if superclass.respond_to?(:#{scope}_builder)
66
+ superclass.#{scope}_builder + @#{scope}_builder
67
+ else
68
+ @#{scope}_builder
69
+ end
70
+ end
71
+ SCOPE
72
+ end
73
+ end
74
+
75
+ class ScopeBuilder < Array
76
+ def self.build(kind, *methods, &block)
77
+ methods, options = extract_options(*methods, &block)
78
+ methods.map! { |method| ActiveSupport::Callbacks::Callback.new(kind, method, options) }
79
+ new(methods)
80
+ end
81
+
82
+ def to_options(object)
83
+ inject({}) do |h, callback|
84
+ res = callback.call(object)
85
+ res ? h.merge(res) : h
86
+ end
87
+ end
88
+
89
+ def join
90
+ hash = {}
91
+ each do |scope|
92
+ next if scope.blank?
93
+
94
+ (scope.keys + hash.keys).uniq.each do |key|
95
+ merge = hash[key] && params[key] # merge if both scopes have the same key
96
+
97
+ if key == :conditions && merge
98
+ hash[key] = if params[key].is_a?(Hash) && hash[key].is_a?(Hash)
99
+ merge_conditions(hash[key].deep_merge(params[key]))
100
+ else
101
+ merge_conditions(params[key], hash[key])
102
+ end
103
+ elsif key == :include && merge
104
+ hash[key] = merge_includes(hash[key], params[key]).uniq
105
+ elsif key == :joins && merge
106
+ hash[key] = merge_joins(params[key], hash[key])
107
+ else
108
+ hash[key] = hash[key] || params[key]
109
+ end
110
+ end
111
+ end
112
+
113
+ hash
114
+ end
115
+
116
+ private
117
+ # Merges conditions so that the result is a valid +condition+
118
+ def self.merge_conditions(*conditions)
119
+ segments = []
120
+
121
+ conditions.each do |condition|
122
+ unless condition.blank?
123
+ sql = model_class.send(:sanitize_sql, condition)
124
+ segments << sql unless sql.blank?
125
+ end
126
+ end
127
+
128
+ "(#{segments.join(') AND (')})" unless segments.empty?
129
+ end
130
+
131
+ def self.extract_options(*methods, &block)
132
+ methods.flatten!
133
+ options = methods.extract_options!
134
+ methods << block if block_given?
135
+ return methods, options
136
+ end
137
+ end
138
+ end
139
+ end
140
+
@@ -13,7 +13,7 @@ module ActiveCollection
13
13
  end
14
14
 
15
15
  def order_by(order)
16
- ac = dup
16
+ ac = unloading_dup
17
17
  ac.order_by! order
18
18
  ac
19
19
  end
@@ -131,7 +131,7 @@ module ActiveCollection
131
131
 
132
132
  # Total number of pages.
133
133
  def total_pages
134
- @total_pages ||= (total_entries / per_page.to_f).ceil
134
+ (total_entries / per_page.to_f).ceil
135
135
  end
136
136
 
137
137
  # return a paginated collection if it isn't already paginated.
@@ -153,6 +153,7 @@ module ActiveCollection
153
153
  current_page && current_page > 0
154
154
  end
155
155
 
156
+ # TODO clean this up
156
157
  def as_data_hash
157
158
  data_hash = { "collection" => collection.as_json }
158
159
  if paginated?
@@ -164,6 +165,7 @@ module ActiveCollection
164
165
  data_hash
165
166
  end
166
167
 
168
+ # TODO clean this up
167
169
  def to_xml(options = {})
168
170
  collect
169
171
  options[:indent] ||= 2
@@ -17,7 +17,7 @@ module ActiveCollection
17
17
  # find_scope :awesome_beer_only
18
18
  #
19
19
  # def awesome_beer_only
20
- # { :conditions => "beer = 'awesome'" }
20
+ # { :conditions => { :beer => 'awesome' } }
21
21
  # end
22
22
  # end
23
23
  #
@@ -34,7 +34,7 @@ module ActiveCollection
34
34
  # count_scope :awesome_beer_only
35
35
  #
36
36
  # def awesome_beer_only
37
- # { :conditions => "beer = 'awesome'" }
37
+ # { :conditions => { :beer => 'awesome' } }
38
38
  # end
39
39
  # end
40
40
  #
@@ -1,21 +1,17 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- class BeerCollection < ActiveCollection::Base
4
- end
5
-
6
3
  class Beer
7
4
  def self.human_name(*args)
8
5
  "Beer"
9
6
  end
10
7
  end
11
8
 
9
+ class BeerCollection < ActiveCollection::Base
10
+ end
11
+
12
12
  describe ActiveCollection do
13
13
  subject { BeerCollection.new }
14
14
 
15
- it "passes human_name to the member class and then pluralizes" do
16
- subject.human_name(:locale => 'en-us').should == "Beers"
17
- end
18
-
19
15
  context "(empty)" do
20
16
  describe "(count methods)" do
21
17
  before do
@@ -29,6 +25,10 @@ describe ActiveCollection do
29
25
  it "has size of 0" do
30
26
  subject.size.should == 0
31
27
  end
28
+
29
+ it "has total_entries of 0" do
30
+ subject.total_entries.should == 0
31
+ end
32
32
  end
33
33
 
34
34
  describe "(collection loading methods)" do
@@ -44,11 +44,6 @@ describe ActiveCollection do
44
44
  subject.length
45
45
  Beer.should_not_receive(:count)
46
46
  subject.should be_empty
47
- end
48
-
49
- it "doesn't load count after loading the collection" do
50
- subject.length
51
- Beer.should_not_receive(:count)
52
47
  subject.size.should == 0
53
48
  end
54
49
 
@@ -57,16 +52,16 @@ describe ActiveCollection do
57
52
  subject.each { |i| count += 1 }
58
53
  count.should == 0
59
54
  end
55
+
56
+ it "returns empty Array on to_a" do
57
+ subject.to_a.should == []
58
+ end
60
59
  end
61
60
  end
62
61
 
63
- context "(simple collection with 5 records)" do
62
+ context "(with 5 records)" do
64
63
  def records
65
- @records ||= begin
66
- beers = []
67
- 5.times { beers << Beer.new }
68
- beers
69
- end
64
+ @records ||= (1..5).map { |i| Beer.new }
70
65
  end
71
66
 
72
67
  describe "(count methods)" do
@@ -98,11 +93,6 @@ describe ActiveCollection do
98
93
  subject.length
99
94
  Beer.should_not_receive(:count)
100
95
  subject.should_not be_empty
101
- end
102
-
103
- it "doesn't load count after loading the collection" do
104
- subject.length
105
- Beer.should_not_receive(:count)
106
96
  subject.size.should == 5
107
97
  end
108
98
 
@@ -111,6 +101,23 @@ describe ActiveCollection do
111
101
  subject.each { |i| count += 1 }
112
102
  count.should == 5
113
103
  end
104
+
105
+ it "returns all objects in an Array on to_a" do
106
+ subject.to_a.should == records
107
+ end
108
+
109
+ it "loads the collection on length" do
110
+ subject.should_not be_loaded
111
+ subject.length
112
+ subject.should be_loaded
113
+ end
114
+
115
+ it "unloads a loaded collection on unload!" do
116
+ subject.to_a
117
+ subject.should be_loaded
118
+ subject.unload!
119
+ subject.should_not be_loaded
120
+ end
114
121
  end
115
122
  end
116
123
  end
@@ -0,0 +1,84 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ class Beer
4
+ def self.human_name(*args)
5
+ "Beer"
6
+ end
7
+
8
+ def self.table_name
9
+ "beers"
10
+ end
11
+ end
12
+
13
+ class BeerCollection < ActiveCollection::Base
14
+ end
15
+
16
+ class DunkelBeer
17
+ def self.human_name(*args)
18
+ "Dunkel Beer"
19
+ end
20
+
21
+ def self.table_name
22
+ "dunkel_beers"
23
+ end
24
+ end
25
+
26
+ class DarkBeerCollection < ActiveCollection::Base
27
+ model "DunkelBeer"
28
+ end
29
+
30
+ class BrokenCollection < ActiveCollection::Base
31
+ end
32
+
33
+ describe ActiveCollection do
34
+ context "(with standard name)" do
35
+ subject { BeerCollection.new }
36
+
37
+ it "has the correct model_class" do
38
+ subject.model_class.should == Beer
39
+ end
40
+
41
+ it "retrieves table_name from member class" do
42
+ subject.table_name.should == "beers"
43
+ end
44
+
45
+ it "retrieves human_name from member class and pluralizes" do
46
+ subject.human_name(:locale => 'en-us').should == "Beers"
47
+ end
48
+ end
49
+
50
+ context "(with model)" do
51
+ subject { DarkBeerCollection.new }
52
+
53
+ it "uses the correct model class" do
54
+ subject.model_class.should == DunkelBeer
55
+ end
56
+
57
+ it "doesn't affect other classes" do
58
+ BeerCollection.new.model_class.should == Beer
59
+ end
60
+
61
+ it "retrieves table_name from member class" do
62
+ subject.table_name.should == "dunkel_beers"
63
+ end
64
+
65
+ it "retrieves human_name from member class and pluralizes" do
66
+ subject.human_name(:locale => 'en-us').should == "Dunkel Beers"
67
+ end
68
+ end
69
+
70
+ context "(broken name)" do
71
+ subject { BrokenCollection.new }
72
+
73
+ it "raises a useful error when usage is attempted" do
74
+ message = "No exception raised."
75
+ begin
76
+ subject.model_class
77
+ rescue NameError => e
78
+ message = e.to_s
79
+ end
80
+ message.should =~ /Use 'model "Class"' in the collection to declare the correct model class for BrokenCollection/
81
+ message.should =~ /uninitialized constant Broken/
82
+ end
83
+ end
84
+ end
@@ -52,7 +52,7 @@ describe ActiveCollection do
52
52
 
53
53
  it_should_behave_like "an empty collection"
54
54
 
55
- it "should be out of bounds" do
55
+ it "is out of bounds" do
56
56
  subject.should be_out_of_bounds
57
57
  end
58
58
 
@@ -70,7 +70,7 @@ describe ActiveCollection do
70
70
  end
71
71
  end
72
72
 
73
- context "(simple collection with 5 records)" do
73
+ context "(with 5 records)" do
74
74
  def records
75
75
  @records ||= begin
76
76
  beers = []
@@ -113,6 +113,16 @@ describe ActiveCollection do
113
113
  subject.total_entries
114
114
  end
115
115
 
116
+ it "raises on attempt to force paginate after already loaded" do
117
+ subject.to_a
118
+ subject.should be_loaded
119
+ lambda { subject.paginate! }.should raise_error(ActiveCollection::AlreadyLoadedError)
120
+ end
121
+
122
+ it "returns the same record on 'soft' paginate when already paginated" do
123
+ subject.paginate.should == subject
124
+ end
125
+
116
126
  it "yields 5 items to each" do
117
127
  count = 0
118
128
  subject.each { |i| count += 1 }
@@ -163,6 +173,7 @@ describe ActiveCollection do
163
173
  Beer.should_receive(:all).with(:limit => ActiveCollection::Base.per_page, :offset => 0).and_return(records)
164
174
  subject.length
165
175
  end
176
+
166
177
  end
167
178
  end
168
179
 
@@ -230,7 +241,7 @@ describe ActiveCollection do
230
241
  end
231
242
 
232
243
  it "calls count to find total_entries even when collection is loaded" do
233
- subject.length
244
+ subject.to_a
234
245
  Beer.should_receive(:count).and_return(5)
235
246
  subject.total_entries.should == 5
236
247
  end
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ class Beer
4
+ def self.human_name(*args)
5
+ "Beer"
6
+ end
7
+
8
+ def self.all(*args)
9
+ [Beer.new, Beer.new]
10
+ end
11
+ end
12
+
13
+ class BeerCollection < ActiveCollection::Base
14
+ end
15
+
16
+ describe ActiveCollection, "(proxying)" do
17
+ subject { BeerCollection.new }
18
+
19
+ it "responds to array methods" do
20
+ subject.should respond_to(:map)
21
+ subject.should respond_to(:slice)
22
+ end
23
+
24
+ it "loads the collection when sending array methods" do
25
+ Beer.should_receive(:all).and_return([Beer.new])
26
+ subject.send(:slice, 0).should_not be_nil
27
+ end
28
+
29
+ it "responds to its own instance methods" do
30
+ subject.should respond_to(:loaded?)
31
+ subject.should respond_to(:empty?)
32
+ end
33
+
34
+ it "doesn't load the collection when sending collection methods" do
35
+ Beer.should_not_receive(:all)
36
+ subject.send(:loaded?).should be_false
37
+ end
38
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_collection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Emde
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-16 00:00:00 -07:00
12
+ date: 2009-10-12 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -41,14 +41,18 @@ files:
41
41
  - active_collection.gemspec
42
42
  - lib/active_collection.rb
43
43
  - lib/active_collection/base.rb
44
+ - lib/active_collection/conditions.rb
44
45
  - lib/active_collection/includes.rb
45
46
  - lib/active_collection/member_class.rb
47
+ - lib/active_collection/new_scope.rb
46
48
  - lib/active_collection/order.rb
47
49
  - lib/active_collection/pagination.rb
48
50
  - lib/active_collection/scope.rb
49
51
  - lib/active_collection/serialization.rb
50
- - spec/active_collection_spec.rb
52
+ - spec/base_spec.rb
53
+ - spec/member_class_spec.rb
51
54
  - spec/pagination_spec.rb
55
+ - spec/proxy_spec.rb
52
56
  - spec/spec.opts
53
57
  - spec/spec_helper.rb
54
58
  has_rdoc: true
@@ -80,6 +84,8 @@ signing_key:
80
84
  specification_version: 3
81
85
  summary: A lazy-loading, Array-like collection proxy for ActiveRecord that understands conditions and paging.
82
86
  test_files:
83
- - spec/active_collection_spec.rb
87
+ - spec/base_spec.rb
88
+ - spec/member_class_spec.rb
84
89
  - spec/pagination_spec.rb
90
+ - spec/proxy_spec.rb
85
91
  - spec/spec_helper.rb