api_resource 0.3.13 → 0.3.14

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/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