api_me 0.1.0 → 0.2.0

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +13 -0
  6. data/LICENCE +20 -0
  7. data/README.md +18 -0
  8. data/Rakefile +11 -0
  9. data/api_me.gemspec +29 -0
  10. data/config.ru +7 -0
  11. data/lib/api_me.rb +133 -0
  12. data/lib/api_me/version.rb +3 -0
  13. data/lib/generators/api_me/controller/USAGE +8 -0
  14. data/lib/generators/api_me/controller/controller_generator.rb +72 -0
  15. data/lib/generators/api_me/controller/templates/controller.rb +7 -0
  16. data/lib/generators/api_me/policy/USAGE +8 -0
  17. data/lib/generators/api_me/policy/policy_generator.rb +58 -0
  18. data/lib/generators/api_me/policy/templates/policy.rb +7 -0
  19. data/lib/generators/api_me/resource/USAGE +11 -0
  20. data/lib/generators/api_me/resource/resource_generator.rb +13 -0
  21. data/spec/acceptance/api/v1/fails_spec.rb +12 -0
  22. data/spec/acceptance/api/v1/users_spec.rb +65 -0
  23. data/spec/internal/app/controllers/api/v1/fails_controller.rb +11 -0
  24. data/spec/internal/app/controllers/api/v1/users_controller.rb +3 -0
  25. data/spec/internal/app/controllers/application_controller.rb +12 -0
  26. data/spec/internal/app/models/user.rb +2 -0
  27. data/spec/internal/app/policies/application_policy.rb +65 -0
  28. data/spec/internal/app/policies/user_policy.rb +8 -0
  29. data/spec/internal/app/serializers/user_serializer.rb +4 -0
  30. data/spec/internal/config/database.yml +3 -0
  31. data/spec/internal/config/routes.rb +8 -0
  32. data/spec/internal/db/schema.rb +6 -0
  33. data/spec/internal/log/.gitignore +1 -0
  34. data/spec/internal/public/favicon.ico +0 -0
  35. data/spec/spec_helper.rb +25 -0
  36. metadata +71 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c70c7302d480e12e4207fa36d09b9caa8610a091
4
- data.tar.gz: 952dc41ca73adee3a21471cf6ab09b0aed6baa09
3
+ metadata.gz: a1d24dedc46539788df2d2b959d96ecf93a5e5a4
4
+ data.tar.gz: c6b2aaddefc12f77cd35ee91935b833f6f743b0b
5
5
  SHA512:
6
- metadata.gz: 84b22bbf0f6c33514f9a79190a4bce87402cda2846abf34ea634a2c16f84211ba180dcb44f459a4c81c1d2bf0c2b14d347cb8208a2d947bb20eb718d1c0eaecc
7
- data.tar.gz: df8b8cfc7fc97b3d03be4a49a520a121abf26d65f0c111b1a394ac006b1f4e846131059583dbb403b13b9cca7cb5d8c0fc06ad8db50672ff0071c15d53f48d1a
6
+ metadata.gz: 2de62f19830a20723cfd7b213867f9788b16dedecc2e6489d46c72557c98bea25f7abf82a57d59971ff698bdec49f46386d0db0b64a6fc75a3c81555410b567e
7
+ data.tar.gz: 2c29e465df95037dc21e724c343811deecc351602bcc4424029aac296debcb7280785bae9bd86cd224d43868f7f8e926ce52266ef51541ff8974d6055c2cb75f
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ Gemfile.lock
2
+ spec/internal/db/*sqlite
3
+ pkg/
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.3
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ script: bundle exec rspec spec
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'activerecord'
7
+ gem 'activesupport'
8
+ gem 'actionpack' # action_controller, action_view
9
+ gem 'combustion', '~> 0.5.2'
10
+ gem 'rack-test'
11
+ gem 'pundit'
12
+ gem 'active_model_serializers', '~> 0.8.0'
13
+ end
data/LICENCE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2014 Sam Clopton
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,18 @@
1
+ [![Gem Version](https://badge.fury.io/rb/api_me.png)](http://badge.fury.io/rb/api_me) [![Build Status](https://travis-ci.org/inigo-llc/api_me.png?branch=master)](https://travis-ci.org/inigo-llc/api_me) [![Code Climate](https://codeclimate.com/github/inigo-llc/api_me/badges/gpa.svg)](https://codeclimate.com/github/inigo-llc/api_me) [![Test Coverage](https://codeclimate.com/github/inigo-llc/api_me/badges/coverage.svg)](https://codeclimate.com/github/inigo-llc/api_me)
2
+ ApiMe
3
+ =========
4
+
5
+ ## This gem is currently a work in progress, follows semver, and may change significantly until version 1.0
6
+
7
+ ### A gem for building RESTful Api resources in Rails
8
+ ApiMe provides a set of generators and base classes to assist with building Restful API's in Ruby on Rails.
9
+
10
+ #### This gem uses the following libraries:
11
+ * Pundit
12
+ * Active Model Serializers (0.8)
13
+
14
+ #### Todo:
15
+ * Add the ability to specify resource filters
16
+
17
+ ## License
18
+ Copyright (c) 2014, Api Me is developed and maintained by Sam Clopton, and is released under the open MIT Licence.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ task :console do
6
+ require 'irb'
7
+ require 'irb/completion'
8
+ require 'api_me' # You know what to do.
9
+ ARGV.clear
10
+ IRB.start
11
+ end
data/api_me.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'api_me/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'api_me'
9
+ s.version = ApiMe::VERSION
10
+ s.authors = ['Sam Clopton']
11
+ s.email = ['samsinite@gmail.com']
12
+ s.homepage = 'https://github.com/inigo/api_me'
13
+ s.summary = 'Api Me'
14
+ s.description = "This friendly library gives you helpers and generators to assist building RESTful API's in your Rails app."
15
+ s.license = 'MIT'
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
19
+ s.require_paths = ['lib', 'app']
20
+
21
+ s.add_runtime_dependency 'activerecord', '>= 3.2.0'
22
+ s.add_runtime_dependency 'activesupport', '>= 3.2.0'
23
+ s.add_runtime_dependency 'pundit', '~> 0.1'
24
+ s.add_runtime_dependency 'active_model_serializers', '~> 0.8.0'
25
+
26
+ s.add_development_dependency 'combustion', '~> 0.5.1'
27
+ s.add_development_dependency 'rspec-rails', '~> 2.13'
28
+ s.add_development_dependency 'sqlite3', '~> 1.3.7'
29
+ end
data/config.ru ADDED
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize!
7
+ run Combustion::Application
data/lib/api_me.rb ADDED
@@ -0,0 +1,133 @@
1
+ require 'active_support/concern'
2
+ require 'pundit'
3
+
4
+ require 'api_me/version'
5
+
6
+ module ApiMe
7
+ extend ActiveSupport::Concern
8
+ include ::Pundit
9
+
10
+ included do
11
+
12
+ protect_from_forgery :with => :null_session
13
+ rescue_from Pundit::NotAuthorizedError, :with => :user_not_authorized
14
+
15
+ after_action :verify_authorized, :except => :index
16
+ after_action :verify_policy_scoped, :only => :index
17
+ end
18
+
19
+ module ClassMethods
20
+ def model(klass)
21
+ @model_klass = klass
22
+ end
23
+
24
+ def serializer(klass)
25
+ @serializer_klass = klass
26
+ end
27
+
28
+ if RUBY_VERSION >= '2.0'
29
+ def model_klass
30
+ @model_klass ||= Object.const_get(model_klass_name)
31
+ end
32
+
33
+ def serializer_klass
34
+ @serializer_klass ||= Object.const_get(serializer_klass_name)
35
+ end
36
+ else
37
+ def model_klass
38
+ @model_klass ||= model_klass_name.safe_constantize
39
+ end
40
+
41
+ def serializer_klass
42
+ @serializer_klass ||= serializer_klass_name.safe_constantize
43
+ end
44
+ end
45
+
46
+ def model_klass_name
47
+ @model_klass_name ||= self.name.demodulize.sub(/Controller$/, '').singularize
48
+ end
49
+
50
+ def serializer_klass_name
51
+ @serializer_klass_name ||= "#{self.name.demodulize.sub(/Controller$/, '').singularize}Serializer"
52
+ end
53
+
54
+ def params_klass_symbol
55
+ self.model_klass.name.downcase.to_sym
56
+ end
57
+ end
58
+
59
+ def index
60
+ @scoped_objects = policy_scope(model_klass.all)
61
+ render :json => @scoped_objects, :each_serializer => serializer_klass
62
+ end
63
+
64
+ def show
65
+ @object = model_klass.find(params[:id])
66
+ authorize @object
67
+
68
+ render :json => @object, :serializer => serializer_klass
69
+ end
70
+
71
+ def create
72
+ begin
73
+ @object = model_klass.new(object_params)
74
+ authorize @object
75
+ @object.save!(object_params)
76
+
77
+ render :status => 201, :json => @object, :serializer => serializer_klass
78
+ rescue ActiveRecord::RecordInvalid => e
79
+ handle_errors(e)
80
+ end
81
+ end
82
+
83
+ def update
84
+ begin
85
+ @object = model_klass.find(params[:id])
86
+ authorize @object
87
+ @object.update!(object_params)
88
+
89
+ render :status => 204, :nothing => true
90
+ rescue ActiveRecord::RecordInvalid => e
91
+ handle_errors(e)
92
+ end
93
+ end
94
+
95
+ def destroy
96
+ @object = model_klass.find(params[:id])
97
+ authorize @object
98
+ @object.destroy()
99
+
100
+ render :status => 204, :nothing => true
101
+ end
102
+
103
+ private
104
+
105
+ def object_params
106
+ params.require(params_klass_symbol).permit(*policy(@object || model_klass).permitted_attributes)
107
+ end
108
+
109
+ def render_errors(errors, status = 422)
110
+ render(:json => {errors: errors}, :status => status)
111
+ end
112
+
113
+ def handle_errors(e)
114
+ render_errors(e.record.errors.messages)
115
+ end
116
+
117
+ def user_not_authorized
118
+ payload = { :message => "User is not allowed to access #{params[:action]} on this resource"}
119
+ render :json => payload, :status => 403
120
+ end
121
+
122
+ def params_klass_symbol
123
+ self.class.params_klass_symbol
124
+ end
125
+
126
+ def model_klass
127
+ self.class.model_klass
128
+ end
129
+
130
+ def serializer_klass
131
+ self.class.serializer_klass
132
+ end
133
+ end
@@ -0,0 +1,3 @@
1
+ module ApiMe
2
+ VERSION = '0.2.0'
3
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ This generator generates an api controller that inherits from ApiMe::BaseController
3
+
4
+ Example:
5
+ rails generate api_controller foo_bar foo:references{polymorphic} bar:belongs_to name description
6
+
7
+ This will create:
8
+ app/controllers/api/v1/foo_bars_controller.rb
@@ -0,0 +1,72 @@
1
+ module ApiMe
2
+ module Generators
3
+ class ControllerGenerator < ::Rails::Generators::NamedBase
4
+ source_root File.expand_path('../templates', __FILE__)
5
+ check_class_collision :suffix => "Controller"
6
+
7
+ argument :attributes, :type => :array, :default => [], :banner => "field field"
8
+
9
+ class_option :parent, :type => :string, :desc => "The parent class for the generated controller"
10
+
11
+ def create_api_controller_file
12
+ template 'controller.rb', File.join('app/controllers',
13
+ controllers_namespace,
14
+ controllers_api_version,
15
+ "#{plural_name}_controller.rb")
16
+ end
17
+
18
+ def controllers_namespace
19
+ "api"
20
+ # @generators.options.fetch(:api, {}).fetch(:namespace, 'api')
21
+ end
22
+
23
+ def controllers_api_version
24
+ "v1"
25
+ # @generators.options.fetch(:api, {}).fetch(:version, 'v1')
26
+ end
27
+
28
+ def controller_class_name
29
+ "#{controllers_namespace.capitalize}::#{controllers_api_version.capitalize}::#{plural_name.camelize}Controller"
30
+ end
31
+
32
+ def attributes_names
33
+ [:id] + attributes.select { |attr| !attr.reference? }.map { |a| a.name.to_sym }
34
+ end
35
+
36
+ def associations
37
+ attributes.select { |attr| attr.reference? }
38
+ end
39
+
40
+ def nonpolymorphic_attribute_names
41
+ associations.select { |attr| attr.type.in?([:belongs_to, :references]) }
42
+ .reject { |attr| attr.attr_options.fetch(:polymorphic, false) }
43
+ .map { |attr| "#{attr.name}_id".to_sym }
44
+ end
45
+
46
+ def polymorphic_attribute_names
47
+ associations.select { |attr| attr.type.in?([:belongs_to, :references]) }
48
+ .select { |attr| attr.attr_options.fetch(:polymorphic, false) }
49
+ .map { |attr| ["#{attr.name}_id".to_sym, "#{attr.name}_type".to_sym] }.flatten
50
+ end
51
+
52
+ def association_attribute_names
53
+ nonpolymorphic_attribute_names + (polymorphic_attribute_names)
54
+ end
55
+
56
+ def strong_parameters
57
+ (attributes_names + association_attribute_names).map(&:inspect).join(", ")
58
+ end
59
+
60
+ def parent_class_name
61
+ base_controller_name = "#{controllers_namespace.capitalize}::BaseController"
62
+ if options[:parent]
63
+ options[:parent]
64
+ else
65
+ "ApplicationController"
66
+ end
67
+ end
68
+
69
+ hook_for :test_framework
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,7 @@
1
+ <% module_namespacing do -%>
2
+ class <%= controller_class_name %> < <%= parent_class_name %>
3
+ include ApiMe
4
+
5
+ #Override default logic here
6
+ end
7
+ <% end -%>
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate api_policy Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,58 @@
1
+ module ApiMe
2
+ module Generators
3
+ class PolicyGenerator < ::Rails::Generators::NamedBase
4
+ source_root File.expand_path('../templates', __FILE__)
5
+ check_class_collision :suffix => "Policy"
6
+
7
+ argument :attributes, :type => :array, :default => [], :banner => "field field"
8
+
9
+ class_option :parent, :type => :string, :desc => "The parent class for the generated policy"
10
+
11
+ def create_api_policy_file
12
+ template 'policy.rb', File.join('app/policies', "#{singular_name}_policy.rb")
13
+ end
14
+
15
+ def policy_class_name
16
+ "#{class_name}Policy"
17
+ end
18
+
19
+ def attributes_names
20
+ attributes.select { |attr| !attr.reference? }.map { |a| a.name.to_sym }
21
+ end
22
+
23
+ def associations
24
+ attributes.select { |attr| attr.reference? }
25
+ end
26
+
27
+ def nonpolymorphic_attribute_names
28
+ associations.select { |attr| attr.type.in?([:belongs_to, :references]) }
29
+ .reject { |attr| attr.attr_options.fetch(:polymorphic, false) }
30
+ .map { |attr| "#{attr.name}_id".to_sym }
31
+ end
32
+
33
+ def polymorphic_attribute_names
34
+ associations.select { |attr| attr.type.in?([:belongs_to, :references]) }
35
+ .select { |attr| attr.attr_options.fetch(:polymorphic, false) }
36
+ .map { |attr| ["#{attr.name}_id".to_sym, "#{attr.name}_type".to_sym] }.flatten
37
+ end
38
+
39
+ def association_attribute_names
40
+ nonpolymorphic_attribute_names + (polymorphic_attribute_names)
41
+ end
42
+
43
+ def strong_parameters
44
+ (attributes_names + association_attribute_names).map(&:inspect).join(", ")
45
+ end
46
+
47
+ def parent_class_name
48
+ if options[:parent]
49
+ options[:parent]
50
+ else
51
+ "ApplicationPolicy"
52
+ end
53
+ end
54
+
55
+ hook_for :test_framework
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,7 @@
1
+ <% module_namespacing do -%>
2
+ class <%= policy_class_name %> < <%= parent_class_name %>
3
+ def permitted_attributes
4
+ [<%= strong_parameters %>]
5
+ end
6
+ end
7
+ <% end -%>
@@ -0,0 +1,11 @@
1
+ Description:
2
+ This generator generates an api resource that inherit from ApiMe::BaseController
3
+
4
+ Example:
5
+ rails generate api_resource foo_bar foo:references{polymorphic} bar:belongs_to name description
6
+
7
+ This will create:
8
+ app/models/foo_bar.rb
9
+ app/serializers/foo_bar_serializer.rb
10
+ app/policy/foo_bar_policy.rb
11
+ app/controllers/api/v1/foo_bars_controller.rb
@@ -0,0 +1,13 @@
1
+ module ApiMe
2
+ module Generators
3
+ class ResourceGenerator < Rails::Generators::Base
4
+ def run_generators
5
+ params = @_initializer[0]
6
+ invoke "model", params
7
+ invoke "serializer", params + ["created_at", "updated_at"]
8
+ invoke "api_me:policy", params
9
+ invoke "api_me:controller", params
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'fails API' do
4
+ it 'fails in the before action' do
5
+ get '/api/v1/fails'
6
+
7
+ expect(last_response.status).to eq(404)
8
+ json = JSON.parse(last_response.body)
9
+
10
+ expect(json['status']).to eq("failed")
11
+ end
12
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Users API' do
4
+ it 'sends the list of users' do
5
+ users = [
6
+ User.create(:username => "Test"),
7
+ User.create(:username => "Test 2")
8
+ ]
9
+
10
+ get '/api/v1/users'
11
+
12
+ expect(last_response.status).to eq(200)
13
+ json = JSON.parse(last_response.body)
14
+
15
+ expect(json['users'].length).to eq(2)
16
+ end
17
+
18
+ it 'sends an individual user' do
19
+ user = User.create(:username => "Test")
20
+
21
+ get '/api/v1/users/' + user.id.to_s + '/'
22
+
23
+ expect(last_response.status).to eq(200)
24
+ json = JSON.parse(last_response.body)
25
+
26
+ expect(json['user']['id']).to eq(user.id)
27
+ end
28
+
29
+ it 'creates a new user' do
30
+ user_params = {
31
+ :username => "Test"
32
+ }
33
+
34
+ post '/api/v1/users/', {:user => user_params}
35
+
36
+ expect(last_response.status).to eq(201)
37
+ json = JSON.parse(last_response.body)
38
+
39
+ expect(json['user']['username']).to eq(user_params[:username])
40
+ end
41
+
42
+ it 'updates an existing user' do
43
+ user = User.create(:username => "Foo")
44
+
45
+ expect(user.username).to eq("Foo")
46
+
47
+ put '/api/v1/users/' + user.id.to_s + '/', {:user => {:username => "Bar"}}
48
+
49
+ updated_user = User.find(user.id)
50
+ expect(last_response.status).to eq(204)
51
+ expect(updated_user.username).to eq("Bar")
52
+ end
53
+
54
+ it 'destroys an existing user' do
55
+ user = User.create(:username => "Foo")
56
+
57
+ expect(user.id).to_not eq(nil)
58
+
59
+ delete '/api/v1/users/' + user.id.to_s + '/'
60
+
61
+ does_user_exist = User.where(:id => user.id).exists?
62
+ expect(last_response.status).to eq(204)
63
+ expect(does_user_exist).to eq(false)
64
+ end
65
+ end
@@ -0,0 +1,11 @@
1
+ class Api::V1::FailsController < ApplicationController
2
+ include ApiMe
3
+
4
+ before_action :fail
5
+
6
+ private
7
+
8
+ def fail
9
+ render json: {:status => "failed"}, status: 404
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ class Api::V1::UsersController < ApplicationController
2
+ include ApiMe
3
+ end
@@ -0,0 +1,12 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery :with => :exception
5
+
6
+ private
7
+
8
+ # Needed by pundit
9
+ def current_user
10
+ nil
11
+ end
12
+ end
@@ -0,0 +1,2 @@
1
+ class User < ActiveRecord::Base
2
+ end
@@ -0,0 +1,65 @@
1
+ class ApplicationPolicy
2
+ attr_reader :user, :record
3
+
4
+ def initialize(user, record)
5
+ @user = user
6
+ @record = record
7
+ end
8
+
9
+ def index?
10
+ true
11
+ end
12
+
13
+ def show?
14
+ scope.where(:id => record.id).exists?
15
+ end
16
+
17
+ def create?
18
+ true
19
+ end
20
+
21
+ def new?
22
+ create?
23
+ end
24
+
25
+ def update?
26
+ true
27
+ end
28
+
29
+ def edit?
30
+ update?
31
+ end
32
+
33
+ def destroy?
34
+ true
35
+ end
36
+
37
+ def scope
38
+ Pundit.policy_scope!(user, record.class)
39
+ end
40
+
41
+ class Scope
42
+ attr_reader :user, :scope
43
+
44
+ def initialize(user, scope)
45
+ @user = user
46
+ @scope = scope
47
+ end
48
+
49
+ def resolve
50
+ readable
51
+ end
52
+
53
+ def readable
54
+ scope
55
+ end
56
+
57
+ def modifyable
58
+ scope
59
+ end
60
+
61
+ def destroyable
62
+ scope
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,8 @@
1
+ class UserPolicy < ApplicationPolicy
2
+ def permitted_attributes
3
+ [:id, :username]
4
+ end
5
+
6
+ class Scope < ApplicationPolicy::Scope
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ class UserSerializer < ActiveModel::Serializer
2
+ embed :ids
3
+ attributes :id, :username
4
+ end
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: db/combustion_test.sqlite
@@ -0,0 +1,8 @@
1
+ Rails.application.routes.draw do
2
+ namespace :api do
3
+ namespace :v1 do
4
+ resources :users
5
+ resources :fails
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ ActiveRecord::Schema.define do
2
+ create_table :users, :force => true do |t|
3
+ t.string :username
4
+ t.timestamps
5
+ end
6
+ end
@@ -0,0 +1 @@
1
+ *.log
File without changes
@@ -0,0 +1,25 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'combustion'
4
+
5
+ Bundler.require :default, :development
6
+
7
+ Combustion.initialize! :active_record, :action_controller
8
+
9
+ require 'rspec/rails'
10
+ require 'rack/test'
11
+
12
+ module ApiHelper
13
+ include Rack::Test::Methods
14
+
15
+ def app
16
+ Rails.application
17
+ end
18
+ end
19
+
20
+ RSpec.configure do |config|
21
+ config.use_transactional_fixtures = true
22
+
23
+ config.include ApiHelper
24
+
25
+ end
metadata CHANGED
@@ -1,108 +1,156 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_me
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Clopton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-19 00:00:00.000000000 Z
11
+ date: 2014-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 3.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 3.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 3.2.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: filter_me
42
+ name: pundit
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: active_model_serializers
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.8.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: combustion
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ~>
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
75
  version: 0.5.1
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ~>
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
82
  version: 0.5.1
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec-rails
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ~>
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
89
  version: '2.13'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ~>
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
96
  version: '2.13'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: sqlite3
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ~>
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
103
  version: 1.3.7
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ~>
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: 1.3.7
97
- description: This friendly library gives you helpers to assist building RESTful API's
98
- in your Rails app.
111
+ description: This friendly library gives you helpers and generators to assist building
112
+ RESTful API's in your Rails app.
99
113
  email:
100
114
  - samsinite@gmail.com
101
115
  executables: []
102
116
  extensions: []
103
117
  extra_rdoc_files: []
104
- files: []
105
- homepage: https://github.com/samsinite/api_me
118
+ files:
119
+ - ".gitignore"
120
+ - ".ruby-version"
121
+ - ".travis.yml"
122
+ - Gemfile
123
+ - LICENCE
124
+ - README.md
125
+ - Rakefile
126
+ - api_me.gemspec
127
+ - config.ru
128
+ - lib/api_me.rb
129
+ - lib/api_me/version.rb
130
+ - lib/generators/api_me/controller/USAGE
131
+ - lib/generators/api_me/controller/controller_generator.rb
132
+ - lib/generators/api_me/controller/templates/controller.rb
133
+ - lib/generators/api_me/policy/USAGE
134
+ - lib/generators/api_me/policy/policy_generator.rb
135
+ - lib/generators/api_me/policy/templates/policy.rb
136
+ - lib/generators/api_me/resource/USAGE
137
+ - lib/generators/api_me/resource/resource_generator.rb
138
+ - spec/acceptance/api/v1/fails_spec.rb
139
+ - spec/acceptance/api/v1/users_spec.rb
140
+ - spec/internal/app/controllers/api/v1/fails_controller.rb
141
+ - spec/internal/app/controllers/api/v1/users_controller.rb
142
+ - spec/internal/app/controllers/application_controller.rb
143
+ - spec/internal/app/models/user.rb
144
+ - spec/internal/app/policies/application_policy.rb
145
+ - spec/internal/app/policies/user_policy.rb
146
+ - spec/internal/app/serializers/user_serializer.rb
147
+ - spec/internal/config/database.yml
148
+ - spec/internal/config/routes.rb
149
+ - spec/internal/db/schema.rb
150
+ - spec/internal/log/.gitignore
151
+ - spec/internal/public/favicon.ico
152
+ - spec/spec_helper.rb
153
+ homepage: https://github.com/inigo/api_me
106
154
  licenses:
107
155
  - MIT
108
156
  metadata: {}
@@ -110,19 +158,20 @@ post_install_message:
110
158
  rdoc_options: []
111
159
  require_paths:
112
160
  - lib
161
+ - app
113
162
  required_ruby_version: !ruby/object:Gem::Requirement
114
163
  requirements:
115
- - - '>='
164
+ - - ">="
116
165
  - !ruby/object:Gem::Version
117
166
  version: '0'
118
167
  required_rubygems_version: !ruby/object:Gem::Requirement
119
168
  requirements:
120
- - - '>='
169
+ - - ">="
121
170
  - !ruby/object:Gem::Version
122
171
  version: '0'
123
172
  requirements: []
124
173
  rubyforge_project:
125
- rubygems_version: 2.0.3
174
+ rubygems_version: 2.2.2
126
175
  signing_key:
127
176
  specification_version: 4
128
177
  summary: Api Me