api_resource 0.4.3 → 0.5.0
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 +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
|