ares-ext 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ doc/*
6
6
  benchmarks/*
7
7
  .bundle
8
8
  vendor
9
+ .yardoc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_resource_extensions (0.0.1)
4
+ ares-ext (0.0.2)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -9,12 +9,20 @@ GEM
9
9
  activeresource (2.3.5)
10
10
  activesupport (= 2.3.5)
11
11
  activesupport (2.3.5)
12
+ addressable (2.2.8)
13
+ crack (0.3.1)
14
+ rcov (1.0.0)
12
15
  rspec (1.3.2)
16
+ webmock (1.7.6)
17
+ addressable (~> 2.2, > 2.2.5)
18
+ crack (>= 0.1.7)
13
19
 
14
20
  PLATFORMS
15
21
  ruby
16
22
 
17
23
  DEPENDENCIES
18
- active_resource_extensions!
19
24
  activeresource (= 2.3.5)
25
+ ares-ext!
26
+ rcov
20
27
  rspec (~> 1.3.1)
28
+ webmock (= 1.7.6)
data/Rakefile CHANGED
@@ -13,4 +13,5 @@ Spec::Rake::SpecTask.new(:rcov) do |spec|
13
13
  spec.libs << 'lib' << 'spec'
14
14
  spec.pattern = 'spec/**/*_spec.rb'
15
15
  spec.rcov = true
16
+ spec.rcov_opts += ['--exclude', 'spec']
16
17
  end
@@ -1,9 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |gem|
4
- gem.authors = ["Benoît Dinocourt"]
4
+ gem.authors = ["Benoit Dinocourt"]
5
5
  gem.email = ["ghrind@gmail.com"]
6
- gem.description = "Make activeresource model compatible with will_paginate and searchlogic helpers, and add a schema feature"
6
+ gem.description = "Make activeresource models compatible with will_paginate and searchlogic helpers, and add a schema feature"
7
7
  gem.summary = gem.description
8
8
  gem.homepage = "http://github.com/Ghrind/active_resource_extensions"
9
9
 
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
12
12
  gem.name = "ares-ext"
13
13
  gem.require_paths = ["lib"]
14
- gem.version = '0.0.1'
14
+ gem.version = '0.0.3'
15
15
 
16
16
  #gem.extra_rdoc_files = [
17
17
  # "LICENSE",
@@ -21,4 +21,6 @@ Gem::Specification.new do |gem|
21
21
 
22
22
  gem.add_development_dependency 'rspec', '~> 1.3.1'
23
23
  gem.add_development_dependency 'activeresource', '2.3.5'
24
+ gem.add_development_dependency 'rcov'
25
+ gem.add_development_dependency 'webmock', '1.7.6'
24
26
  end
@@ -20,15 +20,15 @@ module ActiveResourceExtensions
20
20
  protected
21
21
 
22
22
  def schema
23
- @schema ||= {}
23
+ @schema ||= remote_schema
24
24
  end
25
25
 
26
26
  def schema= new_schema
27
27
  @schema = new_schema
28
28
  end
29
29
 
30
- def load_remote_schema
31
- self.schema = get( :schema )
30
+ def remote_schema
31
+ get( :schema )
32
32
  end
33
33
 
34
34
  end
@@ -38,27 +38,27 @@ module ActiveResourceExtensions
38
38
  if self.class.is_attribute? name
39
39
  value = attributes[name.to_s]
40
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
41
+ case self.class.attribute_type name
42
+ when 'Time'
43
+ Time.parse value
44
+ when 'Date'
45
+ Date.parse value
46
+ when 'Integer'
47
+ value.to_i
48
+ when 'Float'
49
+ value.to_f
50
+ when 'Boolean'
51
+ [true, 1, '1'].include? value
52
+ when 'ObjectId'
53
+ value.to_s
54
+ when ''
55
+ value
60
56
  else
61
- return value
57
+ begin
58
+ self.class.attribute_type( name ).constantize.new value
59
+ rescue ArgumentError, NameError
60
+ raise ArgumentError, "Can't cast #{value.inspect} into #{self.class.attribute_type( name )}"
61
+ end
62
62
  end
63
63
  else
64
64
  super name, *args, &block
@@ -9,9 +9,24 @@ module ActiveResourceExtensions
9
9
 
10
10
  attr_reader :conditions
11
11
 
12
- def initialize model, conditions = {}
12
+ def initialize model, conditions = nil
13
13
  @model = model
14
- @conditions = conditions
14
+ @conditions = conditions || {}
15
+ end
16
+
17
+ def order
18
+ @conditions[:order]
19
+ end
20
+
21
+ def order= new_order
22
+ @conditions[:order] = new_order
23
+ end
24
+
25
+ # Return all records matching conditions.
26
+ #
27
+ # @return [Array<ActiveResource::Base>] All records matching conditions.
28
+ def all
29
+ @model.find( :all, :params => parse_conditions( @conditions ) )
15
30
  end
16
31
 
17
32
  def paginate pagination_options = {}
@@ -38,18 +53,25 @@ module ActiveResourceExtensions
38
53
  params
39
54
  end
40
55
 
41
- # If
56
+ CONDITIONS_SUFFIXES = %w(
57
+ _greater_than
58
+ _less_than
59
+ _like
60
+ )
61
+
42
62
  def method_missing(name, *args, &block)
43
63
  name.to_s =~ /^([\w]*)(=?)$/
44
- attr = $1.to_sym
64
+ condition_name = $1.to_sym
65
+ operator = $2
66
+ attribute_name = condition_name.to_s.sub(/(#{CONDITIONS_SUFFIXES.join('|')})$/, '').to_sym
45
67
 
46
68
  ignore_attribute = ! @model.respond_to?( :is_attribute? )
47
69
 
48
- if ignore_attribute or @model.is_attribute?( attr )
49
- if $2 == '='
50
- @conditions[attr]= args.first
70
+ if ignore_attribute or @model.is_attribute?( attribute_name )
71
+ if operator == '='
72
+ @conditions[condition_name]= args.first
51
73
  else
52
- @conditions[attr]
74
+ @conditions[condition_name]
53
75
  end
54
76
  else
55
77
  super name, *args, &block
@@ -19,8 +19,22 @@ describe ActiveResourceExtensions::ResourceWithSchema do
19
19
  Person.respond_to?( :schema ).should be_true
20
20
  end
21
21
 
22
- it "should have an empty schema" do
23
- Person.send( :schema ).should == {}
22
+ it "should not have a schema" do
23
+ Person.instance_variable_get( :@schema ).should be_nil
24
+ end
25
+
26
+ describe '::schema' do
27
+ it "should load remote schema" do
28
+ schema = { 'name' => 'String', 'age' => 'Integer' }
29
+ Person.should_receive( :get ).with( :schema ).and_return( schema )
30
+ Person.send( :schema ).should == schema
31
+ end
32
+ it "should memoize schema" do
33
+ schema = { 'name' => 'String', 'age' => 'Integer' }
34
+ Person.should_receive( :get ).with( :schema ).once.and_return( schema )
35
+ Person.send( :schema ).should == schema
36
+ Person.send( :schema ).should == schema
37
+ end
24
38
  end
25
39
 
26
40
  it "should replace schema" do
@@ -29,17 +43,11 @@ describe ActiveResourceExtensions::ResourceWithSchema do
29
43
  Person.send( :schema ).should == schema
30
44
  end
31
45
 
32
- describe '::load_remote_schema' do
46
+ describe '::remote_schema' do
33
47
  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
48
  schema = { 'name' => 'String', 'age' => 'Integer' }
40
49
  Person.should_receive( :get ).with( :schema ).and_return( schema )
41
- Person.send :load_remote_schema
42
- Person.send( :schema ).should == schema
50
+ Person.send( :remote_schema ).should == schema
43
51
  end
44
52
  end
45
53
 
@@ -88,10 +96,12 @@ describe ActiveResourceExtensions::ResourceWithSchema do
88
96
  'name' => 'String',
89
97
  'age' => 'Integer',
90
98
  'created_at' => 'Time',
99
+ 'birth_date' => 'Date',
91
100
  'is_musician' => 'Boolean',
92
101
  'height' => 'Float',
93
102
  'unknown_1' => 'Company',
94
- 'unknown_2' => ''
103
+ 'unknown_2' => '',
104
+ 'company_id' => 'ObjectId'
95
105
  } )
96
106
  end
97
107
 
@@ -127,10 +137,12 @@ describe ActiveResourceExtensions::ResourceWithSchema do
127
137
  @person = Person.new(
128
138
  :name => 'John',
129
139
  :age => '26',
140
+ :birth_date => '1983-07-24',
130
141
  :height => '5.3',
131
142
  :is_musician => '1',
132
143
  :created_at => '2012-05-01 23:15:12',
133
144
  :unknown_1 => 'a',
145
+ :company_id => '4fr654r321',
134
146
  :unknown_2 => 'b' )
135
147
  end
136
148
 
@@ -140,6 +152,8 @@ describe ActiveResourceExtensions::ResourceWithSchema do
140
152
  @person.height.should == 5.3
141
153
  @person.is_musician.should == true
142
154
  @person.created_at.should == Time.parse('2012-05-01 23:15:12')
155
+ @person.birth_date.should == Date.parse('1983-07-24')
156
+ @person.company_id.should == '4fr654r321'
143
157
 
144
158
  for value in [ '0', 0, false, 'true' ]
145
159
  person = Person.new( :is_musician => value )
@@ -6,6 +6,17 @@ describe ActiveResourceExtensions::SearchableResource::Collection do
6
6
  @collection = ActiveResourceExtensions::SearchableResource::Collection.new [], 2, 10, 51
7
7
  end
8
8
 
9
+ describe '.method_missing' do
10
+ it "should proxy every missing method to target" do
11
+ target = []
12
+ @collection = ActiveResourceExtensions::SearchableResource::Collection.new target, 2, 10, 51
13
+ for method_name in %w( class << [] ) do
14
+ target.should_receive( method_name.intern ).and_return nil
15
+ @collection.send method_name.intern
16
+ end
17
+ end
18
+ end
19
+
9
20
  describe '.total_pages' do
10
21
  it "should return correct page number" do
11
22
  @collection.total_pages.should == 6
@@ -16,7 +16,39 @@ describe ActiveResourceExtensions::SearchableResource::Search do
16
16
  end
17
17
  end
18
18
 
19
- describe '.method_missing' do
19
+ describe '.new' do
20
+ it "should never set conditions to nil" do
21
+ search = ActiveResourceExtensions::SearchableResource::Search.new Person
22
+ search.conditions.should_not be_nil
23
+
24
+ search = ActiveResourceExtensions::SearchableResource::Search.new Person, nil
25
+ search.conditions.should_not be_nil
26
+ end
27
+ end
28
+
29
+ describe '#order' do
30
+
31
+ context "when class has a schema" do
32
+
33
+ before do
34
+ Person.send :include, ActiveResourceExtensions::ResourceWithSchema
35
+ Person.send :schema=, 'name' => 'String', 'age' => 'Integer'
36
+ @search = Person.search_for
37
+ end
38
+
39
+ it "should set :order condition" do
40
+ @search.order = 'name'
41
+ @search.conditions[:order].should == 'name'
42
+ end
43
+
44
+ it "should return :order condition" do
45
+ @search.instance_variable_set :@conditions, { :order => 'name' }
46
+ @search.order.should == 'name'
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#method_missing' do
20
52
  context "when class has a schema" do
21
53
 
22
54
  before do
@@ -39,6 +71,36 @@ describe ActiveResourceExtensions::SearchableResource::Search do
39
71
 
40
72
  end
41
73
 
74
+ context "when method name is a known attribute with a valid suffix" do
75
+
76
+ it "should set condition" do
77
+ for suffix in %w( _like _greater_than _less_than )
78
+ @search.send :"age#{suffix}=", 26
79
+ @search.conditions[:"age#{suffix}"].should == 26
80
+ end
81
+ end
82
+
83
+ it "should get condition" do
84
+ for suffix in %w( _like _greater_than _less_than )
85
+ @search.instance_variable_set :@conditions, :"age#{suffix}" => 26
86
+ @search.send( :"age#{suffix}" ).should == 26
87
+ end
88
+ end
89
+
90
+ end
91
+
92
+ context "when method name is a known attribute with a valid suffix" do
93
+ it "should have default behavior" do
94
+ lambda do
95
+ @search.name_looks_like
96
+ end.should raise_error NoMethodError
97
+
98
+ lambda do
99
+ @search.name_looks_like= 'bob'
100
+ end.should raise_error NoMethodError
101
+ end
102
+ end
103
+
42
104
  context "when method name is not an attribute" do
43
105
  it "should have default behavior" do
44
106
  lambda do
@@ -63,13 +125,34 @@ describe ActiveResourceExtensions::SearchableResource::Search do
63
125
  end
64
126
  end
65
127
 
66
- describe '.parse_conditions' do
128
+ describe '#parse_conditions' do
67
129
  it "should remove empty conditions" do
68
130
  @search.send( :parse_conditions, :name_like => 'john', :age => '' ).should == { :name_like => 'john' }
69
131
  end
70
132
  end
71
133
 
72
- describe '.paginate' do
134
+ describe '#all' do
135
+ it "should parse conditions" do
136
+ @search.name_like = 'john'
137
+ @search.age = ''
138
+
139
+ @search.should_receive( :parse_conditions ).with( :name_like => 'john', :age => '' ).and_return :name_like => 'john'
140
+
141
+ Person.should_receive( :find ).with( :all, :params => { :name_like => 'john' } ).and_return []
142
+
143
+ @search.all
144
+ end
145
+
146
+ it "should return an Array" do
147
+
148
+ @people = (1..2).map{ |i| Person.new :id => i }
149
+
150
+ Person.should_receive( :find ).with( :all, :params => { } ).and_return @people
151
+ @search.all.should == @people
152
+ end
153
+ end
154
+
155
+ describe '#paginate' do
73
156
 
74
157
  it "should parse conditions" do
75
158
  @search.name_like = 'john'
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ares-ext
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
- - "Beno\xC3\xAEt Dinocourt"
13
+ - Benoit Dinocourt
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-05-23 00:00:00 +02:00
18
+ date: 2012-06-11 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -50,7 +50,37 @@ dependencies:
50
50
  version: 2.3.5
51
51
  type: :development
52
52
  version_requirements: *id002
53
- description: Make activeresource model compatible with will_paginate and searchlogic helpers, and add a schema feature
53
+ - !ruby/object:Gem::Dependency
54
+ name: rcov
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ type: :development
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: webmock
69
+ prerelease: false
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - "="
74
+ - !ruby/object:Gem::Version
75
+ hash: 7
76
+ segments:
77
+ - 1
78
+ - 7
79
+ - 6
80
+ version: 1.7.6
81
+ type: :development
82
+ version_requirements: *id004
83
+ description: Make activeresource models compatible with will_paginate and searchlogic helpers, and add a schema feature
54
84
  email:
55
85
  - ghrind@gmail.com
56
86
  executables: []
@@ -109,7 +139,7 @@ rubyforge_project:
109
139
  rubygems_version: 1.6.1
110
140
  signing_key:
111
141
  specification_version: 3
112
- summary: Make activeresource model compatible with will_paginate and searchlogic helpers, and add a schema feature
142
+ summary: Make activeresource models compatible with will_paginate and searchlogic helpers, and add a schema feature
113
143
  test_files:
114
144
  - spec/active_resource_extensions/resource_with_schema_spec.rb
115
145
  - spec/active_resource_extensions/searchable_resource_spec.rb