rest_area 2.2.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9d46c15a753653c67d5dbe7f65d59aa7bd830b9
4
- data.tar.gz: 17a5f682c439921b5f5da2a78f78699ca30dca79
3
+ metadata.gz: 0274aeb1e1e15d33636be9f1feb5126170e4d46f
4
+ data.tar.gz: e0717d08f0861bbfb70fb3fe21eb4da6fb2ba267
5
5
  SHA512:
6
- metadata.gz: 2946d6d80328536b7de60d87ece1fd286e629a9ef5acab5388aea09d4b3a07a350d3b966eadfe4ec99d94bfb883f281e16939c9b366262b8886aa7ae62f7314a
7
- data.tar.gz: 0f609854f7a6d33f7573d21f7f1af9a8288a642fd114603c16ba5762a1ca07074f988527c860b606865a6965f5e200891d694f7fa34472adb90d3b724a67f099
6
+ metadata.gz: ddbb98f4f8ada3c7548e3b8d56a7862f50fb320fe2921dd9673049391b32c1664e3e3d40f3b9fa60be7ea7f2c9772462c089447dccbb64761575dc0961503562
7
+ data.tar.gz: d54160d2367c66ea6b852a49216ec90def9ab1aa6316318adb8e73b323e0fc5b0691f2b848e430e8f0ccf47d7662d1a3751c9523d4f7d515b9c208ddc501bebf
data/README.md CHANGED
@@ -1,7 +1,9 @@
1
+ [![Code Climate](https://codeclimate.com/github/bguest/rest_area.png)](https://codeclimate.com/github/bguest/rest_area) [![Build Status](https://travis-ci.org/bguest/rest_area.png?branch=master)](https://travis-ci.org/bguest/rest_area) [![Coverage Status](https://coveralls.io/repos/bguest/rest_area/badge.png)](https://coveralls.io/r/bguest/rest_area) [![Gem Version](https://badge.fury.io/rb/rest_area.png)](http://badge.fury.io/rb/rest_area) [![Dependency Status](https://gemnasium.com/bguest/rest_area.png)](https://gemnasium.com/bguest/rest_area)
2
+
1
3
  # RestArea
2
4
 
3
- This gem adds a off bare bones rest api to a rails application. Simply
4
- create the initilizers file with the classes that you want to be in the
5
+ This gem adds a bare bones rest api to a rails application. Simply
6
+ create the initilizer file with the classes that you want to be in the
5
7
  rest api and you will get the get basic rest routes for that class
6
8
  This project rocks and uses MIT-LICENSE.
7
9
 
@@ -10,7 +12,7 @@ This project rocks and uses MIT-LICENSE.
10
12
  This library supports both Rails 3.2.x and Rails 4.1.x.
11
13
 
12
14
  ### Rails 3.2.x
13
- If you are useing Rails 3.2.x you should use the `rails-3_2` branch and/or version/tags 1.x.x, ie
15
+ If you are using Rails 3.2.x you should use the `rails-3_2` branch and/or version/tags 1.x.x, ie
14
16
 
15
17
  gem 'rest_area', '~>1.0'
16
18
 
@@ -19,17 +21,50 @@ If you are using Rails 4.1.x you should use the master branch and/or versions/ta
19
21
 
20
22
  gem 'rest_area', '~>2.0'
21
23
 
22
- ## Initilization / Setup
24
+ ## Initialization / Setup
25
+
26
+ 1. Create a file called `rest_area.rb` in your initializers file
27
+ 2. Add configuration like the following in that file.
28
+
29
+ RestArea.config do
30
+ resources :thing_one, :thing_two # Defaults to all actions
23
31
 
24
- 1. Create a file called `rest_area.rb` in your initilizers file
25
- 2. Add something the following in that file.
32
+ resources :cereal, :thing do
33
+ action :index, :show, :create, :update, :delete
34
+ key :name
35
+ end
36
+
37
+ resource :supermarket do
38
+ read_only!
39
+ messages :say_hello, :ring_it_up
40
+ end
41
+ end
42
+
43
+ Alternatively you can still just pass in a class whitelist, but this is being deprecated.
26
44
 
27
45
  RestArea.class_whitelist = [YourModel, ThatYouWant, ToBeInYour, RestApi]
28
46
 
47
+
29
48
  3. Add something like the following to your `config/routes.rb` file.
30
49
 
31
50
  mount RestArea::Engine => "/your_base_route"
32
51
 
52
+ ### Config Settings
53
+
54
+ Within the RestArea.config block, use `resource` to specify a single resource and `resources` to specify mulitiple resources
55
+
56
+ With in the `resource` / `resources` block,
57
+ + Use `action` to specify what actions that resource will respond to, the available actions are
58
+ `:index`, `:show`, `:create`, `:create`, `:update`, and `:delete`, the default is to use all actions
59
+
60
+ + Use `read_only!` to specify that the resource will only respond to the `index` and `show` actions
61
+
62
+ + Use `key` to specify what column rest_area will use to look up a resource. This is the column name
63
+ that is used for the `:key` in `/:resource/:key` part of the restful path. This defaults to `:id`
64
+
65
+ + Use `message` or `messages` to whitelist methods for a class. Methods much be defined at
66
+ launch. Methods must respond with an object that responds to `.to_json`
67
+
33
68
  # Serializers
34
69
 
35
70
  But what if I want to customize the JSON that comes back? Simple this
@@ -7,7 +7,8 @@ module GetsKlass
7
7
 
8
8
  def get_klass
9
9
  rescue_uninitialized_constant do
10
- @klass = params[:klass].classify.constantize
10
+ klass = params[:klass].classify.constantize
11
+ @klass = RestArea.resources[klass.name.underscore.to_sym]
11
12
  end
12
13
  test_class(@klass)
13
14
 
@@ -16,7 +17,7 @@ module GetsKlass
16
17
  end
17
18
 
18
19
  def test_class(klass)
19
- if klass.nil? || !RestArea.class_whitelist.include?(klass)
20
+ if klass.nil? || !RestArea.resources.include?(klass.name.underscore.to_sym)
20
21
  raise ActionController::RoutingError.new("Resource Does Not Exist")
21
22
  end
22
23
  end
@@ -8,8 +8,10 @@ module RestArea
8
8
  render json: @klass.find(params[:id]).send(@message).all, each_serializer: @message_serializer, root:@message
9
9
  elsif @message_class
10
10
  render json: { @message => @klass.find(params[:id]).send(@message).all }.to_json(root:false)
11
+ elsif @klass.can_send?(@message)
12
+ render json: @klass.find(params[:id]).send(@message).to_json(root:false)
11
13
  else
12
- raise NotImplementedError
14
+ raise ActionController::RoutingError.new("Resource Does Not Exist")
13
15
  end
14
16
  end
15
17
 
@@ -4,6 +4,7 @@ module RestArea
4
4
  class RestController < ::RestArea::ApplicationController
5
5
  skip_before_filter :verify_authenticity_token
6
6
  include GetsKlass
7
+ before_filter :test_action
7
8
  before_filter :set_class_serializer
8
9
  before_filter :add_query_params, :only => [:index]
9
10
 
@@ -57,6 +58,12 @@ module RestArea
57
58
  render json: {errors: object.errors}, :status => :unprocessable_entity
58
59
  end
59
60
 
61
+ def test_action
62
+ unless @klass.can_do?(params[:action].to_sym)
63
+ raise ActionController::RoutingError.new("Resource Does Not Exist")
64
+ end
65
+ end
66
+
60
67
  def klass_params
61
68
  params.require(@root.to_sym).permit!
62
69
  end
@@ -0,0 +1,37 @@
1
+ ##
2
+ # Used for configuring rest_area
3
+ #
4
+ # RestArea.config do
5
+ # resources :cereal, :thing do
6
+ # action :index, :show, :create, :update, :delete
7
+ # end
8
+ #
9
+ # resource :supermarket do
10
+ # read_only!
11
+ # key :name
12
+ # end
13
+ # end
14
+ #
15
+ module RestArea
16
+ class Configuration
17
+
18
+ def initialize()
19
+ @resources = {}
20
+ end
21
+
22
+ def resources(*args, &block)
23
+ if args.any?
24
+ args.each do |klass| resource(klass, &block) end
25
+ else
26
+ @resources
27
+ end
28
+ end
29
+
30
+ def resource(klass, &block)
31
+ resource = Resource.new(klass)
32
+ resource.instance_eval(&block) if block_given?
33
+ @resources[klass] = resource
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,63 @@
1
+ module RestArea
2
+ class Resource < SimpleDelegator
3
+
4
+ attr_reader :actions
5
+
6
+ def initialize(klass)
7
+ @actions = []
8
+ @klass = klass.to_s.classify.constantize
9
+ super @klass
10
+ end
11
+
12
+ def action(*args)
13
+ @actions ||= []
14
+ @actions += args
15
+ @actions.uniq!
16
+ end
17
+
18
+ def messages(*args)
19
+ @messages ||= []
20
+ if args.any?
21
+ args.each do |m| message(m) end
22
+ else
23
+ @messages
24
+ end
25
+ end
26
+
27
+ def message(msg)
28
+ @messages ||= []
29
+ if @klass.method_defined? msg
30
+ @messages << msg
31
+ @messages.uniq!
32
+ else
33
+ raise NoMethodError.new("#{@klass} will not respond to #{msg}")
34
+ end
35
+ end
36
+
37
+ def read_only!
38
+ @actions = [:index, :show]
39
+ end
40
+
41
+ def can_do?(act)
42
+ self.actions.empty? || self.actions.include?(act)
43
+ end
44
+
45
+ def can_send?(msg)
46
+ self.messages.include?(msg.to_sym)
47
+ end
48
+
49
+ def key(key = nil)
50
+ key ? @key = key : (@key || :id)
51
+ end
52
+
53
+ # Wrapped Methods
54
+ def find(*args)
55
+ if key == :id
56
+ super *args
57
+ else
58
+ @klass.where(key => args[0]).first!
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -1,3 +1,3 @@
1
1
  module RestArea
2
- VERSION = "2.2.1"
2
+ VERSION = "2.3.0"
3
3
  end
data/lib/rest_area.rb CHANGED
@@ -1,5 +1,29 @@
1
1
  require "rest_area/engine"
2
+ require 'rest_area/resource'
3
+ require 'rest_area/configuration'
2
4
 
3
5
  module RestArea
4
- mattr_accessor :class_whitelist
6
+ mattr_reader :class_whitelist
7
+
8
+ class << self
9
+
10
+ def config
11
+ @config ||= RestArea::Configuration.new
12
+ end
13
+
14
+ def configure(&block)
15
+ self.config.instance_eval(&block) if block_given?
16
+ end
17
+
18
+ def resources
19
+ self.config.resources
20
+ end
21
+
22
+ def class_whitelist=(array)
23
+ resources.clear
24
+ array.each do |klass|
25
+ self.config.resource klass.name.underscore.to_sym
26
+ end
27
+ end
28
+ end
5
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest_area
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Guest
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-09 00:00:00.000000000 Z
11
+ date: 2014-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.9'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.9'
111
+ - !ruby/object:Gem::Dependency
112
+ name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.7'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.7'
97
125
  description: RestArea adds a restfull controller and api to any Rails Application,
98
126
  simply add the gem and whitelist of available models
99
127
  email:
@@ -115,7 +143,9 @@ files:
115
143
  - app/views/layouts/rest_area/application.html.erb
116
144
  - config/routes.rb
117
145
  - lib/rest_area.rb
146
+ - lib/rest_area/configuration.rb
118
147
  - lib/rest_area/engine.rb
148
+ - lib/rest_area/resource.rb
119
149
  - lib/rest_area/version.rb
120
150
  - lib/tasks/rest_area_tasks.rake
121
151
  homepage: https://github.com/bguest/rest_area