api_resource 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/api_resource.gemspec +4 -74
- data/coverage/assets/0.5.3/app.js +88 -0
- data/coverage/assets/0.5.3/fancybox/blank.gif +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_close.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_loading.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_nav_left.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_nav_right.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_e.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_n.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_s.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_se.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_w.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_title_left.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_title_main.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_title_over.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_title_right.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancybox-x.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancybox-y.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancybox.png +0 -0
- data/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/coverage/assets/0.5.3/favicon_green.png +0 -0
- data/coverage/assets/0.5.3/favicon_red.png +0 -0
- data/coverage/assets/0.5.3/favicon_yellow.png +0 -0
- data/coverage/assets/0.5.3/highlight.css +129 -0
- data/coverage/assets/0.5.3/highlight.pack.js +1 -0
- data/coverage/assets/0.5.3/jquery-1.6.2.min.js +18 -0
- data/coverage/assets/0.5.3/jquery.dataTables.min.js +152 -0
- data/coverage/assets/0.5.3/jquery.timeago.js +141 -0
- data/coverage/assets/0.5.3/jquery.url.js +174 -0
- data/coverage/assets/0.5.3/loading.gif +0 -0
- data/coverage/assets/0.5.3/magnify.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/coverage/assets/0.5.3/stylesheet.css +383 -0
- data/coverage/index.html +3573 -0
- data/lib/api_resource/associations/abstract_scope.rb +191 -0
- data/lib/api_resource/associations/association_scope.rb +47 -0
- data/lib/api_resource/associations/belongs_to_remote_object_proxy.rb +5 -6
- data/lib/api_resource/associations/has_many_remote_object_proxy.rb +5 -8
- data/lib/api_resource/associations/has_one_remote_object_proxy.rb +12 -13
- data/lib/api_resource/associations/multi_object_proxy.rb +65 -39
- data/lib/api_resource/associations/resource_scope.rb +6 -17
- data/lib/api_resource/associations/scope.rb +23 -121
- data/lib/api_resource/associations/single_object_proxy.rb +41 -50
- data/lib/api_resource/associations.rb +32 -11
- data/lib/api_resource/attributes.rb +108 -69
- data/lib/api_resource/base.rb +114 -106
- data/lib/api_resource/local.rb +1 -1
- data/lib/api_resource/model_errors.rb +9 -6
- data/lib/api_resource/scopes.rb +53 -16
- data/lib/api_resource.rb +3 -1
- data/spec/lib/api_resource_spec.rb +3 -7
- data/spec/lib/associations/association_scope_spec.rb +19 -0
- data/spec/lib/associations_spec.rb +251 -162
- data/spec/lib/attributes_spec.rb +33 -15
- data/spec/lib/base_spec.rb +302 -64
- data/spec/lib/callbacks_spec.rb +4 -2
- data/spec/lib/local_spec.rb +5 -1
- data/spec/spec_helper.rb +2 -3
- data/spec/support/mocks/association_mocks.rb +9 -1
- data/spec/support/requests/association_requests.rb +5 -5
- data/spec/support/requests/test_resource_requests.rb +16 -4
- data/spec/tmp/api_resource_test_db.sqlite +0 -0
- metadata +68 -22
- data/.document +0 -5
- data/.rspec +0 -5
- data/.travis.yml +0 -4
- data/lib/api_resource/associations/association_proxy.rb +0 -121
- data/lib/api_resource/associations/dynamic_resource_scope.rb +0 -23
- data/lib/api_resource/associations/generic_scope.rb +0 -68
- data/lib/api_resource/associations/multi_argument_resource_scope.rb +0 -15
- data/lib/api_resource/associations/relation_scope.rb +0 -25
@@ -2,23 +2,23 @@ HashDealer.define(:test_association_resource) do
|
|
2
2
|
id{Kernel.rand(99999)}
|
3
3
|
name{Faker::Name.first_name}
|
4
4
|
age{Kernel.rand(99999)}
|
5
|
-
|
5
|
+
is_active(false)
|
6
6
|
end
|
7
7
|
|
8
8
|
HashDealer.define(:active_test_association_resource, :parent => :test_association_resource) do
|
9
|
-
|
9
|
+
is_active(true)
|
10
10
|
end
|
11
11
|
|
12
12
|
HashDealer.define(:active_birthday_test_association_resource, :parent => :active_test_association_resource) do
|
13
|
-
|
13
|
+
bday{Date.today}
|
14
14
|
end
|
15
15
|
|
16
16
|
HashDealer.define(:inactive_test_association_resource, :parent => :test_association_resource) do
|
17
|
-
|
17
|
+
is_active(false)
|
18
18
|
end
|
19
19
|
|
20
20
|
HashDealer.define(:inactive_birthday_test_association_resource, :parent => :inactive_test_association_resource) do
|
21
|
-
|
21
|
+
bday{Date.today}
|
22
22
|
end
|
23
23
|
|
24
24
|
HashDealer.define(:has_one_object) do
|
@@ -1,14 +1,25 @@
|
|
1
1
|
HashDealer.define(:new_test_object) do
|
2
2
|
attributes({
|
3
|
-
:protected => [:id],
|
3
|
+
:protected => [:id, :protected_attr],
|
4
4
|
:public => [:name, :age, :is_active, [:bday, :date], [:roles, :array]]
|
5
5
|
})
|
6
6
|
scopes({
|
7
|
-
:active => {
|
8
|
-
:paginate => {
|
7
|
+
:active => {},
|
8
|
+
:paginate => {
|
9
|
+
:per_page => :opt,
|
10
|
+
:current_page => :opt
|
11
|
+
},
|
12
|
+
:birthday => {
|
13
|
+
:date => :req
|
14
|
+
}
|
9
15
|
})
|
10
16
|
associations({
|
11
|
-
:has_many => {
|
17
|
+
:has_many => {
|
18
|
+
:has_many_objects => {},
|
19
|
+
:has_many_service_uri => {
|
20
|
+
:class_name => "HasManyObject"
|
21
|
+
}
|
22
|
+
},
|
12
23
|
:belongs_to => {:belongs_to_object => {}, :custom_name => {:class_name => "BelongsToObject"}},
|
13
24
|
:has_one => {:has_one_object => {}},
|
14
25
|
})
|
@@ -28,6 +39,7 @@ end
|
|
28
39
|
HashDealer.define(:test_resource_with_proxies, :parent => :test_resource) do
|
29
40
|
has_one_object{HashDealer.roll(:has_one_object)}
|
30
41
|
has_many_objects{(0..4).to_a.collect{HashDealer.roll(:has_many_object)}}
|
42
|
+
has_many_service_uri{[{:service_uri => "/test_resource/1/has_many"}]}
|
31
43
|
end
|
32
44
|
|
33
45
|
HashDealer.define(:test_resource_errors) do
|
Binary file
|
metadata
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_resource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ethan Langevin
|
9
|
+
- Dan Langevin
|
10
|
+
- Brian Howald
|
9
11
|
autorequire:
|
10
12
|
bindir: bin
|
11
13
|
cert_chain: []
|
@@ -413,53 +415,92 @@ dependencies:
|
|
413
415
|
version: '0'
|
414
416
|
description: A replacement for ActiveResource for RESTful APIs that handles associated
|
415
417
|
object and multiple data sources
|
416
|
-
email:
|
418
|
+
email: developers@lifebooker.com
|
417
419
|
executables: []
|
418
420
|
extensions: []
|
419
421
|
extra_rdoc_files:
|
420
422
|
- LICENSE.txt
|
421
423
|
- README.rdoc
|
422
424
|
files:
|
423
|
-
- .
|
424
|
-
- .
|
425
|
-
- .
|
425
|
+
- api_resource.gemspec
|
426
|
+
- coverage/assets/0.5.3/app.js
|
427
|
+
- coverage/assets/0.5.3/fancybox/blank.gif
|
428
|
+
- coverage/assets/0.5.3/fancybox/fancy_close.png
|
429
|
+
- coverage/assets/0.5.3/fancybox/fancy_loading.png
|
430
|
+
- coverage/assets/0.5.3/fancybox/fancy_nav_left.png
|
431
|
+
- coverage/assets/0.5.3/fancybox/fancy_nav_right.png
|
432
|
+
- coverage/assets/0.5.3/fancybox/fancy_shadow_e.png
|
433
|
+
- coverage/assets/0.5.3/fancybox/fancy_shadow_n.png
|
434
|
+
- coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png
|
435
|
+
- coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png
|
436
|
+
- coverage/assets/0.5.3/fancybox/fancy_shadow_s.png
|
437
|
+
- coverage/assets/0.5.3/fancybox/fancy_shadow_se.png
|
438
|
+
- coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png
|
439
|
+
- coverage/assets/0.5.3/fancybox/fancy_shadow_w.png
|
440
|
+
- coverage/assets/0.5.3/fancybox/fancy_title_left.png
|
441
|
+
- coverage/assets/0.5.3/fancybox/fancy_title_main.png
|
442
|
+
- coverage/assets/0.5.3/fancybox/fancy_title_over.png
|
443
|
+
- coverage/assets/0.5.3/fancybox/fancy_title_right.png
|
444
|
+
- coverage/assets/0.5.3/fancybox/fancybox-x.png
|
445
|
+
- coverage/assets/0.5.3/fancybox/fancybox-y.png
|
446
|
+
- coverage/assets/0.5.3/fancybox/fancybox.png
|
447
|
+
- coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css
|
448
|
+
- coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js
|
449
|
+
- coverage/assets/0.5.3/favicon_green.png
|
450
|
+
- coverage/assets/0.5.3/favicon_red.png
|
451
|
+
- coverage/assets/0.5.3/favicon_yellow.png
|
452
|
+
- coverage/assets/0.5.3/highlight.css
|
453
|
+
- coverage/assets/0.5.3/highlight.pack.js
|
454
|
+
- coverage/assets/0.5.3/jquery-1.6.2.min.js
|
455
|
+
- coverage/assets/0.5.3/jquery.dataTables.min.js
|
456
|
+
- coverage/assets/0.5.3/jquery.timeago.js
|
457
|
+
- coverage/assets/0.5.3/jquery.url.js
|
458
|
+
- coverage/assets/0.5.3/loading.gif
|
459
|
+
- coverage/assets/0.5.3/magnify.png
|
460
|
+
- coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
|
461
|
+
- coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
|
462
|
+
- coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
|
463
|
+
- coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
|
464
|
+
- coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png
|
465
|
+
- coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
|
466
|
+
- coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
|
467
|
+
- coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
|
468
|
+
- coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png
|
469
|
+
- coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png
|
470
|
+
- coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png
|
471
|
+
- coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png
|
472
|
+
- coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png
|
473
|
+
- coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css
|
474
|
+
- coverage/assets/0.5.3/stylesheet.css
|
475
|
+
- coverage/index.html
|
426
476
|
- Gemfile
|
427
477
|
- Gemfile.lock
|
428
478
|
- Guardfile
|
429
|
-
- LICENSE.txt
|
430
|
-
- README.rdoc
|
431
|
-
- Rakefile
|
432
|
-
- VERSION
|
433
|
-
- api_resource.gemspec
|
434
|
-
- lib/api_resource.rb
|
435
479
|
- lib/api_resource/association_activation.rb
|
436
|
-
- lib/api_resource/associations.rb
|
437
|
-
- lib/api_resource/associations/
|
480
|
+
- lib/api_resource/associations/abstract_scope.rb
|
481
|
+
- lib/api_resource/associations/association_scope.rb
|
438
482
|
- lib/api_resource/associations/belongs_to_remote_object_proxy.rb
|
439
|
-
- lib/api_resource/associations/dynamic_resource_scope.rb
|
440
|
-
- lib/api_resource/associations/generic_scope.rb
|
441
483
|
- lib/api_resource/associations/has_many_remote_object_proxy.rb
|
442
484
|
- lib/api_resource/associations/has_many_through_remote_object_proxy.rb
|
443
485
|
- lib/api_resource/associations/has_one_remote_object_proxy.rb
|
444
|
-
- lib/api_resource/associations/multi_argument_resource_scope.rb
|
445
486
|
- lib/api_resource/associations/multi_object_proxy.rb
|
446
487
|
- lib/api_resource/associations/related_object_hash.rb
|
447
|
-
- lib/api_resource/associations/relation_scope.rb
|
448
488
|
- lib/api_resource/associations/resource_scope.rb
|
449
489
|
- lib/api_resource/associations/scope.rb
|
450
490
|
- lib/api_resource/associations/single_object_proxy.rb
|
491
|
+
- lib/api_resource/associations.rb
|
451
492
|
- lib/api_resource/attributes.rb
|
452
493
|
- lib/api_resource/base.rb
|
453
494
|
- lib/api_resource/callbacks.rb
|
454
495
|
- lib/api_resource/connection.rb
|
455
496
|
- lib/api_resource/core_extensions.rb
|
456
497
|
- lib/api_resource/custom_methods.rb
|
457
|
-
- lib/api_resource/decorators.rb
|
458
498
|
- lib/api_resource/decorators/caching_decorator.rb
|
499
|
+
- lib/api_resource/decorators.rb
|
459
500
|
- lib/api_resource/exceptions.rb
|
460
|
-
- lib/api_resource/formats.rb
|
461
501
|
- lib/api_resource/formats/json_format.rb
|
462
502
|
- lib/api_resource/formats/xml_format.rb
|
503
|
+
- lib/api_resource/formats.rb
|
463
504
|
- lib/api_resource/local.rb
|
464
505
|
- lib/api_resource/log_subscriber.rb
|
465
506
|
- lib/api_resource/mocks.rb
|
@@ -467,8 +508,13 @@ files:
|
|
467
508
|
- lib/api_resource/observing.rb
|
468
509
|
- lib/api_resource/railtie.rb
|
469
510
|
- lib/api_resource/scopes.rb
|
511
|
+
- lib/api_resource.rb
|
512
|
+
- LICENSE.txt
|
470
513
|
- nohup.out
|
514
|
+
- Rakefile
|
515
|
+
- README.rdoc
|
471
516
|
- spec/lib/api_resource_spec.rb
|
517
|
+
- spec/lib/associations/association_scope_spec.rb
|
472
518
|
- spec/lib/associations_spec.rb
|
473
519
|
- spec/lib/attributes_spec.rb
|
474
520
|
- spec/lib/base_spec.rb
|
@@ -488,7 +534,9 @@ files:
|
|
488
534
|
- spec/support/requests/prefix_model_requests.rb
|
489
535
|
- spec/support/requests/test_resource_requests.rb
|
490
536
|
- spec/support/test_resource.rb
|
537
|
+
- spec/tmp/api_resource_test_db.sqlite
|
491
538
|
- spec/tmp/DIR
|
539
|
+
- VERSION
|
492
540
|
homepage: http://github.com/ejlangev/resource
|
493
541
|
licenses:
|
494
542
|
- MIT
|
@@ -502,9 +550,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
502
550
|
- - ! '>='
|
503
551
|
- !ruby/object:Gem::Version
|
504
552
|
version: '0'
|
505
|
-
segments:
|
506
|
-
- 0
|
507
|
-
hash: 1111483963078583304
|
508
553
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
509
554
|
none: false
|
510
555
|
requirements:
|
@@ -519,3 +564,4 @@ specification_version: 3
|
|
519
564
|
summary: A replacement for ActiveResource for RESTful APIs that handles associated
|
520
565
|
object and multiple data sources
|
521
566
|
test_files: []
|
567
|
+
has_rdoc:
|
data/.document
DELETED
data/.rspec
DELETED
data/.travis.yml
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
module ApiResource
|
2
|
-
|
3
|
-
module Associations
|
4
|
-
|
5
|
-
class AssociationProxy
|
6
|
-
|
7
|
-
|
8
|
-
cattr_accessor :remote_path_element; self.remote_path_element = :service_uri
|
9
|
-
cattr_accessor :include_class_scopes; self.include_class_scopes = true
|
10
|
-
|
11
|
-
attr_accessor :owner, :loaded, :klass, :internal_object, :remote_path, :scopes, :times_loaded
|
12
|
-
|
13
|
-
# TODO: added owner - moved it to the end because the tests don't use it - it's useful here though
|
14
|
-
def initialize(klass_name, contents, owner = nil)
|
15
|
-
raise "Cannot create an association proxy to the unknown object #{klass_name}" unless defined?(klass_name.to_s.classify)
|
16
|
-
# A simple attr_accessor for testing purposes
|
17
|
-
self.times_loaded = 0
|
18
|
-
self.owner = owner
|
19
|
-
self.klass = klass_name.to_s.classify.constantize
|
20
|
-
# make sure we have the remote definition
|
21
|
-
self.klass.load_class_data
|
22
|
-
self.load(contents)
|
23
|
-
self.loaded = {}.with_indifferent_access
|
24
|
-
|
25
|
-
#debugger
|
26
|
-
|
27
|
-
if self.class.include_class_scopes
|
28
|
-
self.scopes = self.scopes.reverse_merge(self.klass.scopes)
|
29
|
-
end
|
30
|
-
# Now that we have set up all the scopes with the load method we need to create methods
|
31
|
-
self.scopes.each do |key, _|
|
32
|
-
next if self.respond_to?(key)
|
33
|
-
self.instance_eval <<-EOE, __FILE__, __LINE__ + 1
|
34
|
-
def #{key}(opts = {})
|
35
|
-
@#{key} ||= ApiResource::Associations::RelationScope.new(self, :#{key}, opts)
|
36
|
-
end
|
37
|
-
EOE
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def serializable_hash(options = {})
|
42
|
-
raise "Not Implemented: This method must be implemented in a subclass"
|
43
|
-
end
|
44
|
-
|
45
|
-
def scopes
|
46
|
-
@scopes ||= {}.with_indifferent_access
|
47
|
-
end
|
48
|
-
|
49
|
-
def scope?(scp)
|
50
|
-
self.scopes.keys.include?(scp.to_s)
|
51
|
-
end
|
52
|
-
|
53
|
-
def internal_object
|
54
|
-
@internal_object ||= self.load_scope_with_options(:all, {})
|
55
|
-
end
|
56
|
-
|
57
|
-
def blank?
|
58
|
-
self.internal_object.blank?
|
59
|
-
end
|
60
|
-
alias_method :empty?, :blank?
|
61
|
-
|
62
|
-
def method_missing(method, *args, &block)
|
63
|
-
self.internal_object.send(method, *args, &block)
|
64
|
-
end
|
65
|
-
|
66
|
-
def reload
|
67
|
-
if self
|
68
|
-
remove_instance_variable(:@internal_object) if instance_variable_defined?(:@internal_object)
|
69
|
-
self.load(self.load_from_remote({}))
|
70
|
-
self
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def to_s
|
75
|
-
self.internal_object.to_s
|
76
|
-
end
|
77
|
-
|
78
|
-
def inspect
|
79
|
-
self.internal_object.inspect
|
80
|
-
end
|
81
|
-
|
82
|
-
def ==(other)
|
83
|
-
raise "Not Implemented: This method must be implemented in a subclass"
|
84
|
-
end
|
85
|
-
|
86
|
-
protected
|
87
|
-
# This method loads a particular scope with a set of options from the remote server
|
88
|
-
def load_scope_with_options(scope, options)
|
89
|
-
raise "Not Implemented: This method must be implemented in a subclass"
|
90
|
-
end
|
91
|
-
# This method is a helper to initialize for loading the data passed in to create this object
|
92
|
-
def load(contents)
|
93
|
-
raise "Not Implemented: This method must be implemented in a subclass"
|
94
|
-
end
|
95
|
-
|
96
|
-
# get the remote URI based on our config and options
|
97
|
-
def build_load_path(options)
|
98
|
-
path = self.remote_path
|
99
|
-
# add a format if it doesn't exist and there is no query string yet
|
100
|
-
path += ".#{self.klass.format.extension}" unless path =~ /\./ || path =~/\?/
|
101
|
-
# add the query string, allowing for other user-provided options in the remote_path if we have options
|
102
|
-
unless options.blank?
|
103
|
-
path += (path =~ /\?/ ? "&" : "?") + options.to_query
|
104
|
-
end
|
105
|
-
path
|
106
|
-
end
|
107
|
-
|
108
|
-
# get data from the remote server
|
109
|
-
def load_from_remote(options)
|
110
|
-
self.klass.connection.get(self.build_load_path(options))
|
111
|
-
end
|
112
|
-
# This method create the key for the loaded hash, it ensures that a unique set of scopes
|
113
|
-
# with a unique set of options is only loaded once
|
114
|
-
def loaded_hash_key(scope, options)
|
115
|
-
options.to_a.sort.inject(scope) {|accum,(k,v)| accum << "_#{k}_#{v}"}
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'api_resource/associations/resource_scope'
|
2
|
-
|
3
|
-
module ApiResource
|
4
|
-
module Associations
|
5
|
-
class DynamicResourceScope < ResourceScope
|
6
|
-
|
7
|
-
attr_accessor :dynamic_value
|
8
|
-
# initializer - set up the dynamic value
|
9
|
-
def initialize(klass, current_scope, dynamic_value, opts = {})
|
10
|
-
self.dynamic_value = dynamic_value
|
11
|
-
super(klass, current_scope, opts)
|
12
|
-
end
|
13
|
-
# get the to_query value for this resource scope
|
14
|
-
def to_hash
|
15
|
-
hsh = self.scopes[self.current_scope].clone
|
16
|
-
hsh.each_pair do |k,v|
|
17
|
-
hsh[k] = self.dynamic_value
|
18
|
-
end
|
19
|
-
self.parent_hash.merge(hsh)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
require 'api_resource/associations/resource_scope'
|
2
|
-
|
3
|
-
module ApiResource
|
4
|
-
module Associations
|
5
|
-
|
6
|
-
class GenericScope < ResourceScope
|
7
|
-
attr_reader :name
|
8
|
-
attr_reader :params
|
9
|
-
attr_reader :types
|
10
|
-
attr_reader :values
|
11
|
-
|
12
|
-
# Gets called when a scope is called. Stores everything in
|
13
|
-
# this class. Sorry, couldn't be bothered to figure out the
|
14
|
-
# class hierarchy.
|
15
|
-
#
|
16
|
-
# klass - ApiResourceBase class
|
17
|
-
# current_scope - sym for the scope
|
18
|
-
# *args - arguments being passed to the scope
|
19
|
-
def initialize(klass, current_scope, *args)
|
20
|
-
|
21
|
-
@name = current_scope # contains sym with scope ie :for_provider
|
22
|
-
@params = klass.related_objects[:scopes][current_scope].keys
|
23
|
-
@types = klass.related_objects[:scopes][current_scope].values
|
24
|
-
|
25
|
-
# Bail if we have crap
|
26
|
-
if @params == nil
|
27
|
-
raise "Scope #{@name} does not exist #{klass.name}. Scopes: #{klass.related_objects[:scopes]}"
|
28
|
-
end
|
29
|
-
|
30
|
-
# extract parent scope stuff
|
31
|
-
opts = {}
|
32
|
-
last_arg = args[args.count - 1]
|
33
|
-
if last_arg != nil && last_arg.is_a?(Hash) && last_arg[:parent] != nil
|
34
|
-
args = args.slice(0, args.count - 1)
|
35
|
-
opts = last_arg
|
36
|
-
end
|
37
|
-
|
38
|
-
# walk through parameters and types and assign values from *args to parameters
|
39
|
-
@values = []
|
40
|
-
@params.count.times do |i|
|
41
|
-
if @types[i] == :rest
|
42
|
-
@values << args.slice(i, args.count)
|
43
|
-
else
|
44
|
-
@values << args[i]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Let the parent class do its magic.
|
49
|
-
super(klass, current_scope, opts)
|
50
|
-
end
|
51
|
-
|
52
|
-
# get the to_query value for this resource scope
|
53
|
-
def to_hash
|
54
|
-
# debugger
|
55
|
-
if @params.count == 0
|
56
|
-
scope_arguments = true
|
57
|
-
else
|
58
|
-
scope_arguments = {}
|
59
|
-
@params.count.times do |i|
|
60
|
-
scope_arguments[@params[i]] = @values[i] if @values[i] != nil
|
61
|
-
end
|
62
|
-
end
|
63
|
-
self.parent_hash.merge({@name => scope_arguments})
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'api_resource/associations/dynamic_resource_scope'
|
2
|
-
|
3
|
-
module ApiResource
|
4
|
-
module Associations
|
5
|
-
class MultiArgumentResourceScope < DynamicResourceScope
|
6
|
-
# initialize with a variable number of dynamic arguments
|
7
|
-
def initialize(klass, current_scope, *dynamic_value)
|
8
|
-
# pull off opts
|
9
|
-
opts = dynamic_value.extract_options!
|
10
|
-
# we always dynamic value to be an Array, so we don't use the splat here
|
11
|
-
super(klass, current_scope, dynamic_value.flatten, opts)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'api_resource/associations/scope'
|
2
|
-
|
3
|
-
module ApiResource
|
4
|
-
|
5
|
-
module Associations
|
6
|
-
|
7
|
-
class RelationScope < Scope
|
8
|
-
|
9
|
-
# Use this method to access the internal data, this guarantees that loading only occurs once per object
|
10
|
-
def internal_object
|
11
|
-
ApiResource.with_ttl(ttl) do
|
12
|
-
@internal_object ||= self.klass.send(:load_scope_with_options, self.current_scope, self.to_hash)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
#
|
16
|
-
# class factory
|
17
|
-
def self.class_factory(hsh)
|
18
|
-
ApiResource::Associations::RelationScope
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|