axel 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +21 -0
- data/.octopolo.yml +2 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +23 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +271 -0
- data/Rakefile +13 -0
- data/app/models/axel/api_proxy.rb +86 -0
- data/app/models/axel/associations/base.rb +64 -0
- data/app/models/axel/associations/belongs_to.rb +43 -0
- data/app/models/axel/associations/has_many.rb +29 -0
- data/app/models/axel/associations/has_one.rb +30 -0
- data/app/models/axel/payload.rb +4 -0
- data/app/models/axel/payload/base.rb +107 -0
- data/app/models/axel/payload/errors.rb +62 -0
- data/app/models/axel/payload/metadata.rb +57 -0
- data/app/models/axel/querier.rb +166 -0
- data/app/models/axel/router.rb +119 -0
- data/app/models/axel/service_resource.rb +4 -0
- data/app/models/axel/service_resource/associations.rb +80 -0
- data/app/models/axel/service_resource/attributes.rb +23 -0
- data/app/models/axel/service_resource/automatic_resource.rb +23 -0
- data/app/models/axel/service_resource/base.rb +47 -0
- data/app/models/axel/service_resource/builder.rb +40 -0
- data/app/models/axel/service_resource/inspects.rb +17 -0
- data/app/models/axel/service_resource/payload_parser.rb +46 -0
- data/app/models/axel/service_resource/queries.rb +25 -0
- data/app/models/axel/service_resource/requesters.rb +49 -0
- data/app/models/axel/service_resource/routes.rb +19 -0
- data/app/models/axel/service_resource/typhoid_extensions.rb +134 -0
- data/app/views/axel/base/empty.json.erb +0 -0
- data/app/views/axel/base/empty.xml.builder +0 -0
- data/app/views/layouts/axel.json.jbuilder +7 -0
- data/app/views/layouts/axel.xml.builder +12 -0
- data/axel.gemspec +42 -0
- data/lib/axel.rb +56 -0
- data/lib/axel/application_extensions.rb +13 -0
- data/lib/axel/application_helper.rb +27 -0
- data/lib/axel/base_controller.rb +6 -0
- data/lib/axel/cascadable_attribute.rb +33 -0
- data/lib/axel/configurations/resource.rb +29 -0
- data/lib/axel/configurations/service.rb +28 -0
- data/lib/axel/configurator.rb +54 -0
- data/lib/axel/configurators/services.rb +29 -0
- data/lib/axel/controller_base.rb +27 -0
- data/lib/axel/controller_helpers.rb +209 -0
- data/lib/axel/controller_parameters.rb +32 -0
- data/lib/axel/engine.rb +14 -0
- data/lib/axel/inspector.rb +91 -0
- data/lib/axel/payload/remote_error.rb +14 -0
- data/lib/axel/request_options.rb +26 -0
- data/lib/axel/uri.rb +47 -0
- data/lib/axel/version.rb +3 -0
- data/lib/generators/axel/install_generator.rb +16 -0
- data/lib/generators/templates/README.md +22 -0
- data/lib/generators/templates/axel.rb +81 -0
- data/script/rails +5 -0
- data/spec/controllers/pages_controller_spec.rb +217 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/pages_controller.rb +6 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +62 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/log/.gitignore +1 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/envelope_integration_check.rb +96 -0
- data/spec/helpers/axel/application_helper_spec.rb +31 -0
- data/spec/lib/axel/associations/base_spec.rb +28 -0
- data/spec/lib/axel/associations/belongs_to_spec.rb +62 -0
- data/spec/lib/axel/associations/has_many_spec.rb +23 -0
- data/spec/lib/axel/associations/has_one_spec.rb +23 -0
- data/spec/lib/axel/configurations/resource_spec.rb +15 -0
- data/spec/lib/axel/configurations/service_spec.rb +31 -0
- data/spec/lib/axel/configurator_spec.rb +26 -0
- data/spec/lib/axel/configurators/services_spec.rb +37 -0
- data/spec/lib/axel/controller_base_spec.rb +16 -0
- data/spec/lib/axel/controller_parameters_spec.rb +31 -0
- data/spec/lib/axel/inspector_spec.rb +45 -0
- data/spec/lib/axel/request_options_spec.rb +50 -0
- data/spec/lib/axel/uri_spec.rb +42 -0
- data/spec/lib/axel_spec.rb +64 -0
- data/spec/models/axel/api_proxy_spec.rb +66 -0
- data/spec/models/axel/payload/errors_spec.rb +165 -0
- data/spec/models/axel/payload/metadata_spec.rb +141 -0
- data/spec/models/axel/querier_spec.rb +158 -0
- data/spec/models/axel/router_spec.rb +115 -0
- data/spec/models/axel/service_resource/base_spec.rb +244 -0
- data/spec/models/axel/service_resource/builder_spec.rb +64 -0
- data/spec/models/axel/service_resource/payload_parser_spec.rb +60 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/support/address.rb +5 -0
- data/spec/support/persona.rb +15 -0
- data/spec/support/user.rb +6 -0
- data/spec/views/axel/base/empty_spec.rb +34 -0
- metadata +508 -0
@@ -0,0 +1,119 @@
|
|
1
|
+
module Axel
|
2
|
+
class Router
|
3
|
+
private
|
4
|
+
attr_writer :path
|
5
|
+
attr_writer :origin_klass
|
6
|
+
attr_writer :method_name
|
7
|
+
attr_writer :parameters
|
8
|
+
attr_writer :options
|
9
|
+
|
10
|
+
public
|
11
|
+
attr_reader :path
|
12
|
+
attr_reader :origin_klass
|
13
|
+
attr_reader :method_name
|
14
|
+
attr_reader :parameters
|
15
|
+
attr_reader :options
|
16
|
+
|
17
|
+
def initialize(klass, path, name, options = {})
|
18
|
+
self.path = path.to_s
|
19
|
+
self.origin_klass = klass
|
20
|
+
self.method_name = name.to_s
|
21
|
+
self.options = options || {}
|
22
|
+
extract_parameters!
|
23
|
+
end
|
24
|
+
|
25
|
+
def define_route
|
26
|
+
setup_klass_method
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def route(*args)
|
31
|
+
route_path = build_path_with_args *args
|
32
|
+
route_options = extract_routed_args_options args
|
33
|
+
run_route route_path, route_options
|
34
|
+
end
|
35
|
+
|
36
|
+
# The class constant used for querying and dumping the
|
37
|
+
# response to
|
38
|
+
def klass
|
39
|
+
klass_from_class_option || klass_from_class_name_option || origin_klass
|
40
|
+
end
|
41
|
+
private :klass
|
42
|
+
|
43
|
+
def klass_from_class_option(class_option = options[:class])
|
44
|
+
class_option.respond_to?(:querier) && class_option
|
45
|
+
end
|
46
|
+
private :klass_from_class_option
|
47
|
+
|
48
|
+
def klass_from_class_name_option
|
49
|
+
options[:class_name].present? &&
|
50
|
+
klass_from_class_option(options[:class_name].to_s.camelize.safe_constantize)
|
51
|
+
end
|
52
|
+
private :klass_from_class_name_option
|
53
|
+
|
54
|
+
def run_route(route_path, route_options)
|
55
|
+
klass.querier.without_default_path.at_path(route_path).request_options route_options
|
56
|
+
end
|
57
|
+
private :run_route
|
58
|
+
|
59
|
+
def extract_routed_args_options(args)
|
60
|
+
hash_options = arity > 0 && args.first.is_a?(Hash)
|
61
|
+
first_option = hash_options ? 1 : arity - 1
|
62
|
+
args[first_option..-1].to_a.extract_options!
|
63
|
+
end
|
64
|
+
private :extract_routed_args_options
|
65
|
+
|
66
|
+
# Sets up a new static method on the class that defines the
|
67
|
+
# route. The method actually delegates to our router with the
|
68
|
+
# method's name.
|
69
|
+
def setup_klass_method
|
70
|
+
origin_klass.define_singleton_method method_name do |*args|
|
71
|
+
self.routes[__method__].route *args
|
72
|
+
end
|
73
|
+
end
|
74
|
+
private :setup_klass_method
|
75
|
+
|
76
|
+
def extract_parameters!
|
77
|
+
if parameters.nil?
|
78
|
+
self.parameters = path.
|
79
|
+
split("/").
|
80
|
+
select { |s| s.start_with?(":") }.
|
81
|
+
map { |s| s[1..-1] }
|
82
|
+
else
|
83
|
+
true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
private :extract_parameters!
|
87
|
+
|
88
|
+
def arity
|
89
|
+
parameters.count
|
90
|
+
end
|
91
|
+
private :arity
|
92
|
+
|
93
|
+
def build_path_with_args(*args)
|
94
|
+
param_options = args.first.is_a?(Hash) ? handle_hash(args.first) : handle_splat(args)
|
95
|
+
path.split("/").collect { |piece|
|
96
|
+
piece.match(/^:/) ? param_options[piece.to_s[1..-1]] : piece
|
97
|
+
}.join "/"
|
98
|
+
end
|
99
|
+
private :build_path_with_args
|
100
|
+
|
101
|
+
def handle_hash(hash)
|
102
|
+
hash = hash.with_indifferent_access
|
103
|
+
parameters.collect { |param_name| { param_name => hash[param_name] } }.
|
104
|
+
inject({}) { |new_hash, found| new_hash.merge found }.
|
105
|
+
with_indifferent_access
|
106
|
+
end
|
107
|
+
private :handle_hash
|
108
|
+
|
109
|
+
def handle_splat(splat)
|
110
|
+
values = splat[0...arity].map(&:to_s)
|
111
|
+
while values.size < arity do
|
112
|
+
values << ""
|
113
|
+
end
|
114
|
+
Hash[parameters.zip(values)].
|
115
|
+
with_indifferent_access
|
116
|
+
end
|
117
|
+
private :handle_splat
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Axel
|
2
|
+
module ServiceResource
|
3
|
+
module Associations
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
def method_missing(method_name, *args, &block)
|
9
|
+
if self.class.associations_respond_to?(method_name)
|
10
|
+
cache_association method_name do
|
11
|
+
self.class.association(method_name).run_method(self, method_name, *args, &block)
|
12
|
+
end
|
13
|
+
else
|
14
|
+
super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def respond_to?(method_name, include_private = false)
|
19
|
+
self.class.associations_respond_to?(method_name) || super
|
20
|
+
end
|
21
|
+
|
22
|
+
def reset_association_cache!
|
23
|
+
@association_cache = {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def association_cache
|
27
|
+
@assocation_cache ||= {}
|
28
|
+
end
|
29
|
+
private :association_cache
|
30
|
+
|
31
|
+
def cache_association(name, &block)
|
32
|
+
association_cache[name] ||= block.call
|
33
|
+
end
|
34
|
+
private :cache_association
|
35
|
+
|
36
|
+
module ClassMethods
|
37
|
+
def belongs_to(relation_name, options = {})
|
38
|
+
belongs_to_associations[relation_name] =
|
39
|
+
Axel::Associations::BelongsTo.new(self, relation_name, options)
|
40
|
+
end
|
41
|
+
|
42
|
+
def has_many(relation_name, options = {})
|
43
|
+
has_many_associations[relation_name] =
|
44
|
+
Axel::Associations::HasMany.new(self, relation_name, options)
|
45
|
+
end
|
46
|
+
|
47
|
+
def has_one(relation_name, options = {})
|
48
|
+
has_one_associations[relation_name] =
|
49
|
+
Axel::Associations::HasOne.new(self, relation_name, options)
|
50
|
+
end
|
51
|
+
|
52
|
+
def associations_respond_to?(method_name)
|
53
|
+
!!association(method_name)
|
54
|
+
end
|
55
|
+
|
56
|
+
def association(method_name)
|
57
|
+
associations.values.find { |association| association.handles_method? method_name }
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def associations
|
63
|
+
belongs_to_associations.merge(has_many_associations).merge(has_one_associations)
|
64
|
+
end
|
65
|
+
|
66
|
+
def has_one_associations
|
67
|
+
@__has_one_associations ||= {}.with_indifferent_access
|
68
|
+
end
|
69
|
+
|
70
|
+
def belongs_to_associations
|
71
|
+
@__belongs_to_associations ||= {}.with_indifferent_access
|
72
|
+
end
|
73
|
+
|
74
|
+
def has_many_associations
|
75
|
+
@__has_many_associations ||= {}.with_indifferent_access
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Axel
|
2
|
+
module ServiceResource
|
3
|
+
UnknownAttributeError = Class.new(StandardError)
|
4
|
+
module Attributes
|
5
|
+
def assign_attributes(new_attributes)
|
6
|
+
return unless new_attributes
|
7
|
+
|
8
|
+
new_attributes.each do |k, v|
|
9
|
+
if respond_to?("#{k}=")
|
10
|
+
send("#{k}=", v)
|
11
|
+
else
|
12
|
+
raise(UnknownAttributeError, "unknown attribute: #{k}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_attributes(attributes)
|
18
|
+
assign_attributes(attributes)
|
19
|
+
save
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Axel
|
2
|
+
module ServiceResource
|
3
|
+
module AutomaticResource
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
# Name the resource. Used if you call your class Foo but the API
|
8
|
+
# Proxy know it as "Bar". This will resolve that configuration
|
9
|
+
# disconnect
|
10
|
+
def resource_name(name = nil)
|
11
|
+
@_resource_name = name.to_s.underscore.pluralize if name
|
12
|
+
@_resource_name || self.name.split("::").last.underscore.pluralize
|
13
|
+
end
|
14
|
+
|
15
|
+
# Resource object that holds configuration information about the service
|
16
|
+
# and path
|
17
|
+
def resource
|
18
|
+
Axel.resources[resource_name]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Axel
|
2
|
+
module ServiceResource
|
3
|
+
class Base < Typhoid::Resource
|
4
|
+
extend Axel::CascadableAttribute
|
5
|
+
include Inspects
|
6
|
+
include Queries
|
7
|
+
include Routes
|
8
|
+
include AutomaticResource
|
9
|
+
include TyphoidExtensions
|
10
|
+
include Requesters
|
11
|
+
include Associations
|
12
|
+
include Attributes
|
13
|
+
|
14
|
+
# Standard fields that should be on almost all objects
|
15
|
+
# coming in
|
16
|
+
field :id
|
17
|
+
field :uri
|
18
|
+
|
19
|
+
delegate :paged?,
|
20
|
+
:total_pages,
|
21
|
+
to: :metadata
|
22
|
+
|
23
|
+
def initialize(params = {})
|
24
|
+
super (params || {}).with_indifferent_access
|
25
|
+
end
|
26
|
+
|
27
|
+
# Grab the classlevel block that defines parameters to pass with
|
28
|
+
# a reload and evaluate that within this instance
|
29
|
+
def reload_params
|
30
|
+
{}
|
31
|
+
end
|
32
|
+
private :reload_params
|
33
|
+
|
34
|
+
def reload
|
35
|
+
reset_association_cache!
|
36
|
+
request_and_load do
|
37
|
+
self.class.manual_request :get, reload_uri, reload_params
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def reload_uri
|
42
|
+
request_uri
|
43
|
+
end
|
44
|
+
private :reload_uri
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Axel
|
2
|
+
module ServiceResource
|
3
|
+
class Builder < Typhoid::Builder
|
4
|
+
def result
|
5
|
+
enveloped? ? parsed_body["result"] : parsed_body
|
6
|
+
end
|
7
|
+
|
8
|
+
def enveloped?
|
9
|
+
parsed_body.respond_to?("has_key?") && parsed_body.has_key?("metadata") && parsed_body.has_key?("result")
|
10
|
+
end
|
11
|
+
|
12
|
+
def array?
|
13
|
+
result.is_a?(Array)
|
14
|
+
end
|
15
|
+
|
16
|
+
def singular?
|
17
|
+
!array?
|
18
|
+
end
|
19
|
+
|
20
|
+
def metadata
|
21
|
+
parsed_body["metadata"] if enveloped?
|
22
|
+
end
|
23
|
+
|
24
|
+
def errors
|
25
|
+
parsed_body["errors"] if enveloped?
|
26
|
+
end
|
27
|
+
|
28
|
+
def compiled_payloads
|
29
|
+
Array(result).map { |res| { "metadata" => metadata, "errors" => errors, "result" => res } }
|
30
|
+
end
|
31
|
+
|
32
|
+
def build_array
|
33
|
+
compiled_payloads.collect { |single|
|
34
|
+
build_from_klass(single)
|
35
|
+
}
|
36
|
+
end
|
37
|
+
private :build_array
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Axel
|
2
|
+
module ServiceResource
|
3
|
+
module Inspects
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def inspect
|
7
|
+
Inspector.new(self, [:request_uri], [:attributes, :metadata, :remote_errors]).inspect
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def inspect
|
12
|
+
Inspector.new(self, [:request_uri]).inspect
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Axel
|
2
|
+
module ServiceResource
|
3
|
+
class PayloadParser
|
4
|
+
def initialize(payload)
|
5
|
+
self.payload = ActiveSupport::HashWithIndifferentAccess.new payload
|
6
|
+
end
|
7
|
+
|
8
|
+
def parsed
|
9
|
+
[payload, result, metadata, remote_errors]
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
attr_accessor :payload
|
14
|
+
|
15
|
+
def metadata
|
16
|
+
Payload::Metadata.new bare_metadata
|
17
|
+
end
|
18
|
+
|
19
|
+
def remote_errors
|
20
|
+
Payload::Errors.new bare_remote_errors
|
21
|
+
end
|
22
|
+
|
23
|
+
def result
|
24
|
+
(payload[:result] || backup_result ).with_indifferent_access
|
25
|
+
end
|
26
|
+
|
27
|
+
def bare_metadata
|
28
|
+
(payload[:metadata] || {} ).with_indifferent_access
|
29
|
+
end
|
30
|
+
|
31
|
+
def bare_remote_errors
|
32
|
+
raw = payload[:errors] || payload[:error] || {}
|
33
|
+
raw = { messages: raw } if raw.is_a?(Array)
|
34
|
+
raw.with_indifferent_access
|
35
|
+
end
|
36
|
+
|
37
|
+
def payload_is_enveloped?
|
38
|
+
payload.is_a?(Hash) && payload.has_key?(:metadata) && payload.has_key?(:result)
|
39
|
+
end
|
40
|
+
|
41
|
+
def backup_result
|
42
|
+
payload_is_enveloped? ? {} : payload
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Axel::Querier # Autoloading
|
2
|
+
module Axel
|
3
|
+
module ServiceResource
|
4
|
+
module Queries
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
# Use Query methods from a Querier instance
|
9
|
+
class << self
|
10
|
+
delegate *Axel::Querier.query_methods, to: :querier
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
# Entry point to querying methods like:
|
16
|
+
# #where
|
17
|
+
# #path
|
18
|
+
# #uri
|
19
|
+
def querier
|
20
|
+
Axel::Querier.new self
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Axel
|
2
|
+
module ServiceResource
|
3
|
+
module Requesters
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def default_request_options;end
|
7
|
+
|
8
|
+
def retrieve_default_request_options(options)
|
9
|
+
RequestOptions.new(compiled_default_request_options, options).compiled
|
10
|
+
end
|
11
|
+
private :retrieve_default_request_options
|
12
|
+
|
13
|
+
def compiled_default_request_options
|
14
|
+
(self.class.default_request_options ||{}).merge(default_request_options || {})
|
15
|
+
end
|
16
|
+
private :compiled_default_request_options
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
def default_request_options;end
|
20
|
+
|
21
|
+
def retrieve_default_request_options(options)
|
22
|
+
RequestOptions.new(default_request_options, options).compiled
|
23
|
+
end
|
24
|
+
|
25
|
+
# Make a simple request and get a response back. Will build the
|
26
|
+
# response into this object
|
27
|
+
#
|
28
|
+
# For options see Typhoeus::Request
|
29
|
+
# args can be read like this: *paths, options = {}
|
30
|
+
def request(uri, *args)
|
31
|
+
options = args.extract_options!
|
32
|
+
build_request(uri_join(uri, *args), retrieve_default_request_options(options)).run
|
33
|
+
end
|
34
|
+
|
35
|
+
# Make a request, but use the default request_uri for this object
|
36
|
+
def from_base(*args)
|
37
|
+
request request_uri, *args
|
38
|
+
end
|
39
|
+
|
40
|
+
# Resource endpoint for this API
|
41
|
+
#
|
42
|
+
# base_url/organizations/1
|
43
|
+
def find(id, params = {})
|
44
|
+
from_base id, params
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|