api_me 0.2.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a1d24dedc46539788df2d2b959d96ecf93a5e5a4
4
- data.tar.gz: c6b2aaddefc12f77cd35ee91935b833f6f743b0b
3
+ metadata.gz: 47cb01169b34ee2781c7a1780659b99605797343
4
+ data.tar.gz: 8a19a3832d2cf1cdc9e663f52949d58e00aa3dc3
5
5
  SHA512:
6
- metadata.gz: 2de62f19830a20723cfd7b213867f9788b16dedecc2e6489d46c72557c98bea25f7abf82a57d59971ff698bdec49f46386d0db0b64a6fc75a3c81555410b567e
7
- data.tar.gz: 2c29e465df95037dc21e724c343811deecc351602bcc4424029aac296debcb7280785bae9bd86cd224d43868f7f8e926ce52266ef51541ff8974d6055c2cb75f
6
+ metadata.gz: 6aae861edb9a28dee94fbdc56eac28a0a79efa2c765071d87ad7c90e5517ea05925489851a5979fceb5129c3eec7dc231b0af8d85c4769e6452f03ecd82a1b4d
7
+ data.tar.gz: ac8a6dbcbaf4472be7216ffabca39bbbc7bbc85fe8ed0987cbeb6e6ff2079b35dfb5550e5d062a9bda20050cb9ba8c1d8dda04996d4e74cc1332049aa3276aeb
data/README.md CHANGED
@@ -1,4 +1,4 @@
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)
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) [![Dependency Status](https://gemnasium.com/inigo-llc/api_me.svg)](https://gemnasium.com/inigo-llc/api_me)
2
2
  ApiMe
3
3
  =========
4
4
 
@@ -7,12 +7,32 @@ ApiMe
7
7
  ### A gem for building RESTful Api resources in Rails
8
8
  ApiMe provides a set of generators and base classes to assist with building Restful API's in Ruby on Rails.
9
9
 
10
+ ### Usage
11
+ `rails g api_me:resource user organization:belongs_to name:string ...`
12
+
13
+ this generates the following:
14
+
15
+ * app/controllers/api/v1/users_controller.rb
16
+ * app/policies/user_policy.rb
17
+ * app/serializers/user_serializer.rb
18
+ * app/models/user.rb
19
+
20
+ Or
21
+
22
+ users_controller.rb
23
+ ````rb
24
+ class UsersController < ApplicationController
25
+ include ApiMe
26
+ end
27
+ ````
28
+
10
29
  #### This gem uses the following libraries:
11
30
  * Pundit
12
31
  * Active Model Serializers (0.8)
13
32
 
14
33
  #### Todo:
15
- * Add the ability to specify resource filters
34
+ - [ ] Add the ability to specify resource filters
35
+ - [ ] Add the ability to specify the api controller path (I.E. app/controllers/api/v2)
16
36
 
17
37
  ## License
18
38
  Copyright (c) 2014, Api Me is developed and maintained by Sam Clopton, and is released under the open MIT Licence.
data/Rakefile CHANGED
@@ -1,11 +1,44 @@
1
1
  require 'bundler'
2
+ require 'rspec/core/rake_task'
3
+ require 'rake/notes/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
2
6
 
3
7
  Bundler::GemHelper.install_tasks
4
8
 
5
9
  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
10
+ require 'irb'
11
+ require 'irb/completion'
12
+ require 'api_me' # You know what to do.
13
+ ARGV.clear
14
+ IRB.start
15
+ end
16
+
17
+ task default: 'reports:all'
18
+
19
+ namespace :reports do
20
+ task all: [:fixme_notes, :rubocop, :spec]
21
+
22
+ task :rubocop do
23
+ system 'bundle exec rubocop --rails --display-cop-names'
24
+ end
25
+
26
+ desc 'Create a report on all notes'
27
+ task :notes do
28
+ puts "\nCollecting all of the standard code notes..."
29
+ system 'bundle exec rake notes'
30
+ puts "\nCollecting all HACK code notes..."
31
+ system 'bundle exec rake notes:custom ANNOTATION=HACK'
32
+ puts "\nCollecting all spec code notes..."
33
+ system "grep -rnE 'OPTIMIZE:|OPTIMIZE|FIXME:|FIXME|TODO:|TODO|HACK:|HACK'"\
34
+ ' spec'
35
+ end
36
+
37
+ desc 'Print only FIXME notes'
38
+ task :fixme_notes do
39
+ puts "\nFIXME Notes (These should all be fixed before merging to master):"
40
+ system 'bundle exec rake notes:fixme'
41
+ system "grep -rnE 'FIXME:|FIXME'"\
42
+ ' spec'
43
+ end
11
44
  end
data/api_me.gemspec CHANGED
@@ -5,25 +5,27 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'api_me/version'
6
6
 
7
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'
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
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']
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
19
+ s.require_paths = %w(lib app)
20
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'
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
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'
26
+ s.add_development_dependency 'combustion', '~> 0.5.1'
27
+ s.add_development_dependency 'rspec-rails', '~> 3'
28
+ s.add_development_dependency 'sqlite3', '~> 1.3.7'
29
+ s.add_development_dependency 'rubocop', '>= 0.27.0'
30
+ s.add_development_dependency 'rake-notes', '>= 0.2.0'
29
31
  end
data/lib/api_me.rb CHANGED
@@ -7,13 +7,12 @@ module ApiMe
7
7
  extend ActiveSupport::Concern
8
8
  include ::Pundit
9
9
 
10
- included do
10
+ included do
11
11
 
12
- protect_from_forgery :with => :null_session
13
- rescue_from Pundit::NotAuthorizedError, :with => :user_not_authorized
12
+ rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
14
13
 
15
- after_action :verify_authorized, :except => :index
16
- after_action :verify_policy_scoped, :only => :index
14
+ after_action :verify_authorized, except: :index
15
+ after_action :verify_policy_scoped, only: :index
17
16
  end
18
17
 
19
18
  module ClassMethods
@@ -44,60 +43,56 @@ module ApiMe
44
43
  end
45
44
 
46
45
  def model_klass_name
47
- @model_klass_name ||= self.name.demodulize.sub(/Controller$/, '').singularize
46
+ @model_klass_name ||= name.demodulize.sub(/Controller$/, '').singularize
48
47
  end
49
48
 
50
49
  def serializer_klass_name
51
- @serializer_klass_name ||= "#{self.name.demodulize.sub(/Controller$/, '').singularize}Serializer"
50
+ @serializer_klass_name ||= "#{name.demodulize.sub(/Controller$/, '').singularize}Serializer"
52
51
  end
53
52
 
54
53
  def params_klass_symbol
55
- self.model_klass.name.downcase.to_sym
54
+ model_klass.name.downcase.to_sym
56
55
  end
57
56
  end
58
57
 
59
58
  def index
60
59
  @scoped_objects = policy_scope(model_klass.all)
61
- render :json => @scoped_objects, :each_serializer => serializer_klass
60
+ render json: @scoped_objects, each_serializer: serializer_klass
62
61
  end
63
62
 
64
63
  def show
65
64
  @object = model_klass.find(params[:id])
66
65
  authorize @object
67
66
 
68
- render :json => @object, :serializer => serializer_klass
67
+ render json: @object, serializer: serializer_klass
69
68
  end
70
69
 
71
70
  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
71
+ @object = model_klass.new(object_params)
72
+ authorize @object
73
+ @object.save!(object_params)
74
+
75
+ render status: 201, json: @object, serializer: serializer_klass
76
+ rescue ActiveRecord::RecordInvalid => e
77
+ handle_errors(e)
81
78
  end
82
79
 
83
80
  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
81
+ @object = model_klass.find(params[:id])
82
+ authorize @object
83
+ @object.update!(object_params)
84
+
85
+ render status: 204, nothing: true
86
+ rescue ActiveRecord::RecordInvalid => e
87
+ handle_errors(e)
93
88
  end
94
89
 
95
90
  def destroy
96
91
  @object = model_klass.find(params[:id])
97
92
  authorize @object
98
- @object.destroy()
93
+ @object.destroy
99
94
 
100
- render :status => 204, :nothing => true
95
+ render status: 204, nothing: true
101
96
  end
102
97
 
103
98
  private
@@ -107,7 +102,7 @@ module ApiMe
107
102
  end
108
103
 
109
104
  def render_errors(errors, status = 422)
110
- render(:json => {errors: errors}, :status => status)
105
+ render(json: { errors: errors }, status: status)
111
106
  end
112
107
 
113
108
  def handle_errors(e)
@@ -115,8 +110,8 @@ module ApiMe
115
110
  end
116
111
 
117
112
  def user_not_authorized
118
- payload = { :message => "User is not allowed to access #{params[:action]} on this resource"}
119
- render :json => payload, :status => 403
113
+ payload = { message: "User is not allowed to access #{params[:action]} on this resource" }
114
+ render json: payload, status: 403
120
115
  end
121
116
 
122
117
  def params_klass_symbol
@@ -1,3 +1,3 @@
1
1
  module ApiMe
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -2,26 +2,26 @@ module ApiMe
2
2
  module Generators
3
3
  class ControllerGenerator < ::Rails::Generators::NamedBase
4
4
  source_root File.expand_path('../templates', __FILE__)
5
- check_class_collision :suffix => "Controller"
5
+ check_class_collision suffix: 'Controller'
6
6
 
7
- argument :attributes, :type => :array, :default => [], :banner => "field field"
7
+ argument :attributes, type: :array, default: [], banner: 'field field'
8
8
 
9
- class_option :parent, :type => :string, :desc => "The parent class for the generated controller"
9
+ class_option :parent, type: :string, desc: 'The parent class for the generated controller'
10
10
 
11
11
  def create_api_controller_file
12
12
  template 'controller.rb', File.join('app/controllers',
13
- controllers_namespace,
14
- controllers_api_version,
15
- "#{plural_name}_controller.rb")
13
+ controllers_namespace,
14
+ controllers_api_version,
15
+ "#{plural_name}_controller.rb")
16
16
  end
17
17
 
18
18
  def controllers_namespace
19
- "api"
19
+ 'api'
20
20
  # @generators.options.fetch(:api, {}).fetch(:namespace, 'api')
21
21
  end
22
22
 
23
23
  def controllers_api_version
24
- "v1"
24
+ 'v1'
25
25
  # @generators.options.fetch(:api, {}).fetch(:version, 'v1')
26
26
  end
27
27
 
@@ -34,7 +34,7 @@ module ApiMe
34
34
  end
35
35
 
36
36
  def associations
37
- attributes.select { |attr| attr.reference? }
37
+ attributes.select(&:reference?)
38
38
  end
39
39
 
40
40
  def nonpolymorphic_attribute_names
@@ -54,7 +54,7 @@ module ApiMe
54
54
  end
55
55
 
56
56
  def strong_parameters
57
- (attributes_names + association_attribute_names).map(&:inspect).join(", ")
57
+ (attributes_names + association_attribute_names).map(&:inspect).join(', ')
58
58
  end
59
59
 
60
60
  def parent_class_name
@@ -62,7 +62,7 @@ module ApiMe
62
62
  if options[:parent]
63
63
  options[:parent]
64
64
  else
65
- "ApplicationController"
65
+ 'ApplicationController'
66
66
  end
67
67
  end
68
68
 
@@ -2,11 +2,11 @@ module ApiMe
2
2
  module Generators
3
3
  class PolicyGenerator < ::Rails::Generators::NamedBase
4
4
  source_root File.expand_path('../templates', __FILE__)
5
- check_class_collision :suffix => "Policy"
5
+ check_class_collision suffix: 'Policy'
6
6
 
7
- argument :attributes, :type => :array, :default => [], :banner => "field field"
7
+ argument :attributes, type: :array, default: [], banner: 'field field'
8
8
 
9
- class_option :parent, :type => :string, :desc => "The parent class for the generated policy"
9
+ class_option :parent, type: :string, desc: 'The parent class for the generated policy'
10
10
 
11
11
  def create_api_policy_file
12
12
  template 'policy.rb', File.join('app/policies', "#{singular_name}_policy.rb")
@@ -21,7 +21,7 @@ module ApiMe
21
21
  end
22
22
 
23
23
  def associations
24
- attributes.select { |attr| attr.reference? }
24
+ attributes.select(&:reference?)
25
25
  end
26
26
 
27
27
  def nonpolymorphic_attribute_names
@@ -41,14 +41,14 @@ module ApiMe
41
41
  end
42
42
 
43
43
  def strong_parameters
44
- (attributes_names + association_attribute_names).map(&:inspect).join(", ")
44
+ (attributes_names + association_attribute_names).map(&:inspect).join(', ')
45
45
  end
46
46
 
47
47
  def parent_class_name
48
48
  if options[:parent]
49
49
  options[:parent]
50
50
  else
51
- "ApplicationPolicy"
51
+ 'ApplicationPolicy'
52
52
  end
53
53
  end
54
54
 
@@ -3,10 +3,10 @@ module ApiMe
3
3
  class ResourceGenerator < Rails::Generators::Base
4
4
  def run_generators
5
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
6
+ invoke 'model', params
7
+ invoke 'serializer', params + %w(created_at updated_at)
8
+ invoke 'api_me:policy', params
9
+ invoke 'api_me:controller', params
10
10
  end
11
11
  end
12
12
  end
@@ -7,6 +7,6 @@ describe 'fails API' do
7
7
  expect(last_response.status).to eq(404)
8
8
  json = JSON.parse(last_response.body)
9
9
 
10
- expect(json['status']).to eq("failed")
10
+ expect(json['status']).to eq('failed')
11
11
  end
12
12
  end
@@ -3,8 +3,8 @@ require 'spec_helper'
3
3
  describe 'Users API' do
4
4
  it 'sends the list of users' do
5
5
  users = [
6
- User.create(:username => "Test"),
7
- User.create(:username => "Test 2")
6
+ User.create(username: 'Test'),
7
+ User.create(username: 'Test 2')
8
8
  ]
9
9
 
10
10
  get '/api/v1/users'
@@ -16,7 +16,7 @@ describe 'Users API' do
16
16
  end
17
17
 
18
18
  it 'sends an individual user' do
19
- user = User.create(:username => "Test")
19
+ user = User.create(username: 'Test')
20
20
 
21
21
  get '/api/v1/users/' + user.id.to_s + '/'
22
22
 
@@ -28,10 +28,10 @@ describe 'Users API' do
28
28
 
29
29
  it 'creates a new user' do
30
30
  user_params = {
31
- :username => "Test"
31
+ username: 'Test'
32
32
  }
33
33
 
34
- post '/api/v1/users/', {:user => user_params}
34
+ post '/api/v1/users/', user: user_params
35
35
 
36
36
  expect(last_response.status).to eq(201)
37
37
  json = JSON.parse(last_response.body)
@@ -40,25 +40,25 @@ describe 'Users API' do
40
40
  end
41
41
 
42
42
  it 'updates an existing user' do
43
- user = User.create(:username => "Foo")
43
+ user = User.create(username: 'Foo')
44
44
 
45
- expect(user.username).to eq("Foo")
45
+ expect(user.username).to eq('Foo')
46
46
 
47
- put '/api/v1/users/' + user.id.to_s + '/', {:user => {:username => "Bar"}}
47
+ put '/api/v1/users/' + user.id.to_s + '/', user: { username: 'Bar' }
48
48
 
49
49
  updated_user = User.find(user.id)
50
50
  expect(last_response.status).to eq(204)
51
- expect(updated_user.username).to eq("Bar")
51
+ expect(updated_user.username).to eq('Bar')
52
52
  end
53
53
 
54
54
  it 'destroys an existing user' do
55
- user = User.create(:username => "Foo")
55
+ user = User.create(username: 'Foo')
56
56
 
57
57
  expect(user.id).to_not eq(nil)
58
58
 
59
59
  delete '/api/v1/users/' + user.id.to_s + '/'
60
60
 
61
- does_user_exist = User.where(:id => user.id).exists?
61
+ does_user_exist = User.where(id: user.id).exists?
62
62
  expect(last_response.status).to eq(204)
63
63
  expect(does_user_exist).to eq(false)
64
64
  end
@@ -6,6 +6,6 @@ class Api::V1::FailsController < ApplicationController
6
6
  private
7
7
 
8
8
  def fail
9
- render json: {:status => "failed"}, status: 404
9
+ render json: { status: 'failed' }, status: 404
10
10
  end
11
11
  end
@@ -1,7 +1,7 @@
1
1
  class ApplicationController < ActionController::Base
2
2
  # Prevent CSRF attacks by raising an exception.
3
3
  # For APIs, you may want to use :null_session instead.
4
- protect_from_forgery :with => :exception
4
+ protect_from_forgery with: :exception
5
5
 
6
6
  private
7
7
 
@@ -11,7 +11,7 @@ class ApplicationPolicy
11
11
  end
12
12
 
13
13
  def show?
14
- scope.where(:id => record.id).exists?
14
+ scope.where(id: record.id).exists?
15
15
  end
16
16
 
17
17
  def create?
@@ -1,6 +1,6 @@
1
1
  ActiveRecord::Schema.define do
2
- create_table :users, :force => true do |t|
3
- t.string :username
4
- t.timestamps
5
- end
2
+ create_table :users, force: true do |t|
3
+ t.string :username
4
+ t.timestamps
5
+ end
6
6
  end
data/spec/spec_helper.rb CHANGED
@@ -18,8 +18,8 @@ module ApiHelper
18
18
  end
19
19
 
20
20
  RSpec.configure do |config|
21
- config.use_transactional_fixtures = true
21
+ config.use_transactional_fixtures = true
22
22
 
23
- config.include ApiHelper
23
+ config.include ApiHelper
24
24
 
25
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_me
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Clopton
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.13'
89
+ version: '3'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.13'
96
+ version: '3'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: sqlite3
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +108,34 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 1.3.7
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 0.27.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 0.27.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake-notes
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 0.2.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 0.2.0
111
139
  description: This friendly library gives you helpers and generators to assist building
112
140
  RESTful API's in your Rails app.
113
141
  email: