acts_as_api 0.3.11 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -4
- data/.travis.yml +5 -1
- data/Gemfile +2 -1
- data/History.txt +4 -0
- data/README.md +9 -4
- data/Rakefile +28 -5
- data/acts_as_api.gemspec +1 -1
- data/lib/acts_as_api/api_template.rb +54 -63
- data/lib/acts_as_api/array.rb +2 -2
- data/lib/acts_as_api/base.rb +19 -13
- data/lib/acts_as_api/config.rb +2 -2
- data/lib/acts_as_api/rendering.rb +4 -4
- data/lib/acts_as_api/version.rb +1 -1
- data/spec/README.md +55 -0
- data/spec/active_record_dummy/.gitignore +15 -0
- data/spec/active_record_dummy/Gemfile +16 -0
- data/spec/active_record_dummy/README.rdoc +261 -0
- data/spec/active_record_dummy/Rakefile +7 -0
- data/spec/{rails_app/public → active_record_dummy/app/assets}/images/rails.png +0 -0
- data/spec/active_record_dummy/app/assets/javascripts/application.js +15 -0
- data/spec/active_record_dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/active_record_dummy/app/controllers/application_controller.rb +3 -0
- data/spec/{rails_app → active_record_dummy}/app/helpers/application_helper.rb +0 -0
- data/spec/{rails_app/lib/tasks → active_record_dummy/app/mailers}/.gitkeep +0 -0
- data/spec/{rails_app/public/stylesheets → active_record_dummy/app/models}/.gitkeep +0 -0
- data/spec/{rails_app → active_record_dummy}/app/models/profile.rb +1 -0
- data/spec/active_record_dummy/app/models/task.rb +4 -0
- data/spec/{rails_app → active_record_dummy}/app/models/untouched.rb +0 -0
- data/spec/{rails_app → active_record_dummy}/app/models/user.rb +1 -0
- data/spec/active_record_dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/active_record_dummy/config.ru +4 -0
- data/spec/active_record_dummy/config/application.rb +59 -0
- data/spec/{rails_app → active_record_dummy}/config/boot.rb +0 -0
- data/spec/{rails_app → active_record_dummy}/config/database.yml +5 -3
- data/spec/active_record_dummy/config/environment.rb +5 -0
- data/spec/active_record_dummy/config/environments/development.rb +37 -0
- data/spec/active_record_dummy/config/environments/production.rb +67 -0
- data/spec/active_record_dummy/config/environments/test.rb +37 -0
- data/spec/{rails_app → active_record_dummy}/config/initializers/backtrace_silencers.rb +0 -0
- data/spec/active_record_dummy/config/initializers/generators.rb +2 -0
- data/spec/{rails_app → active_record_dummy}/config/initializers/inflections.rb +5 -0
- data/spec/{rails_app → active_record_dummy}/config/initializers/mime_types.rb +0 -0
- data/spec/active_record_dummy/config/initializers/secret_token.rb +7 -0
- data/spec/active_record_dummy/config/initializers/session_store.rb +8 -0
- data/spec/active_record_dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/{rails_app → active_record_dummy}/config/locales/en.yml +1 -1
- data/spec/active_record_dummy/config/routes.rb +59 -0
- data/spec/{rails_app → active_record_dummy}/db/migrate/20110214201640_create_tables.rb +0 -0
- data/spec/{rails_app → active_record_dummy}/db/schema.rb +0 -0
- data/spec/{rails_app → active_record_dummy}/db/seeds.rb +0 -0
- data/spec/active_record_dummy/doc/README_FOR_APP +2 -0
- data/spec/{rails_app/public/favicon.ico → active_record_dummy/lib/assets/.gitkeep} +0 -0
- data/spec/active_record_dummy/lib/tasks/.gitkeep +0 -0
- data/spec/active_record_dummy/log/.gitkeep +0 -0
- data/spec/{rails_app → active_record_dummy}/public/404.html +0 -0
- data/spec/{rails_app → active_record_dummy}/public/422.html +0 -0
- data/spec/{rails_app → active_record_dummy}/public/500.html +0 -1
- data/spec/active_record_dummy/public/favicon.ico +0 -0
- data/spec/{rails_app → active_record_dummy}/public/index.html +10 -8
- data/spec/{rails_app → active_record_dummy}/public/robots.txt +0 -0
- data/spec/{rails_app → active_record_dummy}/script/rails +0 -0
- data/spec/active_record_dummy/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/active_record_dummy/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/active_record_dummy/vendor/plugins/.gitkeep +0 -0
- data/spec/controllers/respond_with_users_controller_spec.rb +18 -33
- data/spec/controllers/users_controller_spec.rb +8 -25
- data/spec/models/{active_record_spec.rb → model_spec.rb} +5 -3
- data/spec/mongoid_dummy/.gitignore +15 -0
- data/spec/mongoid_dummy/Gemfile +18 -0
- data/spec/mongoid_dummy/README.rdoc +261 -0
- data/spec/mongoid_dummy/Rakefile +7 -0
- data/spec/mongoid_dummy/app/assets/images/rails.png +0 -0
- data/spec/mongoid_dummy/app/assets/javascripts/application.js +15 -0
- data/spec/mongoid_dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/mongoid_dummy/app/controllers/application_controller.rb +3 -0
- data/spec/mongoid_dummy/app/helpers/application_helper.rb +2 -0
- data/spec/mongoid_dummy/app/mailers/.gitkeep +0 -0
- data/spec/mongoid_dummy/app/models/.gitkeep +0 -0
- data/spec/{rails_app/app/models/mongo_profile.rb → mongoid_dummy/app/models/profile.rb} +2 -2
- data/spec/{rails_app/app/models/mongo_task.rb → mongoid_dummy/app/models/task.rb} +2 -2
- data/spec/{rails_app/app/models/mongo_untouched.rb → mongoid_dummy/app/models/untouched.rb} +1 -1
- data/spec/mongoid_dummy/app/models/user.rb +48 -0
- data/spec/mongoid_dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/mongoid_dummy/config.ru +4 -0
- data/spec/mongoid_dummy/config/application.rb +65 -0
- data/spec/mongoid_dummy/config/boot.rb +6 -0
- data/spec/mongoid_dummy/config/environment.rb +5 -0
- data/spec/{rails_app → mongoid_dummy}/config/environments/development.rb +10 -4
- data/spec/{rails_app → mongoid_dummy}/config/environments/production.rb +29 -14
- data/spec/{rails_app → mongoid_dummy}/config/environments/test.rb +8 -8
- data/spec/mongoid_dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/mongoid_dummy/config/initializers/generators.rb +2 -0
- data/spec/mongoid_dummy/config/initializers/include_acts_as_api.rb +3 -0
- data/spec/mongoid_dummy/config/initializers/inflections.rb +15 -0
- data/spec/mongoid_dummy/config/initializers/mime_types.rb +5 -0
- data/spec/mongoid_dummy/config/initializers/secret_token.rb +7 -0
- data/spec/mongoid_dummy/config/initializers/session_store.rb +8 -0
- data/spec/mongoid_dummy/config/initializers/wrap_parameters.rb +10 -0
- data/spec/mongoid_dummy/config/locales/en.yml +5 -0
- data/spec/{rails_app → mongoid_dummy}/config/mongoid.yml +8 -3
- data/spec/mongoid_dummy/config/routes.rb +59 -0
- data/spec/mongoid_dummy/db/seeds.rb +7 -0
- data/spec/mongoid_dummy/doc/README_FOR_APP +2 -0
- data/spec/mongoid_dummy/lib/assets/.gitkeep +0 -0
- data/spec/mongoid_dummy/lib/tasks/.gitkeep +0 -0
- data/spec/mongoid_dummy/log/.gitkeep +0 -0
- data/spec/mongoid_dummy/public/404.html +26 -0
- data/spec/mongoid_dummy/public/422.html +26 -0
- data/spec/mongoid_dummy/public/500.html +25 -0
- data/spec/mongoid_dummy/public/favicon.ico +0 -0
- data/spec/mongoid_dummy/public/index.html +241 -0
- data/spec/mongoid_dummy/public/robots.txt +5 -0
- data/spec/mongoid_dummy/script/rails +6 -0
- data/spec/mongoid_dummy/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/mongoid_dummy/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/mongoid_dummy/vendor/plugins/.gitkeep +0 -0
- data/spec/shared_engine/.gitignore +7 -0
- data/spec/shared_engine/Gemfile +14 -0
- data/spec/shared_engine/MIT-LICENSE +20 -0
- data/spec/shared_engine/README.rdoc +3 -0
- data/spec/shared_engine/Rakefile +29 -0
- data/spec/shared_engine/app/assets/images/shared_engine/.gitkeep +0 -0
- data/spec/shared_engine/app/assets/javascripts/shared_engine/application.js +15 -0
- data/spec/shared_engine/app/assets/stylesheets/shared_engine/application.css +13 -0
- data/spec/shared_engine/app/controllers/shared_engine/application_controller.rb +4 -0
- data/spec/shared_engine/app/controllers/shared_engine/respond_with_users_controller.rb +59 -0
- data/spec/shared_engine/app/controllers/shared_engine/users_controller.rb +71 -0
- data/spec/shared_engine/app/helpers/shared_engine/application_helper.rb +4 -0
- data/spec/shared_engine/app/models/user_template.rb +154 -0
- data/spec/shared_engine/app/views/layouts/shared_engine/application.html.erb +14 -0
- data/spec/{rails_app → shared_engine}/config/routes.rb +2 -4
- data/spec/shared_engine/dummy/README.rdoc +261 -0
- data/spec/{rails_app → shared_engine/dummy}/Rakefile +2 -2
- data/spec/shared_engine/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/shared_engine/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/shared_engine/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/shared_engine/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/shared_engine/dummy/app/mailers/.gitkeep +0 -0
- data/spec/shared_engine/dummy/app/models/.gitkeep +0 -0
- data/spec/shared_engine/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/{rails_app → shared_engine/dummy}/config.ru +1 -1
- data/spec/{rails_app → shared_engine/dummy}/config/application.rb +30 -10
- data/spec/shared_engine/dummy/config/boot.rb +10 -0
- data/spec/shared_engine/dummy/config/database.yml +25 -0
- data/spec/{rails_app → shared_engine/dummy}/config/environment.rb +1 -1
- data/spec/shared_engine/dummy/config/environments/development.rb +37 -0
- data/spec/shared_engine/dummy/config/environments/production.rb +67 -0
- data/spec/shared_engine/dummy/config/environments/test.rb +37 -0
- data/spec/shared_engine/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/shared_engine/dummy/config/initializers/inflections.rb +15 -0
- data/spec/shared_engine/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/{rails_app → shared_engine/dummy}/config/initializers/secret_token.rb +1 -1
- data/spec/{rails_app → shared_engine/dummy}/config/initializers/session_store.rb +2 -2
- data/spec/shared_engine/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/shared_engine/dummy/config/locales/en.yml +5 -0
- data/spec/shared_engine/dummy/config/routes.rb +4 -0
- data/spec/shared_engine/dummy/lib/assets/.gitkeep +0 -0
- data/spec/shared_engine/dummy/log/.gitkeep +0 -0
- data/spec/shared_engine/dummy/public/404.html +26 -0
- data/spec/shared_engine/dummy/public/422.html +26 -0
- data/spec/shared_engine/dummy/public/500.html +25 -0
- data/spec/shared_engine/dummy/public/favicon.ico +0 -0
- data/spec/shared_engine/dummy/script/rails +6 -0
- data/spec/shared_engine/lib/shared_engine.rb +4 -0
- data/spec/shared_engine/lib/shared_engine/engine.rb +5 -0
- data/spec/shared_engine/lib/shared_engine/version.rb +3 -0
- data/spec/shared_engine/lib/tasks/shared_engine_tasks.rake +4 -0
- data/spec/shared_engine/script/rails +8 -0
- data/spec/shared_engine/shared_engine.gemspec +22 -0
- data/spec/spec_helper.rb +16 -11
- data/spec/support/controller_examples.rb +35 -41
- data/spec/support/model_examples/associations.rb +13 -13
- data/spec/support/model_examples/enabled.rb +2 -2
- data/spec/support/model_examples/extending.rb +6 -6
- data/spec/support/model_examples/options.rb +53 -0
- data/spec/support/model_examples/untouched.rb +2 -2
- data/spec/support/simple_fixtures.rb +31 -59
- metadata +324 -132
- data/spec/models/mongoid_spec.rb +0 -29
- data/spec/models/vanilla_ruby_spec.rb +0 -31
- data/spec/rails_app/.gitignore +0 -4
- data/spec/rails_app/app/controllers/application_controller.rb +0 -11
- data/spec/rails_app/app/controllers/respond_with_users_controller.rb +0 -57
- data/spec/rails_app/app/controllers/users_controller.rb +0 -69
- data/spec/rails_app/app/models/mongo_user.rb +0 -192
- data/spec/rails_app/app/models/task.rb +0 -3
- data/spec/rails_app/app/models/vanilla_profile.rb +0 -16
- data/spec/rails_app/app/models/vanilla_task.rb +0 -16
- data/spec/rails_app/app/models/vanilla_untouched.rb +0 -2
- data/spec/rails_app/app/models/vanilla_user.rb +0 -195
- data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
- data/spec/rails_app/config/initializers/acts_as_api_mongoid.rb +0 -6
- data/spec/rails_app/public/javascripts/application.js +0 -2
- data/spec/rails_app/public/javascripts/controls.js +0 -965
- data/spec/rails_app/public/javascripts/dragdrop.js +0 -974
- data/spec/rails_app/public/javascripts/effects.js +0 -1123
- data/spec/rails_app/public/javascripts/prototype.js +0 -6001
- data/spec/rails_app/public/javascripts/rails.js +0 -191
data/.gitignore
CHANGED
@@ -4,8 +4,11 @@ pkg/*
|
|
4
4
|
Gemfile.lock
|
5
5
|
test
|
6
6
|
acts_as_api.tmproj
|
7
|
-
spec/
|
8
|
-
spec/
|
9
|
-
spec/
|
7
|
+
spec/active_record_dummy/db/*.sqlite3
|
8
|
+
spec/active_record_dummy/tmp/**/*
|
9
|
+
spec/active_record_dummy/log/*.log
|
10
|
+
spec/mongoid_dummy/tmp/**/*
|
11
|
+
spec/mongoid_dummy/log/*.log
|
10
12
|
.rspec
|
11
|
-
.rvmrc
|
13
|
+
.rvmrc
|
14
|
+
*.sqlite3-journal
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -6,7 +6,8 @@ gemspec
|
|
6
6
|
group :test do
|
7
7
|
gem 'sqlite3-ruby'
|
8
8
|
gem 'mongoid', '>= 2.0.1'
|
9
|
+
gem 'rspec', '>= 2.9.0'
|
9
10
|
gem 'rspec-rails', '>= 2.5.0'
|
10
11
|
gem 'webrat'
|
11
|
-
gem '
|
12
|
+
gem 'shared_engine', :path => './spec/shared_engine'
|
12
13
|
end
|
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -6,6 +6,8 @@ It provides a simple interface to determine the representation of your model dat
|
|
6
6
|
|
7
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
|
+
The lib is _very_ fast in generating your responses and battle tested in production with platforms like [Diaspora](https://joindiaspora.com) or [flinc](https://flinc.org).
|
10
|
+
|
9
11
|
## Introduction
|
10
12
|
|
11
13
|
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:
|
@@ -54,7 +56,7 @@ There are a lot of how-tos like:
|
|
54
56
|
* DRY templates for your api responses
|
55
57
|
* Ships with support for __ActiveRecord__ and __Mongoid__
|
56
58
|
* Support for Rails 3 Responders
|
57
|
-
* Plays very well together with client libs like [Backbone.js](http://documentcloud.github.com/backbone)
|
59
|
+
* Plays very well together with client libs like [Backbone.js](http://documentcloud.github.com/backbone), [RestKit](http://restkit.org) (iOS) or [gson](http://code.google.com/p/google-gson) (Android).
|
58
60
|
* Easy but very flexible syntax for defining the templates
|
59
61
|
* XML, JSON and JSON-P support out of the box, easy to extend
|
60
62
|
* Minimal dependecies (you can also use it without Rails)
|
@@ -76,14 +78,17 @@ There are a lot of how-tos like:
|
|
76
78
|
|
77
79
|
* Wiki: https://github.com/fabrik42/acts_as_api/wiki
|
78
80
|
|
81
|
+
* Want to contribute - the spec suite is explained here: https://github.com/fabrik42/acts_as_api/tree/master/spec
|
82
|
+
|
79
83
|
### Travis CI build status ![acts_as_api on travis ci](http://travis-ci.org/fabrik42/acts_as_api.png)
|
80
84
|
|
81
|
-
Specs run with 1.9.2, 1.8.7 and REE: http://travis-ci.org/#!/fabrik42/acts_as_api
|
85
|
+
Specs run with 1.9.3, 1.9.2, 1.8.7 and REE: http://travis-ci.org/#!/fabrik42/acts_as_api
|
82
86
|
|
83
87
|
### Tested with:
|
84
88
|
|
85
|
-
* MRI 1.9.
|
86
|
-
* MRI 1.
|
89
|
+
* MRI 1.9.3-p125
|
90
|
+
* MRI 1.9.2-p290
|
91
|
+
* MRI 1.8.7-p358
|
87
92
|
* But it just should work fine with other versions too... :)
|
88
93
|
|
89
94
|
### Downwards Compatibility
|
data/Rakefile
CHANGED
@@ -8,17 +8,40 @@ RSpec::Core::RakeTask.new
|
|
8
8
|
|
9
9
|
namespace :spec do
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
supported_orms = %w(mongoid active_record)
|
12
|
+
|
13
|
+
supported_orms.each do |orm|
|
14
|
+
desc "Run #{orm} specs only"
|
15
|
+
RSpec::Core::RakeTask.new do |t|
|
16
|
+
t.name = orm
|
17
|
+
t.rspec_opts = ["--color"]
|
18
|
+
end
|
19
|
+
|
20
|
+
task "prepare_#{orm}" do
|
21
|
+
ENV['ACTS_AS_API_ORM'] = orm
|
22
|
+
end
|
23
|
+
|
24
|
+
Rake::Task["spec:#{orm}"].prerequisites << "spec:prepare_#{orm}"
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
# task :all => supported_orms.map{|orm| "spec:#{orm}"}
|
29
|
+
|
30
|
+
desc "Runs specs for all ORMs (#{supported_orms.join(', ')})"
|
31
|
+
task :all do
|
32
|
+
supported_orms.each do |orm|
|
33
|
+
puts "Starting to run specs for #{orm}..."
|
34
|
+
system("bundle exec rake spec:#{orm}")
|
35
|
+
raise "#{orm} failed!" unless $?.exitstatus == 0
|
36
|
+
end
|
15
37
|
end
|
16
38
|
|
17
39
|
end
|
18
40
|
|
41
|
+
|
19
42
|
gemspec = Gem::Specification.load("acts_as_api.gemspec")
|
20
43
|
|
21
|
-
task :default => :
|
44
|
+
task :default => "spec:all"
|
22
45
|
|
23
46
|
desc "Generate the gh_pages site"
|
24
47
|
task :rocco do
|
data/acts_as_api.gemspec
CHANGED
@@ -16,7 +16,7 @@ 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.
|
19
|
+
s.add_development_dependency('rails', ['>= 3.2.3'])
|
20
20
|
s.add_development_dependency('mongoid', ['>= 2.0.1'])
|
21
21
|
|
22
22
|
s.rdoc_options = ['--charset=UTF-8']
|
@@ -11,18 +11,11 @@ module ActsAsApi
|
|
11
11
|
|
12
12
|
# The name of the api template as a Symbol.
|
13
13
|
attr_accessor :api_template
|
14
|
-
|
15
|
-
attr_reader :options
|
16
14
|
|
17
|
-
|
18
|
-
# set to the passed template.
|
19
|
-
def self.create(template)
|
20
|
-
t = ApiTemplate.new
|
21
|
-
t.api_template = template
|
22
|
-
return t
|
23
|
-
end
|
15
|
+
attr_reader :options
|
24
16
|
|
25
|
-
def initialize
|
17
|
+
def initialize(api_template)
|
18
|
+
self.api_template = api_template
|
26
19
|
@options ||= {}
|
27
20
|
end
|
28
21
|
|
@@ -67,82 +60,80 @@ module ActsAsApi
|
|
67
60
|
# If a special template name for the passed item is specified
|
68
61
|
# it will be returned, if not the original api template.
|
69
62
|
def api_template_for(fieldset, field)
|
70
|
-
return api_template unless fieldset.is_a? ActsAsApi::ApiTemplate
|
71
63
|
fieldset.option_for(field, :template) || api_template
|
72
64
|
end
|
73
65
|
|
74
66
|
# Decides if the passed item should be added to
|
75
67
|
# the response based on the conditional options passed.
|
76
|
-
def allowed_to_render?(fieldset, field, model)
|
68
|
+
def allowed_to_render?(fieldset, field, model, options)
|
77
69
|
return true unless fieldset.is_a? ActsAsApi::ApiTemplate
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
70
|
+
|
71
|
+
fieldset_options = fieldset.options_for(field)
|
72
|
+
|
73
|
+
if fieldset_options[:unless]
|
74
|
+
!(condition_fulfilled?(model, fieldset_options[:unless], options))
|
75
|
+
elsif fieldset_options[:if]
|
76
|
+
condition_fulfilled?(model, fieldset_options[:if], options)
|
77
|
+
else
|
78
|
+
true
|
79
|
+
end
|
82
80
|
end
|
83
81
|
|
84
82
|
# Checks if a condition is fulfilled
|
85
83
|
# (result is not nil or false)
|
86
|
-
def condition_fulfilled?(model, condition)
|
84
|
+
def condition_fulfilled?(model, condition, options)
|
87
85
|
case condition
|
88
86
|
when Symbol
|
89
87
|
result = model.send(condition)
|
90
88
|
when Proc
|
91
|
-
result = condition
|
89
|
+
result = call_proc(condition, model, options)
|
92
90
|
end
|
93
|
-
|
91
|
+
!!result
|
94
92
|
end
|
95
93
|
|
96
94
|
# Generates a hash that represents the api response based on this
|
97
95
|
# template for the passed model instance.
|
98
|
-
def to_response_hash(model)
|
99
|
-
queue = []
|
96
|
+
def to_response_hash(model, fieldset = self, options = {})
|
100
97
|
api_output = {}
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
next unless allowed_to_render?(fieldset, field, model)
|
111
|
-
|
112
|
-
case value
|
113
|
-
when Symbol
|
114
|
-
if model.respond_to?(value)
|
115
|
-
out = model.send value
|
116
|
-
end
|
117
|
-
|
118
|
-
when Proc
|
119
|
-
out = value.call(model)
|
120
|
-
|
121
|
-
when String
|
122
|
-
# go up the call chain
|
123
|
-
out = model
|
124
|
-
value.split(".").each do |method|
|
125
|
-
out = out.send(method.to_sym)
|
126
|
-
end
|
127
|
-
|
128
|
-
when Hash
|
129
|
-
leaf[:output][field] ||= {}
|
130
|
-
queue << { :output => leaf[:output][field], :item => value }
|
131
|
-
next
|
132
|
-
end
|
133
|
-
|
134
|
-
if out.respond_to?(:as_api_response)
|
135
|
-
sub_template = api_template_for(fieldset, field)
|
136
|
-
out = out.send(:as_api_response, sub_template)
|
137
|
-
end
|
138
|
-
|
139
|
-
leaf[:output][field] = out
|
98
|
+
|
99
|
+
fieldset.each do |field, value|
|
100
|
+
next unless allowed_to_render?(fieldset, field, model, options)
|
101
|
+
|
102
|
+
out = process_value(model, value, options)
|
103
|
+
|
104
|
+
if out.respond_to?(:as_api_response)
|
105
|
+
sub_template = api_template_for(fieldset, field)
|
106
|
+
out = out.as_api_response(sub_template, options)
|
140
107
|
end
|
141
|
-
|
108
|
+
|
109
|
+
api_output[field] = out
|
142
110
|
end
|
143
|
-
|
111
|
+
|
144
112
|
api_output
|
145
113
|
end
|
146
|
-
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def process_value(model, value, options)
|
118
|
+
case value
|
119
|
+
when Symbol
|
120
|
+
model.send(value)
|
121
|
+
when Proc
|
122
|
+
call_proc(value,model,options)
|
123
|
+
when String
|
124
|
+
value.split('.').inject(model) { |result, method| result.send(method) }
|
125
|
+
when Hash
|
126
|
+
to_response_hash(model, value)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def call_proc(the_proc,model,options)
|
131
|
+
if the_proc.arity == 2
|
132
|
+
the_proc.call(model, options)
|
133
|
+
else
|
134
|
+
the_proc.call(model)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
147
138
|
end
|
148
139
|
end
|
data/lib/acts_as_api/array.rb
CHANGED
@@ -6,11 +6,11 @@ class Array
|
|
6
6
|
# The Array checks all its items if they respond to the +as_api_response+ method.
|
7
7
|
# If they do, the result of this method will be collected.
|
8
8
|
# If they don't, the item itself will be collected.
|
9
|
-
def as_api_response(api_template)
|
9
|
+
def as_api_response(api_template, options = {})
|
10
10
|
|
11
11
|
collect do |item|
|
12
12
|
if item.respond_to?(:as_api_response)
|
13
|
-
item.as_api_response(api_template)
|
13
|
+
item.as_api_response(api_template,options)
|
14
14
|
else
|
15
15
|
item
|
16
16
|
end
|
data/lib/acts_as_api/base.rb
CHANGED
@@ -34,7 +34,7 @@ module ActsAsApi
|
|
34
34
|
# be contained in the api responses.
|
35
35
|
def api_accessible(api_template, options = {}, &block)
|
36
36
|
|
37
|
-
attributes = api_accessible_attributes(api_template) || ApiTemplate.
|
37
|
+
attributes = api_accessible_attributes(api_template) || ApiTemplate.new(api_template)
|
38
38
|
|
39
39
|
attributes.merge!(api_accessible_attributes(options[:extend])) if options[:extend]
|
40
40
|
|
@@ -56,25 +56,31 @@ module ActsAsApi
|
|
56
56
|
|
57
57
|
# Creates the api response of the model and returns it as a Hash.
|
58
58
|
# Will raise an exception if the passed api template is not defined for the model
|
59
|
-
def as_api_response(api_template)
|
59
|
+
def as_api_response(api_template, options = {})
|
60
60
|
api_attributes = self.class.api_accessible_attributes(api_template)
|
61
61
|
raise ActsAsApi::TemplateNotFoundError.new("acts_as_api template :#{api_template.to_s} was not found for model #{self.class}") if api_attributes.nil?
|
62
|
-
|
63
|
-
before_api_response(api_template) if respond_to? :before_api_response
|
64
|
-
|
65
|
-
response_hash = if respond_to? :around_api_response
|
66
|
-
around_api_response api_template do
|
67
|
-
api_attributes.to_response_hash(self)
|
68
|
-
end
|
69
|
-
else
|
70
|
-
api_attributes.to_response_hash(self)
|
71
|
-
end
|
72
62
|
|
73
|
-
|
63
|
+
before_api_response(api_template)
|
64
|
+
response_hash = around_api_response(api_template) do
|
65
|
+
api_attributes.to_response_hash(self, api_attributes, options)
|
66
|
+
end
|
67
|
+
after_api_response(api_template)
|
74
68
|
|
75
69
|
response_hash
|
76
70
|
end
|
77
71
|
|
72
|
+
protected
|
73
|
+
|
74
|
+
def before_api_response(api_remplate)
|
75
|
+
end
|
76
|
+
|
77
|
+
def after_api_response(api_remplate)
|
78
|
+
end
|
79
|
+
|
80
|
+
def around_api_response(api_remplate)
|
81
|
+
yield
|
82
|
+
end
|
83
|
+
|
78
84
|
end
|
79
85
|
|
80
86
|
end
|
data/lib/acts_as_api/config.rb
CHANGED
@@ -49,10 +49,10 @@ module ActsAsApi
|
|
49
49
|
# If true the jsonp function call will get the http status passed
|
50
50
|
# as a second parameter
|
51
51
|
def add_http_status_to_jsonp_response
|
52
|
-
@add_http_status_to_jsonp_response
|
52
|
+
@add_http_status_to_jsonp_response.nil? ? true : @add_http_status_to_jsonp_response
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
end
|
57
57
|
|
58
|
-
end
|
58
|
+
end
|
@@ -41,14 +41,14 @@ module ActsAsApi
|
|
41
41
|
|
42
42
|
if !output_params[:root].nil?
|
43
43
|
api_root_name = output_params[:root].to_s
|
44
|
+
elsif api_model.class.respond_to?(:model_name)
|
45
|
+
api_root_name = api_model.class.model_name
|
44
46
|
elsif api_model.respond_to?(:collection_name)
|
45
47
|
api_root_name = api_model.collection_name
|
46
|
-
elsif api_model.respond_to?(:model_name)
|
47
|
-
api_root_name = api_model.model_name
|
48
48
|
elsif api_model.is_a?(Array) && !api_model.empty? && api_model.first.class.respond_to?(:model_name)
|
49
49
|
api_root_name = api_model.first.class.model_name
|
50
|
-
elsif api_model.
|
51
|
-
api_root_name = api_model.
|
50
|
+
elsif api_model.respond_to?(:model_name)
|
51
|
+
api_root_name = api_model.model_name
|
52
52
|
else
|
53
53
|
api_root_name = ActsAsApi::Config.default_root.to_s
|
54
54
|
end
|
data/lib/acts_as_api/version.rb
CHANGED
data/spec/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# Spec folder intro
|
2
|
+
|
3
|
+
## Running specs
|
4
|
+
|
5
|
+
Every ORM has a rake task. Run `rake -T` to see them all.
|
6
|
+
|
7
|
+
`rake spec:all` will run all spec suites in a row.
|
8
|
+
|
9
|
+
`rake spec:#{orm_name}` will run the spec suite for a specific ORM.
|
10
|
+
|
11
|
+
## Working with the specs
|
12
|
+
|
13
|
+
acts_as_api can be used with lots of different configurations, depending e.g. on the ORM (ActiveRecord, Mongoid, vanilla ruby) or the way the content is rendered (usual Rails controller, vs. Responder).
|
14
|
+
|
15
|
+
A goal of the lib is to stay consistent in its behaviour over these different configurations, so it won't get in your way, once you change other parts of your application.
|
16
|
+
|
17
|
+
To achieve this goal and because of the need to keep the specs as DRY as possible, the following spec setup was created:
|
18
|
+
|
19
|
+
### A shared engine
|
20
|
+
|
21
|
+
In order to keep the spec suite DRY it uses a Rails engine, available at `./shared_engine`.
|
22
|
+
|
23
|
+
It contains the controllers that are re-used by the ORM-specific Rails apps and some mixins that can be shared over the models of different ORMs.
|
24
|
+
|
25
|
+
### Dummy Rails apps
|
26
|
+
|
27
|
+
There used to be one Rails app that contained all supported ORMs. But multiple times this setup veiled problems e.g. with ORM-specific dependencies.
|
28
|
+
|
29
|
+
Now there are multiple Rails apps, one for every supported ORM: `./active_record_dummy` and `./mongoid_dummy`.
|
30
|
+
|
31
|
+
These are very simple apps, basically just clicked together on [railswizard.org](http://railswizard.org).
|
32
|
+
|
33
|
+
They contain **no controllers** to be tested, just models that match the tested ones.
|
34
|
+
|
35
|
+
### Adding a dummy Rails app
|
36
|
+
|
37
|
+
* Create a new Rails app in the folder `./spec/#{orm_name}_dummy`.
|
38
|
+
|
39
|
+
* Create to Models used in the spec (`User, Profile, Untouched, Task`).
|
40
|
+
|
41
|
+
* Include `SharedEngine::UserTemplate` in your `User` model.
|
42
|
+
|
43
|
+
* Add `mount SharedEngine::Engine => "/shared", :as => "shared"` to your `routes.rb`
|
44
|
+
|
45
|
+
* Add the following lines to your Gemfile:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
gem 'shared_engine', :path => '../shared_engine'
|
49
|
+
gem 'acts_as_api', :path => '../../'
|
50
|
+
```
|
51
|
+
|
52
|
+
* Add your dummy app to the `Rakefile` in the root folder by adding it to the `supported_orms` array.
|
53
|
+
|
54
|
+
|
55
|
+
If you have to do some special setup (e.g. creating a schema) you can do this in `./spec_helper.rb`.
|