ares-ext 0.0.1
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.
- data/.gitignore +8 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +20 -0
- data/README.md +4 -0
- data/Rakefile +16 -0
- data/active_resource_extensions.gemspec +24 -0
- data/lib/active_resource_extensions/resource_with_schema.rb +69 -0
- data/lib/active_resource_extensions/searchable_resource/collection.rb +44 -0
- data/lib/active_resource_extensions/searchable_resource/search.rb +61 -0
- data/lib/active_resource_extensions/searchable_resource.rb +22 -0
- data/lib/active_resource_extensions.rb +4 -0
- data/spec/active_resource_extensions/resource_with_schema_spec.rb +168 -0
- data/spec/active_resource_extensions/searchable_resource_spec/collection_spec.rb +60 -0
- data/spec/active_resource_extensions/searchable_resource_spec/search_spec.rb +124 -0
- data/spec/active_resource_extensions/searchable_resource_spec.rb +31 -0
- data/spec/spec_helper.rb +3 -0
- metadata +118 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
active_resource_extensions (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
activeresource (2.3.5)
|
10
|
+
activesupport (= 2.3.5)
|
11
|
+
activesupport (2.3.5)
|
12
|
+
rspec (1.3.2)
|
13
|
+
|
14
|
+
PLATFORMS
|
15
|
+
ruby
|
16
|
+
|
17
|
+
DEPENDENCIES
|
18
|
+
active_resource_extensions!
|
19
|
+
activeresource (= 2.3.5)
|
20
|
+
rspec (~> 1.3.1)
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
Bundler.setup
|
4
|
+
#require 'appraisal'
|
5
|
+
|
6
|
+
require 'spec/rake/spectask'
|
7
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
8
|
+
spec.libs << 'lib' << 'spec'
|
9
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
10
|
+
end
|
11
|
+
|
12
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
13
|
+
spec.libs << 'lib' << 'spec'
|
14
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
15
|
+
spec.rcov = true
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.authors = ["Benoît Dinocourt"]
|
5
|
+
gem.email = ["ghrind@gmail.com"]
|
6
|
+
gem.description = "Make activeresource model compatible with will_paginate and searchlogic helpers, and add a schema feature"
|
7
|
+
gem.summary = gem.description
|
8
|
+
gem.homepage = "http://github.com/Ghrind/active_resource_extensions"
|
9
|
+
|
10
|
+
gem.files = `git ls-files`.split($\)
|
11
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
12
|
+
gem.name = "ares-ext"
|
13
|
+
gem.require_paths = ["lib"]
|
14
|
+
gem.version = '0.0.1'
|
15
|
+
|
16
|
+
#gem.extra_rdoc_files = [
|
17
|
+
# "LICENSE",
|
18
|
+
# "README.rdoc"
|
19
|
+
#]
|
20
|
+
# gem.date = %q{2011-08-15}
|
21
|
+
|
22
|
+
gem.add_development_dependency 'rspec', '~> 1.3.1'
|
23
|
+
gem.add_development_dependency 'activeresource', '2.3.5'
|
24
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module ActiveResourceExtensions
|
2
|
+
# Get schema from webservice, detect missing attributes and cast known attributes appropriately
|
3
|
+
module ResourceWithSchema
|
4
|
+
|
5
|
+
def self.included base
|
6
|
+
base.extend ClassMethods
|
7
|
+
base.send :include, InstanceMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
|
12
|
+
def is_attribute? name
|
13
|
+
schema.keys.include? name.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def attribute_type name
|
17
|
+
schema[name.to_s]
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def schema
|
23
|
+
@schema ||= {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def schema= new_schema
|
27
|
+
@schema = new_schema
|
28
|
+
end
|
29
|
+
|
30
|
+
def load_remote_schema
|
31
|
+
self.schema = get( :schema )
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
module InstanceMethods
|
37
|
+
def method_missing name, *args, &block
|
38
|
+
if self.class.is_attribute? name
|
39
|
+
value = attributes[name.to_s]
|
40
|
+
return if value.nil?
|
41
|
+
if self.class.is_attribute? name
|
42
|
+
case self.class.attribute_type name
|
43
|
+
when 'Time'
|
44
|
+
Time.parse value
|
45
|
+
when 'Integer'
|
46
|
+
value.to_i
|
47
|
+
when 'Float'
|
48
|
+
value.to_f
|
49
|
+
when 'Boolean'
|
50
|
+
[true, 1, '1'].include? value
|
51
|
+
when ''
|
52
|
+
value
|
53
|
+
else
|
54
|
+
begin
|
55
|
+
self.class.attribute_type( name ).constantize.new value
|
56
|
+
rescue ArgumentError, NameError
|
57
|
+
raise ArgumentError, "Can't cast #{value.inspect} into #{self.class.attribute_type( name )}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
else
|
61
|
+
return value
|
62
|
+
end
|
63
|
+
else
|
64
|
+
super name, *args, &block
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module ActiveResourceExtensions
|
2
|
+
|
3
|
+
module SearchableResource
|
4
|
+
|
5
|
+
# Proxy of an Array compatible with will_paginate
|
6
|
+
class Collection
|
7
|
+
instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$)/ }
|
8
|
+
|
9
|
+
attr_reader :current_page, :total_entries, :per_page
|
10
|
+
|
11
|
+
def initialize target, current_page, per_page, total_entries
|
12
|
+
@target = target
|
13
|
+
@current_page = current_page
|
14
|
+
@per_page = per_page
|
15
|
+
@total_entries = total_entries
|
16
|
+
end
|
17
|
+
|
18
|
+
def total_pages
|
19
|
+
( total_entries.to_f / @per_page ).ceil
|
20
|
+
end
|
21
|
+
|
22
|
+
def previous_page
|
23
|
+
current_page == 1 ? nil : ( current_page - 1 )
|
24
|
+
end
|
25
|
+
|
26
|
+
def next_page
|
27
|
+
current_page == total_pages ? nil : ( current_page + 1 )
|
28
|
+
end
|
29
|
+
|
30
|
+
def target
|
31
|
+
@target ||= []
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def method_missing(name, *args, &block)
|
37
|
+
target.send(name, *args, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module ActiveResourceExtensions
|
2
|
+
|
3
|
+
module SearchableResource
|
4
|
+
|
5
|
+
class Search
|
6
|
+
|
7
|
+
DEFAULT_PAGE = 1
|
8
|
+
DEFAULT_PER_PAGE = 10
|
9
|
+
|
10
|
+
attr_reader :conditions
|
11
|
+
|
12
|
+
def initialize model, conditions = {}
|
13
|
+
@model = model
|
14
|
+
@conditions = conditions
|
15
|
+
end
|
16
|
+
|
17
|
+
def paginate pagination_options = {}
|
18
|
+
# Get the parameters corresponding to the search options
|
19
|
+
params = parse_conditions @conditions
|
20
|
+
|
21
|
+
total_entries = @model.count params
|
22
|
+
|
23
|
+
# Manage pagination
|
24
|
+
params[:page] = ( pagination_options[:page] || DEFAULT_PAGE ).to_i
|
25
|
+
params[:per_page] = ( pagination_options[:per_page] || DEFAULT_PER_PAGE ).to_i
|
26
|
+
|
27
|
+
SearchableResource::Collection.new @model.find( :all, :params => params ), params[:page], params[:per_page], total_entries
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
# TODO We can add custom search options here
|
33
|
+
def parse_conditions conditions
|
34
|
+
|
35
|
+
# By default all empty options are removed
|
36
|
+
params = conditions.delete_if{ |k, v| v.blank? }
|
37
|
+
|
38
|
+
params
|
39
|
+
end
|
40
|
+
|
41
|
+
# If
|
42
|
+
def method_missing(name, *args, &block)
|
43
|
+
name.to_s =~ /^([\w]*)(=?)$/
|
44
|
+
attr = $1.to_sym
|
45
|
+
|
46
|
+
ignore_attribute = ! @model.respond_to?( :is_attribute? )
|
47
|
+
|
48
|
+
if ignore_attribute or @model.is_attribute?( attr )
|
49
|
+
if $2 == '='
|
50
|
+
@conditions[attr]= args.first
|
51
|
+
else
|
52
|
+
@conditions[attr]
|
53
|
+
end
|
54
|
+
else
|
55
|
+
super name, *args, &block
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ActiveResourceExtensions
|
2
|
+
# Add search and pagination features to ActiveResource models
|
3
|
+
module SearchableResource
|
4
|
+
|
5
|
+
def self.included base
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
def search_for options = {}
|
12
|
+
SearchableResource::Search.new self, options
|
13
|
+
end
|
14
|
+
|
15
|
+
def count params = {}
|
16
|
+
get( :count, params )['count'].to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveResourceExtensions::ResourceWithSchema do
|
4
|
+
|
5
|
+
before do
|
6
|
+
class Person < ActiveResource::Base
|
7
|
+
self.site = 'http://test.webservicehost.com'
|
8
|
+
include ActiveResourceExtensions::ResourceWithSchema
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
class ::Object
|
14
|
+
remove_const :Person
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should add a schema method" do
|
19
|
+
Person.respond_to?( :schema ).should be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should have an empty schema" do
|
23
|
+
Person.send( :schema ).should == {}
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should replace schema" do
|
27
|
+
schema = { 'name' => 'String' }
|
28
|
+
Person.send( :schema=, schema )
|
29
|
+
Person.send( :schema ).should == schema
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '::load_remote_schema' do
|
33
|
+
it "should use active_resource get method" do
|
34
|
+
Person.should_receive( :get ).with( :schema )
|
35
|
+
Person.send :load_remote_schema
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should load schema from response" do
|
39
|
+
schema = { 'name' => 'String', 'age' => 'Integer' }
|
40
|
+
Person.should_receive( :get ).with( :schema ).and_return( schema )
|
41
|
+
Person.send :load_remote_schema
|
42
|
+
Person.send( :schema ).should == schema
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '::is_attribute?' do
|
47
|
+
|
48
|
+
before do
|
49
|
+
Person.send( :schema=, { 'name' => 'String', 'age' => 'Integer' } )
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should find attribute when name is a symbol" do
|
53
|
+
Person.is_attribute?( :name ).should be_true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should find attribute when name is a string" do
|
57
|
+
Person.is_attribute?( 'name' ).should be_true
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should return false if attribute doesn't exists" do
|
61
|
+
Person.is_attribute?( 'firstname' ).should be_false
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '::attribute_type?' do
|
66
|
+
|
67
|
+
before do
|
68
|
+
Person.send( :schema=, { 'name' => 'String', 'age' => 'Integer' } )
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should return attribute's type when name is a string" do
|
72
|
+
Person.attribute_type( 'name' ).should == 'String'
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should return attribute's type when name is a symbol" do
|
76
|
+
Person.attribute_type( :name ).should == 'String'
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should return nil if attribute is unknown" do
|
80
|
+
Person.attribute_type( :firstname ).should == nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '.method_missing' do
|
85
|
+
|
86
|
+
before do
|
87
|
+
Person.send( :schema=, {
|
88
|
+
'name' => 'String',
|
89
|
+
'age' => 'Integer',
|
90
|
+
'created_at' => 'Time',
|
91
|
+
'is_musician' => 'Boolean',
|
92
|
+
'height' => 'Float',
|
93
|
+
'unknown_1' => 'Company',
|
94
|
+
'unknown_2' => ''
|
95
|
+
} )
|
96
|
+
end
|
97
|
+
|
98
|
+
context "when method is not an attribute name" do
|
99
|
+
|
100
|
+
before do
|
101
|
+
@person = Person.new
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should have default behavior" do
|
105
|
+
lambda do
|
106
|
+
@person.firstname
|
107
|
+
end.should raise_error NoMethodError
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "when method is an attribute name" do
|
112
|
+
|
113
|
+
context "when attribute has not been loaded" do
|
114
|
+
|
115
|
+
before do
|
116
|
+
@person = Person.new
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should return nil" do
|
120
|
+
@person.name.should be_nil
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "when attribute has been loaded" do
|
125
|
+
|
126
|
+
before do
|
127
|
+
@person = Person.new(
|
128
|
+
:name => 'John',
|
129
|
+
:age => '26',
|
130
|
+
:height => '5.3',
|
131
|
+
:is_musician => '1',
|
132
|
+
:created_at => '2012-05-01 23:15:12',
|
133
|
+
:unknown_1 => 'a',
|
134
|
+
:unknown_2 => 'b' )
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should cast value appropriately" do
|
138
|
+
@person.name.should == 'John'
|
139
|
+
@person.age.should == 26
|
140
|
+
@person.height.should == 5.3
|
141
|
+
@person.is_musician.should == true
|
142
|
+
@person.created_at.should == Time.parse('2012-05-01 23:15:12')
|
143
|
+
|
144
|
+
for value in [ '0', 0, false, 'true' ]
|
145
|
+
person = Person.new( :is_musician => value )
|
146
|
+
if person.is_musician != false
|
147
|
+
violated "#{value.inspect} should be cast as false"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should raise an ArgumentError if casting cannot be made" do
|
154
|
+
lambda do
|
155
|
+
@person.unknown_1
|
156
|
+
end.should raise_error ArgumentError
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should return value if attribute type is an empty string" do
|
160
|
+
@person.unknown_2.should == 'b'
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveResourceExtensions::SearchableResource::Collection do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@collection = ActiveResourceExtensions::SearchableResource::Collection.new [], 2, 10, 51
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '.total_pages' do
|
10
|
+
it "should return correct page number" do
|
11
|
+
@collection.total_pages.should == 6
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '.previous_page' do
|
16
|
+
|
17
|
+
context "when at the first page" do
|
18
|
+
|
19
|
+
before do
|
20
|
+
@collection = ActiveResourceExtensions::SearchableResource::Collection.new [], 1, 10, 51
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return nil" do
|
24
|
+
@collection.previous_page.should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when not at the first page" do
|
30
|
+
|
31
|
+
it "should return correct page number" do
|
32
|
+
@collection.previous_page.should == 1
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '.next_page' do
|
39
|
+
context "when at the last page" do
|
40
|
+
|
41
|
+
before do
|
42
|
+
@collection = ActiveResourceExtensions::SearchableResource::Collection.new [], 6, 10, 51
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should return nil" do
|
46
|
+
@collection.next_page.should be_nil
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
context "when not at the last page" do
|
52
|
+
|
53
|
+
it "should return correct page number" do
|
54
|
+
@collection.next_page.should == 3
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveResourceExtensions::SearchableResource::Search do
|
4
|
+
|
5
|
+
before do
|
6
|
+
class Person < ActiveResource::Base
|
7
|
+
self.site = 'http://test.webservicehost.com'
|
8
|
+
include ActiveResourceExtensions::SearchableResource
|
9
|
+
end
|
10
|
+
@search = Person.search_for
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
class ::Object
|
15
|
+
remove_const :Person
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.method_missing' do
|
20
|
+
context "when class has a schema" do
|
21
|
+
|
22
|
+
before do
|
23
|
+
Person.send :include, ActiveResourceExtensions::ResourceWithSchema
|
24
|
+
Person.send :schema=, 'name' => 'String', 'age' => 'Integer'
|
25
|
+
@search = Person.search_for
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when method name is a known attribute" do
|
29
|
+
|
30
|
+
it "should set condition" do
|
31
|
+
@search.age = 26
|
32
|
+
@search.conditions[:age].should == 26
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should get condition" do
|
36
|
+
@search.instance_variable_set :@conditions, :age => 26
|
37
|
+
@search.age.should == 26
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when method name is not an attribute" do
|
43
|
+
it "should have default behavior" do
|
44
|
+
lambda do
|
45
|
+
@search.firstname
|
46
|
+
end.should raise_error NoMethodError
|
47
|
+
|
48
|
+
lambda do
|
49
|
+
@search.firstname= 'bob'
|
50
|
+
end.should raise_error NoMethodError
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when class has no schema" do
|
56
|
+
it "should set condition" do
|
57
|
+
@search.firstname = 'bob'
|
58
|
+
@search.conditions[:firstname].should == 'bob'
|
59
|
+
end
|
60
|
+
it "should get condition" do
|
61
|
+
@search.firstname.should be_nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '.parse_conditions' do
|
67
|
+
it "should remove empty conditions" do
|
68
|
+
@search.send( :parse_conditions, :name_like => 'john', :age => '' ).should == { :name_like => 'john' }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '.paginate' do
|
73
|
+
|
74
|
+
it "should parse conditions" do
|
75
|
+
@search.name_like = 'john'
|
76
|
+
@search.age = ''
|
77
|
+
|
78
|
+
@search.should_receive( :parse_conditions ).with( :name_like => 'john', :age => '' ).and_return :name_like => 'john'
|
79
|
+
|
80
|
+
Person.should_receive( :count).with( { :name_like => 'john' } ).and_return 0
|
81
|
+
Person.should_receive( :find ).with( :all, :params => { :page => 1, :per_page => 10, :name_like => 'john' } ).and_return []
|
82
|
+
|
83
|
+
@search.paginate
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should set collection 'current_page' attribute" do
|
87
|
+
Person.should_receive( :count).with( {} ).and_return 0
|
88
|
+
Person.should_receive( :find ).with( :all, :params => { :page => 5, :per_page => 10 } ).and_return []
|
89
|
+
@search.paginate( :page => 5 ).current_page.should == 5
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should set collection 'per_page' attribute" do
|
93
|
+
Person.should_receive( :count).with( {} ).and_return 0
|
94
|
+
Person.should_receive( :find ).with( :all, :params => { :page => 1, :per_page => 100 } ).and_return []
|
95
|
+
@search.paginate( :per_page => 100 ).per_page.should == 100
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "returned object" do
|
99
|
+
|
100
|
+
before do
|
101
|
+
@dataset = [Person.new, Person.new]
|
102
|
+
Person.should_receive( :count).with( anything ).and_return 2
|
103
|
+
Person.should_receive( :find ).with( :all, anything ).and_return @dataset
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should use default if 'page' option is missing" do
|
107
|
+
@search.paginate.current_page.should == 1
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should use default if 'per_page' option is missing" do
|
111
|
+
@search.paginate.per_page.should == 10
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should set collection 'target' attribute" do
|
115
|
+
@search.paginate.target.should == @dataset
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should set collection 'total_entries' attribute" do
|
119
|
+
@search.paginate.total_entries.should == 2
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveResourceExtensions::SearchableResource do
|
4
|
+
|
5
|
+
before do
|
6
|
+
class Person < ActiveResource::Base
|
7
|
+
self.site = 'http://test.webservicehost.com'
|
8
|
+
include ActiveResourceExtensions::SearchableResource
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
class ::Object
|
14
|
+
remove_const :Person
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#search_for' do
|
19
|
+
it "should return an instance of ActiveResourceExtensions::SearchableResource::Search" do
|
20
|
+
Person.search_for.class.name.should == "ActiveResourceExtensions::SearchableResource::Search"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#count' do
|
25
|
+
it "should return an integer with the count" do
|
26
|
+
Person.should_receive( :get ).with( :count, {} ).and_return({ 'count' => '3' })
|
27
|
+
Person.count.should == 3
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ares-ext
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Beno\xC3\xAEt Dinocourt"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-05-23 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 25
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 3
|
33
|
+
- 1
|
34
|
+
version: 1.3.1
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: activeresource
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - "="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 9
|
46
|
+
segments:
|
47
|
+
- 2
|
48
|
+
- 3
|
49
|
+
- 5
|
50
|
+
version: 2.3.5
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
description: Make activeresource model compatible with will_paginate and searchlogic helpers, and add a schema feature
|
54
|
+
email:
|
55
|
+
- ghrind@gmail.com
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files: []
|
61
|
+
|
62
|
+
files:
|
63
|
+
- .gitignore
|
64
|
+
- Gemfile
|
65
|
+
- Gemfile.lock
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- active_resource_extensions.gemspec
|
69
|
+
- lib/active_resource_extensions.rb
|
70
|
+
- lib/active_resource_extensions/resource_with_schema.rb
|
71
|
+
- lib/active_resource_extensions/searchable_resource.rb
|
72
|
+
- lib/active_resource_extensions/searchable_resource/collection.rb
|
73
|
+
- lib/active_resource_extensions/searchable_resource/search.rb
|
74
|
+
- spec/active_resource_extensions/resource_with_schema_spec.rb
|
75
|
+
- spec/active_resource_extensions/searchable_resource_spec.rb
|
76
|
+
- spec/active_resource_extensions/searchable_resource_spec/collection_spec.rb
|
77
|
+
- spec/active_resource_extensions/searchable_resource_spec/search_spec.rb
|
78
|
+
- spec/spec_helper.rb
|
79
|
+
has_rdoc: true
|
80
|
+
homepage: http://github.com/Ghrind/active_resource_extensions
|
81
|
+
licenses: []
|
82
|
+
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options: []
|
85
|
+
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 3
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
version: "0"
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
hash: 3
|
103
|
+
segments:
|
104
|
+
- 0
|
105
|
+
version: "0"
|
106
|
+
requirements: []
|
107
|
+
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 1.6.1
|
110
|
+
signing_key:
|
111
|
+
specification_version: 3
|
112
|
+
summary: Make activeresource model compatible with will_paginate and searchlogic helpers, and add a schema feature
|
113
|
+
test_files:
|
114
|
+
- spec/active_resource_extensions/resource_with_schema_spec.rb
|
115
|
+
- spec/active_resource_extensions/searchable_resource_spec.rb
|
116
|
+
- spec/active_resource_extensions/searchable_resource_spec/collection_spec.rb
|
117
|
+
- spec/active_resource_extensions/searchable_resource_spec/search_spec.rb
|
118
|
+
- spec/spec_helper.rb
|