acts_as_api 0.3.0 → 0.3.1
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/.gitignore +2 -1
- data/acts_as_api.gemspec +2 -4
- data/lib/acts_as_api/api_template.rb +14 -1
- data/lib/acts_as_api/base.rb +14 -25
- data/lib/acts_as_api/config.rb +1 -1
- data/lib/acts_as_api/version.rb +1 -1
- data/spec/controllers/users_controller_spec.rb +1 -1
- data/spec/models/base_spec.rb +105 -10
- data/spec/rails_app/app/models/profile.rb +3 -0
- data/spec/rails_app/app/models/user.rb +12 -2
- data/spec/rails_app/db/migrate/20110214201640_create_tables.rb +9 -0
- data/spec/rails_app/db/schema.rb +13 -0
- metadata +7 -5
data/.gitignore
CHANGED
data/acts_as_api.gemspec
CHANGED
@@ -14,10 +14,8 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.add_dependency('activemodel','>= 3.0.0')
|
16
16
|
s.add_dependency('activesupport','>= 3.0.0')
|
17
|
-
s.add_dependency('rack','>= 1.1.0')
|
18
|
-
|
19
|
-
# s.add_dependency('json','>= 1.4.6')
|
20
|
-
|
17
|
+
s.add_dependency('rack','>= 1.1.0')
|
18
|
+
|
21
19
|
s.add_development_dependency('rails', ['>= 3.0.0'])
|
22
20
|
|
23
21
|
s.has_rdoc = true
|
@@ -2,8 +2,21 @@ module ActsAsApi
|
|
2
2
|
#
|
3
3
|
class ApiTemplate < Hash
|
4
4
|
|
5
|
+
def options_for(key)
|
6
|
+
@options[key]
|
7
|
+
end
|
8
|
+
|
9
|
+
def option_for(key, value)
|
10
|
+
@options[key][value] if @options[key]
|
11
|
+
end
|
12
|
+
|
5
13
|
def add(val, options = {})
|
6
|
-
|
14
|
+
item_key = (options[:as] || val).to_sym
|
15
|
+
|
16
|
+
self[item_key] = val
|
17
|
+
|
18
|
+
@options ||= {}
|
19
|
+
@options[item_key] = options
|
7
20
|
end
|
8
21
|
|
9
22
|
def remove(key)
|
data/lib/acts_as_api/base.rb
CHANGED
@@ -40,9 +40,6 @@ module ActsAsApi
|
|
40
40
|
|
41
41
|
def api_accessible(api_template, options = {}, &block)
|
42
42
|
|
43
|
-
# return api_accessible_deprecated([api_template]) if api_template.is_a? Hash
|
44
|
-
|
45
|
-
|
46
43
|
attributes = api_accessible_attributes(api_template) || ApiTemplate.new
|
47
44
|
|
48
45
|
attributes.merge!(api_accessible_attributes(options[:extend])) if options[:extend]
|
@@ -61,7 +58,6 @@ module ActsAsApi
|
|
61
58
|
|
62
59
|
end
|
63
60
|
|
64
|
-
|
65
61
|
module InstanceMethods
|
66
62
|
|
67
63
|
# Creates the api response of the model and returns it as a Hash.
|
@@ -81,29 +77,21 @@ module ActsAsApi
|
|
81
77
|
|
82
78
|
leaf[:item].each do |k,v|
|
83
79
|
|
80
|
+
if leaf[:item].respond_to?(:option_for)
|
81
|
+
sub_template = leaf[:item].option_for(k, :template) || api_template
|
82
|
+
else
|
83
|
+
sub_template = api_template
|
84
|
+
end
|
85
|
+
|
84
86
|
case v
|
85
87
|
when Symbol
|
86
88
|
|
87
89
|
if self.respond_to?(v)
|
88
90
|
out = send v
|
89
|
-
|
90
|
-
if out.respond_to?(:as_api_response)
|
91
|
-
out = out.send(:as_api_response, api_template)
|
92
|
-
end
|
93
|
-
|
94
|
-
leaf[:parent][k] = out
|
95
|
-
|
96
91
|
end
|
97
92
|
|
98
|
-
when Proc
|
99
|
-
|
93
|
+
when Proc
|
100
94
|
out = v.call(self)
|
101
|
-
|
102
|
-
if out.respond_to?(:as_api_response)
|
103
|
-
out = out.send(:as_api_response, api_template)
|
104
|
-
end
|
105
|
-
|
106
|
-
leaf[:parent][k] = out
|
107
95
|
|
108
96
|
when String
|
109
97
|
# go up the call chain
|
@@ -112,16 +100,17 @@ module ActsAsApi
|
|
112
100
|
out = out.send(method.to_sym)
|
113
101
|
end
|
114
102
|
|
115
|
-
if out.respond_to?(:as_api_response)
|
116
|
-
out = out.send(:as_api_response, api_template)
|
117
|
-
end
|
118
|
-
|
119
|
-
leaf[:parent][k] = out
|
120
|
-
|
121
103
|
when Hash
|
122
104
|
leaf[:parent][k] ||= {}
|
123
105
|
queue << { :parent => leaf[:parent][k], :item => v}
|
106
|
+
next
|
107
|
+
end
|
108
|
+
|
109
|
+
if out.respond_to?(:as_api_response)
|
110
|
+
out = out.send(:as_api_response, sub_template)
|
124
111
|
end
|
112
|
+
|
113
|
+
leaf[:parent][k] = out
|
125
114
|
|
126
115
|
end
|
127
116
|
|
data/lib/acts_as_api/config.rb
CHANGED
@@ -7,7 +7,7 @@ module ActsAsApi
|
|
7
7
|
# The accepted response formats
|
8
8
|
# Default is <tt>[:xml, :json]</tt>
|
9
9
|
attr_accessor_with_default :accepted_api_formats, [:xml, :json] # :nodoc:
|
10
|
-
|
10
|
+
|
11
11
|
# Holds formats that should be dasherized
|
12
12
|
# Default is <tt>[:xml]</tt>
|
13
13
|
attr_accessor_with_default :dasherize_for, [:xml]
|
data/lib/acts_as_api/version.rb
CHANGED
data/spec/models/base_spec.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
2
|
|
3
|
-
describe "acts_as_api" do
|
3
|
+
describe "acts_as_api", :orm => :active_record do
|
4
4
|
|
5
5
|
before(:each) do
|
6
|
-
@luke = User.create({ :first_name => 'Luke', :last_name => 'Skywalker', :age => 25, :active => true })
|
6
|
+
@luke = User.create({ :first_name => 'Luke', :last_name => 'Skywalker', :age => 25, :active => true })
|
7
7
|
@han = User.create({ :first_name => 'Han', :last_name => 'Solo', :age => 35, :active => true })
|
8
8
|
@leia = User.create({ :first_name => 'Princess', :last_name => 'Leia', :age => 25, :active => false })
|
9
9
|
|
10
|
+
@luke.profile = Profile.create({ :avatar => 'picard.jpg', :homepage => 'lukasarts.com' })
|
11
|
+
|
10
12
|
@destroy_deathstar = @luke.tasks.create({ :heading => "Destroy Deathstar", :description => "XWing, Shoot, BlowUp", :time_spent => 30, :done => true })
|
11
13
|
@study_with_yoda = @luke.tasks.create({ :heading => "Study with Yoda", :description => "Jedi Stuff, ya know", :time_spent => 60, :done => true })
|
12
14
|
@win_rebellion = @luke.tasks.create({ :heading => "Win Rebellion", :description => "no idea yet...", :time_spent => 180, :done => false })
|
@@ -273,14 +275,99 @@ describe "acts_as_api" do
|
|
273
275
|
end
|
274
276
|
|
275
277
|
describe "including an association (which does acts_as_api) in the api template" do
|
278
|
+
|
279
|
+
context "has_many" do
|
280
|
+
|
281
|
+
before(:each) do
|
282
|
+
Task.acts_as_api
|
283
|
+
Task.api_accessible :include_tasks do |t|
|
284
|
+
t.add :heading
|
285
|
+
t.add :done
|
286
|
+
end
|
287
|
+
@response = @luke.as_api_response(:include_tasks)
|
288
|
+
end
|
289
|
+
|
290
|
+
it "should return a hash" do
|
291
|
+
@response.should be_kind_of(Hash)
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should return the correct number of keys" do
|
295
|
+
@response.should have(1).key
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should return all specified fields" do
|
299
|
+
@response.keys.should include(:tasks)
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should return the correct values for the specified fields" do
|
303
|
+
@response[:tasks].should be_an Array
|
304
|
+
@response[:tasks].should have(3).tasks
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should contain the associated child models with the determined api template" do
|
308
|
+
@response[:tasks].each do |task|
|
309
|
+
task.keys.should include(:heading, :done)
|
310
|
+
task.keys.should have(2).attributes
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
it "should contain the correct data of the child models" do
|
315
|
+
task_hash = [ @destroy_deathstar, @study_with_yoda, @win_rebellion ].collect{|t| { :done => t.done, :heading => t.heading } }
|
316
|
+
@response[:tasks].should eql task_hash
|
317
|
+
end
|
318
|
+
|
319
|
+
end
|
320
|
+
|
321
|
+
context "has_one" do
|
322
|
+
|
323
|
+
before(:each) do
|
324
|
+
Profile.acts_as_api
|
325
|
+
Profile.api_accessible :include_profile do |t|
|
326
|
+
t.add :avatar
|
327
|
+
t.add :homepage
|
328
|
+
end
|
329
|
+
@response = @luke.as_api_response(:include_profile)
|
330
|
+
end
|
331
|
+
|
332
|
+
it "should return a hash" do
|
333
|
+
@response.should be_kind_of(Hash)
|
334
|
+
end
|
335
|
+
|
336
|
+
it "should return the correct number of keys" do
|
337
|
+
@response.should have(1).key
|
338
|
+
end
|
339
|
+
|
340
|
+
it "should return all specified fields" do
|
341
|
+
@response.keys.should include(:profile)
|
342
|
+
end
|
343
|
+
|
344
|
+
it "should return the correct values for the specified fields" do
|
345
|
+
@response[:profile].should be_a Hash
|
346
|
+
@response[:profile].should have(2).attributes
|
347
|
+
end
|
348
|
+
|
349
|
+
it "should contain the associated child models with the determined api template" do
|
350
|
+
@response[:profile].keys.should include(:avatar, :homepage)
|
351
|
+
end
|
352
|
+
|
353
|
+
it "should contain the correct data of the child models" do
|
354
|
+
profile_hash = { :avatar => @luke.profile.avatar, :homepage => @luke.profile.homepage }
|
355
|
+
@response[:profile].should eql profile_hash
|
356
|
+
end
|
357
|
+
|
358
|
+
end
|
359
|
+
|
360
|
+
end
|
361
|
+
|
362
|
+
describe "including an association (which does acts_as_api, but with using another template name) in the api template", :meow => true do
|
276
363
|
|
277
364
|
before(:each) do
|
278
365
|
Task.acts_as_api
|
279
|
-
Task.api_accessible :
|
280
|
-
t.add :
|
281
|
-
t.add :
|
366
|
+
Task.api_accessible :other_template do |t|
|
367
|
+
t.add :description
|
368
|
+
t.add :time_spent
|
282
369
|
end
|
283
|
-
@response = @luke.as_api_response(:
|
370
|
+
@response = @luke.as_api_response(:other_sub_template)
|
284
371
|
end
|
285
372
|
|
286
373
|
it "should return a hash" do
|
@@ -288,9 +375,17 @@ describe "acts_as_api" do
|
|
288
375
|
end
|
289
376
|
|
290
377
|
it "should return the correct number of keys" do
|
291
|
-
@response.should have(
|
378
|
+
@response.should have(2).keys
|
379
|
+
end
|
380
|
+
|
381
|
+
it "should return all specified fields" do
|
382
|
+
@response.keys.should include(:first_name)
|
292
383
|
end
|
293
384
|
|
385
|
+
it "should return the correct values for the specified fields" do
|
386
|
+
@response.values.should include(@luke.first_name)
|
387
|
+
end
|
388
|
+
|
294
389
|
it "should return all specified fields" do
|
295
390
|
@response.keys.should include(:tasks)
|
296
391
|
end
|
@@ -302,17 +397,17 @@ describe "acts_as_api" do
|
|
302
397
|
|
303
398
|
it "should contain the associated child models with the determined api template" do
|
304
399
|
@response[:tasks].each do |task|
|
305
|
-
task.keys.should include(:
|
400
|
+
task.keys.should include(:description, :time_spent)
|
306
401
|
task.keys.should have(2).attributes
|
307
402
|
end
|
308
403
|
end
|
309
404
|
|
310
405
|
it "should contain the correct data of the child models" do
|
311
|
-
task_hash = [ @destroy_deathstar, @study_with_yoda, @win_rebellion ].collect{|t| { :
|
406
|
+
task_hash = [ @destroy_deathstar, @study_with_yoda, @win_rebellion ].collect{|t| { :description => t.description, :time_spent => t.time_spent } }
|
312
407
|
@response[:tasks].should eql task_hash
|
313
408
|
end
|
314
409
|
|
315
|
-
end
|
410
|
+
end
|
316
411
|
|
317
412
|
describe "including a scoped association in the api template" do
|
318
413
|
|
@@ -2,6 +2,8 @@ class User < ActiveRecord::Base
|
|
2
2
|
|
3
3
|
has_many :tasks
|
4
4
|
|
5
|
+
has_one :profile
|
6
|
+
|
5
7
|
acts_as_api
|
6
8
|
|
7
9
|
api_accessible :name_only do |t|
|
@@ -40,11 +42,19 @@ class User < ActiveRecord::Base
|
|
40
42
|
t.add lambda{|model| model.full_name.upcase }, :as => :all_caps_name
|
41
43
|
t.add lambda{ Time.now.class.to_s }, :as => :without_param
|
42
44
|
end
|
43
|
-
|
44
45
|
User.api_accessible :include_tasks do |t|
|
45
46
|
t.add :tasks
|
46
47
|
end
|
47
|
-
|
48
|
+
|
49
|
+
api_accessible :include_profile do |t|
|
50
|
+
t.add :profile
|
51
|
+
end
|
52
|
+
|
53
|
+
api_accessible :other_sub_template do |t|
|
54
|
+
t.add :first_name
|
55
|
+
t.add :tasks, :template => :other_template
|
56
|
+
end
|
57
|
+
|
48
58
|
api_accessible :include_completed_tasks do |t|
|
49
59
|
t.add "tasks.completed.all", :as => :completed_tasks
|
50
60
|
end
|
@@ -20,6 +20,14 @@ class CreateTables < ActiveRecord::Migration
|
|
20
20
|
t.datetime "updated_at"
|
21
21
|
end
|
22
22
|
|
23
|
+
create_table "profiles", :force => true do |t|
|
24
|
+
t.integer "user_id"
|
25
|
+
t.string "avatar"
|
26
|
+
t.string "homepage"
|
27
|
+
t.datetime "created_at"
|
28
|
+
t.datetime "updated_at"
|
29
|
+
end
|
30
|
+
|
23
31
|
create_table :untoucheds do |t|
|
24
32
|
t.string "nothing"
|
25
33
|
t.timestamps
|
@@ -29,6 +37,7 @@ class CreateTables < ActiveRecord::Migration
|
|
29
37
|
|
30
38
|
def self.down
|
31
39
|
drop_table :untoucheds
|
40
|
+
drop_table :profiles
|
32
41
|
drop_table :tasks
|
33
42
|
drop_table :users
|
34
43
|
end
|
data/spec/rails_app/db/schema.rb
CHANGED
@@ -21,6 +21,14 @@ ActiveRecord::Schema.define(:version => 20110214201640) do
|
|
21
21
|
t.datetime "created_at"
|
22
22
|
t.datetime "updated_at"
|
23
23
|
end
|
24
|
+
|
25
|
+
create_table "profiles", :force => true do |t|
|
26
|
+
t.integer "user_id"
|
27
|
+
t.string "avatar"
|
28
|
+
t.string "homepage"
|
29
|
+
t.datetime "created_at"
|
30
|
+
t.datetime "updated_at"
|
31
|
+
end
|
24
32
|
|
25
33
|
create_table "users", :force => true do |t|
|
26
34
|
t.string "first_name"
|
@@ -30,5 +38,10 @@ ActiveRecord::Schema.define(:version => 20110214201640) do
|
|
30
38
|
t.datetime "created_at"
|
31
39
|
t.datetime "updated_at"
|
32
40
|
end
|
41
|
+
|
42
|
+
create_table "untoucheds", :force => true do |t|
|
43
|
+
t.string "nothing"
|
44
|
+
t.timestamps
|
45
|
+
end
|
33
46
|
|
34
47
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 1
|
10
|
+
version: 0.3.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "Christian B\xC3\xA4uerlein"
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-08 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- spec/rails_app/app/controllers/respond_with_users_controller.rb
|
120
120
|
- spec/rails_app/app/controllers/users_controller.rb
|
121
121
|
- spec/rails_app/app/helpers/application_helper.rb
|
122
|
+
- spec/rails_app/app/models/profile.rb
|
122
123
|
- spec/rails_app/app/models/task.rb
|
123
124
|
- spec/rails_app/app/models/untouched.rb
|
124
125
|
- spec/rails_app/app/models/user.rb
|
@@ -192,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
193
|
requirements: []
|
193
194
|
|
194
195
|
rubyforge_project:
|
195
|
-
rubygems_version: 1.
|
196
|
+
rubygems_version: 1.6.2
|
196
197
|
signing_key:
|
197
198
|
specification_version: 3
|
198
199
|
summary: Makes creating XML/JSON responses in Rails 3 easy and fun.
|
@@ -206,6 +207,7 @@ test_files:
|
|
206
207
|
- spec/rails_app/app/controllers/respond_with_users_controller.rb
|
207
208
|
- spec/rails_app/app/controllers/users_controller.rb
|
208
209
|
- spec/rails_app/app/helpers/application_helper.rb
|
210
|
+
- spec/rails_app/app/models/profile.rb
|
209
211
|
- spec/rails_app/app/models/task.rb
|
210
212
|
- spec/rails_app/app/models/untouched.rb
|
211
213
|
- spec/rails_app/app/models/user.rb
|