make_restful 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/lib/make_restful.rb CHANGED
@@ -14,7 +14,6 @@ module MakeRestful
14
14
  autoload :PermissibleActions
15
15
 
16
16
  extend Callbacks
17
- include Loaders
18
17
  include RestMethods
19
18
  include Rendering
20
19
  include Sugar
@@ -22,6 +21,9 @@ module MakeRestful
22
21
  delegate :allow_method?, :allow_format?, :resource_name, :instance_name, to: :klass
23
22
 
24
23
  included do
24
+ class_attribute :json_root_node, :collection_loader, :instance_loader, instance_writer: false
25
+
26
+ extend ClassMethods
25
27
 
26
28
  class_attribute :allowed_actions, :allowed_formats, :finder, :pagination, :resource_class, instance_writer: false
27
29
  attr_reader :resource, :instance, :collection
@@ -35,6 +37,8 @@ module MakeRestful
35
37
  resource name.underscore.gsub(/(.*)_controller/,'\1').singularize rescue nil
36
38
  find_by :id
37
39
 
40
+ include Loaders
41
+
38
42
  end
39
43
 
40
44
  def klass
@@ -10,9 +10,16 @@ module MakeRestful::ClassMethods
10
10
 
11
11
  private
12
12
 
13
+ def json_collection_root_node(true_or_name=true)
14
+ self.json_root_node = if true_or_name === true
15
+ resource_name
16
+ elsif true_or_name.is_a?(Symbol) || true_or_name.is_a?(String)
17
+ true_or_name
18
+ end
19
+ end
20
+
13
21
  def resource(klass)
14
22
 
15
- before_filter :verify_method!
16
23
  before_filter :load_resource
17
24
  before_filter :load_collection, only: [:index]
18
25
  before_filter :load_instance, only: [:show, :destroy, :update]
@@ -25,6 +32,14 @@ module MakeRestful::ClassMethods
25
32
  self.finder = key.to_sym
26
33
  end
27
34
 
35
+ def collection(&block)
36
+ self.collection_loader = block if block_given?
37
+ end
38
+
39
+ def instance(&block)
40
+ self.collection_loader = block if block_given?
41
+ end
42
+
28
43
  def actions(*actions)
29
44
 
30
45
  options = actions.extract_options!
@@ -46,7 +61,7 @@ module MakeRestful::ClassMethods
46
61
  end
47
62
 
48
63
  def paginates!(opts={})
49
- opts.reverse_merge!({ per_page: 25 })
64
+ opts.assert_valid_keys :node
50
65
  self.pagination = opts
51
66
  end
52
67
 
@@ -1,4 +1,36 @@
1
1
  module MakeRestful::Loaders
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+
6
+ before_filter :verify_method!
7
+ before_filter :verify_format!
8
+
9
+ collection do
10
+ if pagination && !params.has_key?(:all)
11
+ paginated_collection = @resource.paginate page: params[:page], per_page: (params[:per_page] || pagination[:per_page] || 25)
12
+ { resource_name.to_sym => paginated_collection,
13
+ pagination: {
14
+ current_page: paginated_collection.current_page,
15
+ per_page: paginated_collection.per_page,
16
+ total_entries: paginated_collection.total_entries,
17
+ total_pages: paginated_collection.total_pages
18
+ }
19
+ }
20
+ else
21
+ @resource.all
22
+ end
23
+ end
24
+
25
+ instance do
26
+ if finder && @resource.respond_to?(:where)
27
+ @resource.where(finder.to_sym => finder_value).first
28
+ else
29
+ @resource.find(finder_value)
30
+ end
31
+ end
32
+
33
+ end
2
34
 
3
35
  private
4
36
 
@@ -16,21 +48,9 @@ module MakeRestful::Loaders
16
48
  end
17
49
 
18
50
  def load_collection
19
- @collection = if pagination && !params.has_key?(:all)
20
- paginated_collection = @resource.paginate page: params[:page], per_page: (params[:per_page] || pagination[:per_page] || 25)
21
- { resource_name.to_sym => paginated_collection,
22
- pagination: {
23
- current_page: paginated_collection.current_page,
24
- per_page: paginated_collection.per_page,
25
- total_entries: paginated_collection.total_entries,
26
- total_pages: paginated_collection.total_pages
27
- }
28
- }
29
- else
30
- @resource.all
31
- end
51
+ @collection = instance_eval(&collection_loader)
32
52
 
33
- if @collection.empty?
53
+ unless @collection.present?
34
54
  @response = { error: 'no results found' }
35
55
  @status = :not_found
36
56
  render(load_template: false) and return
@@ -43,11 +63,7 @@ module MakeRestful::Loaders
43
63
  finder = opts[:finder] || send(:finder)
44
64
  finder_value = params[finder]
45
65
 
46
- @instance = if finder && @resource.respond_to?(:where)
47
- @resource.where(finder.to_sym => finder_value).first
48
- else
49
- @resource.find(finder_value)
50
- end
66
+ @instance = instance_eval(&instance_loader)
51
67
  eval "@#{instance_name} = @instance"
52
68
 
53
69
  unless @instance
@@ -65,6 +81,13 @@ module MakeRestful::Loaders
65
81
  render(load_template: false)
66
82
  end
67
83
 
84
+ def verify_format!
85
+ return if allowed_formats.allowed?(request.format.symbol)
86
+ @response = { error: "Format:#{request.format} is unsupported" }
87
+ @status = :unsupported_media_type
88
+ render(load_template: false)
89
+ end
90
+
68
91
  alias :verify_action! :verify_method!
69
92
 
70
93
  end
@@ -9,14 +9,20 @@ module MakeRestful::Rendering
9
9
  options[:load_template] = true if options[:load_template].nil?
10
10
  cleaned_options = options.reject{ |k,v| [:load_template, :status].include?(k) }
11
11
 
12
- super and return if (( template_present && options[:load_template]) || cleaned_options.present? ) && allowed_formats.allowed?(formats)
12
+ super and return if (( template_present && options[:load_template]) || cleaned_options.present? )
13
13
 
14
14
  # Set the response from the chain
15
- response = @response || @instance || @collection
15
+ response = if @response.present?
16
+ @response
17
+ elsif @instance.present?
18
+ @instance
19
+ elsif @collection.present?
20
+ wrap_collection
21
+ end
16
22
 
17
23
  respond_to do |format|
18
- format.json { super json: response, status: @status, callback: ( params[:callback] if allowed_formats.allowed? :jsonp )} if allowed_formats.allowed? :json, :jsonp
19
- format.xml { super xml: response, status: @status } if allowed_formats.allowed? :xml
24
+ format.json { super json: response, status: @status, callback: ( params[:callback] if allowed_formats.allowed? :jsonp )}
25
+ format.xml { super xml: response, status: @status }
20
26
  format.any do
21
27
  head @status and return if @status
22
28
  super
@@ -24,4 +30,28 @@ module MakeRestful::Rendering
24
30
  end
25
31
  end
26
32
 
33
+ def wrap_collection
34
+
35
+ response = if json_root_node
36
+ { json_root_node.to_sym => @collection }
37
+ else
38
+ @collection
39
+ end
40
+
41
+ if @collection.respond_to? :current_page
42
+
43
+ pagination = {}
44
+ pagination[:current_page] = @collection.current_page if @collection.respond_to? :current_page
45
+ pagination[:per_page] = @collection.current_page if @collection.respond_to? :per_page
46
+ pagination[:total_entries] = @collection.total_entries if @collection.respond_to? :total_entries
47
+ pagination[:total_pages] = @collection.total_pages if @collection.respond_to? :total_pages
48
+
49
+ pagination = { klass.pagination[:node] => pagination } if klass.pagination[:node]
50
+
51
+ response.merge!(pagination)
52
+ end
53
+
54
+ response
55
+ end
56
+
27
57
  end
@@ -1,3 +1,3 @@
1
1
  module MakeRestful
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: make_restful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-30 00:00:00.000000000 Z
12
+ date: 2012-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -107,4 +107,3 @@ signing_key:
107
107
  specification_version: 3
108
108
  summary: Enables rest on a resource
109
109
  test_files: []
110
- has_rdoc: