acts_as_api 0.3.8 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -5,8 +5,8 @@ gemspec
5
5
 
6
6
  group :test do
7
7
  gem 'sqlite3-ruby'
8
- gem 'mongoid', '>= 2.0.0'
9
- gem 'rspec-rails', '>= 2.4.1'
8
+ gem 'mongoid', '>= 2.0.1'
9
+ gem 'rspec-rails', '>= 2.5.0'
10
10
  gem 'webrat'
11
11
  gem 'rocco', :git => 'git://github.com/fabrik42/rocco.git'
12
12
  end
@@ -1,3 +1,8 @@
1
+ === 0.3.9 2011-09-24
2
+
3
+ * Spec suite now running on Rails 3.1
4
+ * Fixed naming issue with ActiveRecord::Relation (Ticket #35)
5
+
1
6
  === 0.3.8 2011-06-21
2
7
 
3
8
  * Fixed Rails 3.1 deprecation warning
@@ -1,35 +1,36 @@
1
- = acts_as_api http://travis-ci.org/fabrik42/acts_as_api.png
1
+ # acts_as_api ![acts_as_api on travis ci](http://travis-ci.org/fabrik42/acts_as_api.png)
2
2
 
3
3
  acts_as_api makes creating XML/JSON responses in Rails 3 easy and fun.
4
4
 
5
5
  It provides a simple interface to determine the representation of your model data, that should be rendered in your API responses.
6
6
 
7
- In addition to Rails it theoretically can be used with any ruby app and any database (*ActiveRecord* and *Mongoid* are supported out of the box) as it only has few dependencies.
7
+ In addition to Rails it theoretically can be used with any ruby app and any database (__ActiveRecord__ and __Mongoid__ are supported out of the box) as it only has few dependencies.
8
8
 
9
- == Introduction
9
+ ## Introduction
10
10
 
11
11
  acts_as_api enriches the models and controllers of your app in a Rails-like way so you can easily determine how your API responses should look like:
12
12
 
13
- class User < ActiveRecord::Base
13
+ ```ruby
14
+ class User < ActiveRecord::Base
14
15
 
15
- acts_as_api
16
+ acts_as_api
16
17
 
17
- api_accessible :public do |template|
18
- template.add :first_name
19
- template.add :age
20
- end
18
+ api_accessible :public do |template|
19
+ template.add :first_name
20
+ template.add :age
21
+ end
22
+ # will render json: { "user": { "first_name": "John", "age": 26 } }
21
23
 
22
- api_accessible :private do |template|
23
- template.add :first_name
24
- template.add :last_name
25
- template.add :age
26
- template.add :birthday
27
- end
24
+ api_accessible :private, :extend => :public do |template|
25
+ template.add :last_name
26
+ template.add :email
27
+ end
28
+ # will render json: { "user": { "first_name": "John", "last_name": "Doe", "age": 26, "email": "john@example.org" } }
28
29
 
29
- end
30
+ end
31
+ ```
30
32
 
31
-
32
- == Getting started
33
+ ## Getting started
33
34
 
34
35
  A nice introduction about acts_as_api with examples can be found here:
35
36
 
@@ -39,23 +40,33 @@ See the Wiki for a lot of usage examples and features:
39
40
 
40
41
  https://github.com/fabrik42/acts_as_api/wiki
41
42
 
42
- == Features:
43
+ There are a lot of how-tos like:
44
+
45
+ * [Extending existing api templates](https://github.com/fabrik42/acts_as_api/wiki/Extending-an-existing-api-template)
46
+ * [Include attributes and all other kinds of methods of your model](https://github.com/fabrik42/acts_as_api/wiki/Calling-a-method-of-the-model)
47
+ * [Include child associations (if they also act_as_api this will be considered)](https://github.com/fabrik42/acts_as_api/wiki/Including-a-child-association)
48
+ * [Rename attributes, methods, associations](https://github.com/fabrik42/acts_as_api/wiki/Renaming-an-attribute)
49
+ * [Keep your API templates out of your models](https://github.com/fabrik42/acts_as_api/wiki/Keep-your-api-templates-out-of-your-models)
50
+ * [and much more...](https://github.com/fabrik42/acts_as_api/wiki)
51
+
52
+ ## Features:
43
53
 
44
54
  * DRY templates for your api responses
55
+ * Ships with support for __ActiveRecord__ and __Mongoid__
56
+ * Support for Rails 3 Responders
57
+ * Plays very well together with client libs like [Backbone.js](http://documentcloud.github.com/backbone) or [RestKit](http://restkit.org) (iOS).
45
58
  * Easy but very flexible syntax for defining the templates
46
59
  * XML, JSON and JSON-P support out of the box, easy to extend
47
- * Support for Rails 3 Responders
48
60
  * Minimal dependecies (you can also use it without Rails)
49
- * Ships with support for *ActiveRecord* and *Mongoid*
50
61
  * Supports multiple api rendering templates per model. This is especially useful for API versioning or for example for private vs. public access points to a user’s profile.
51
62
 
52
- === Requirements:
63
+ ### Requirements:
53
64
 
54
65
  * ActiveModel (>= 3.0.0)
55
66
  * ActiveSupport (>= 3.0.0)
56
67
  * Rack (>= 1.1.0)
57
68
 
58
- === Links
69
+ ### Links
59
70
 
60
71
  * Introduction: http://fabrik42.github.com/acts_as_api
61
72
 
@@ -65,22 +76,22 @@ https://github.com/fabrik42/acts_as_api/wiki
65
76
 
66
77
  * Wiki: https://github.com/fabrik42/acts_as_api/wiki
67
78
 
68
- === Travis CI build status http://travis-ci.org/fabrik42/acts_as_api.png
79
+ ### Travis CI build status ![acts_as_api on travis ci](http://travis-ci.org/fabrik42/acts_as_api.png)
69
80
 
70
81
  Specs run with 1.9.2, 1.8.7 and REE: http://travis-ci.org/#!/fabrik42/acts_as_api
71
82
 
72
- === Tested with:
83
+ ### Tested with:
73
84
 
74
85
  * MRI 1.9.2-p180
75
86
  * MRI 1.8.7-p334
76
- * But it just should work fine with other versions too... :)
87
+ * But it just should work fine with other versions too... :)
77
88
 
78
- === Downwards Compatibility
89
+ ### Downwards Compatibility
79
90
 
80
91
  Note that upgrading to 0.3.0 will break code that worked with previous versions due to a complete overhaul of the lib.
81
92
  For a legacy version of this readme file look here: https://github.com/fabrik42/acts_as_api/wiki/legacy-acts_as_api-0.2-readme
82
93
 
83
- === LICENSE:
94
+ ### LICENSE:
84
95
 
85
96
  (The MIT License)
86
97
 
data/Rakefile CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'bundler'
2
2
  require 'rspec/core'
3
3
  require 'rspec/core/rake_task'
4
- #require 'rake/rdoctask'
5
4
 
6
5
  Bundler::GemHelper.install_tasks
7
6
 
@@ -17,21 +16,11 @@ namespace :spec do
17
16
 
18
17
  end
19
18
 
20
-
21
-
22
-
23
19
  gemspec = Gem::Specification.load("acts_as_api.gemspec")
24
20
 
25
21
  task :default => :spec
26
22
 
27
- # causes crash in travis ci
28
- #Rake::RDocTask.new do |rdoc|
29
- # rdoc.rdoc_dir = 'doc'
30
- # rdoc.title = "#{gemspec.name} #{gemspec.version}"
31
- # rdoc.options += gemspec.rdoc_options
32
- # rdoc.options << '--line-numbers' << '--inline-source'
33
- # rdoc.rdoc_files.include(gemspec.extra_rdoc_files)
34
- # rdoc.rdoc_files.include('README.rdoc')
35
- #end
36
-
37
- #bundle exec rocco examples/introduction/index.rb -t examples/introduction/layout.mustache
23
+ desc "Generate the gh_pages site"
24
+ task :rocco do
25
+ system "bundle exec rocco examples/introduction/index.rb -t examples/introduction/layout.mustache"
26
+ end
@@ -16,11 +16,10 @@ Gem::Specification.new do |s|
16
16
  s.add_dependency('activesupport','>= 3.0.0')
17
17
  s.add_dependency('rack','>= 1.1.0')
18
18
 
19
- s.add_development_dependency('rails', ['>= 3.0.0'])
20
- s.add_development_dependency('mongoid', ['>= 2.0.0'])
19
+ s.add_development_dependency('rails', ['>= 3.1.0'])
20
+ s.add_development_dependency('mongoid', ['>= 2.0.1'])
21
21
 
22
- s.rdoc_options = ['--main', 'README.rdoc', '--charset=UTF-8']
23
- s.extra_rdoc_files = ['README.rdoc']
22
+ s.rdoc_options = ['--charset=UTF-8']
24
23
 
25
24
  s.files = `git ls-files`.split("\n")
26
25
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -3,6 +3,9 @@
3
3
  <head>
4
4
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
5
  <title>acts_as_api</title>
6
+ <meta content="A Ruby/Rails gem to easily generate web api reponses!" name="description" />
7
+ <meta content="Christian Bäuerlein" name="author" />
8
+ <meta content="en" name="language" />
6
9
  <link rel="stylesheet" href="./docco.css">
7
10
  <link href="http://fonts.googleapis.com/css?family=Copse:regular" rel="stylesheet" type="text/css" >
8
11
  <style>
@@ -56,44 +59,38 @@ You surely don’t want to expose your models always with all attributes.</p>
56
59
 
57
60
  <ul>
58
61
  <li>DRY templates for your api responses</li>
62
+ <li>Ships with support for <strong>ActiveRecord</strong> and <strong>Mongoid</strong></li>
63
+ <li>Support for Rails 3 Responders</li>
64
+ <li>Plays very well together with client libs like <a href="http://documentcloud.github.com/backbone">Backbone.js</a> or <a href="http://restkit.org">RestKit</a> (iOS).</li>
59
65
  <li>Easy but very flexible syntax for defining the templates</li>
60
66
  <li>XML, JSON and JSON-P support out of the box, easy to extend</li>
61
- <li>Support for Rails 3 Responders</li>
67
+ <li>Support for meta data like pagination info, etc&hellip;</li>
62
68
  <li>Minimal dependecies (you can also use it without Rails)</li>
63
- <li>Ships with support for <strong>ActiveRecord</strong> and <strong>Mongoid</strong></li>
64
69
  <li>Supports multiple api rendering templates for a models. This is especially useful for API versioning or for example for private vs. public access points to a user’s profile.</li>
65
70
  </ul>
71
+
72
+
73
+ <hr />
66
74
  </td>
67
75
  <td class=code>
68
76
  <div class='highlight'><pre></pre></div>
69
77
  </td>
70
78
  </tr>
71
- <tr id='section-3'>
72
- <td class=docs>
73
- <div class="pilwrap">
74
- <a class="pilcrow" href="#section-3">&#182;</a>
75
- </div>
76
- <hr />
77
- </td>
78
- <td class=code>
79
- <div class='highlight'><pre></pre></div>
80
- </td>
81
- </tr>
82
- <tr id='section-Rails_3.0.x_Quickstart'>
79
+ <tr id='section-Rails_3.x_Quickstart'>
83
80
  <td class=docs>
84
81
  <div class="pilwrap">
85
- <a class="pilcrow" href="#section-Rails_3.0.x_Quickstart">&#182;</a>
82
+ <a class="pilcrow" href="#section-Rails_3.x_Quickstart">&#182;</a>
86
83
  </div>
87
- <h2>Rails 3.0.x Quickstart</h2>
84
+ <h2>Rails 3.x Quickstart</h2>
88
85
  </td>
89
86
  <td class=code>
90
87
  <div class='highlight'><pre></pre></div>
91
88
  </td>
92
89
  </tr>
93
- <tr id='section-5'>
90
+ <tr id='section-4'>
94
91
  <td class=docs>
95
92
  <div class="pilwrap">
96
- <a class="pilcrow" href="#section-5">&#182;</a>
93
+ <a class="pilcrow" href="#section-4">&#182;</a>
97
94
  </div>
98
95
  <p>Add to gemfile</p>
99
96
  </td>
@@ -101,10 +98,10 @@ You surely don’t want to expose your models always with all attributes.</p>
101
98
  <div class='highlight'><pre><span class="n">gem</span> <span class="s1">&#39;acts_as_api&#39;</span></pre></div>
102
99
  </td>
103
100
  </tr>
104
- <tr id='section-6'>
101
+ <tr id='section-5'>
105
102
  <td class=docs>
106
103
  <div class="pilwrap">
107
- <a class="pilcrow" href="#section-6">&#182;</a>
104
+ <a class="pilcrow" href="#section-5">&#182;</a>
108
105
  </div>
109
106
  <p>Update your bundle</p>
110
107
  </td>
@@ -123,10 +120,10 @@ You surely don’t want to expose your models always with all attributes.</p>
123
120
  <div class='highlight'><pre></pre></div>
124
121
  </td>
125
122
  </tr>
126
- <tr id='section-8'>
123
+ <tr id='section-7'>
127
124
  <td class=docs>
128
125
  <div class="pilwrap">
129
- <a class="pilcrow" href="#section-8">&#182;</a>
126
+ <a class="pilcrow" href="#section-7">&#182;</a>
130
127
  </div>
131
128
  <p>Given you have a model <code>User</code>.
132
129
  If you only want to expose the <code>first_name</code> and <code>last_name</code> attribute of a user via your api, you would do something like this:</p>
@@ -135,10 +132,10 @@ If you only want to expose the <code>first_name</code> and <code>last_name</code
135
132
  <div class='highlight'><pre></pre></div>
136
133
  </td>
137
134
  </tr>
138
- <tr id='section-9'>
135
+ <tr id='section-8'>
139
136
  <td class=docs>
140
137
  <div class="pilwrap">
141
- <a class="pilcrow" href="#section-9">&#182;</a>
138
+ <a class="pilcrow" href="#section-8">&#182;</a>
142
139
  </div>
143
140
  <p>Within your model:</p>
144
141
 
@@ -159,10 +156,10 @@ If you only want to expose the <code>first_name</code> and <code>last_name</code
159
156
  <span class="k">end</span></pre></div>
160
157
  </td>
161
158
  </tr>
162
- <tr id='section-10'>
159
+ <tr id='section-9'>
163
160
  <td class=docs>
164
161
  <div class="pilwrap">
165
- <a class="pilcrow" href="#section-10">&#182;</a>
162
+ <a class="pilcrow" href="#section-9">&#182;</a>
166
163
  </div>
167
164
  <p>An API template with the name <code>:name_only</code> was created.</p>
168
165
 
@@ -183,10 +180,10 @@ If you only want to expose the <code>first_name</code> and <code>last_name</code
183
180
  <div class='highlight'><pre></pre></div>
184
181
  </td>
185
182
  </tr>
186
- <tr id='section-12'>
183
+ <tr id='section-11'>
187
184
  <td class=docs>
188
185
  <div class="pilwrap">
189
- <a class="pilcrow" href="#section-12">&#182;</a>
186
+ <a class="pilcrow" href="#section-11">&#182;</a>
190
187
  </div>
191
188
  <p>Now you just have to exchange the <code>render</code> method in your controller for the <code>render_for_api</code> method.</p>
192
189
  </td>
@@ -197,10 +194,10 @@ If you only want to expose the <code>first_name</code> and <code>last_name</code
197
194
  <span class="vi">@users</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">all</span></pre></div>
198
195
  </td>
199
196
  </tr>
200
- <tr id='section-13'>
197
+ <tr id='section-12'>
201
198
  <td class=docs>
202
199
  <div class="pilwrap">
203
- <a class="pilcrow" href="#section-13">&#182;</a>
200
+ <a class="pilcrow" href="#section-12">&#182;</a>
204
201
  </div>
205
202
  <p>Note that it&rsquo;s wise to add a <code>root</code> param when rendering lists.</p>
206
203
  </td>
@@ -234,10 +231,10 @@ If you only want to expose the <code>first_name</code> and <code>last_name</code
234
231
  <div class='highlight'><pre></pre></div>
235
232
  </td>
236
233
  </tr>
237
- <tr id='section-15'>
234
+ <tr id='section-14'>
238
235
  <td class=docs>
239
236
  <div class="pilwrap">
240
- <a class="pilcrow" href="#section-15">&#182;</a>
237
+ <a class="pilcrow" href="#section-14">&#182;</a>
241
238
  </div>
242
239
  <p>Try it. The JSON response of #show should now look like this:</p>
243
240
 
@@ -253,10 +250,10 @@ because they were not listed by <code>api_accessible</code> in the model.</p>
253
250
  <span class="p">}</span></pre></div>
254
251
  </td>
255
252
  </tr>
256
- <tr id='section-16'>
253
+ <tr id='section-15'>
257
254
  <td class=docs>
258
255
  <div class="pilwrap">
259
- <a class="pilcrow" href="#section-16">&#182;</a>
256
+ <a class="pilcrow" href="#section-15">&#182;</a>
260
257
  </div>
261
258
  <hr />
262
259
  </td>
@@ -304,10 +301,10 @@ provides you some tools to customize your API responses.</p>
304
301
  <div class='highlight'><pre></pre></div>
305
302
  </td>
306
303
  </tr>
307
- <tr id='section-19'>
304
+ <tr id='section-18'>
308
305
  <td class=docs>
309
306
  <div class="pilwrap">
310
- <a class="pilcrow" href="#section-19">&#182;</a>
307
+ <a class="pilcrow" href="#section-18">&#182;</a>
311
308
  </div>
312
309
  <hr />
313
310
  </td>
@@ -5,16 +5,20 @@
5
5
 
6
6
  ### Features
7
7
  # * DRY templates for your api responses
8
+ # * Ships with support for **ActiveRecord** and **Mongoid**
9
+ # * Support for Rails 3 Responders
10
+ # * Plays very well together with client libs like [Backbone.js][b1] or [RestKit][r1] (iOS).
8
11
  # * Easy but very flexible syntax for defining the templates
9
12
  # * XML, JSON and JSON-P support out of the box, easy to extend
10
- # * Support for Rails 3 Responders
13
+ # * Support for meta data like pagination info, etc...
11
14
  # * Minimal dependecies (you can also use it without Rails)
12
- # * Ships with support for **ActiveRecord** and **Mongoid**
13
15
  # * Supports multiple api rendering templates for a models. This is especially useful for API versioning or for example for private vs. public access points to a user’s profile.
14
-
16
+ # [b1]: http://documentcloud.github.com/backbone
17
+ # [r1]: http://restkit.org
15
18
  # ***
16
19
 
17
- ### Rails 3.0.x Quickstart
20
+
21
+ ### Rails 3.x Quickstart
18
22
 
19
23
  # Add to gemfile
20
24
  gem 'acts_as_api'
@@ -3,6 +3,9 @@
3
3
  <head>
4
4
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
5
5
  <title>acts_as_api</title>
6
+ <meta content="A Ruby/Rails gem to easily generate web api reponses!" name="description" />
7
+ <meta content="Christian Bäuerlein" name="author" />
8
+ <meta content="en" name="language" />
6
9
  <link rel="stylesheet" href="./docco.css">
7
10
  <link href="http://fonts.googleapis.com/css?family=Copse:regular" rel="stylesheet" type="text/css" >
8
11
  <style>
@@ -46,7 +46,7 @@ module ActsAsApi
46
46
 
47
47
  api_root_name = api_root_name.underscore.tr('/', '_')
48
48
 
49
- if api_model.is_a?(Array)
49
+ if api_model.is_a?(Array) || api_model.is_a?(ActiveRecord::Relation)
50
50
  api_root_name = api_root_name.pluralize
51
51
  end
52
52
 
@@ -1,3 +1,3 @@
1
1
  module ActsAsApi
2
- VERSION = "0.3.8"
2
+ VERSION = "0.3.9"
3
3
  end
@@ -2,10 +2,10 @@ class ApplicationController < ActionController::Base
2
2
  protect_from_forgery
3
3
 
4
4
  before_filter do
5
- if params[:orm] == :active_record
5
+ if params[:orm] == 'active_record'
6
6
  @user_model = User
7
- elsif params[:orm] == :mongoid
7
+ elsif params[:orm] == 'mongoid'
8
8
  @user_model = MongoUser
9
9
  end
10
- end
10
+ end
11
11
  end
@@ -9,12 +9,30 @@ class RespondWithUsersController < ApplicationController
9
9
  respond_with @users, :api_template => params[:api_template].to_sym, :root => :users
10
10
  end
11
11
 
12
+ def index_meta
13
+ @users = @user_model.all
14
+ meta_hash = { :page => 1, :total => 999 }
15
+ respond_with @users, :api_template => params[:api_template].to_sym, :root => :users, :meta => meta_hash
16
+ end
17
+
18
+ def index_relation
19
+ @users = @user_model.limit(100)
20
+ respond_with @users, :api_template => params[:api_template].to_sym
21
+ end
22
+
12
23
  def show
13
24
  @user = @user_model.find(params[:id])
14
25
  # :root => :user is only used here because we need it for the node name of the MongoUser model
15
26
  respond_with @user, :api_template => params[:api_template].to_sym, :root => :user
16
27
  end
17
28
 
29
+ def show_meta
30
+ @user = @user_model.find(params[:id])
31
+ meta_hash = { :page => 1, :total => 999 }
32
+ # :root => :user is only used here because we need it for the node name of the MongoUser model
33
+ respond_with @user, :api_template => params[:api_template].to_sym, :root => :user, :meta => meta_hash
34
+ end
35
+
18
36
  def show_default
19
37
  @user = @user_model.find(params[:id])
20
38
  respond_with @user
@@ -9,6 +9,25 @@ class UsersController < ApplicationController
9
9
  end
10
10
  end
11
11
 
12
+ def index_meta
13
+ @users = @user_model.all
14
+ meta_hash = { :page => 1, :total => 999 }
15
+
16
+ respond_to do |format|
17
+ format.xml { render_for_api params[:api_template].to_sym, :xml => @users, :root => :users, :meta => meta_hash }
18
+ format.json { render_for_api params[:api_template].to_sym, :json => @users, :root => :users, :meta => meta_hash }
19
+ end
20
+ end
21
+
22
+ def index_relation
23
+ @users = @user_model.limit(100)
24
+
25
+ respond_to do |format|
26
+ format.xml { render_for_api params[:api_template].to_sym, :xml => @users }
27
+ format.json { render_for_api params[:api_template].to_sym, :json => @users }
28
+ end
29
+ end
30
+
12
31
  def show
13
32
  @user = @user_model.find(params[:id])
14
33
 
@@ -19,6 +38,16 @@ class UsersController < ApplicationController
19
38
  end
20
39
  end
21
40
 
41
+ def show_meta
42
+ @user = @user_model.find(params[:id])
43
+ meta_hash = { :page => 1, :total => 999 }
44
+ respond_to do |format|
45
+ # :root => :user is only used here because we need it for the node name of the MongoUser model
46
+ format.xml { render_for_api params[:api_template].to_sym, :xml => @user, :root => :user }
47
+ format.json { render_for_api params[:api_template].to_sym, :json => @user, :root => :user, :meta => meta_hash }
48
+ end
49
+ end
50
+
22
51
  def show_default
23
52
  @user = @user_model.find(params[:id])
24
53
  respond_to do |format|
@@ -27,5 +56,4 @@ class UsersController < ApplicationController
27
56
  end
28
57
  end
29
58
 
30
-
31
- end
59
+ end
@@ -11,7 +11,6 @@ RailsApp::Application.configure do
11
11
 
12
12
  # Show full error reports and disable caching
13
13
  config.consider_all_requests_local = true
14
- config.action_view.debug_rjs = true
15
14
  config.action_controller.perform_caching = false
16
15
 
17
16
  # Don't care if the mailer can't send
@@ -1,13 +1,23 @@
1
1
  RailsApp::Application.routes.draw do
2
2
 
3
3
  resources :users do
4
+ collection do
5
+ get 'index_meta'
6
+ get 'index_relation'
7
+ end
4
8
  member do
9
+ get 'show_meta'
5
10
  get 'show_default'
6
11
  end
7
12
  end
8
13
 
9
14
  resources :respond_with_users do
15
+ collection do
16
+ get 'index_meta'
17
+ get 'index_relation'
18
+ end
10
19
  member do
20
+ get 'show_meta'
11
21
  get 'show_default'
12
22
  end
13
23
  end
@@ -94,6 +94,38 @@ shared_examples_for "a controller with ActsAsApi responses" do
94
94
  end
95
95
 
96
96
  end
97
+
98
+ describe 'get all users as a ActiveRecord::Relation object, autodetecting the root node name' do
99
+
100
+ before(:each) do
101
+ get :index_relation, :format => 'json', :api_template => :name_only, :orm => @orm_for_testing
102
+
103
+ if @orm_for_testing == :active_record
104
+ @root_node = "users"
105
+ elsif @orm_for_testing == :mongoid
106
+ @root_node = "mongo_users"
107
+ end
108
+ end
109
+
110
+ it "should have a root node named users" do
111
+ response_body_json.should have_key(@root_node)
112
+ end
113
+
114
+ it "should contain all users" do
115
+ response_body_json[@root_node].should be_a(Array)
116
+ end
117
+
118
+ it "should contain the specified attributes" do
119
+ response_body_json[@root_node].first.should have_key("first_name")
120
+ response_body_json[@root_node].first.should have_key("last_name")
121
+ end
122
+
123
+ it "should contain the specified values" do
124
+ response_body_json[@root_node].first["first_name"].should eql("Luke")
125
+ response_body_json[@root_node].first["last_name"].should eql("Skywalker")
126
+ end
127
+
128
+ end
97
129
 
98
130
  describe 'get a single user' do
99
131
 
@@ -278,4 +310,79 @@ shared_examples_for "a controller with ActsAsApi responses" do
278
310
  end
279
311
  end
280
312
 
313
+ describe 'config.add_root_node_for is empty, so no root node is created' do
314
+ before(:each) do
315
+ @org_add_root_node_for_config = ActsAsApi::Config.add_root_node_for.dup
316
+ ActsAsApi::Config.add_root_node_for = []
317
+ end
318
+
319
+ after(:each) do
320
+ ActsAsApi::Config.add_root_node_for = @org_add_root_node_for_config
321
+ end
322
+
323
+ describe 'get all users' do
324
+ before(:each) do
325
+ get :index, :format => 'json', :api_template => :name_only, :callback => @callback, :orm => @orm_for_testing
326
+ end
327
+
328
+ its "response has no named root node" do
329
+ response_body_json.should be_an(Array)
330
+ end
331
+ end
332
+
333
+ describe 'get a single user' do
334
+ before(:each) do
335
+ get :show, :format => 'json', :api_template => :name_only, :id => @luke.id, :orm => @orm_for_testing
336
+ end
337
+
338
+ its "response has no named root node" do
339
+ response_body_json.should be_a(Hash)
340
+ response_body_json.should have_key("first_name")
341
+ end
342
+ end
343
+ end
344
+
345
+ describe 'pass meta information on rendering' do
346
+
347
+ describe 'get all users' do
348
+ before(:each) do
349
+ get :index_meta, :format => 'json', :api_template => :name_only, :orm => @orm_for_testing
350
+ end
351
+
352
+ it "shows model response fields" do
353
+ response_body_json.should be_a(Hash)
354
+ response_body_json.should have_key("users")
355
+ response_body_json["users"].should be_an(Array)
356
+ end
357
+
358
+ it "shows page field" do
359
+ response_body_json.should have_key("page")
360
+ end
361
+
362
+ it "shows total field" do
363
+ response_body_json.should have_key("total")
364
+ end
365
+ end
366
+
367
+ describe 'get a single user' do
368
+ before(:each) do
369
+ get :show_meta, :format => 'json', :api_template => :name_only, :id => @luke.id, :orm => @orm_for_testing
370
+ end
371
+
372
+ it "shows model response fields" do
373
+ response_body_json.should be_a(Hash)
374
+ response_body_json.should have_key("user")
375
+ end
376
+
377
+ it "shows page field" do
378
+ response_body_json.should have_key("page")
379
+ end
380
+
381
+ it "shows total field" do
382
+ response_body_json.should have_key("total")
383
+ end
384
+
385
+ end
386
+ end
387
+
281
388
  end
@@ -1,5 +1,5 @@
1
1
  module SimpleFixtures
2
-
2
+
3
3
  def setup_active_record_models
4
4
  @orm_for_testing = :active_record
5
5
  @user_model = User
@@ -7,7 +7,7 @@ module SimpleFixtures
7
7
  @profile_model = Profile
8
8
  @untouched_model = Untouched
9
9
 
10
- @luke = @user_model.create({ :first_name => 'Luke', :last_name => 'Skywalker', :age => 25, :active => true })
10
+ @luke = @user_model.create({ :first_name => 'Luke', :last_name => 'Skywalker', :age => 25, :active => true })
11
11
  @han = @user_model.create({ :first_name => 'Han', :last_name => 'Solo', :age => 35, :active => true })
12
12
  @leia = @user_model.create({ :first_name => 'Princess', :last_name => 'Leia', :age => 25, :active => false })
13
13
 
@@ -15,22 +15,22 @@ module SimpleFixtures
15
15
 
16
16
  @destroy_deathstar = @luke.tasks.create({ :heading => "Destroy Deathstar", :description => "XWing, Shoot, BlowUp", :time_spent => 30, :done => true })
17
17
  @study_with_yoda = @luke.tasks.create({ :heading => "Study with Yoda", :description => "Jedi Stuff, ya know", :time_spent => 60, :done => true })
18
- @win_rebellion = @luke.tasks.create({ :heading => "Win Rebellion", :description => "no idea yet...", :time_spent => 180, :done => false })
18
+ @win_rebellion = @luke.tasks.create({ :heading => "Win Rebellion", :description => "no idea yet...", :time_spent => 180, :done => false })
19
19
  end
20
-
20
+
21
21
  def clean_up_active_record_models
22
22
  @user_model.delete_all
23
23
  @task_model.delete_all
24
24
  end
25
-
25
+
26
26
  def setup_mongoid_models
27
- @orm_for_testing = :mongoid
27
+ @orm_for_testing = :mongoid
28
28
  @user_model = MongoUser
29
29
  @task_model = MongoTask
30
30
  @profile_model = MongoProfile
31
31
  @untouched_model = MongoUntouched
32
-
33
- @luke = @user_model.new({ :first_name => 'Luke', :last_name => 'Skywalker', :age => 25, :active => true })
32
+
33
+ @luke = @user_model.new({ :first_name => 'Luke', :last_name => 'Skywalker', :age => 25, :active => true })
34
34
  @han = @user_model.new({ :first_name => 'Han', :last_name => 'Solo', :age => 35, :active => true })
35
35
  @leia = @user_model.new({ :first_name => 'Princess', :last_name => 'Leia', :age => 25, :active => false })
36
36
 
@@ -38,17 +38,17 @@ module SimpleFixtures
38
38
 
39
39
  @destroy_deathstar = @luke.tasks.new({ :heading => "Destroy Deathstar", :description => "XWing, Shoot, BlowUp", :time_spent => 30, :done => true })
40
40
  @study_with_yoda = @luke.tasks.new({ :heading => "Study with Yoda", :description => "Jedi Stuff, ya know", :time_spent => 60, :done => true })
41
- @win_rebellion = @luke.tasks.new({ :heading => "Win Rebellion", :description => "no idea yet...", :time_spent => 180, :done => false })
42
-
41
+ @win_rebellion = @luke.tasks.new({ :heading => "Win Rebellion", :description => "no idea yet...", :time_spent => 180, :done => false })
42
+
43
43
  @luke.save!
44
44
  @han.save!
45
- @leia.save!
45
+ @leia.save!
46
46
  end
47
-
47
+
48
48
  def clean_up_mongoid_models
49
49
  @user_model.delete_all
50
50
  end
51
-
51
+
52
52
  def setup_roflscale_models
53
53
  @orm_for_testing = :vanilla
54
54
  @user_model = VanillaUser
@@ -56,7 +56,7 @@ module SimpleFixtures
56
56
  @profile_model = VanillaProfile
57
57
  @untouched_model = VanillaUntouched
58
58
 
59
- @luke = @user_model.new({ :first_name => 'Luke', :last_name => 'Skywalker', :age => 25, :active => true })
59
+ @luke = @user_model.new({ :first_name => 'Luke', :last_name => 'Skywalker', :age => 25, :active => true })
60
60
  @han = @user_model.new({ :first_name => 'Han', :last_name => 'Solo', :age => 35, :active => true })
61
61
  @leia = @user_model.new({ :first_name => 'Princess', :last_name => 'Leia', :age => 25, :active => false })
62
62
 
@@ -65,14 +65,14 @@ module SimpleFixtures
65
65
  @destroy_deathstar = @task_model.new({ :user => @luke, :heading => "Destroy Deathstar", :description => "XWing, Shoot, BlowUp", :time_spent => 30, :done => true })
66
66
  @study_with_yoda = @task_model.new({ :user => @luke, :heading => "Study with Yoda", :description => "Jedi Stuff, ya know", :time_spent => 60, :done => true })
67
67
  @win_rebellion = @task_model.new({ :user => @luke, :heading => "Win Rebellion", :description => "no idea yet...", :time_spent => 180, :done => false })
68
-
68
+
69
69
  @luke.tasks << @destroy_deathstar << @study_with_yoda << @win_rebellion
70
70
  end
71
-
71
+
72
72
  def clean_up_roflscale_models
73
73
  # nothing to do ;)
74
- end
75
-
74
+ end
75
+
76
76
  end
77
77
 
78
78
 
metadata CHANGED
@@ -1,118 +1,84 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: acts_as_api
3
- version: !ruby/object:Gem::Version
4
- hash: 3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.9
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 8
10
- version: 0.3.8
11
6
  platform: ruby
12
- authors:
13
- - "Christian B\xC3\xA4uerlein"
7
+ authors:
8
+ - Christian Bäuerlein
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-06-21 00:00:00 +02:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-09-24 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: activemodel
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70355969859080 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 7
30
- segments:
31
- - 3
32
- - 0
33
- - 0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
34
21
  version: 3.0.0
35
22
  type: :runtime
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: activesupport
39
23
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70355969859080
25
+ - !ruby/object:Gem::Dependency
26
+ name: activesupport
27
+ requirement: &70355969858580 !ruby/object:Gem::Requirement
41
28
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 7
46
- segments:
47
- - 3
48
- - 0
49
- - 0
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
50
32
  version: 3.0.0
51
33
  type: :runtime
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- name: rack
55
34
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *70355969858580
36
+ - !ruby/object:Gem::Dependency
37
+ name: rack
38
+ requirement: &70355969858120 !ruby/object:Gem::Requirement
57
39
  none: false
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- hash: 19
62
- segments:
63
- - 1
64
- - 1
65
- - 0
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
66
43
  version: 1.1.0
67
44
  type: :runtime
68
- version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: rails
71
45
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *70355969858120
47
+ - !ruby/object:Gem::Dependency
48
+ name: rails
49
+ requirement: &70355969857640 !ruby/object:Gem::Requirement
73
50
  none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 7
78
- segments:
79
- - 3
80
- - 0
81
- - 0
82
- version: 3.0.0
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 3.1.0
83
55
  type: :development
84
- version_requirements: *id004
85
- - !ruby/object:Gem::Dependency
86
- name: mongoid
87
56
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
57
+ version_requirements: *70355969857640
58
+ - !ruby/object:Gem::Dependency
59
+ name: mongoid
60
+ requirement: &70355969857160 !ruby/object:Gem::Requirement
89
61
  none: false
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
93
- hash: 15
94
- segments:
95
- - 2
96
- - 0
97
- - 0
98
- version: 2.0.0
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: 2.0.1
99
66
  type: :development
100
- version_requirements: *id005
101
- description: acts_as_api enriches the models and controllers of your app in a rails-like way so you can easily determine how your XML/JSON API responses should look like.
102
- email:
67
+ prerelease: false
68
+ version_requirements: *70355969857160
69
+ description: acts_as_api enriches the models and controllers of your app in a rails-like
70
+ way so you can easily determine how your XML/JSON API responses should look like.
71
+ email:
103
72
  - christian@ffwdme.com
104
73
  executables: []
105
-
106
74
  extensions: []
107
-
108
- extra_rdoc_files:
109
- - README.rdoc
110
- files:
75
+ extra_rdoc_files: []
76
+ files:
111
77
  - .gitignore
112
78
  - .travis.yml
113
79
  - Gemfile
114
80
  - History.txt
115
- - README.rdoc
81
+ - README.md
116
82
  - Rakefile
117
83
  - acts_as_api.gemspec
118
84
  - examples/introduction/docco.css
@@ -210,43 +176,32 @@ files:
210
176
  - spec/support/model_examples/undefined.rb
211
177
  - spec/support/model_examples/untouched.rb
212
178
  - spec/support/simple_fixtures.rb
213
- has_rdoc: true
214
179
  homepage: https://github.com/fabrik42/acts_as_api
215
180
  licenses: []
216
-
217
181
  post_install_message:
218
- rdoc_options:
219
- - --main
220
- - README.rdoc
182
+ rdoc_options:
221
183
  - --charset=UTF-8
222
- require_paths:
184
+ require_paths:
223
185
  - lib
224
- required_ruby_version: !ruby/object:Gem::Requirement
186
+ required_ruby_version: !ruby/object:Gem::Requirement
225
187
  none: false
226
- requirements:
227
- - - ">="
228
- - !ruby/object:Gem::Version
229
- hash: 3
230
- segments:
231
- - 0
232
- version: "0"
233
- required_rubygems_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ! '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ required_rubygems_version: !ruby/object:Gem::Requirement
234
193
  none: false
235
- requirements:
236
- - - ">="
237
- - !ruby/object:Gem::Version
238
- hash: 3
239
- segments:
240
- - 0
241
- version: "0"
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
242
198
  requirements: []
243
-
244
199
  rubyforge_project:
245
- rubygems_version: 1.6.2
200
+ rubygems_version: 1.8.6
246
201
  signing_key:
247
202
  specification_version: 3
248
203
  summary: Makes creating XML/JSON responses in Rails 3 easy and fun.
249
- test_files:
204
+ test_files:
250
205
  - spec/controllers/respond_with_users_controller_spec.rb
251
206
  - spec/controllers/users_controller_spec.rb
252
207
  - spec/models/active_record_spec.rb