ares-ext 0.0.1 → 0.0.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.
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