active_collection 0.2.1 → 0.2.3

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: 1
2
+ :patch: 3
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.1"
8
+ s.version = "0.2.3"
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-14}
12
+ s.date = %q{2009-09-16}
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 = [
@@ -27,9 +27,11 @@ Gem::Specification.new do |s|
27
27
  "lib/active_collection.rb",
28
28
  "lib/active_collection/base.rb",
29
29
  "lib/active_collection/includes.rb",
30
+ "lib/active_collection/member_class.rb",
30
31
  "lib/active_collection/order.rb",
31
32
  "lib/active_collection/pagination.rb",
32
33
  "lib/active_collection/scope.rb",
34
+ "lib/active_collection/serialization.rb",
33
35
  "spec/active_collection_spec.rb",
34
36
  "spec/pagination_spec.rb",
35
37
  "spec/spec.opts",
@@ -4,10 +4,12 @@ require 'active_support'
4
4
 
5
5
  module ActiveCollection
6
6
  autoload :Base, 'active_collection/base'
7
+ autoload :MemberClass, 'active_collection/member_class'
7
8
  autoload :Scope, 'active_collection/scope'
8
9
  autoload :Order, 'active_collection/order'
9
10
  autoload :Includes, 'active_collection/includes'
10
11
  autoload :Pagination, 'active_collection/pagination'
12
+ autoload :Serialization, 'active_collection/serialization'
11
13
 
12
14
  Base
13
15
  end
@@ -37,30 +37,6 @@ module ActiveCollection
37
37
  proxy_respond_to?(*args) || collection.respond_to?(*args)
38
38
  end
39
39
 
40
- def self.model_class
41
- @model_class ||= name.sub(/Collection$/,'').constantize
42
- end
43
-
44
- def model_class
45
- self.class.model_class
46
- end
47
-
48
- def self.table_name
49
- model_class.table_name
50
- end
51
-
52
- def table_name
53
- self.class.table_name
54
- end
55
-
56
- def self.human_name
57
- table_name.gsub(/_/,' ')
58
- end
59
-
60
- def human_name
61
- self.class.human_name
62
- end
63
-
64
40
  # Forwards <tt>===</tt> explicitly to the collection because the instance method
65
41
  # removal above doesn't catch it. Loads the collection if needed.
66
42
  def ===(other)
@@ -75,36 +51,6 @@ module ActiveCollection
75
51
  end
76
52
  end
77
53
 
78
- # Turn the params into a hash suitable for passing the collection directly as an arg to a named path.
79
- def to_param
80
- params.empty?? nil : params.to_param
81
- end
82
-
83
- def as_data_hash
84
- data_hash = { "collection" => collection.as_json }
85
- data_hash["total_entries"] = total_entries
86
- data_hash
87
- end
88
-
89
- def to_xml(options = {})
90
- collect
91
- options[:indent] ||= 2
92
- xml = options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
93
- xml.instruct! unless options[:skip_instruct]
94
- xml.tag!(table_name) do
95
- xml.total_entries(total_entries, :type => "integer")
96
- xml.collection(:type => "array") do
97
- collection.each do |item|
98
- item.to_xml(:indent => options[:indent], :builder => xml, :skip_instruct => true)
99
- end
100
- end
101
- end
102
- end
103
-
104
- def as_json(options = nil)
105
- {table_name => as_data_hash}.as_json(options)
106
- end
107
-
108
54
  # Implements Enumerable
109
55
  def each(&block)
110
56
  collection.each(&block)
@@ -191,23 +137,11 @@ module ActiveCollection
191
137
  def raise_if_loaded
192
138
  raise AlreadyLoadedError, "Cannot modify a collection that has already been loaded." if loaded?
193
139
  end
194
-
195
- # Extracted from AR:B
196
- # Object#to_a is deprecated, though it does have the desired behavior
197
- def safe_to_array(o)
198
- case o
199
- when NilClass
200
- []
201
- when Array
202
- o
203
- else
204
- [o]
205
- end
206
- end
207
140
  end
208
141
 
209
142
  Base.class_eval do
143
+ include MemberClass
210
144
  include Scope
211
- include Includes, Order, Pagination
145
+ include Includes, Order, Pagination, Serialization
212
146
  end
213
147
  end
@@ -0,0 +1,33 @@
1
+ module ActiveCollection
2
+ module MemberClass
3
+ def self.included(mod)
4
+ mod.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def model_class
9
+ @model_class ||= name.sub(/Collection$/,'').constantize
10
+ end
11
+
12
+ def table_name
13
+ model_class.table_name
14
+ end
15
+
16
+ def human_name(*args)
17
+ model_class.human_name(*args).pluralize
18
+ end
19
+ end
20
+
21
+ def model_class
22
+ self.class.model_class
23
+ end
24
+
25
+ def table_name
26
+ self.class.table_name
27
+ end
28
+
29
+ def human_name(*args)
30
+ self.class.human_name(*args)
31
+ end
32
+ end
33
+ end
@@ -31,7 +31,13 @@ module ActiveCollection
31
31
  # Loads total entries and calculates the size from that.
32
32
  def size_with_pagination
33
33
  if paginated?
34
- last_page?? size_without_pagination % per_page : per_page
34
+ if out_of_bounds?
35
+ 0
36
+ elsif last_page?
37
+ size_without_pagination % per_page
38
+ else
39
+ per_page
40
+ end
35
41
  else
36
42
  size_without_pagination
37
43
  end
@@ -92,7 +98,7 @@ module ActiveCollection
92
98
  #
93
99
  # may load total_entries if not already loaded.
94
100
  def last_page?
95
- next_page.nil?
101
+ !out_of_bounds? && next_page.nil?
96
102
  end
97
103
 
98
104
  # New Collection for current_page - 1 or nil.
@@ -0,0 +1,34 @@
1
+ module ActiveCollection
2
+ module Serialization
3
+ # Turn the params into a hash suitable such that passing the collection
4
+ # directly to a named path generates the path for the current collection.
5
+ def to_param
6
+ params.empty?? nil : params.to_param
7
+ end
8
+
9
+ def as_data_hash
10
+ data_hash = { table_name => collection.as_json }
11
+ data_hash["total_entries"] = total_entries
12
+ data_hash
13
+ end
14
+
15
+ def to_xml(options = {})
16
+ collect
17
+ options[:indent] ||= 2
18
+ xml = options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
19
+ xml.instruct! unless options[:skip_instruct]
20
+ xml.collection do
21
+ xml.total_entries(total_entries, :type => "integer")
22
+ xml.tag!(table_name, :type => "array") do
23
+ collection.each do |item|
24
+ item.to_xml(:indent => options[:indent], :builder => xml, :skip_instruct => true)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ def as_json(options = nil)
31
+ {"collection" => as_data_hash}.as_json(options)
32
+ end
33
+ end
34
+ end
@@ -4,11 +4,18 @@ class BeerCollection < ActiveCollection::Base
4
4
  end
5
5
 
6
6
  class Beer
7
+ def self.human_name(*args)
8
+ "Beer"
9
+ end
7
10
  end
8
11
 
9
12
  describe ActiveCollection do
10
13
  subject { BeerCollection.new }
11
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
+
12
19
  context "(empty)" do
13
20
  describe "(count methods)" do
14
21
  before do
@@ -59,6 +59,14 @@ describe ActiveCollection do
59
59
  it "is on page 2" do
60
60
  subject.current_page.should == 2
61
61
  end
62
+
63
+ it "is empty" do
64
+ subject.should be_empty
65
+ end
66
+
67
+ it "has 0 size" do
68
+ subject.size.should == 0
69
+ end
62
70
  end
63
71
  end
64
72
 
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.1
4
+ version: 0.2.3
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-14 00:00:00 -07:00
12
+ date: 2009-09-16 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -42,9 +42,11 @@ files:
42
42
  - lib/active_collection.rb
43
43
  - lib/active_collection/base.rb
44
44
  - lib/active_collection/includes.rb
45
+ - lib/active_collection/member_class.rb
45
46
  - lib/active_collection/order.rb
46
47
  - lib/active_collection/pagination.rb
47
48
  - lib/active_collection/scope.rb
49
+ - lib/active_collection/serialization.rb
48
50
  - spec/active_collection_spec.rb
49
51
  - spec/pagination_spec.rb
50
52
  - spec/spec.opts