toast 0.2.0 → 0.3.4
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/README.md +7 -0
- data/app/controller/toast_controller.rb +5 -3
- data/config/routes.rb +8 -2
- data/lib/toast/active_record_extensions.rb +1 -1
- data/lib/toast/{associate_collection.rb → association.rb} +19 -10
- data/lib/toast/attribute.rb +3 -1
- data/lib/toast/config_dsl.rb +72 -22
- data/lib/toast/engine.rb +4 -2
- data/lib/toast/record.rb +20 -9
- data/lib/toast/resource.rb +13 -16
- data/lib/toast/root_collection.rb +45 -14
- data/lib/toast/single.rb +69 -0
- metadata +8 -14
data/README.md
CHANGED
@@ -126,6 +126,13 @@ Installation
|
|
126
126
|
cd toast
|
127
127
|
rake install
|
128
128
|
|
129
|
+
or with bundler (Gemfile)
|
130
|
+
|
131
|
+
gem "toast", :git => "https://github.com/robokopp/toast.git"
|
132
|
+
|
133
|
+
Note: There is a Gem on RubyGems.org too, but I will not keep it up-to-date for now.
|
134
|
+
Please use the git (edge) version.
|
135
|
+
|
129
136
|
Test Suite
|
130
137
|
==========
|
131
138
|
|
@@ -3,14 +3,16 @@ class ToastController < ApplicationController
|
|
3
3
|
def catch_all
|
4
4
|
|
5
5
|
begin
|
6
|
-
resource = Toast::Resource.build( params, request )
|
7
|
-
render resource.apply(request.method, request.body.read)
|
8
6
|
|
7
|
+
@resource = Toast::Resource.build( params, request )
|
8
|
+
|
9
|
+
render @resource.apply(request.method, request.body.read)
|
10
|
+
|
9
11
|
rescue Toast::ResourceNotFound => e
|
10
12
|
return head(:not_found)
|
11
13
|
|
12
14
|
rescue Toast::PayloadInvalid => e
|
13
|
-
return
|
15
|
+
return render :text => e.message, :status => :forbidden
|
14
16
|
|
15
17
|
rescue Toast::PayloadFormatError => e
|
16
18
|
return head(:bad_request)
|
data/config/routes.rb
CHANGED
@@ -5,8 +5,14 @@ Rails.application.routes.draw do
|
|
5
5
|
|
6
6
|
resource_name = model.to_s.pluralize.underscore
|
7
7
|
|
8
|
-
match
|
9
|
-
|
8
|
+
match("#{model.toast_config.namespace}/#{resource_name}(/:id(/:subresource))" => 'toast#catch_all',
|
9
|
+
:constraints => { :id => /\d+/ },
|
10
|
+
:resource => resource_name,
|
11
|
+
:defaults => { :format => 'json' })
|
12
|
+
|
13
|
+
match("#{model.toast_config.namespace}/#{resource_name}/:subresource" => 'toast#catch_all',
|
14
|
+
:resource => resource_name,
|
15
|
+
:defaults => { :format => 'json' })
|
10
16
|
end
|
11
17
|
|
12
18
|
match ":resource(/:id(/:subresource))" => 'toast#not_found', :constraints => { :id => /\d+/ }
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Toast
|
2
|
-
class
|
2
|
+
class Association < Resource
|
3
3
|
|
4
4
|
attr_reader :model
|
5
5
|
|
6
|
-
def initialize model, id, subresource_name
|
6
|
+
def initialize model, id, subresource_name, format
|
7
7
|
unless model.toast_config.exposed_associations.include? subresource_name
|
8
8
|
raise ResourceNotFound
|
9
9
|
end
|
@@ -11,6 +11,7 @@ module Toast
|
|
11
11
|
@model = model
|
12
12
|
@record = model.find(id) rescue raise(ResourceNotFound)
|
13
13
|
@collection = subresource_name
|
14
|
+
@format = format
|
14
15
|
|
15
16
|
@associate_model = Resource.get_class_by_resource_name subresource_name
|
16
17
|
@associate_model.uri_base = @model.uri_base
|
@@ -18,11 +19,20 @@ module Toast
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def get
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
result = @record.send(@collection)
|
23
|
+
|
24
|
+
if result.is_a? Array
|
25
|
+
{
|
26
|
+
:json => result.map{|r| r.exposed_attributes(:in_collection => true)},
|
27
|
+
:status => :ok
|
28
|
+
}
|
29
|
+
else
|
30
|
+
{
|
31
|
+
:json => result.exposed_attributes(:in_collection => true),
|
32
|
+
:status => :ok
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
26
36
|
end
|
27
37
|
|
28
38
|
def put
|
@@ -31,19 +41,18 @@ module Toast
|
|
31
41
|
|
32
42
|
def post payload
|
33
43
|
|
34
|
-
|
35
44
|
if self.media_type != @associate_model.toast_config.media_type
|
36
45
|
raise UnsupportedMediaType
|
37
46
|
end
|
38
47
|
|
39
|
-
if payload.keys.to_set != @associate_model.toast_config.exposed_attributes.to_set
|
48
|
+
if payload.keys.to_set != (@associate_model.toast_config.exposed_attributes.to_set - @associate_model.toast_config.auto_fields.to_set)
|
40
49
|
raise PayloadInvalid
|
41
50
|
end
|
42
51
|
|
43
52
|
unless payload.is_a? Hash
|
44
53
|
raise PayloadFormatError
|
45
54
|
end
|
46
|
-
|
55
|
+
|
47
56
|
record = @record.send(@collection).create payload
|
48
57
|
|
49
58
|
{
|
data/lib/toast/attribute.rb
CHANGED
@@ -3,7 +3,7 @@ module Toast
|
|
3
3
|
|
4
4
|
attr_reader :model
|
5
5
|
|
6
|
-
def initialize model, id, attribute_name
|
6
|
+
def initialize model, id, attribute_name, format
|
7
7
|
unless model.toast_config.exposed_attributes.include? attribute_name
|
8
8
|
raise ResourceNotFound
|
9
9
|
end
|
@@ -11,6 +11,7 @@ module Toast
|
|
11
11
|
@model = model
|
12
12
|
@record = model.find(id) rescue raise(ResourceNotFound)
|
13
13
|
@attribute_name = attribute_name
|
14
|
+
@format = format
|
14
15
|
end
|
15
16
|
|
16
17
|
def get
|
@@ -21,6 +22,7 @@ module Toast
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def put payload
|
25
|
+
|
24
26
|
@record.update_attribute(@attribute_name, payload)
|
25
27
|
{
|
26
28
|
:json => @record[@attribute_name],
|
data/lib/toast/config_dsl.rb
CHANGED
@@ -4,27 +4,22 @@ module Toast
|
|
4
4
|
class Base
|
5
5
|
include Blockenspiel::DSL
|
6
6
|
dsl_attr_accessor :media_type, :has_many, :namespace
|
7
|
+
# attr_reader :exposed_attributes, :exposed_associations
|
7
8
|
|
8
9
|
def initialize model
|
9
10
|
@model = model
|
10
11
|
@fields = []
|
12
|
+
@auto_fields = []
|
11
13
|
@collections = []
|
14
|
+
@singles = []
|
12
15
|
@media_type = "application/json"
|
13
|
-
@exposed_attributes = []
|
14
|
-
@exposed_associations = []
|
15
16
|
@disallow_methods = []
|
17
|
+
@pass_params_to = []
|
16
18
|
@in_collection = ConfigDSL::InCollection.new model, self
|
17
19
|
end
|
18
20
|
|
19
21
|
def fields= *fields
|
20
22
|
@fields.push *ConfigDSL.sanitize(fields,"fields")
|
21
|
-
@fields.each do |attr_or_assoc|
|
22
|
-
if @model.new.attributes.keys.include? attr_or_assoc
|
23
|
-
@exposed_attributes << attr_or_assoc
|
24
|
-
else
|
25
|
-
@exposed_associations << attr_or_assoc
|
26
|
-
end
|
27
|
-
end
|
28
23
|
end
|
29
24
|
|
30
25
|
def fields *arg
|
@@ -32,6 +27,25 @@ module Toast
|
|
32
27
|
self.fields = *arg
|
33
28
|
end
|
34
29
|
|
30
|
+
def exposed_attributes
|
31
|
+
assocs = @model.reflect_on_all_associations.map{|a| a.name.to_s}
|
32
|
+
@fields.select{|f| !assocs.include?(f)}
|
33
|
+
end
|
34
|
+
|
35
|
+
def exposed_associations
|
36
|
+
assocs = @model.reflect_on_all_associations.map{|a| a.name.to_s}
|
37
|
+
@fields.select{|f| assocs.include?(f)}
|
38
|
+
end
|
39
|
+
|
40
|
+
def auto_fields= *arg
|
41
|
+
@auto_fields.push *ConfigDSL.sanitize(arg,"auto fields")
|
42
|
+
end
|
43
|
+
|
44
|
+
def auto_fields *arg
|
45
|
+
return(@auto_fields) if arg.empty?
|
46
|
+
self.auto_fields = *arg
|
47
|
+
end
|
48
|
+
|
35
49
|
def disallow_methods= *arg
|
36
50
|
@disallow_methods.push *ConfigDSL.sanitize(arg,"disallow methods")
|
37
51
|
end
|
@@ -41,8 +55,15 @@ module Toast
|
|
41
55
|
self.disallow_methods = *arg
|
42
56
|
end
|
43
57
|
|
44
|
-
|
58
|
+
def pass_params_to= *arg
|
59
|
+
@pass_params_to.push *ConfigDSL.sanitize(arg,"pass_params_to")
|
60
|
+
end
|
45
61
|
|
62
|
+
def pass_params_to *arg
|
63
|
+
return(@pass_params_to) if arg.empty?
|
64
|
+
self.pass_params_to = *arg
|
65
|
+
end
|
66
|
+
|
46
67
|
def collections= collections=[]
|
47
68
|
@collections = ConfigDSL.sanitize(collections, "collections")
|
48
69
|
end
|
@@ -52,6 +73,15 @@ module Toast
|
|
52
73
|
self.collections = *arg
|
53
74
|
end
|
54
75
|
|
76
|
+
def singles= singles=[]
|
77
|
+
@singles = ConfigDSL.sanitize(singles, "singles")
|
78
|
+
end
|
79
|
+
|
80
|
+
def singles *arg
|
81
|
+
return(@singles) if arg.empty?
|
82
|
+
self.singles = *arg
|
83
|
+
end
|
84
|
+
|
55
85
|
def in_collection &block
|
56
86
|
if block_given?
|
57
87
|
Blockenspiel.invoke( block, @in_collection)
|
@@ -70,24 +100,25 @@ module Toast
|
|
70
100
|
def initialize model, base_config
|
71
101
|
@model = model
|
72
102
|
@fields = base_config.fields
|
73
|
-
@
|
74
|
-
@
|
103
|
+
@disallow_methods = []
|
104
|
+
# @exposed_attributes = base_config.exposed_attributes
|
105
|
+
# @exposed_associations = base_config.exposed_associations
|
75
106
|
@media_type = "application/json"
|
76
107
|
end
|
77
108
|
|
78
109
|
def fields= *fields
|
79
110
|
@fields = ConfigDSL.sanitize(fields,"fields")
|
80
111
|
|
81
|
-
@exposed_attributes = []
|
82
|
-
@exposed_associations = []
|
112
|
+
# @exposed_attributes = []
|
113
|
+
# @exposed_associations = []
|
83
114
|
|
84
|
-
@fields.each do |attr_or_assoc|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
end
|
115
|
+
# @fields.each do |attr_or_assoc|
|
116
|
+
# if @model.new.attributes.keys.include? attr_or_assoc
|
117
|
+
# @exposed_attributes << attr_or_assoc
|
118
|
+
# else
|
119
|
+
# @exposed_associations << attr_or_assoc
|
120
|
+
# end
|
121
|
+
# end
|
91
122
|
end
|
92
123
|
|
93
124
|
def fields *arg
|
@@ -95,7 +126,26 @@ module Toast
|
|
95
126
|
self.fields = *arg
|
96
127
|
end
|
97
128
|
|
98
|
-
|
129
|
+
def exposed_attributes
|
130
|
+
assocs = @model.reflect_on_all_associations.map{|a| a.name.to_s}
|
131
|
+
@fields.select{|f| !assocs.include?(f)}
|
132
|
+
end
|
133
|
+
|
134
|
+
def exposed_associations
|
135
|
+
assocs = @model.reflect_on_all_associations.map{|a| a.name.to_s}
|
136
|
+
@fields.select{|f| assocs.include?(f)}
|
137
|
+
end
|
138
|
+
|
139
|
+
def disallow_methods= *arg
|
140
|
+
@disallow_methods.push *ConfigDSL.sanitize(arg,"disallow methods")
|
141
|
+
end
|
142
|
+
|
143
|
+
def disallow_methods *arg
|
144
|
+
return(@disallow_methods) if arg.empty?
|
145
|
+
self.disallow_methods = *arg
|
146
|
+
end
|
147
|
+
|
148
|
+
# attr_reader :exposed_attributes, :exposed_associations
|
99
149
|
end
|
100
150
|
|
101
151
|
|
data/lib/toast/engine.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'toast/active_record_extensions.rb'
|
2
2
|
require 'toast/resource.rb'
|
3
3
|
require 'toast/root_collection'
|
4
|
-
require 'toast/
|
4
|
+
require 'toast/association'
|
5
5
|
require 'toast/attribute'
|
6
6
|
require 'toast/record'
|
7
|
+
require 'toast/single'
|
8
|
+
|
7
9
|
require 'action_dispatch/http/request'
|
8
10
|
|
9
11
|
module Toast
|
@@ -19,7 +21,7 @@ module Toast
|
|
19
21
|
begin
|
20
22
|
Dir["#{Rails.root}/app/models/**/*.rb"].each{|m| require m }
|
21
23
|
|
22
|
-
rescue
|
24
|
+
rescue
|
23
25
|
# raised when DB is not setup yet. (rake db:schema:load)
|
24
26
|
end
|
25
27
|
|
data/lib/toast/record.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module Toast
|
2
2
|
class Record < Resource
|
3
3
|
|
4
|
-
attr_reader :model
|
4
|
+
attr_reader :model
|
5
5
|
|
6
|
-
def initialize model, id
|
6
|
+
def initialize model, id, format
|
7
7
|
@model = model
|
8
8
|
@record = model.find(id) rescue raise(ResourceNotFound.new)
|
9
|
+
@format = format
|
9
10
|
end
|
10
11
|
|
11
12
|
def post payload
|
@@ -24,23 +25,33 @@ module Toast
|
|
24
25
|
raise PayloadFormatError
|
25
26
|
end
|
26
27
|
|
27
|
-
if payload.keys.to_set != @model.toast_config.exposed_attributes.to_set
|
28
|
+
if payload.keys.to_set != (@model.toast_config.exposed_attributes.to_set - @model.toast_config.auto_fields.to_set)
|
28
29
|
raise PayloadInvalid
|
29
30
|
end
|
30
31
|
|
31
32
|
@record.update_attributes payload
|
32
|
-
|
33
|
+
{
|
33
34
|
:json => @record.exposed_attributes,
|
34
35
|
:status => :ok,
|
35
36
|
:location => @record.uri
|
36
37
|
}
|
37
38
|
end
|
38
39
|
|
39
|
-
def get
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
def get
|
41
|
+
case @format
|
42
|
+
when "html", "xml"
|
43
|
+
{
|
44
|
+
:template => "resources/#{model.to_s.underscore}",
|
45
|
+
:locals => { model.to_s.underscore.to_sym => @record } # full record, view should filter
|
46
|
+
}
|
47
|
+
when "json"
|
48
|
+
{
|
49
|
+
:json => @record.exposed_attributes,
|
50
|
+
:status => :ok
|
51
|
+
}
|
52
|
+
else
|
53
|
+
raise ResourceNotFound
|
54
|
+
end
|
44
55
|
end
|
45
56
|
|
46
57
|
def delete
|
data/lib/toast/resource.rb
CHANGED
@@ -21,29 +21,26 @@ module Toast
|
|
21
21
|
resource_name = params[:resource]
|
22
22
|
id = params[:id]
|
23
23
|
subresource_name = params[:subresource]
|
24
|
-
|
25
|
-
uri_base = "#{request.protocol}#{request.host}"
|
26
|
-
unless (request.protocol == "http://" and request.port == 80) or
|
27
|
-
(request.protocol == "https://" and request.port == 443)
|
28
|
-
uri_base += ":#{request.port}"
|
29
|
-
end
|
24
|
+
format = params[:format]
|
30
25
|
|
31
26
|
begin
|
32
|
-
|
27
|
+
|
33
28
|
model = get_class_by_resource_name resource_name
|
34
|
-
|
35
|
-
|
36
|
-
model.uri_base
|
29
|
+
|
30
|
+
# base is complete URL until the resource name
|
31
|
+
model.uri_base = request.url.match(/(.*)\/#{resource_name}(?:\..+|\/|\z)/)[1]
|
37
32
|
|
38
33
|
# decide which sub type
|
39
|
-
rsc = if id.nil?
|
40
|
-
Toast::
|
34
|
+
rsc = if id.nil? and model.toast_config.singles.include?(subresource_name)
|
35
|
+
Toast::Single.new(model, subresource_name, params.clone)
|
36
|
+
elsif id.nil?
|
37
|
+
Toast::RootCollection.new(model, subresource_name, params.clone)
|
41
38
|
elsif subresource_name.nil?
|
42
|
-
Toast::Record.new(model, id)
|
39
|
+
Toast::Record.new(model, id, format)
|
43
40
|
elsif model.toast_config.exposed_associations.include? subresource_name
|
44
|
-
Toast::
|
41
|
+
Toast::Association.new(model, id, subresource_name, format)
|
45
42
|
elsif model.toast_config.exposed_attributes.include? subresource_name
|
46
|
-
Toast::Attribute.new(model, id, subresource_name)
|
43
|
+
Toast::Attribute.new(model, id, subresource_name, format)
|
47
44
|
else
|
48
45
|
raise ResourceNotFound
|
49
46
|
end
|
@@ -82,7 +79,7 @@ module Toast
|
|
82
79
|
self.send(method.downcase)
|
83
80
|
else
|
84
81
|
raise MethodNotAllowed
|
85
|
-
end
|
82
|
+
end
|
86
83
|
end
|
87
84
|
end
|
88
85
|
end
|
@@ -3,7 +3,7 @@ module Toast
|
|
3
3
|
|
4
4
|
attr_reader :model
|
5
5
|
|
6
|
-
def initialize model, subresource_name
|
6
|
+
def initialize model, subresource_name, params
|
7
7
|
|
8
8
|
subresource_name ||= "all"
|
9
9
|
|
@@ -13,14 +13,35 @@ module Toast
|
|
13
13
|
|
14
14
|
@model = model
|
15
15
|
@collection = subresource_name
|
16
|
+
@params = params
|
17
|
+
@format = params[:format]
|
16
18
|
end
|
17
19
|
|
18
20
|
def get
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
if @model.toast_config.in_collection.disallow_methods.include? "get"
|
22
|
+
raise MethodNotAllowed
|
23
|
+
end
|
24
|
+
|
25
|
+
records = if @model.toast_config.pass_params_to.include?(@collection)
|
26
|
+
@model.send(@collection, @params)
|
27
|
+
else
|
28
|
+
@model.send(@collection)
|
29
|
+
end
|
30
|
+
|
31
|
+
case @format
|
32
|
+
when "html"
|
33
|
+
{
|
34
|
+
:template => "resources/#{model.to_s.pluralize.underscore}",
|
35
|
+
:locals => { model.to_s.pluralize.underscore.to_sym => records }
|
36
|
+
}
|
37
|
+
when "json"
|
38
|
+
{
|
39
|
+
:json => records.map{|r| r.exposed_attributes(:in_collection => true)},
|
40
|
+
:status => :ok
|
41
|
+
}
|
42
|
+
else
|
43
|
+
raise ResourceNotFound
|
44
|
+
end
|
24
45
|
end
|
25
46
|
|
26
47
|
def put
|
@@ -28,6 +49,10 @@ module Toast
|
|
28
49
|
end
|
29
50
|
|
30
51
|
def post payload
|
52
|
+
if @model.toast_config.in_collection.disallow_methods.include? "post"
|
53
|
+
raise MethodNotAllowed
|
54
|
+
end
|
55
|
+
|
31
56
|
if @collection != "all"
|
32
57
|
raise MethodNotAllowed
|
33
58
|
end
|
@@ -40,17 +65,23 @@ module Toast
|
|
40
65
|
raise PayloadFormatError
|
41
66
|
end
|
42
67
|
|
43
|
-
if payload.keys.to_set != @model.toast_config.exposed_attributes.to_set
|
68
|
+
if payload.keys.to_set != (@model.toast_config.exposed_attributes.to_set - @model.toast_config.auto_fields.to_set)
|
44
69
|
raise PayloadInvalid
|
45
70
|
end
|
46
71
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
72
|
+
|
73
|
+
begin
|
74
|
+
record = @model.create! payload
|
75
|
+
|
76
|
+
{
|
77
|
+
:json => record.exposed_attributes,
|
78
|
+
:location => record.uri,
|
79
|
+
:status => :created
|
80
|
+
}
|
81
|
+
|
82
|
+
rescue ActiveRecord::RecordInvalid => e
|
83
|
+
raise PayloadInvalid.new(e.message)
|
84
|
+
end
|
54
85
|
end
|
55
86
|
|
56
87
|
def delete
|
data/lib/toast/single.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
module Toast
|
2
|
+
|
3
|
+
# A Single resource is queried without an ID, by custom class methods
|
4
|
+
# or scopes of the model or ActiveRecord single finders like:
|
5
|
+
# first, last
|
6
|
+
|
7
|
+
# The single resource name must be a class method of the model and
|
8
|
+
# must return nil or an instance.
|
9
|
+
|
10
|
+
# GET is the only allowed verb. To make changes the URI with ID has
|
11
|
+
# to be used.
|
12
|
+
class Single < Resource
|
13
|
+
|
14
|
+
attr_reader :model
|
15
|
+
|
16
|
+
def initialize model, subresource_name, params
|
17
|
+
|
18
|
+
unless model.toast_config.singles.include? subresource_name
|
19
|
+
raise ResourceNotFound
|
20
|
+
end
|
21
|
+
|
22
|
+
@model = model
|
23
|
+
@single_finder = subresource_name
|
24
|
+
@params = params
|
25
|
+
@format = params[:format]
|
26
|
+
end
|
27
|
+
|
28
|
+
def get
|
29
|
+
if @model.toast_config.in_collection.disallow_methods.include? "get"
|
30
|
+
raise MethodNotAllowed
|
31
|
+
end
|
32
|
+
|
33
|
+
record = if @model.toast_config.pass_params_to.include?(@single_finder)
|
34
|
+
@model.send(@single_finder, @params)
|
35
|
+
else
|
36
|
+
@model.send(@single_finder)
|
37
|
+
end
|
38
|
+
|
39
|
+
raise ResourceNotFound if record.nil?
|
40
|
+
|
41
|
+
case @format
|
42
|
+
when "html"
|
43
|
+
{
|
44
|
+
:template => "resources/#{model.to_s.underscore}",
|
45
|
+
:locals => { model.to_s.pluralize.underscore.to_sym => record }
|
46
|
+
}
|
47
|
+
when "json"
|
48
|
+
{
|
49
|
+
:json => record.exposed_attributes,
|
50
|
+
:status => :ok
|
51
|
+
}
|
52
|
+
else
|
53
|
+
raise ResourceNotFound
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def put
|
58
|
+
raise MethodNotAllowed
|
59
|
+
end
|
60
|
+
|
61
|
+
def post payload
|
62
|
+
raise MethodNotAllowed
|
63
|
+
end
|
64
|
+
|
65
|
+
def delete
|
66
|
+
raise MethodNotAllowed
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 4
|
9
|
+
version: 0.3.4
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Robert Annies
|
@@ -15,18 +14,16 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date:
|
17
|
+
date: 2012-02-29 00:00:00 +01:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: blockenspiel
|
23
22
|
prerelease: false
|
24
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
24
|
requirements:
|
27
25
|
- - ~>
|
28
26
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 11
|
30
27
|
segments:
|
31
28
|
- 0
|
32
29
|
- 4
|
@@ -50,13 +47,14 @@ files:
|
|
50
47
|
- config/routes.rb
|
51
48
|
- lib/toast.rb
|
52
49
|
- lib/toast/active_record_extensions.rb
|
53
|
-
- lib/toast/
|
50
|
+
- lib/toast/association.rb
|
54
51
|
- lib/toast/attribute.rb
|
55
52
|
- lib/toast/config_dsl.rb
|
56
53
|
- lib/toast/engine.rb
|
57
54
|
- lib/toast/record.rb
|
58
55
|
- lib/toast/resource.rb
|
59
56
|
- lib/toast/root_collection.rb
|
57
|
+
- lib/toast/single.rb
|
60
58
|
- README.md
|
61
59
|
has_rdoc: true
|
62
60
|
homepage: https://github.com/robokopp/toast
|
@@ -68,27 +66,23 @@ rdoc_options: []
|
|
68
66
|
require_paths:
|
69
67
|
- lib
|
70
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
-
none: false
|
72
69
|
requirements:
|
73
70
|
- - ">="
|
74
71
|
- !ruby/object:Gem::Version
|
75
|
-
hash: 3
|
76
72
|
segments:
|
77
73
|
- 0
|
78
74
|
version: "0"
|
79
75
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
-
none: false
|
81
76
|
requirements:
|
82
77
|
- - ">="
|
83
78
|
- !ruby/object:Gem::Version
|
84
|
-
hash: 3
|
85
79
|
segments:
|
86
80
|
- 0
|
87
81
|
version: "0"
|
88
82
|
requirements: []
|
89
83
|
|
90
84
|
rubyforge_project:
|
91
|
-
rubygems_version: 1.6
|
85
|
+
rubygems_version: 1.3.6
|
92
86
|
signing_key:
|
93
87
|
specification_version: 3
|
94
88
|
summary: Toast adds a RESTful interface to ActiveRecord models in Ruby on Rails.
|