api_resource 0.3.13 → 0.3.14

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.13
1
+ 0.3.14
data/api_resource.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "api_resource"
8
- s.version = "0.3.13"
8
+ s.version = "0.3.14"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ethan Langevin"]
12
- s.date = "2012-09-20"
12
+ s.date = "2012-09-24"
13
13
  s.description = "A replacement for ActiveResource for RESTful APIs that handles associated object and multiple data sources"
14
14
  s.email = "ejl6266@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -71,12 +71,15 @@ Gem::Specification.new do |s|
71
71
  "spec/lib/local_spec.rb",
72
72
  "spec/lib/mocks_spec.rb",
73
73
  "spec/lib/model_errors_spec.rb",
74
+ "spec/lib/prefixes_spec.rb",
74
75
  "spec/spec_helper.rb",
75
76
  "spec/support/mocks/association_mocks.rb",
76
77
  "spec/support/mocks/error_resource_mocks.rb",
78
+ "spec/support/mocks/prefix_model_mocks.rb",
77
79
  "spec/support/mocks/test_resource_mocks.rb",
78
80
  "spec/support/requests/association_requests.rb",
79
81
  "spec/support/requests/error_resource_requests.rb",
82
+ "spec/support/requests/prefix_model_requests.rb",
80
83
  "spec/support/requests/test_resource_requests.rb",
81
84
  "spec/support/test_resource.rb",
82
85
  "spec/tmp/DIR"
@@ -84,7 +87,7 @@ Gem::Specification.new do |s|
84
87
  s.homepage = "http://github.com/ejlangev/resource"
85
88
  s.licenses = ["MIT"]
86
89
  s.require_paths = ["lib"]
87
- s.rubygems_version = "1.8.22"
90
+ s.rubygems_version = "1.8.17"
88
91
  s.summary = "A replacement for ActiveResource for RESTful APIs that handles associated object and multiple data sources"
89
92
 
90
93
  if s.respond_to? :specification_version then
@@ -119,14 +119,14 @@ module ApiResource
119
119
 
120
120
  def association?(assoc)
121
121
  self.related_objects.any? do |key, value|
122
- next if key.to_s == "scope"
122
+ next if key.to_s == "scopes"
123
123
  value.detect { |k,v| k.to_sym == assoc.to_sym }
124
124
  end
125
125
  end
126
126
 
127
127
  def association_names
128
128
  # structure is {:has_many => {"myname" => "ClassName"}}
129
- self.related_objects.clone.delete_if{|k,v| k.to_s == "scope"}.collect{|k,v| v.keys.collect(&:to_sym)}.flatten
129
+ self.related_objects.clone.delete_if{|k,v| k.to_s == "scopes"}.collect{|k,v| v.keys.collect(&:to_sym)}.flatten
130
130
  end
131
131
 
132
132
  def association_class_name(assoc)
@@ -145,7 +145,9 @@ module ApiResource
145
145
  self.association_types.keys.each do |type|
146
146
  self.related_objects[type] = RelatedObjectHash.new({})
147
147
  end
148
- self.related_objects[:scope] = RelatedObjectHash.new({})
148
+
149
+ # TODO :Remove scopes from related_objects.
150
+ self.related_objects[:scopes] = RelatedObjectHash.new({})
149
151
  end
150
152
 
151
153
  def clone_related_objects
@@ -154,7 +156,8 @@ module ApiResource
154
156
  self.association_types.keys.each do |type|
155
157
  self.related_objects[type] = self.related_objects[type].clone
156
158
  end
157
- self.related_objects[:scope] = self.related_objects[:scope].clone
159
+ # TODO :Remove scopes from related_objects.
160
+ self.related_objects[:scopes] = self.related_objects[:scopes].clone
158
161
  end
159
162
 
160
163
  def define_association_as_attribute(assoc_type, assoc_name)
@@ -26,8 +26,6 @@ module ApiResource
26
26
  class_attribute :primary_key
27
27
  self.primary_key = "id"
28
28
 
29
- attr_accessor :prefix_options
30
-
31
29
  class << self
32
30
 
33
31
  # writers - accessors with defaults were not working
@@ -240,16 +238,33 @@ module ApiResource
240
238
 
241
239
  def element_path(id, prefix_options = {}, query_options = nil)
242
240
  prefix_options, query_options = split_options(prefix_options) if query_options.nil?
243
- "#{prefix(prefix_options)}#{collection_name}/#{URI.escape id.to_s}.#{format.extension}#{query_string(query_options)}"
241
+
242
+ # If we have a prefix, we need a foreign key id
243
+ # This regex detects '//', which means no foreign key id is present.
244
+ if prefix(prefix_options) =~ /\/\/$/
245
+ "/#{collection_name}/#{URI.escape id.to_s}.#{format.extension}#{query_string(query_options)}"
246
+ else
247
+ # Fall back on this rather than search without the id
248
+ "#{prefix(prefix_options)}#{collection_name}/#{URI.escape id.to_s}.#{format.extension}#{query_string(query_options)}"
249
+ end
244
250
  end
245
251
 
246
- def new_element_path(prefix_options = {})
247
- "#{prefix(prefix_options)}#{collection_name}/new.#{format.extension}"
252
+ # TODO: Add back in support for non-dynamic prefix paths (e.g. /subdir/resources/new.json)
253
+ def new_element_path
254
+ "/#{collection_name}/new.#{format.extension}"
248
255
  end
249
256
 
250
257
  def collection_path(prefix_options = {}, query_options = nil)
251
258
  prefix_options, query_options = split_options(prefix_options) if query_options.nil?
252
- "#{prefix(prefix_options)}#{collection_name}.#{format.extension}#{query_string(query_options)}"
259
+
260
+ # If we have a prefix, we need a foreign key id
261
+ # This regex detects '//', which means no foreign key id is present.
262
+ if prefix(prefix_options) =~ /\/\/$/
263
+ "/#{collection_name}.#{format.extension}#{query_string(query_options)}"
264
+ else
265
+ # Fall back on this rather than search without the id
266
+ "#{prefix(prefix_options)}#{collection_name}.#{format.extension}#{query_string(query_options)}"
267
+ end
253
268
  end
254
269
 
255
270
  def build(attributes = {})
@@ -344,7 +359,7 @@ module ApiResource
344
359
  else
345
360
  prefix_options, query_options = split_options(options[:params])
346
361
  path = collection_path(prefix_options, query_options)
347
- instantiate_collection( (connection.get(path, headers) || []), prefix_options )
362
+ instantiate_collection( (connection.get(path, headers) || []))
348
363
  end
349
364
  rescue ApiResource::ResourceNotFound
350
365
  # Swallowing ResourceNotFound exceptions and return nil - as per
@@ -368,17 +383,15 @@ module ApiResource
368
383
  def find_single(scope, options)
369
384
  prefix_options, query_options = split_options(options[:params])
370
385
  path = element_path(scope, prefix_options, query_options)
371
- instantiate_record(connection.get(path, headers), prefix_options)
386
+ instantiate_record(connection.get(path, headers))
372
387
  end
373
388
 
374
- def instantiate_collection(collection, prefix_options = {})
375
- collection.collect! { |record| instantiate_record(record, prefix_options) }
389
+ def instantiate_collection(collection)
390
+ collection.collect! { |record| instantiate_record(record) }
376
391
  end
377
392
 
378
- def instantiate_record(record, prefix_options = {})
379
- new(record).tap do |resource|
380
- resource.prefix_options = prefix_options
381
- end
393
+ def instantiate_record(record)
394
+ new(record)
382
395
  end
383
396
 
384
397
 
@@ -421,7 +434,6 @@ module ApiResource
421
434
  end
422
435
 
423
436
  def initialize(attributes = {})
424
- @prefix_options = {}
425
437
  # if we initialize this class, load the attributes
426
438
  unless self.class.instance_variable_defined?(:@class_data)
427
439
  self.class.set_class_attributes_upon_load
@@ -450,7 +462,7 @@ module ApiResource
450
462
  end
451
463
 
452
464
  def ==(other)
453
- other.equal?(self) || (other.instance_of?(self.class) && other.id == self.id && other.prefix_options == self.prefix_options)
465
+ other.equal?(self) || (other.instance_of?(self.class) && other.id == self.id)
454
466
  end
455
467
 
456
468
  def eql?(other)
@@ -464,7 +476,6 @@ module ApiResource
464
476
  def dup
465
477
  self.class.new.tap do |resource|
466
478
  resource.attributes = self.attributes
467
- resource.prefix_options = @prefix_options
468
479
  end
469
480
  end
470
481
 
@@ -499,11 +510,25 @@ module ApiResource
499
510
  # We can't use alias_method here, because method 'id' optimizes itself on the fly.
500
511
  id && id.to_s # Be sure to stringify the id for routes
501
512
  end
513
+
514
+ def prefix_options
515
+ return {} unless self.class.prefix_source =~ /\:/
516
+ ret = {}
517
+ self.prefix_attribute_names.each do |name|
518
+ ret[name] = self.send(name)
519
+ end
520
+ ret
521
+ end
522
+
523
+ def prefix_attribute_names
524
+ return [] unless self.class.prefix_source =~ /\:/
525
+ self.class.prefix_source.scan(/\:(\w+)/).collect{|match| match.first.to_sym}
526
+ end
502
527
 
503
528
  def load(attributes)
504
529
  return if attributes.nil?
505
530
  raise ArgumentError, "expected an attributes Hash, got #{attributes.inspect}" unless attributes.is_a?(Hash)
506
- @prefix_options, attributes = split_options(attributes)
531
+
507
532
  attributes.symbolize_keys.each do |key, value|
508
533
  # If this attribute doesn't exist define it as a protected attribute
509
534
  self.class.define_protected_attributes(key) unless self.respond_to?(key)
@@ -571,7 +596,12 @@ module ApiResource
571
596
  # If this is an association and it's in include_associations then include it
572
597
  if options[:include_extras].include?(key.to_sym)
573
598
  accum.merge(key => val)
574
- elsif options[:except].include?(key.to_sym) || (!include_nil_attributes && val.nil? && self.changes[key].blank?)
599
+ elsif options[:except].include?(key.to_sym)
600
+ accum
601
+ # this attribute is already accounted for in the URL
602
+ elsif self.prefix_attribute_names.include?(key.to_sym)
603
+ accum
604
+ elsif(!include_nil_attributes && val.nil? && self.changes[key].blank?)
575
605
  accum
576
606
  else
577
607
  !self.attribute?(key) || self.protected_attribute?(key) ? accum : accum.merge(key => val)
@@ -594,8 +624,12 @@ module ApiResource
594
624
  load(response)
595
625
  end
596
626
 
597
- def element_path(id, prefix_options = {}, query_options = nil)
598
- self.class.element_path(id, prefix_options, query_options)
627
+ def element_path(id, prefix_override_options = {}, query_options = nil)
628
+ self.class.element_path(
629
+ id,
630
+ self.prefix_options.merge(prefix_override_options),
631
+ query_options
632
+ )
599
633
  end
600
634
 
601
635
  # list of all attributes that are not nil
@@ -611,8 +645,11 @@ module ApiResource
611
645
  self.class.new_element_path(prefix_options)
612
646
  end
613
647
 
614
- def collection_path(prefix_options = {},query_options = nil)
615
- self.class.collection_path(prefix_options, query_options)
648
+ def collection_path(override_prefix_options = {},query_options = nil)
649
+ self.class.collection_path(
650
+ self.prefix_options.merge(override_prefix_options),
651
+ query_options
652
+ )
616
653
  end
617
654
 
618
655
  def create(*args)
@@ -639,7 +676,7 @@ module ApiResource
639
676
  def update(*args)
640
677
  body = setup_update_call(*args)
641
678
  # We can just ignore the response
642
- connection.put(element_path(self.id, prefix_options), body, self.class.headers).tap do |response|
679
+ connection.put(element_path(self.id), body, self.class.headers).tap do |response|
643
680
  load_attributes_from_response(response)
644
681
  end
645
682
  end
@@ -5,12 +5,12 @@ module ApiResource
5
5
 
6
6
  module ClassMethods
7
7
  def scopes
8
- return self.related_objects[:scope]
8
+ return self.related_objects[:scopes]
9
9
  end
10
10
 
11
11
  def scope(name, hsh)
12
12
  raise ArgumentError, "Expecting an attributes hash given #{hsh.inspect}" unless hsh.is_a?(Hash)
13
- self.related_objects[:scope][name.to_sym] = hsh
13
+ self.related_objects[:scopes][name.to_sym] = hsh
14
14
  # we also need to define a class method for each scope
15
15
  self.instance_eval <<-EOE, __FILE__, __LINE__ + 1
16
16
  def #{name}(*args)
@@ -20,12 +20,12 @@ module ApiResource
20
20
  end
21
21
 
22
22
  def scope?(name)
23
- self.related_objects[:scope][name.to_sym].present?
23
+ self.related_objects[:scopes][name.to_sym].present?
24
24
  end
25
25
 
26
26
  def scope_attributes(name)
27
27
  raise "No such scope #{name}" unless self.scope?(name)
28
- self.related_objects[:scope][name.to_sym]
28
+ self.related_objects[:scopes][name.to_sym]
29
29
  end
30
30
  end
31
31
 
@@ -225,7 +225,7 @@ describe "Associations" do
225
225
  describe "Multi Object Associations" do
226
226
 
227
227
  before(:all) do
228
- TestResource.related_objects[:scope].clear
228
+ TestResource.related_objects[:scopes].clear
229
229
  end
230
230
 
231
231
  after(:each) do
@@ -658,7 +658,7 @@ describe "Associations" do
658
658
  end
659
659
  end
660
660
  it "should add remote associations to related objects" do
661
- TestAR.related_objects.should eql({"has_many_remote"=>{}, "belongs_to_remote"=>{"my_favorite_thing"=>"TestClassYay"}, "has_one_remote"=>{}, "scope"=>{}})
661
+ TestAR.related_objects.should eql({"has_many_remote"=>{}, "belongs_to_remote"=>{"my_favorite_thing"=>"TestClassYay"}, "has_one_remote"=>{}, "scopes"=>{}})
662
662
  end
663
663
  context "Not Overriding Scopes" do
664
664
  it "should not override scopes, which would raise an error with lambda-style scopes" do
@@ -643,7 +643,10 @@ describe "Base" do
643
643
  end
644
644
 
645
645
  it "should not load the resource definition when respond_to? is called
646
- if the definition has already been loaded"
646
+ if the definition has already been loaded" do
647
+ TestResource.expects(:set_class_attributes_upon_load).never
648
+ TestResource.send(:respond_to?, :some_method)
649
+ end
647
650
 
648
651
  end
649
652
 
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe "With Prefixes" do
4
+
5
+ let(:prefix_model) do
6
+ PrefixModel.new({:foreign_key_id => "123", :name => "test"})
7
+ end
8
+
9
+ before(:each) do
10
+ PrefixModel.reload_class_attributes
11
+ end
12
+
13
+ context ".find" do
14
+
15
+ it "should use the prefix to find a single record when given as a param" do
16
+ PrefixModel.connection.expects(:get)
17
+ .with(
18
+ "/foreign/123/prefix_models/456.json",
19
+ instance_of(Hash)
20
+ )
21
+ .returns({})
22
+ PrefixModel.find(456, :params => {:foreign_key_id => 123})
23
+ end
24
+
25
+ it "should not use the prefix to find a single record when not given as a param to avoid automatic failure" do
26
+ PrefixModel.connection.expects(:get)
27
+ .with(
28
+ "/prefix_models/456.json",
29
+ instance_of(Hash)
30
+ )
31
+ .returns({})
32
+ PrefixModel.find(456)
33
+ end
34
+ end
35
+
36
+ context "#create" do
37
+
38
+ it "should use the prefix to create a new record" do
39
+ prefix_model.send(:connection).expects(:post)
40
+ .with(
41
+ "/foreign/123/prefix_models.json",
42
+ {"prefix_model" => {"name" => "test"}}.to_json,
43
+ instance_of(Hash)
44
+ )
45
+ prefix_model.save
46
+ end
47
+
48
+ end
49
+
50
+ context "#first" do
51
+
52
+ it "should use the prefix to find records" do
53
+ prefix_model.send(:connection).expects(:get)
54
+ .with(
55
+ "/foreign/123/prefix_models.json",
56
+ instance_of(Hash)
57
+ )
58
+ .returns([])
59
+ PrefixModel.first(:params => {:foreign_key_id => 123})
60
+ end
61
+
62
+ it "should not use the prefix to find records when not given as a param to avoid automatic failure" do
63
+ prefix_model.send(:connection).expects(:get)
64
+ .with(
65
+ "/prefix_models.json",
66
+ instance_of(Hash)
67
+ )
68
+ .returns([])
69
+ PrefixModel.first
70
+ end
71
+
72
+ end
73
+
74
+ context "#destroy" do
75
+
76
+ it "should use the prefix to destroy a record" do
77
+
78
+ prefix_model.id = 456
79
+ prefix_model.send(:connection).expects(:delete)
80
+ .with(
81
+ "/foreign/123/prefix_models/456.json",
82
+ instance_of(Hash)
83
+ )
84
+ prefix_model.destroy
85
+
86
+ end
87
+
88
+ end
89
+
90
+ context "#update" do
91
+
92
+ it "should use the prefix to update a record" do
93
+ prefix_model.id = 456
94
+ prefix_model.name = "changed name"
95
+ prefix_model.send(:connection).expects(:put)
96
+ .with(
97
+ "/foreign/123/prefix_models/456.json",
98
+ {"prefix_model" => {"name" => "changed name"}}.to_json,
99
+ instance_of(Hash)
100
+ )
101
+ prefix_model.save
102
+
103
+ end
104
+
105
+ end
106
+
107
+ end
@@ -0,0 +1,5 @@
1
+ ApiResource::Mocks.define do
2
+ endpoint("/prefix_models/new.json") do
3
+ get(HashDealer.roll(:new_prefix_model_response))
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ HashDealer.define(:new_prefix_model_response) do
2
+
3
+ attributes({
4
+ "public" => ["foreign_key_id", "name"]
5
+ })
6
+
7
+ end
@@ -31,6 +31,10 @@ class ErrorResource < ApiResource::Base
31
31
 
32
32
  end
33
33
 
34
+ class PrefixModel < ApiResource::Base
35
+ self.prefix = "/foreign/:foreign_key_id/"
36
+ end
37
+
34
38
  class ScopeResource < ApiResource::Base
35
39
 
36
40
  end
@@ -65,4 +69,4 @@ module TestMod
65
69
 
66
70
  end
67
71
 
68
- end
72
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.13
4
+ version: 0.3.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-20 00:00:00.000000000 Z
12
+ date: 2012-09-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &70347987239000 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,15 +21,10 @@ dependencies:
21
21
  version: '3'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: '3'
24
+ version_requirements: *70347987239000
30
25
  - !ruby/object:Gem::Dependency
31
26
  name: hash_dealer
32
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &70347987235820 !ruby/object:Gem::Requirement
33
28
  none: false
34
29
  requirements:
35
30
  - - ! '>='
@@ -37,15 +32,10 @@ dependencies:
37
32
  version: '0'
38
33
  type: :runtime
39
34
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
35
+ version_requirements: *70347987235820
46
36
  - !ruby/object:Gem::Dependency
47
37
  name: rest-client
48
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &70347987225660 !ruby/object:Gem::Requirement
49
39
  none: false
50
40
  requirements:
51
41
  - - ! '>='
@@ -53,15 +43,10 @@ dependencies:
53
43
  version: '0'
54
44
  type: :runtime
55
45
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
46
+ version_requirements: *70347987225660
62
47
  - !ruby/object:Gem::Dependency
63
48
  name: log4r
64
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &70347987223380 !ruby/object:Gem::Requirement
65
50
  none: false
66
51
  requirements:
67
52
  - - ! '>='
@@ -69,15 +54,10 @@ dependencies:
69
54
  version: '0'
70
55
  type: :runtime
71
56
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
57
+ version_requirements: *70347987223380
78
58
  - !ruby/object:Gem::Dependency
79
59
  name: differ
80
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &70347987220520 !ruby/object:Gem::Requirement
81
61
  none: false
82
62
  requirements:
83
63
  - - ! '>='
@@ -85,15 +65,10 @@ dependencies:
85
65
  version: '0'
86
66
  type: :runtime
87
67
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '0'
68
+ version_requirements: *70347987220520
94
69
  - !ruby/object:Gem::Dependency
95
70
  name: colorize
96
- requirement: !ruby/object:Gem::Requirement
71
+ requirement: &70347987217700 !ruby/object:Gem::Requirement
97
72
  none: false
98
73
  requirements:
99
74
  - - ! '>='
@@ -101,15 +76,10 @@ dependencies:
101
76
  version: '0'
102
77
  type: :runtime
103
78
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
79
+ version_requirements: *70347987217700
110
80
  - !ruby/object:Gem::Dependency
111
81
  name: json
112
- requirement: !ruby/object:Gem::Requirement
82
+ requirement: &70347987214900 !ruby/object:Gem::Requirement
113
83
  none: false
114
84
  requirements:
115
85
  - - ! '>='
@@ -117,15 +87,10 @@ dependencies:
117
87
  version: '0'
118
88
  type: :runtime
119
89
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ! '>='
124
- - !ruby/object:Gem::Version
125
- version: '0'
90
+ version_requirements: *70347987214900
126
91
  - !ruby/object:Gem::Dependency
127
92
  name: pry
128
- requirement: !ruby/object:Gem::Requirement
93
+ requirement: &70347987213800 !ruby/object:Gem::Requirement
129
94
  none: false
130
95
  requirements:
131
96
  - - ! '>='
@@ -133,15 +98,10 @@ dependencies:
133
98
  version: '0'
134
99
  type: :development
135
100
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: '0'
101
+ version_requirements: *70347987213800
142
102
  - !ruby/object:Gem::Dependency
143
103
  name: pry-doc
144
- requirement: !ruby/object:Gem::Requirement
104
+ requirement: &70347987211500 !ruby/object:Gem::Requirement
145
105
  none: false
146
106
  requirements:
147
107
  - - ! '>='
@@ -149,15 +109,10 @@ dependencies:
149
109
  version: '0'
150
110
  type: :development
151
111
  prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
- requirements:
155
- - - ! '>='
156
- - !ruby/object:Gem::Version
157
- version: '0'
112
+ version_requirements: *70347987211500
158
113
  - !ruby/object:Gem::Dependency
159
114
  name: pry-nav
160
- requirement: !ruby/object:Gem::Requirement
115
+ requirement: &70347987210040 !ruby/object:Gem::Requirement
161
116
  none: false
162
117
  requirements:
163
118
  - - ! '>='
@@ -165,15 +120,10 @@ dependencies:
165
120
  version: '0'
166
121
  type: :development
167
122
  prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
- requirements:
171
- - - ! '>='
172
- - !ruby/object:Gem::Version
173
- version: '0'
123
+ version_requirements: *70347987210040
174
124
  - !ruby/object:Gem::Dependency
175
125
  name: rspec
176
- requirement: !ruby/object:Gem::Requirement
126
+ requirement: &70347987208920 !ruby/object:Gem::Requirement
177
127
  none: false
178
128
  requirements:
179
129
  - - ! '>='
@@ -181,15 +131,10 @@ dependencies:
181
131
  version: '0'
182
132
  type: :development
183
133
  prerelease: false
184
- version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
- requirements:
187
- - - ! '>='
188
- - !ruby/object:Gem::Version
189
- version: '0'
134
+ version_requirements: *70347987208920
190
135
  - !ruby/object:Gem::Dependency
191
136
  name: ruby-debug19
192
- requirement: !ruby/object:Gem::Requirement
137
+ requirement: &70347987207660 !ruby/object:Gem::Requirement
193
138
  none: false
194
139
  requirements:
195
140
  - - ! '>='
@@ -197,15 +142,10 @@ dependencies:
197
142
  version: '0'
198
143
  type: :development
199
144
  prerelease: false
200
- version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
- requirements:
203
- - - ! '>='
204
- - !ruby/object:Gem::Version
205
- version: '0'
145
+ version_requirements: *70347987207660
206
146
  - !ruby/object:Gem::Dependency
207
147
  name: growl
208
- requirement: !ruby/object:Gem::Requirement
148
+ requirement: &70347987206540 !ruby/object:Gem::Requirement
209
149
  none: false
210
150
  requirements:
211
151
  - - ! '>='
@@ -213,15 +153,10 @@ dependencies:
213
153
  version: '0'
214
154
  type: :development
215
155
  prerelease: false
216
- version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
- requirements:
219
- - - ! '>='
220
- - !ruby/object:Gem::Version
221
- version: '0'
156
+ version_requirements: *70347987206540
222
157
  - !ruby/object:Gem::Dependency
223
158
  name: rspec-rails
224
- requirement: !ruby/object:Gem::Requirement
159
+ requirement: &70347987204880 !ruby/object:Gem::Requirement
225
160
  none: false
226
161
  requirements:
227
162
  - - ! '>='
@@ -229,15 +164,10 @@ dependencies:
229
164
  version: '0'
230
165
  type: :development
231
166
  prerelease: false
232
- version_requirements: !ruby/object:Gem::Requirement
233
- none: false
234
- requirements:
235
- - - ! '>='
236
- - !ruby/object:Gem::Version
237
- version: '0'
167
+ version_requirements: *70347987204880
238
168
  - !ruby/object:Gem::Dependency
239
169
  name: factory_girl
240
- requirement: !ruby/object:Gem::Requirement
170
+ requirement: &70347987192680 !ruby/object:Gem::Requirement
241
171
  none: false
242
172
  requirements:
243
173
  - - ! '>='
@@ -245,15 +175,10 @@ dependencies:
245
175
  version: '0'
246
176
  type: :development
247
177
  prerelease: false
248
- version_requirements: !ruby/object:Gem::Requirement
249
- none: false
250
- requirements:
251
- - - ! '>='
252
- - !ruby/object:Gem::Version
253
- version: '0'
178
+ version_requirements: *70347987192680
254
179
  - !ruby/object:Gem::Dependency
255
180
  name: simplecov
256
- requirement: !ruby/object:Gem::Requirement
181
+ requirement: &70347987190600 !ruby/object:Gem::Requirement
257
182
  none: false
258
183
  requirements:
259
184
  - - ! '>='
@@ -261,15 +186,10 @@ dependencies:
261
186
  version: '0'
262
187
  type: :development
263
188
  prerelease: false
264
- version_requirements: !ruby/object:Gem::Requirement
265
- none: false
266
- requirements:
267
- - - ! '>='
268
- - !ruby/object:Gem::Version
269
- version: '0'
189
+ version_requirements: *70347987190600
270
190
  - !ruby/object:Gem::Dependency
271
191
  name: faker
272
- requirement: !ruby/object:Gem::Requirement
192
+ requirement: &70347987188780 !ruby/object:Gem::Requirement
273
193
  none: false
274
194
  requirements:
275
195
  - - ! '>='
@@ -277,15 +197,10 @@ dependencies:
277
197
  version: '0'
278
198
  type: :development
279
199
  prerelease: false
280
- version_requirements: !ruby/object:Gem::Requirement
281
- none: false
282
- requirements:
283
- - - ! '>='
284
- - !ruby/object:Gem::Version
285
- version: '0'
200
+ version_requirements: *70347987188780
286
201
  - !ruby/object:Gem::Dependency
287
202
  name: guard-bundler
288
- requirement: !ruby/object:Gem::Requirement
203
+ requirement: &70347987187280 !ruby/object:Gem::Requirement
289
204
  none: false
290
205
  requirements:
291
206
  - - ! '>='
@@ -293,15 +208,10 @@ dependencies:
293
208
  version: '0'
294
209
  type: :development
295
210
  prerelease: false
296
- version_requirements: !ruby/object:Gem::Requirement
297
- none: false
298
- requirements:
299
- - - ! '>='
300
- - !ruby/object:Gem::Version
301
- version: '0'
211
+ version_requirements: *70347987187280
302
212
  - !ruby/object:Gem::Dependency
303
213
  name: guard-rspec
304
- requirement: !ruby/object:Gem::Requirement
214
+ requirement: &70347987185260 !ruby/object:Gem::Requirement
305
215
  none: false
306
216
  requirements:
307
217
  - - ! '>='
@@ -309,15 +219,10 @@ dependencies:
309
219
  version: '0'
310
220
  type: :development
311
221
  prerelease: false
312
- version_requirements: !ruby/object:Gem::Requirement
313
- none: false
314
- requirements:
315
- - - ! '>='
316
- - !ruby/object:Gem::Version
317
- version: '0'
222
+ version_requirements: *70347987185260
318
223
  - !ruby/object:Gem::Dependency
319
224
  name: guard-spork
320
- requirement: !ruby/object:Gem::Requirement
225
+ requirement: &70347987183440 !ruby/object:Gem::Requirement
321
226
  none: false
322
227
  requirements:
323
228
  - - ! '>='
@@ -325,15 +230,10 @@ dependencies:
325
230
  version: '0'
326
231
  type: :development
327
232
  prerelease: false
328
- version_requirements: !ruby/object:Gem::Requirement
329
- none: false
330
- requirements:
331
- - - ! '>='
332
- - !ruby/object:Gem::Version
333
- version: '0'
233
+ version_requirements: *70347987183440
334
234
  - !ruby/object:Gem::Dependency
335
235
  name: mocha
336
- requirement: !ruby/object:Gem::Requirement
236
+ requirement: &70347987181200 !ruby/object:Gem::Requirement
337
237
  none: false
338
238
  requirements:
339
239
  - - ! '>='
@@ -341,15 +241,10 @@ dependencies:
341
241
  version: '0'
342
242
  type: :development
343
243
  prerelease: false
344
- version_requirements: !ruby/object:Gem::Requirement
345
- none: false
346
- requirements:
347
- - - ! '>='
348
- - !ruby/object:Gem::Version
349
- version: '0'
244
+ version_requirements: *70347987181200
350
245
  - !ruby/object:Gem::Dependency
351
246
  name: bundler
352
- requirement: !ruby/object:Gem::Requirement
247
+ requirement: &70347987176960 !ruby/object:Gem::Requirement
353
248
  none: false
354
249
  requirements:
355
250
  - - ! '>='
@@ -357,15 +252,10 @@ dependencies:
357
252
  version: '0'
358
253
  type: :development
359
254
  prerelease: false
360
- version_requirements: !ruby/object:Gem::Requirement
361
- none: false
362
- requirements:
363
- - - ! '>='
364
- - !ruby/object:Gem::Version
365
- version: '0'
255
+ version_requirements: *70347987176960
366
256
  - !ruby/object:Gem::Dependency
367
257
  name: jeweler
368
- requirement: !ruby/object:Gem::Requirement
258
+ requirement: &70347987171880 !ruby/object:Gem::Requirement
369
259
  none: false
370
260
  requirements:
371
261
  - - ~>
@@ -373,15 +263,10 @@ dependencies:
373
263
  version: 1.6.4
374
264
  type: :development
375
265
  prerelease: false
376
- version_requirements: !ruby/object:Gem::Requirement
377
- none: false
378
- requirements:
379
- - - ~>
380
- - !ruby/object:Gem::Version
381
- version: 1.6.4
266
+ version_requirements: *70347987171880
382
267
  - !ruby/object:Gem::Dependency
383
268
  name: activerecord
384
- requirement: !ruby/object:Gem::Requirement
269
+ requirement: &70347987162100 !ruby/object:Gem::Requirement
385
270
  none: false
386
271
  requirements:
387
272
  - - ~>
@@ -389,15 +274,10 @@ dependencies:
389
274
  version: '3'
390
275
  type: :development
391
276
  prerelease: false
392
- version_requirements: !ruby/object:Gem::Requirement
393
- none: false
394
- requirements:
395
- - - ~>
396
- - !ruby/object:Gem::Version
397
- version: '3'
277
+ version_requirements: *70347987162100
398
278
  - !ruby/object:Gem::Dependency
399
279
  name: sqlite3
400
- requirement: !ruby/object:Gem::Requirement
280
+ requirement: &70347987161120 !ruby/object:Gem::Requirement
401
281
  none: false
402
282
  requirements:
403
283
  - - ! '>='
@@ -405,12 +285,7 @@ dependencies:
405
285
  version: '0'
406
286
  type: :development
407
287
  prerelease: false
408
- version_requirements: !ruby/object:Gem::Requirement
409
- none: false
410
- requirements:
411
- - - ! '>='
412
- - !ruby/object:Gem::Version
413
- version: '0'
288
+ version_requirements: *70347987161120
414
289
  description: A replacement for ActiveResource for RESTful APIs that handles associated
415
290
  object and multiple data sources
416
291
  email: ejl6266@gmail.com
@@ -474,12 +349,15 @@ files:
474
349
  - spec/lib/local_spec.rb
475
350
  - spec/lib/mocks_spec.rb
476
351
  - spec/lib/model_errors_spec.rb
352
+ - spec/lib/prefixes_spec.rb
477
353
  - spec/spec_helper.rb
478
354
  - spec/support/mocks/association_mocks.rb
479
355
  - spec/support/mocks/error_resource_mocks.rb
356
+ - spec/support/mocks/prefix_model_mocks.rb
480
357
  - spec/support/mocks/test_resource_mocks.rb
481
358
  - spec/support/requests/association_requests.rb
482
359
  - spec/support/requests/error_resource_requests.rb
360
+ - spec/support/requests/prefix_model_requests.rb
483
361
  - spec/support/requests/test_resource_requests.rb
484
362
  - spec/support/test_resource.rb
485
363
  - spec/tmp/DIR
@@ -498,7 +376,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
498
376
  version: '0'
499
377
  segments:
500
378
  - 0
501
- hash: 3537958463116260436
379
+ hash: -500623177238346967
502
380
  required_rubygems_version: !ruby/object:Gem::Requirement
503
381
  none: false
504
382
  requirements:
@@ -507,7 +385,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
507
385
  version: '0'
508
386
  requirements: []
509
387
  rubyforge_project:
510
- rubygems_version: 1.8.22
388
+ rubygems_version: 1.8.17
511
389
  signing_key:
512
390
  specification_version: 3
513
391
  summary: A replacement for ActiveResource for RESTful APIs that handles associated