restly 0.0.1.alpha.1 → 0.0.1.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +2 -0
- data/README.md +63 -3
- data/lib/generators/restly_config_generator.rb +13 -0
- data/lib/generators/restly_model_generator.rb +18 -0
- data/lib/generators/templates/config.yml.erb +32 -0
- data/lib/generators/templates/model.rb.erb +9 -0
- data/lib/restly/associations/base.rb +83 -12
- data/lib/restly/associations/belongs_to.rb +23 -6
- data/lib/restly/associations/embeddable_resources/embeds_many.rb +4 -0
- data/lib/restly/associations/embeddable_resources/embeds_one.rb +4 -0
- data/lib/restly/associations/embeddable_resources.rb +15 -4
- data/lib/restly/associations/has_many.rb +0 -9
- data/lib/restly/associations/has_one.rb +0 -9
- data/lib/restly/associations.rb +75 -15
- data/lib/restly/base/generic_methods.rb +10 -2
- data/lib/restly/base/includes.rb +0 -22
- data/lib/restly/base/instance/attributes.rb +26 -16
- data/lib/restly/base/instance/persistence.rb +6 -1
- data/lib/restly/base/{write_callbacks.rb → instance/write_callbacks.rb} +1 -1
- data/lib/restly/base/instance.rb +15 -9
- data/lib/restly/base.rb +3 -4
- data/lib/restly/client.rb +2 -2
- data/lib/restly/collection/pagination.rb +1 -1
- data/lib/restly/concerned_inheritance.rb +30 -0
- data/lib/restly/configuration.rb +20 -18
- data/lib/restly/error.rb +18 -20
- data/lib/restly/nested_attributes.rb +4 -3
- data/lib/restly/proxies/{auth.rb → authorization.rb} +1 -1
- data/lib/restly/proxies/base.rb +4 -0
- data/lib/restly/proxies/{params.rb → with_params.rb} +1 -1
- data/lib/restly/proxies/with_path.rb +24 -0
- data/lib/restly/proxies.rb +3 -4
- data/lib/restly/railtie.rb +5 -0
- data/lib/restly/version.rb +1 -1
- data/lib/restly.rb +2 -0
- data/restly.gemspec +0 -1
- data/spec/restly/associations/base_spec.rb +8 -0
- data/spec/restly/associations/belongs_to_spec.rb +8 -0
- data/spec/restly/associations/embeddable_resources/embeds_many_spec.rb +8 -0
- data/spec/restly/associations/embeddable_resources/embeds_one_spec.rb +8 -0
- data/spec/restly/associations/embeddable_resources_spec.rb +8 -0
- data/spec/restly/associations/has_many_spec.rb +8 -0
- data/spec/restly/associations/has_one_spec.rb +8 -0
- data/spec/restly/associations_spec.rb +8 -0
- data/spec/restly/base/fields_spec.rb +8 -0
- data/spec/restly/base/generic_methods_spec.rb +8 -0
- data/spec/restly/base/includes_spec.rb +8 -0
- data/spec/restly/base/instance/actions_spec.rb +8 -0
- data/spec/restly/base/instance/attributes_spec.rb +8 -0
- data/spec/restly/base/instance/persistence_spec.rb +8 -0
- data/spec/restly/base/instance/write_callbacks_spec.rb +8 -0
- data/spec/restly/base/instance_spec.rb +8 -0
- data/spec/restly/base/mass_assignment_security_spec.rb +8 -0
- data/spec/restly/base/resource/finders_spec.rb +8 -0
- data/spec/restly/base/resource_spec.rb +8 -0
- data/spec/restly/base_spec.rb +5 -51
- data/spec/restly/client_spec.rb +8 -0
- data/spec/restly/collection/pagination_spec.rb +8 -0
- data/spec/restly/collection_spec.rb +8 -0
- data/spec/restly/concearned_inheritance_spec.rb +8 -0
- data/spec/restly/configuration_spec.rb +8 -0
- data/spec/restly/connection_spec.rb +8 -0
- data/spec/restly/controller_methods_spec.rb +8 -0
- data/spec/restly/middleware_spec.rb +8 -0
- data/spec/restly/nested_attributes_spec.rb +8 -0
- data/spec/restly/proxies/associations/collection_spec.rb +8 -0
- data/spec/restly/proxies/associations/instance_spec.rb +8 -0
- data/spec/restly/proxies/authorization_spec.rb +8 -0
- data/spec/restly/proxies/base_spec.rb +8 -0
- data/spec/restly/proxies/with_params_spec.rb +8 -0
- data/spec/restly/thread_local_spec.rb +8 -0
- data/spec/{helper.rb → spec_helper.rb} +0 -3
- metadata +82 -26
- data/lib/restly/associations/builder.rb +0 -30
- data/spec/fakewebs.rb +0 -0
data/.rspec
ADDED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Restly
|
2
2
|
|
3
|
-
|
3
|
+
Restly is an ActiveModel based ODM (Object Document Mapper) for restful web-services. It includes the ability to define relationships to any Ruby class using some built in helpers.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -16,9 +16,69 @@ Or install it yourself as:
|
|
16
16
|
|
17
17
|
$ gem install restly
|
18
18
|
|
19
|
-
##
|
19
|
+
## Configuration
|
20
|
+
In order for restly to funciton it will need some configuration. This can be done by placing restly.yml in your config directory. We have added a generator to make this easier.
|
20
21
|
|
21
|
-
|
22
|
+
```sh
|
23
|
+
$ rails generate restly:configuration
|
24
|
+
```
|
25
|
+
|
26
|
+
This will generate a file like so:
|
27
|
+
|
28
|
+
```yaml
|
29
|
+
development: &development
|
30
|
+
site: http://example.com # Change This
|
31
|
+
default_format: json # defaults to: json
|
32
|
+
|
33
|
+
## Would you like requests to be cached?
|
34
|
+
# cache: true
|
35
|
+
# cache_options:
|
36
|
+
# expires_in: 3600
|
37
|
+
|
38
|
+
## Enable Oauth?
|
39
|
+
# use_oauth: true
|
40
|
+
# oauth_options:
|
41
|
+
# client_id: %client_id%
|
42
|
+
# client_secret: %client_secret%
|
43
|
+
|
44
|
+
test:
|
45
|
+
<<: *development
|
46
|
+
|
47
|
+
production:
|
48
|
+
site: http://example.com # Change This
|
49
|
+
default_format: json # defaults to: json
|
50
|
+
|
51
|
+
# Would you like requests to be cached?
|
52
|
+
cache: true
|
53
|
+
cache_options:
|
54
|
+
expires_in: 3600
|
55
|
+
|
56
|
+
## Enable Oauth?
|
57
|
+
# use_oauth: true
|
58
|
+
# oauth_options:
|
59
|
+
# client_id: %client_id%
|
60
|
+
# client_secret: %client_secret%
|
61
|
+
|
62
|
+
```
|
63
|
+
|
64
|
+
## Creating a Restly Model
|
65
|
+
|
66
|
+
# Using the generator
|
67
|
+
|
68
|
+
```
|
69
|
+
$ rails generate restly:model MyModel
|
70
|
+
```
|
71
|
+
|
72
|
+
This will generate a model that looks like this:
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
class MyModel < Restly::Base
|
76
|
+
|
77
|
+
# self.resource_name = 'my_model'
|
78
|
+
# self.path = 'some_path/to_resource' # defaults to: 'resource_name.pluralized'
|
79
|
+
|
80
|
+
end
|
81
|
+
```
|
22
82
|
|
23
83
|
## Contributing
|
24
84
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Restly
|
2
|
+
module Generators
|
3
|
+
class ModelGenerator < Rails::Generators::NamedBase
|
4
|
+
|
5
|
+
source_root File.expand_path("../templates", __FILE__)
|
6
|
+
|
7
|
+
def initialize(args, *options) #:nodoc:
|
8
|
+
args[0] = args[0].gsub(/\./,'_')
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_model_file
|
13
|
+
template "model.rb.erb", "app/models/#{file_name}.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
development: &development
|
2
|
+
site: http://example.com # Change This
|
3
|
+
default_format: json # defaults to: json
|
4
|
+
|
5
|
+
## Would you like requests to be cached?
|
6
|
+
# cache: true
|
7
|
+
# cache_options:
|
8
|
+
# expires_in: 3600
|
9
|
+
|
10
|
+
## Enable Oauth?
|
11
|
+
# use_oauth: true
|
12
|
+
# oauth_options:
|
13
|
+
# client_id: %client_id%
|
14
|
+
# client_secret: %client_secret%
|
15
|
+
|
16
|
+
test:
|
17
|
+
<<: *development
|
18
|
+
|
19
|
+
production:
|
20
|
+
site: http://example.com # Change This
|
21
|
+
default_format: json # defaults to: json
|
22
|
+
|
23
|
+
# Would you like requests to be cached?
|
24
|
+
cache: true
|
25
|
+
cache_options:
|
26
|
+
expires_in: 3600
|
27
|
+
|
28
|
+
## Enable Oauth?
|
29
|
+
# use_oauth: true
|
30
|
+
# oauth_options:
|
31
|
+
# client_id: %client_id%
|
32
|
+
# client_secret: %client_secret%
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class <%= class_name %> < Restly::Base
|
2
|
+
|
3
|
+
## Override the Site
|
4
|
+
# self.site = "anotherexample.com" # defaults to config's site
|
5
|
+
# self.resource_name = "some_other_name" # defaults to class_name.underscore
|
6
|
+
# self.path = "/some_other_path" # defaults to: resource_name.pluralized
|
7
|
+
# self.format = :json # defaults to :json
|
8
|
+
|
9
|
+
end
|
@@ -12,24 +12,95 @@ class Restly::Associations::Base
|
|
12
12
|
@options = options
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
|
15
|
+
def load(parent, options)
|
16
|
+
|
17
|
+
# Merge Options
|
18
|
+
options.reverse_merge!(self.options)
|
19
|
+
|
20
|
+
# Authorize and Set Path
|
21
|
+
association = authorize(options[:authorize]).with_path(parent, options[:path])
|
22
|
+
|
23
|
+
# Load Collection or Instance
|
24
|
+
collection? ? association.load_collection(parent) : association.load_instance(parent)
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_collection(parent, association_class = self.association_class)
|
28
|
+
raise Restly::Error::AssociationError, "Not a collection" unless collection?
|
29
|
+
Restly::Proxies::Associations::Collection.new(association_class.all, parent)
|
30
|
+
end
|
31
|
+
|
32
|
+
def load_instance(parent, association_class = self.association_class)
|
33
|
+
raise Restly::Error::AssociationError, "Not an instance" if collection?
|
34
|
+
instance = if (foreign_key = parent.attributes["#{name}_id"])
|
35
|
+
association_class.find(foreign_key)
|
36
|
+
else
|
37
|
+
association_class.instance_from_response association_class.connection.get(association_class.path)
|
38
|
+
end
|
39
|
+
Restly::Proxies::Associations::Instance.new(instance, parent)
|
40
|
+
end
|
41
|
+
|
42
|
+
def valid?(val)
|
43
|
+
valid_instances = Array.wrap(val).reject{ |item| item.resource_name == @association_class.resource_name }.empty?
|
44
|
+
raise Restly::Error::InvalidObject, "#{val} is not a #{association_class}" unless valid_instances
|
45
|
+
end
|
46
|
+
|
47
|
+
# Stubs
|
48
|
+
def stub(parent, attributes)
|
49
|
+
return nil if !parent.is_a?(Restly::Base) || !attributes.present?
|
50
|
+
collection? ? stub_collection(parent, attributes) : stub_instance(parent, attributes)
|
51
|
+
end
|
52
|
+
|
53
|
+
def stub_collection(parent, attributes)
|
54
|
+
collection = attributes.map{ |item_attrs| association_class.new(item_attrs, loaded: embedded?) }
|
55
|
+
Restly::Proxies::Associations::Collection.new(collection, parent)
|
56
|
+
end
|
57
|
+
|
58
|
+
def stub_instance(parent, attributes)
|
59
|
+
instance = association_class.new(attributes, loaded: embedded?)
|
60
|
+
Restly::Proxies::Associations::Instance.new(instance, parent)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Build
|
64
|
+
def build(parent, attributes = nil, options = {})
|
65
|
+
raise NoMethodError, "Build not available for collection." if collection?
|
66
|
+
instance = association_class.new(attributes, options)
|
67
|
+
instance.write_attribute("#{@owner.resource_name}_id", parent.id) if association_class.method_defined?("#{@owner.resource_name}_id")
|
68
|
+
Restly::Proxies::Associations::Instance.new(instance, parent)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Modifiers
|
72
|
+
def authorize(authorization = nil, association_class=self.association_class)
|
73
|
+
duplicate = self.dup
|
74
|
+
duplicate.instance_variable_set :@association_class, if (!association_class.authorized? && @owner.respond_to?(:authorized?) && @owner.authorized?) || authorization
|
75
|
+
association_class.authorize(authorization || @owner.connection)
|
76
|
+
else
|
77
|
+
association_class
|
78
|
+
end
|
79
|
+
duplicate
|
17
80
|
end
|
18
81
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
82
|
+
def with_path(parent, path = nil, association_class=self.association_class)
|
83
|
+
duplicate = self.dup
|
84
|
+
duplicate.instance_variable_set :@association_class, if path
|
85
|
+
association_class.with_path(path)
|
86
|
+
else
|
87
|
+
association_class.with_path(association_resource_name, prepend: parent.path)
|
88
|
+
end
|
89
|
+
duplicate
|
23
90
|
end
|
24
91
|
|
25
92
|
private
|
26
93
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
94
|
+
def collection?
|
95
|
+
false
|
96
|
+
end
|
97
|
+
|
98
|
+
def embedded?
|
99
|
+
false
|
100
|
+
end
|
101
|
+
|
102
|
+
def association_resource_name
|
103
|
+
collection? ? association_class.resource_name.pluralize : association_class.resource_name
|
33
104
|
end
|
34
105
|
|
35
106
|
end
|
@@ -1,11 +1,28 @@
|
|
1
1
|
class Restly::Associations::BelongsTo < Restly::Associations::Base
|
2
2
|
|
3
|
-
def
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
def load(parent, options)
|
4
|
+
if polymorphic
|
5
|
+
set_polymorphic_class(parent).load(parent, options)
|
6
|
+
else
|
7
|
+
super(parent, options)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def set_polymorphic_class(parent)
|
12
|
+
duplicate = self.dup
|
13
|
+
duplicate.instance_variable_set(:@association_class, parent.send("#{name}_type"))
|
14
|
+
duplicate.instance_variable_set(:@polymorphic, false)
|
15
|
+
duplicate
|
16
|
+
end
|
17
|
+
|
18
|
+
def with_path(parent, path = nil, association_class=self.association_class)
|
19
|
+
duplicate = self.dup
|
20
|
+
duplicate.instance_variable_set :@association_class, if path
|
21
|
+
association_class.with_path(path)
|
22
|
+
else
|
23
|
+
association_class
|
24
|
+
end
|
25
|
+
duplicate
|
9
26
|
end
|
10
27
|
|
11
28
|
def collection?
|
@@ -10,9 +10,15 @@ module Restly::Associations::EmbeddableResources
|
|
10
10
|
exclude_field(name) if ancestors.include?(Restly::Base)
|
11
11
|
self.resource_associations[name] = association = EmbedsOne.new(self, name, options)
|
12
12
|
|
13
|
-
define_method name do
|
14
|
-
|
13
|
+
define_method name do |options={}|
|
14
|
+
return get_association(name) if get_association(name).present?
|
15
|
+
set_association name, association.stub(self)
|
15
16
|
end
|
17
|
+
|
18
|
+
define_method "#{name}=" do |value|
|
19
|
+
set_association name, value
|
20
|
+
end
|
21
|
+
|
16
22
|
end
|
17
23
|
|
18
24
|
# Embeds Many
|
@@ -20,9 +26,14 @@ module Restly::Associations::EmbeddableResources
|
|
20
26
|
exclude_field(name) if ancestors.include?(Restly::Base)
|
21
27
|
self.resource_associations[name] = association = EmbedsMany.new(self, name, options)
|
22
28
|
|
23
|
-
define_method name do
|
24
|
-
(
|
29
|
+
define_method name do |options={}|
|
30
|
+
get_association(name, options)
|
25
31
|
end
|
32
|
+
|
33
|
+
define_method "#{name}=" do |value|
|
34
|
+
set_association name, value
|
35
|
+
end
|
36
|
+
|
26
37
|
end
|
27
38
|
|
28
39
|
end
|
@@ -7,15 +7,6 @@ class Restly::Associations::HasMany < Restly::Associations::Base
|
|
7
7
|
super
|
8
8
|
end
|
9
9
|
|
10
|
-
def scope_with_parent(parent, options)
|
11
|
-
options.reverse_merge!(self.options)
|
12
|
-
association_class = polymorphic ? [@namespace, instance.send("#{name}_type")] : self.association_class
|
13
|
-
association_class = authorize(association_class, options[:authorize])
|
14
|
-
collection = association_class.with_params("with_#{parent.resource_name}_id" => parent.id).all # (parent.attributes["#{name}_id"])
|
15
|
-
collection.select{|i| i.attributes["#{parent.resource_name}_id"] == parent.id }
|
16
|
-
Restly::Proxies::Associations::Collection.new(collection, parent)
|
17
|
-
end
|
18
|
-
|
19
10
|
def collection?
|
20
11
|
true
|
21
12
|
end
|
@@ -7,15 +7,6 @@ class Restly::Associations::HasOne < Restly::Associations::Base
|
|
7
7
|
super
|
8
8
|
end
|
9
9
|
|
10
|
-
def scope_with_parent(parent, options)
|
11
|
-
options.reverse_merge!(self.options)
|
12
|
-
association_class = polymorphic ? [@namespace, instance.send("#{name}_type")] : self.association_class
|
13
|
-
association_class = authorize(association_class, options[:authorize])
|
14
|
-
collection = association_class.with_params("with_#{parent.resource_name}_id" => parent.id).all(parent.attributes["#{name}_id"])
|
15
|
-
collection.select{|i| i.attributes["#{parent.resource_name}_id"] == parent.id }.first
|
16
|
-
Restly::Proxies::Associations::Instance.new(instance, parent)
|
17
|
-
end
|
18
|
-
|
19
10
|
def collection?
|
20
11
|
true
|
21
12
|
end
|
data/lib/restly/associations.rb
CHANGED
@@ -10,17 +10,30 @@ module Restly::Associations
|
|
10
10
|
autoload :HasOneThrough
|
11
11
|
autoload :EmbeddableResources
|
12
12
|
|
13
|
-
class
|
13
|
+
class AssociationsSet < HashWithIndifferentAccess
|
14
|
+
end
|
15
|
+
|
16
|
+
class IndifferentSet < Set
|
17
|
+
|
18
|
+
def include?(attr)
|
19
|
+
return super unless attr.is_a?(Symbol) || attr.is_a?(String)
|
20
|
+
super(attr.to_s) || super(attr.to_sym)
|
21
|
+
end
|
22
|
+
|
14
23
|
end
|
15
24
|
|
16
25
|
included do
|
17
26
|
|
18
|
-
|
27
|
+
include Restly::ConcernedInheritance
|
28
|
+
extend EmbeddableResources if self == Restly::Base
|
19
29
|
include Restly::NestedAttributes
|
20
30
|
|
21
31
|
delegate :resource_name, to: :klass
|
22
32
|
class_attribute :resource_associations, instance_reader: false, instance_writer: false
|
23
|
-
|
33
|
+
|
34
|
+
attr_reader :association_attributes
|
35
|
+
|
36
|
+
self.resource_associations = AssociationsSet.new
|
24
37
|
|
25
38
|
inherited do
|
26
39
|
self.resource_associations = resource_associations.dup
|
@@ -28,12 +41,42 @@ module Restly::Associations
|
|
28
41
|
|
29
42
|
end
|
30
43
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
44
|
+
def associations
|
45
|
+
IndifferentSet.new klass.reflect_on_all_resource_associations.keys.map(&:to_sym)
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_association(attr, val)
|
49
|
+
association = klass.reflect_on_resource_association(attr)
|
50
|
+
association.valid?(val)
|
51
|
+
@association_attributes[attr] = val
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_association(attr, options={})
|
55
|
+
association = klass.reflect_on_resource_association(attr)
|
56
|
+
(@association_attributes ||= {}.with_indifferent_access)[attr] || set_association(attr, association.load(self, options))
|
57
|
+
end
|
58
|
+
|
59
|
+
def respond_to_association?(m)
|
60
|
+
!!(/(?<attr>\w+)(?<setter>=)?$/ =~ m.to_s) && associations.include?(attr.to_sym)
|
61
|
+
end
|
62
|
+
|
63
|
+
def respond_to?(m, include_private = false)
|
64
|
+
respond_to_association?(m) || super
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def method_missing(m, *args, &block)
|
70
|
+
if !!(/(?<attr>\w+)(?<setter>=)?$/ =~ m.to_s) && associations.include?(m)
|
71
|
+
attr = attr.to_sym
|
72
|
+
case !!setter
|
73
|
+
when true
|
74
|
+
set_association(attr, *args)
|
75
|
+
when false
|
76
|
+
get_association(attr)
|
77
|
+
end
|
78
|
+
else
|
79
|
+
super(m, *args, &block)
|
37
80
|
end
|
38
81
|
end
|
39
82
|
|
@@ -47,6 +90,10 @@ module Restly::Associations
|
|
47
90
|
name.gsub(/.*::/,'').underscore
|
48
91
|
end
|
49
92
|
|
93
|
+
def reflect_on_resource_association(association_name)
|
94
|
+
reflect_on_all_resource_associations[association_name]
|
95
|
+
end
|
96
|
+
|
50
97
|
def reflect_on_all_resource_associations
|
51
98
|
resource_associations
|
52
99
|
end
|
@@ -57,32 +104,45 @@ module Restly::Associations
|
|
57
104
|
def belongs_to_resource(name, options = {})
|
58
105
|
exclude_field(name) if ancestors.include?(Restly::Base)
|
59
106
|
self.resource_associations[name] = association = BelongsTo.new(self, name, options)
|
107
|
+
|
60
108
|
define_method name do |options={}|
|
61
|
-
|
109
|
+
get_association(name, options)
|
110
|
+
end
|
111
|
+
|
112
|
+
define_method "#{name}=" do |value|
|
113
|
+
set_association name, value
|
62
114
|
end
|
115
|
+
|
63
116
|
end
|
64
117
|
|
65
118
|
# Has One
|
66
119
|
def has_one_resource(name, options = {})
|
67
120
|
exclude_field(name) if ancestors.include?(Restly::Base)
|
68
121
|
self.resource_associations[name] = association = HasOne.new(self, name, options)
|
122
|
+
|
69
123
|
define_method name do |options={}|
|
70
|
-
|
124
|
+
get_association(name, options)
|
125
|
+
end
|
126
|
+
|
127
|
+
define_method "#{name}=" do |value|
|
128
|
+
set_association name, value
|
71
129
|
end
|
130
|
+
|
72
131
|
end
|
73
132
|
|
74
133
|
# Has One
|
75
134
|
def has_many_resources(name, options = {})
|
76
135
|
exclude_field(name) if ancestors.include?(Restly::Base)
|
77
136
|
self.resource_associations[name] = association = HasMany.new(self, name, options)
|
137
|
+
|
78
138
|
define_method name do |options={}|
|
79
|
-
|
139
|
+
get_association(name, options)
|
80
140
|
end
|
81
|
-
end
|
82
141
|
|
142
|
+
define_method "#{name}=" do |value|
|
143
|
+
set_association name, value
|
144
|
+
end
|
83
145
|
|
84
|
-
def reflect_on_resource_association(association_name)
|
85
|
-
reflect_on_all_resource_associations[association_name]
|
86
146
|
end
|
87
147
|
|
88
148
|
end
|
@@ -1,11 +1,15 @@
|
|
1
1
|
module Restly::Base::GenericMethods
|
2
2
|
|
3
3
|
def authorize(token_object)
|
4
|
-
Restly::Proxies::
|
4
|
+
Restly::Proxies::Authorization.new self, token_object
|
5
5
|
end
|
6
6
|
|
7
7
|
def with_params(params={})
|
8
|
-
Restly::Proxies::
|
8
|
+
Restly::Proxies::WithParams.new self, params
|
9
|
+
end
|
10
|
+
|
11
|
+
def with_path(*args)
|
12
|
+
Restly::Proxies::WithPath.new self, *args
|
9
13
|
end
|
10
14
|
|
11
15
|
def path_with_format(*args)
|
@@ -21,4 +25,8 @@ module Restly::Base::GenericMethods
|
|
21
25
|
connection.token.present?
|
22
26
|
end
|
23
27
|
|
28
|
+
def proxied?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
24
32
|
end
|
data/lib/restly/base/includes.rb
CHANGED
@@ -1,18 +1,6 @@
|
|
1
1
|
module Restly::Base::Includes
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
|
-
included do
|
5
|
-
extend ClassMethods
|
6
|
-
|
7
|
-
class_attribute :inherited_callbacks
|
8
|
-
self.inherited_callbacks = []
|
9
|
-
|
10
|
-
inherited do
|
11
|
-
self.inherited_callbacks = inherited_callbacks
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
4
|
module ClassMethods
|
17
5
|
|
18
6
|
# Delegate stuff to client
|
@@ -38,16 +26,6 @@ module Restly::Base::Includes
|
|
38
26
|
resource_name
|
39
27
|
end
|
40
28
|
|
41
|
-
private
|
42
|
-
|
43
|
-
def inherited(subclass = nil, &block)
|
44
|
-
self.inherited_callbacks << block and return if block_given?
|
45
|
-
|
46
|
-
inherited_callbacks.each do |call_block|
|
47
|
-
subclass.class_eval(&call_block)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
29
|
end
|
52
30
|
|
53
31
|
end
|