restrack 0.1.1 → 0.1.2

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.markdown ADDED
@@ -0,0 +1,229 @@
1
+ # RESTRack - serving JSON at REST with pleasure.
2
+
3
+ ## Description:
4
+ RESTRack is a [Rack](http://rack.rubyforge.org/)-based [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller)
5
+ framework that makes it extremely easy to develop [REST](http://en.wikipedia.org/wiki/Representational_State_Transfer)ful
6
+ data services. It is inspired by Rails, and follows a few of its conventions. But it has no routes file, routing
7
+ relationships are done through supplying custom code blocks to class methods such as "has\_relationship\_to" or
8
+ "has\_mapped\_relationships\_to".
9
+
10
+ RESTRack aims at being lightweight and easy to use. It will automatically render JSON and XML for the data
11
+ structures you return in your actions \(any structure parsable by the "[json](http://flori.github.com/json/)" and
12
+ "[xml-simple](https://github.com/maik/xml-simple)" gems, respectively\).
13
+
14
+ If you supply a view for a controller action, you do that using a builder file. Builder files are stored in the
15
+ view directory grouped by controller name subdirectories \(`view/<controller>/<action>.xml.builder`\). XML format
16
+ requests will then render the view template with the builder gem, rather than generating XML with XmlSimple.
17
+
18
+
19
+ ## Installation:
20
+ ### Using [RubyGems](http://rubygems.org):
21
+ <sudo> gem install restrack
22
+
23
+
24
+ ## Why RESTRack when there is Rails?
25
+ [Rails](http://rubyonrails.org/) is a powerful tool for full web applications. RESTRack is targeted at making
26
+ development of lightweight data services as easy as possible, while still giving you a performant and extensible
27
+ framework. The primary goal of of the development of RESTRack was to add as little as possible to the framework to give
28
+ the web developer a good application space for developing JSON and XML services.
29
+
30
+ Rails 3 instantiates approximately 80K more objects than RESTRack to do a hello world or nothing type response with
31
+ the default setup. Trimming Rails down to just ActionController, by eliminating ActiveRecord, ActionMailer, and
32
+ ActiveResource, it still instantiates over 47K more objects than RESTRack.
33
+
34
+
35
+ ## CLI Usage:
36
+ ### Generate a new service \(FooBar::WebService\)
37
+ - restrack generate service foo\_bar
38
+ - restrack gen serv foo\_bar
39
+ - restrack g s foo\_bar
40
+
41
+ ### Generate a new controller \(FooBar::BazController\)
42
+ - restrack generate controller baz
43
+ - restrack gen cont baz
44
+ - restrack g c baz
45
+
46
+ ### Generate a new controller that descends from another \(FooBar::NewController < FooBar::BazController\)
47
+ - restrack generate controller new descendant\_from baz
48
+ - restrack g controller new parent baz
49
+
50
+ ### Start up a server on default rackup port 9292
51
+ - restrack server
52
+
53
+ ### Start up a server on port 3456
54
+ - restrack server 3456
55
+ - restrack s 3456
56
+
57
+
58
+ ## REST action method names
59
+ All default RESTful controller method names align with their Rails counterparts, with two additional actions being
60
+ supported\(\*\).
61
+
62
+ HTTP Verb: | GET | PUT | POST | DELETE
63
+ Collection URI (/widgets/): | index | replace | create | *drop
64
+ Element URI (/widgets/42): | show | update | *add | destroy
65
+
66
+
67
+ ## URLs and Controller relationships
68
+ RESTRack enforces a strict URL pattern through the contruct of controller relationships, rather than a routing file.
69
+ Defining a controller for a resource means that you plan to expose that resource to requests to your service.
70
+ Defining a controller relationship means that you plan to expose a path from this resource to another.
71
+
72
+ ### "pass\_through\_to"
73
+ An open, or pass-through, path can be defined via the "pass\_through\_to" class method for resource controllers. This
74
+ exposes URL patterns like the following:
75
+
76
+ GET /foo/123/bar/234 <= simple pass-through from Foo 123 to show Bar 234
77
+ GET /foo/123/bar <= simple pass-through from Foo 123 to Bar index
78
+
79
+ ### "has\_relationship\_to"
80
+ A direct path to a single related resource's controller can be defined with the "has\_relationship\_to" method. This
81
+ allows you to define a one-to-one relationship from this resource to a related resource, which means that the id of
82
+ the related resource is implied through the id of the caller. The caller has one relation through a custom code block
83
+ passed to "has\_relationship\_to". The code block takes the caller resource's id and evaluates to the relation
84
+ resource's id, for example a PeopleController might define a one-to-one relationship like so:
85
+
86
+ has_relationship_to( :people, :as spouse ) do |id|
87
+ People.find(id).spouse.id
88
+ end
89
+
90
+ This exposes URL patterns like the following:
91
+
92
+ GET /people/Sally/spouse <= direct route to show Sally's spouse
93
+ PUT /people/Henry/spouse <= direct route to update Henry's spouse
94
+ POST /people/Jane/spouse <= direct route to add Jane's spouse
95
+
96
+ ### "has\_relationships\_to" and "has\_defined\_relationships\_to"
97
+ A direct path to many related resources' controller can be defined with the "has\_relationships\_to" and
98
+ "has\_defined\_relationships\_to" methods. These allows you to define one-to-many relationships. They work similar to
99
+ "has\_relationship\_to", except that they accept code blocks which evaluate to arrays of related child ids. Each
100
+ resource in the parent's relation list is then accessed through its array index (zero-based) in the URL. An example
101
+ of exposing the list of a People resource's children in this manner follows:
102
+
103
+ has_relationships_to( :people, :as => children ) do |id|
104
+ People.find(id).children.collect {|child| child.id}
105
+ end
106
+
107
+ Which exposes URLs similar to:
108
+
109
+ GET /people/Nancy/children/0 <= direct route to show child 0
110
+ DELETE /people/Robert/children/100 <= direct route to destroy child 100
111
+
112
+ An example of "has\_defined\_relationships\_to":
113
+
114
+ has_defined_relationships_to( :people, :as => children ) do |id|
115
+ People.find(id).children.collect {|child| child.id}
116
+ end
117
+
118
+ exposes URL patterns:
119
+
120
+ GET /people/Nancy/children/George <= route to show child George
121
+ DELETE /people/Robert/children/Jerry <= route to destroy child Jerry
122
+
123
+ ### "has\_mapped\_relationships\_to"
124
+ Multiple named one-to-many relationships can be exposed with the "has\_mapped\_relationships\_to" method. This allows
125
+ you to define many named or keyword paths to related resources. The method's code block should accepts the parent id
126
+ and return a hash where the keys are your relationship names and the values are the child resource ids. For example,
127
+ within a PeopleController the following definition:
128
+
129
+ has_mapped_relationships_to( :people ) do |id|
130
+ {
131
+ 'father' => People.find(id).father.id,
132
+ 'mother' => People.find(id).mother.id,
133
+ 'boss' => People.find(id).boss.id,
134
+ 'assistant' => People.find(id).assistant.id
135
+ }
136
+ end
137
+
138
+ This would expose the following URL patterns:
139
+
140
+ GET /people/Fred/people/father => show the father of Fred
141
+ PUT /people/Fred/people/assistant => update Fred's assistant
142
+ POST /people/Fred/people/boss => add Fred's boss
143
+ DELETE /people/Luke/people/mother => destroy Luke's father
144
+
145
+ ### Setting the data type of the id - "keyed\_with\_type"
146
+ Resource id data types can be defined with the "keyed\_with\_type" class method within resource controllers. The
147
+ default data type of String is used if a different type is not specified.
148
+
149
+
150
+ ## Logging/Logging Level
151
+ RESTRack outputs to two logs, the standard log (or error log) and the request log. Paths and logging levels for these
152
+ can be configured in `config/constants.yaml`. RESTRack uses Logger from Ruby-stdlib.
153
+
154
+ ## XML Serialization
155
+ RESTRack will convert the data structures that your actions return to JSON by default. You can change the default
156
+ by setting :DEFAULT_FORMAT to :XML in `config/constants.yml`.
157
+
158
+ ### With XmlSimple
159
+ RESTRack will attempt to serialize the data structures that your action methods return automatically using the
160
+ xml-simple gem.
161
+
162
+ ### With Builder
163
+ Custom XML serialization can be done by providing Builder gem templates in `views/<controller>/<action>.xml.builder`.
164
+
165
+
166
+ ## Inputs
167
+
168
+ ### Query string parameters
169
+ Available to controllers in the @params instance variable.
170
+
171
+ ### POST data
172
+ Available to controllers in the @input instance variable.
173
+
174
+
175
+ ## Constant Definition (config/constants.yaml)
176
+
177
+ ### Required Configuration Settings
178
+ #### :LOG
179
+ Sets the location of the error log.
180
+
181
+ #### :REQUEST\_LOG
182
+ Sets the location of the request log.
183
+
184
+ #### :LOG\_LEVEL
185
+ Sets the the logging level of the error log, based on the Ruby Logger object. Supply these as a symbol, with valid
186
+ values being :DEBUG, :INFO, :WARN, etc.
187
+
188
+ #### :REQUEST\_LOG\_LEVEL
189
+ Sets the the logging level of the request log, similar to :LOG_LEVEL.
190
+
191
+ ### Optional Configuration Settings
192
+ #### :DEFAULT\_FORMAT
193
+ Sets the default format for the response. This is the format that the response will take if no extension is appended to
194
+ the request string (i.e. /foo/123 rather than /foo/123.xml). Services will have a default format of JSON if this
195
+ configuration option is not defined.
196
+
197
+ #### :DEFAULT\_RESOURCE
198
+ Set this option in config/constants.yaml to use an implied root resource controller.
199
+
200
+ :DEFAULT_RESOURCE: foo
201
+ # /foo/123 could be accessed with /123
202
+ # /foo could be accessed with /
203
+
204
+ #### :ROOT\_RESOURCE\_ACCEPT
205
+ :ROOT_RESOURCE_ACCEPT: [ 'foo', 'bar' ]
206
+ # defines an array of resources that can be accessed (without being proxied through another relation).
207
+
208
+
209
+ #### :ROOT\_RESOURCE\_DENY
210
+ :ROOT_RESOURCE_DENY: [ 'baz' ]
211
+ # defines an array of resources that cannot be accessed without proxying though another controller.
212
+
213
+
214
+ ## License:
215
+
216
+ Copyright (c) 2010 Chris St. John
217
+
218
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
219
+ documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
220
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
221
+ persons to whom the Software is furnished to do so, subject to the following conditions:
222
+
223
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
224
+ Software.
225
+
226
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
227
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
228
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
229
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -52,7 +52,7 @@ module RESTRack
52
52
 
53
53
  end
54
54
 
55
- class Object
55
+ class Object #:nodoc: all
56
56
  # Courtesy of Rails' ActiveSupport, thank you DHH et al.
57
57
  def blank?
58
58
  respond_to?(:empty?) ? empty? : !self
@@ -1,3 +1,3 @@
1
1
  module RESTRack
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/restrack.gemspec CHANGED
@@ -9,21 +9,20 @@ Gem::Specification.new do |s|
9
9
  s.authors = ['Chris St. John']
10
10
  s.email = ['chris@stjohnstudios.com']
11
11
  s.homepage = 'http://github.com/stjohncj/RESTRack'
12
- s.summary = %q{A lightweight MVC framework developed specifically for JSON and XML REST services.}
13
- s.description = %q{RESTRack is a Rack based MVC framework that makes it extremely easy to
14
- develop RESTful data services. It is inspired by Rails, and follows a few of
15
- its conventions. But it has no routes file, routing relationships are done
16
- through supplying custom code blocks to class methods such as
17
- 'has_relationship_to', 'has_mapped_relationships_to',
18
- 'has_direct_relationship_to', and 'has_direct_relationships_to'.
19
- RESTRack aims at being lightweight and easy to use. It will
20
- automatically render JSON and XML for the data structures you return in your
21
- actions (any structure parsable by the 'json' and 'xml-simple' gems,
22
- respectively).
23
- If you supply a view for a controller action, you do that using a builder
24
- file (view/<controller>/<action>.xml.builder). XML format requests will then
25
- render the view template with the builder gem, rather than generating XML with
26
- XmlSimple.}
12
+ s.summary = %q{A lightweight MVC framework developed specifically for JSON (and XML) REST services.}
13
+ s.description = %q{
14
+ RESTRack is a Rack-based MVC framework that makes it extremely easy to develop RESTful data services. It is inspired by
15
+ Rails, and follows a few of its conventions. But it has no routes file, routing relationships are done through
16
+ supplying custom code blocks to class methods such as "has_relationship_to" or "has_mapped_relationships_to".
17
+
18
+ RESTRack aims at being lightweight and easy to use. It will automatically render JSON and XML for the data
19
+ structures you return in your actions (any structure parsable by the "json" and
20
+ "xml-simple" gems, respectively).
21
+
22
+ If you supply a view for a controller action, you do that using a builder file. Builder files are stored in the
23
+ view directory grouped by controller name subdirectories (`view/<controller>/<action>.xml.builder`). XML format
24
+ requests will then render the view template with the builder gem, rather than generating XML with XmlSimple.
25
+ }
27
26
 
28
27
  s.rubyforge_project = "restrack"
29
28
 
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restrack
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
4
+ prerelease:
5
+ version: 0.1.2
10
6
  platform: ruby
11
7
  authors:
12
8
  - Chris St. John
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-02-06 00:00:00 -05:00
13
+ date: 2011-02-13 00:00:00 -05:00
18
14
  default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
@@ -25,8 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ">="
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
24
  version: "0"
31
25
  type: :runtime
32
26
  version_requirements: *id001
@@ -38,8 +32,6 @@ dependencies:
38
32
  requirements:
39
33
  - - ">="
40
34
  - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
35
  version: "0"
44
36
  type: :runtime
45
37
  version_requirements: *id002
@@ -51,8 +43,6 @@ dependencies:
51
43
  requirements:
52
44
  - - ">="
53
45
  - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
46
  version: "0"
57
47
  type: :runtime
58
48
  version_requirements: *id003
@@ -64,8 +54,6 @@ dependencies:
64
54
  requirements:
65
55
  - - ">="
66
56
  - !ruby/object:Gem::Version
67
- segments:
68
- - 0
69
57
  version: "0"
70
58
  type: :runtime
71
59
  version_requirements: *id004
@@ -77,10 +65,6 @@ dependencies:
77
65
  requirements:
78
66
  - - ">="
79
67
  - !ruby/object:Gem::Version
80
- segments:
81
- - 1
82
- - 0
83
- - 13
84
68
  version: 1.0.13
85
69
  type: :runtime
86
70
  version_requirements: *id005
@@ -92,8 +76,6 @@ dependencies:
92
76
  requirements:
93
77
  - - ">="
94
78
  - !ruby/object:Gem::Version
95
- segments:
96
- - 0
97
79
  version: "0"
98
80
  type: :runtime
99
81
  version_requirements: *id006
@@ -105,8 +87,6 @@ dependencies:
105
87
  requirements:
106
88
  - - ">="
107
89
  - !ruby/object:Gem::Version
108
- segments:
109
- - 0
110
90
  version: "0"
111
91
  type: :runtime
112
92
  version_requirements: *id007
@@ -118,26 +98,19 @@ dependencies:
118
98
  requirements:
119
99
  - - ">="
120
100
  - !ruby/object:Gem::Version
121
- segments:
122
- - 0
123
101
  version: "0"
124
102
  type: :runtime
125
103
  version_requirements: *id008
126
- description: |-
127
- RESTRack is a Rack based MVC framework that makes it extremely easy to
128
- develop RESTful data services. It is inspired by Rails, and follows a few of
129
- its conventions. But it has no routes file, routing relationships are done
130
- through supplying custom code blocks to class methods such as
131
- 'has_relationship_to', 'has_mapped_relationships_to',
132
- 'has_direct_relationship_to', and 'has_direct_relationships_to'.
133
- RESTRack aims at being lightweight and easy to use. It will
134
- automatically render JSON and XML for the data structures you return in your
135
- actions (any structure parsable by the 'json' and 'xml-simple' gems,
136
- respectively).
137
- If you supply a view for a controller action, you do that using a builder
138
- file (view/<controller>/<action>.xml.builder). XML format requests will then
139
- render the view template with the builder gem, rather than generating XML with
140
- XmlSimple.
104
+ description: "\n\
105
+ RESTRack is a Rack-based MVC framework that makes it extremely easy to develop RESTful data services. It is inspired by\n\
106
+ Rails, and follows a few of its conventions. But it has no routes file, routing relationships are done through\n\
107
+ supplying custom code blocks to class methods such as \"has_relationship_to\" or \"has_mapped_relationships_to\".\n\n\
108
+ RESTRack aims at being lightweight and easy to use. It will automatically render JSON and XML for the data\n\
109
+ structures you return in your actions (any structure parsable by the \"json\" and\n\
110
+ \"xml-simple\" gems, respectively).\n\n\
111
+ If you supply a view for a controller action, you do that using a builder file. Builder files are stored in the\n\
112
+ view directory grouped by controller name subdirectories (`view/<controller>/<action>.xml.builder`). XML format\n\
113
+ requests will then render the view template with the builder gem, rather than generating XML with XmlSimple.\n "
141
114
  email:
142
115
  - chris@stjohnstudios.com
143
116
  executables:
@@ -148,7 +121,7 @@ extra_rdoc_files: []
148
121
 
149
122
  files:
150
123
  - Gemfile
151
- - README.rdoc
124
+ - README.markdown
152
125
  - Rakefile
153
126
  - bin/restrack
154
127
  - lib/restrack.rb
@@ -223,24 +196,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
223
196
  requirements:
224
197
  - - ">="
225
198
  - !ruby/object:Gem::Version
226
- segments:
227
- - 0
228
199
  version: "0"
229
200
  required_rubygems_version: !ruby/object:Gem::Requirement
230
201
  none: false
231
202
  requirements:
232
203
  - - ">="
233
204
  - !ruby/object:Gem::Version
234
- segments:
235
- - 0
236
205
  version: "0"
237
206
  requirements: []
238
207
 
239
208
  rubyforge_project: restrack
240
- rubygems_version: 1.3.7
209
+ rubygems_version: 1.5.2
241
210
  signing_key:
242
211
  specification_version: 3
243
- summary: A lightweight MVC framework developed specifically for JSON and XML REST services.
212
+ summary: A lightweight MVC framework developed specifically for JSON (and XML) REST services.
244
213
  test_files:
245
214
  - test/sample_app_1/config/constants.yaml
246
215
  - test/sample_app_1/controllers/bat_controller.rb
data/README.rdoc DELETED
@@ -1,196 +0,0 @@
1
- = RESTRack
2
-
3
- == Description:
4
- RESTRack is a Rack-based MVC framework that makes it extremely easy to develop RESTful data services. It is inspired
5
- by Rails, and follows a few of its conventions. But it has no routes file, routing relationships are done through
6
- supplying custom code blocks to class methods such as 'has_relationship_to' or 'has_mapped_relationships_to'.
7
- RESTRack aims at being lightweight and easy to use. It will automatically render JSON and XML for the data
8
- structures you return in your actions (any structure parsable by the 'json' and 'xml-simple' gems, respectively).
9
- If you supply a view for a controller action, you do that using a builder file. Builder files are stored in the
10
- view directory grouped by controller name subdirectories (view/<controller>/<action>.xml.builder). XML format
11
- requests will then render the view template with the builder gem, rather than generating XML with XmlSimple.
12
-
13
-
14
- == Installation:
15
- <sudo> gem install restrack
16
-
17
-
18
- == Why RESTRack when there is Rails?
19
- Rails is a powerful tool for full web applications. RESTRack is targeted at making development of lightweight data
20
- services as easy as possible, while still giving you a performant and extensible framework. The primary goal of
21
- of the development of RESTRack was to add as little as possible to the framework to give the web developer a good
22
- application space for developing JSON and XML services.
23
-
24
- Rails 3 instantiates approximately 80K more objects than RESTRack to do a hello world or nothing type response with
25
- the default setup. Trimming Rails down to just ActionController, by eliminating ActiveRecord, ActionMailer, and
26
- ActiveResource, it still instantiates over 47K more objects than RESTRack.
27
-
28
-
29
- == CLI Usage:
30
- - restrack generate service foo_bar
31
- - restrack gen serv foo_bar
32
- - restrack g s foo_bar
33
- - restrack generate controller baz
34
- - restrack gen cont baz
35
- - restrack g c baz
36
- - restrack server # default rackup port 9292
37
- - restrack server 3456
38
- - restrack s 3456
39
-
40
-
41
- == REST action method names
42
- All default RESTful controller method names align with their Rails counterparts, with two additional actions being
43
- supported(*).
44
-
45
- # HTTP Verb: | GET | PUT | POST | DELETE
46
- # Collection URI (/widgets/): | index | replace | create | *drop
47
- # Element URI (/widgets/42): | show | update | *add | destroy
48
-
49
-
50
- == URLs and Controller relationships
51
- RESTRack enforces a strict URL pattern through the contruct of controller relationships, rather than a routing file.
52
- Defining a controller for a resource means that you plan to expose that resource to requests to your service.
53
- Defining a controller relationship means that you plan to expose a path from this resource to another.
54
-
55
- === 'pass_through_to'
56
- An open, or pass-through, path can be defined via the 'pass_through_to' class method for resource controllers. This
57
- exposes URL patterns like the following:
58
- GET /foo/123/bar/234 <= simple pass-through from Foo 123 to show Bar 234
59
- GET /foo/123/bar <= simple pass-through from Foo 123 to Bar index
60
-
61
- === 'has_relationship_to'
62
- A direct path to a single related resource's controller can be defined with the 'has_relationship_to' method. This
63
- allows you to define a one-to-one relationship from this resource to a related resource, which means that the id of
64
- the related resource is implied through the id of the caller. The caller has one relation through a custom code block
65
- passed to 'has_relationship_to'. The code block takes the caller resource's id and evaluates to the relation
66
- resource's id, for example a PeopleController might define a one-to-one relationship like so:
67
- has_relationship_to( :people, :as spouse ) do |id|
68
- People.find(id).spouse.id
69
- end
70
- This exposes URL patterns like
71
- the following:
72
- GET /people/Sally/spouse <= direct route to show Sally's spouse
73
- PUT /people/Henry/spouse <= direct route to update Henry's spouse
74
- POST /people/Jane/spouse <= direct route to add Jane's spouse
75
-
76
- === 'has_relationships_to' and 'has_defined_relationships_to'
77
- A direct path to many related resources' controller can be defined with the 'has_relationships_to' and
78
- 'has_defined_relationships_to' methods. These allows you to define one-to-many relationships. They work similar to
79
- 'has_relationship_to', except that they accept code blocks which evaluate to arrays of related child ids. Each
80
- resource in the parent's relation list is then accessed through its array index (zero-based) in the URL. An example
81
- of exposing the list of a People resource's children in this manner follows:
82
- has_relationships_to( :people, :as => children ) do |id|
83
- People.find(id).children.collect {|child| child.id}
84
- end
85
- GET /people/Nancy/children/0 <= direct route to show child 0
86
- DELETE /people/Robert/children/100 <= direct route to destroy child 100
87
-
88
- has_defined_relationships_to( :people, :as => children ) do |id|
89
- People.find(id).children.collect {|child| child.id}
90
- end
91
- GET /people/Nancy/children/George <= direct route to show child 0
92
- DELETE /people/Robert/children/John <= direct route to destroy child 100
93
-
94
- === 'has_mapped_relationships_to'
95
- Multiple named one-to-many relationships can be exposed with the 'has_mapped_relationships_to' method. This allows
96
- you to define many named or keyword paths to related resources. The method's code block should accepts the parent id
97
- and return a hash where the keys are your relationship names and the values are the child resource ids. For example,
98
- within a PeopleController the following definition:
99
- has_mapped_relationships_to( :people ) do |id|
100
- {
101
- 'father' => People.find(id).father.id,
102
- 'mother' => People.find(id).mother.id,
103
- 'boss' => People.find(id).boss.id,
104
- 'assistant' => People.find(id).assistant.id
105
- }
106
- end
107
- This would expose the following URL patterns:
108
- GET /people/Fred/people/father => show the father of Fred
109
- PUT /people/Fred/people/assistant => update Fred's assistant
110
- POST /people/Fred/people/boss => add Fred's boss
111
- DELETE /people/Luke/people/mother => destroy Luke's father
112
-
113
-
114
- Resource id data types can be defined with the keyed_with_type class method within resource controllers. The
115
- default data type of String is used if a different type is not specified.
116
-
117
-
118
- == Logging/Logging Level
119
- RESTRack logs to two logs, the standard log (or error log) and the request log. Paths and logging levels for these
120
- can be configured in config/constants.yaml. RESTRack uses Logger from Ruby-stdlib.
121
-
122
- == XML Serialization
123
- RESTRack will convert the data structures that your actions return to JSON by default. You can change the default
124
- by setting :DEFAULT_FORMAT to :XML in config/constants.yml.
125
-
126
- === With XmlSimple
127
- RESTRack will attempt to serialize the data structures that your action methods return automatically using the
128
- xml-simple gem.
129
-
130
- === With Builder
131
- Custom XML serialization can be done by providing Builder gem templates in views/<controller>/<action>.xml.builder
132
-
133
-
134
- == Inputs
135
-
136
- === Query string parameters
137
- Available to controllers in the @params instance variable.
138
-
139
- === POST data
140
- Available to controllers in the @input instance variable.
141
-
142
-
143
- == Constant Definition (config/constants.yaml)
144
-
145
- === Required Configuration Settings
146
- ==== :LOG
147
- Sets the location of the error log.
148
-
149
- ==== :REQUEST_LOG
150
- Sets the location of the request log.
151
-
152
- ==== :LOG_LEVEL
153
- Sets the the logging level of the error log, based on the Ruby Logger object. Supply these as a symbol, with valid
154
- values being :DEBUG, :INFO, :WARN, etc.
155
-
156
- ==== :REQUEST_LOG_LEVEL
157
- Sets the the logging level of the request log, similar to :LOG_LEVEL.
158
-
159
- === Optional Configuration Settings
160
- ==== :DEFAULT_FORMAT
161
- Sets the default format for the response. This is the format that the response will take if no extension is
162
- appended to the request string (i.e. /foo/123 rather than /foo/123.xml). Services will have a default format of JSON
163
- if this configuration option is not defined.
164
-
165
- ==== :DEFAULT_RESOURCE
166
- Set this option in config/constants.yaml to use an implied root resource controller.
167
- :DEFAULT_RESOURCE: foo
168
- # /foo/123 could be accessed with /123
169
- # /foo could be accessed with /
170
-
171
- ==== :ROOT_RESOURCE_ACCEPT
172
- :ROOT_RESOURCE_ACCEPT: [ 'foo', 'bar' ]
173
- defines an array of resources that can be accessed (without being proxied through another relation).
174
-
175
-
176
- ==== :ROOT_RESOURCE_DENY
177
- :ROOT_RESOURCE_DENY: [ 'baz' ]
178
- defines an array of resources that cannot be accessed without proxying though another controller.
179
-
180
-
181
- == License:
182
-
183
- Copyright (c) 2010 Chris St. John
184
-
185
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
186
- documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
187
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
188
- persons to whom the Software is furnished to do so, subject to the following conditions:
189
-
190
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
191
- Software.
192
-
193
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
194
- WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
195
- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
196
- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.