rails-rapido 0.1.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c7c8672e3ca4ed53db33a2bb7345b9500428f5e
4
- data.tar.gz: de8ef790022968819a797c831517886894e70c7d
3
+ metadata.gz: 8d0cc71591ad6a2b6b8b2226f0c8c7a6a336599a
4
+ data.tar.gz: 0560d78f59cdc2e438558dc83b8eaa4375f1534b
5
5
  SHA512:
6
- metadata.gz: 0b1c4da043e6f9573eb6218440dd56f6ad4e0fc8117a1e8792fd4af4491deb4310fa37efbbffb05d40ed2324c8e08045f787a9d04aa415598fcd73784428d597
7
- data.tar.gz: '082bd98d224b0ae9fa5979b008d87fe398184449a5c12509b48bd965b416f63f7f177736864c91af1fb38fc28cb45731917d4813d6895cd362ab00732ee4b865'
6
+ metadata.gz: 39b81c33f1dbd7dfdbf72c2c0640698e4805df177d92916b447d954df1b922c8dd4861881d7f6a5546e80ec3f56aff728005d8229688510388046c2d72eaab0f
7
+ data.tar.gz: cd4497effc05b8e1b62d8774065fec76c7b5332857896dc133be45b782e1250cbb4c46ce3cc287f9fbb925dedbd261ee3fa8d81e804d60e9335504addce236cc
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3.4
2
+ TargetRubyVersion: 2.3
3
3
  # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
4
4
  # to ignore them, so only the ones explicitly set in this file are enabled.
5
5
  DisabledByDefault: true
data/README.md CHANGED
@@ -1,76 +1,10 @@
1
1
  # Rapido
2
2
 
3
- Rapido is a simple module library that can be included into your Rails controllers to dry up a standard, RESTful API.
3
+ [![Code Climate](https://codeclimate.com/github/starfighterheavy/rapido/badges/gpa.svg)](https://codeclimate.com/github/starfighterheavy/rapido)
4
4
 
5
- ## Installation
5
+ Rapido is a simple, highly opinionated library that can be included into your Rails controllers to enforce standardized behavior and security.
6
6
 
7
- Add this line to your application's Gemfile:
8
-
9
- ```ruby
10
- gem 'rapido'
11
- ```
12
-
13
- And then execute:
14
-
15
- $ bundle
16
-
17
- Or install it yourself as:
18
-
19
- $ gem install rapido
20
-
21
- ## Usage
22
-
23
- Simply including the Rapido::Controller module into your controller is all you need to do if:
24
-
25
- 1. Odd controller name: your controller's name follows the standard [Resource.pluralize]Controller format.
26
- 1. Odd controller methods: you don't need any additional API endpoints other then the standard REST create/show/index/delete/update endpoints.
27
- 1. Resource ownership: the resource governed by your controller is not nested within an owner, e.g. /api/v1/[parent_resource]/[parent_resource_id]/[my_resource]
28
-
29
- If your controller has any of these characteristics, you'll need to do a little bit more work to properly configure your controller.
30
-
31
- ### Odd controller name
32
-
33
- If for some reason your controller name does not follow the standard format, you'll need to override the override the `resource_class` method. For example, if you have a controller named `MyOddleNamedWidgetController` for the `Widget` resource:
34
-
35
- ```
36
- class MyOddlyNamedWidgetController < ApplicationController
37
- include Rapido::Controller
38
-
39
- private
40
-
41
- def resource_class
42
- Widget
43
- end
44
- end
45
- ```
46
-
47
-
48
- ### Odd controller methods
49
-
50
- If you have endpoints other than create, show, index, update, and delete, you can add them as additional methods like so:
51
-
52
- ```
53
- class WidgetsController < ApplicationController
54
- include Rapido::Controller
55
-
56
- def spin
57
- resource.spin!
58
- head :ok
59
- end
60
- end
61
- ```
62
-
63
- ### Resource ownership
64
-
65
- If your resources has a `belongs_to` relationship that is reflected in the API route as a nested resource, you can specify the `resource_owner` class to include the relationship when retrieving the resource.
66
-
67
- ```
68
- class WidgetsController < ApplicationController
69
- include Radido::Controller
70
-
71
- resource_owner_name :widget_factory
72
- end
73
- ```
7
+ Documentation coming soon.
74
8
 
75
9
  ## Development
76
10
 
@@ -78,6 +12,10 @@ After checking out the repo, run `bin/setup` to install dependencies. You can al
78
12
 
79
13
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
80
14
 
15
+ ## Testing
16
+
17
+ Run `rake` to execute the feature tests written for the sample application in the `test` directory.
18
+
81
19
  ## Contributing
82
20
 
83
21
  Bug reports and pull requests are welcome on GitHub at https://github.com/jskirst/rapido.
data/Rakefile CHANGED
@@ -1,2 +1,6 @@
1
1
  require 'bundler/gem_tasks'
2
- task default: :spec
2
+ task default: :test
3
+
4
+ task :test do
5
+ exec '(cd test/test_5_1/ && bin/rails db:environment:set RAILS_ENV=test && bundle exec cucumber)'
6
+ end
@@ -0,0 +1,4 @@
1
+ = simple_form_for([@owner, @resource].compact) do |f|
2
+ - @resource_permitted_params.each do |param|
3
+ = f.input param
4
+ = f.submit "Save"
@@ -0,0 +1,14 @@
1
+ h2= [@owner.name, @resource_class.name.capitalize.pluralize].compact.join(" ")
2
+ = link_to "New #{@resource_class.name.capitalize}", @new_path
3
+ table
4
+ thead
5
+ tr
6
+ - @resource_class.new.to_h.keys.each do |key|
7
+ th= key.to_s.capitalize
8
+ - @resource_collection.each do |resource|
9
+ tr
10
+ - resource.keys.each_with_index do |key, index|
11
+ - if index == 0
12
+ td= link_to resource.name, url_for([@owner, resource].compact)
13
+ - else
14
+ td= resource[key]
@@ -0,0 +1,4 @@
1
+ = simple_form_for([@owner, @resource].compact) do |f|
2
+ - @resource_permitted_params.each do |param|
3
+ = f.input param
4
+ = f.submit "Save"
@@ -0,0 +1,10 @@
1
+ h2= @resource.name
2
+
3
+ = link_to "Edit", url_for([:edit, @owner, @resource].compact)
4
+ = link_to "Delete", url_for([@owner, @resource].compact), method: :delete
5
+ = link_to "Back", controller: params[:controller], action: "index"
6
+
7
+ dl
8
+ - @resource.to_h.each do |key, value|
9
+ dt= key
10
+ dd= value
@@ -1,5 +1,34 @@
1
1
  require 'rapido/version'
2
2
  require 'rapido/controller'
3
+ require 'rapido/api_controller'
4
+ require 'rapido/app_controller'
5
+ require 'rapido/app_views'
6
+ require 'rapido/app_record_not_found'
7
+ require 'rapido/auth/api_key'
3
8
 
4
9
  module Rapido
10
+ class << self
11
+ attr_writer :configuration
12
+ end
13
+
14
+ class Configuration
15
+ attr_accessor :authority_class, :authority_lookup_param, :authority_lookup_field
16
+
17
+ def initialize
18
+ @authority_class = :account
19
+ @authority_lookup_param = :api_key
20
+ @authority_lookup_field = :api_key
21
+ end
22
+ end
23
+
24
+ class Engine < ::Rails::Engine
25
+ end
26
+
27
+ def self.configuration
28
+ @configuration ||= Configuration.new
29
+ end
30
+
31
+ def self.configure
32
+ yield(configuration)
33
+ end
5
34
  end
@@ -0,0 +1,50 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'active_support/rescuable'
4
+ require 'rapido/errors'
5
+
6
+ module Rapido
7
+ module ApiController
8
+ extend ActiveSupport::Concern
9
+
10
+ include Rapido::Errors
11
+
12
+ included do
13
+ rescue_from RecordNotFound do |e|
14
+ render json: { errors: [ e.to_s ] }, status: 404
15
+ end
16
+ end
17
+
18
+ def index
19
+ render json: resource_collection.map(&:to_h)
20
+ end
21
+
22
+ def show
23
+ render json: resource.to_h
24
+ end
25
+
26
+ def create
27
+ new_resource = build_resource
28
+ if new_resource.save
29
+ render json: new_resource.to_h, status: :created
30
+ else
31
+ render json: { errors: new_resource.errors.full_messages }, status: 422
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ resource_hsh = resource.to_h
37
+ resource.destroy
38
+ render json: resource_hsh
39
+ end
40
+
41
+ def update
42
+ resource.assign_attributes(resource_params)
43
+ if resource.save
44
+ render json: resource.to_h
45
+ else
46
+ render json: { errors: resource.errors.full_messages }, status: 422
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,95 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'rapido/errors'
4
+
5
+ module Rapido
6
+ module AppController
7
+ extend ActiveSupport::Concern
8
+ include Rapido::Errors
9
+
10
+ included do
11
+ before_action do
12
+ resource_permitted_params
13
+ end
14
+ end
15
+
16
+ def index
17
+ @resource_collection = resource_collection
18
+ end
19
+
20
+ def show
21
+ @resource = resource
22
+ end
23
+
24
+ def new
25
+ @resource = owner.send(resource_class_name.pluralize).new
26
+ end
27
+
28
+ def create
29
+ new_resource = build_resource
30
+ if new_resource.save
31
+ redirect_to after_create_path(new_resource)
32
+ else
33
+ flash[:error] = new_resource.errors.full_messages.join('. ')
34
+ redirect_to new_path
35
+ end
36
+ end
37
+
38
+ def destroy
39
+ resource.destroy
40
+ redirect_to after_delete_path(resource)
41
+ end
42
+
43
+ def edit
44
+ @resource = resource
45
+ end
46
+
47
+ def update
48
+ resource.assign_attributes(resource_params)
49
+ if resource.save
50
+ redirect_to after_update_path(resource)
51
+ else
52
+ flash[:error] = resource.errors.full_messages.join('. ')
53
+ resource.reload
54
+ redirect_to edit_path(resource)
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def resource_path(action, resource = nil)
61
+ keys = { controller: params[:controller], action: action }
62
+ keys[resource_lookup_param] = resource.send(resource_lookup_param) if resource
63
+ keys[owner_lookup_param] = owner.send(owner_lookup_field) if owner_lookup_param.present?
64
+ url_for(keys)
65
+ end
66
+
67
+ def edit_path(resource)
68
+ @edit_path ||= resource_path(:edit, resource)
69
+ end
70
+
71
+ def show_path(resource)
72
+ @show_path ||= resource_path(:show, resource)
73
+ end
74
+
75
+ def new_path
76
+ @new_path ||= resource_path(:new)
77
+ end
78
+
79
+ def index_path
80
+ @index_path ||= resource_path(:index)
81
+ end
82
+
83
+ def after_create_path(resource)
84
+ show_path(resource)
85
+ end
86
+
87
+ def after_update_path(resource)
88
+ show_path(resource)
89
+ end
90
+
91
+ def after_delete_path(*)
92
+ index_path
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,12 @@
1
+ module Rapido
2
+ module AppRecordNotFound
3
+ extend ActiveSupport::Concern
4
+ include Rapido::Errors
5
+
6
+ included do
7
+ rescue_from RecordNotFound do |e|
8
+ render file: 'public/404', status: :not_found, layout: false
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ module Rapido
2
+ module AppViews
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_action do
7
+ append_view_path (Rapido::Engine.root + 'app/views/rapido')
8
+ new_path
9
+ index_path
10
+ resource_class
11
+ end
12
+ end
13
+
14
+ class_methods do
15
+ def local_prefixes
16
+ [controller_path, 'app']
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,4 @@
1
+ module Rapido
2
+ module Auth
3
+ end
4
+ end
@@ -0,0 +1,41 @@
1
+ module Rapido
2
+ module Auth
3
+ module ApiKey
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_action :load_authority
8
+
9
+ rescue_from LackAuthority do |e|
10
+ render json: { error: 'Request denied.' }, status: 401
11
+ end
12
+ end
13
+
14
+ def authority_class
15
+ @authority_class ||=
16
+ Rapido.configuration.authority_class.to_s.camelize.constantize
17
+ end
18
+
19
+ def authority_lookup_param
20
+ @authority_lookup_param ||=
21
+ Rapido.configuration.authority_lookup_param
22
+ end
23
+
24
+ def authority_lookup_field
25
+ @authority_lookup_field ||=
26
+ Rapido.configuration.authority_lookup_field
27
+ end
28
+
29
+ def load_authority
30
+ @authority = authority_class.find_by(authority_lookup_field => params[authority_lookup_param])
31
+ raise LackAuthority unless @authority
32
+ end
33
+
34
+ def authority
35
+ @authority
36
+ end
37
+
38
+ class LackAuthority < StandardError; end
39
+ end
40
+ end
41
+ end
@@ -1,150 +1,173 @@
1
1
  require 'active_support'
2
2
  require 'active_support/core_ext'
3
- require 'active_support/rescuable'
3
+ require 'rapido/errors'
4
4
 
5
5
  module Rapido
6
6
  module Controller
7
7
  extend ActiveSupport::Concern
8
8
 
9
- included do
10
- rescue_from ActiveRecord::RecordNotFound do |e|
11
- render json: { errors: [ e.to_s ] }, status: 404
12
- end
13
- end
9
+ include Rapido::Errors
14
10
 
15
11
  class_methods do
16
- def resource_owner_name(name = nil)
17
- @resource_owner_name = name.to_s if name
18
- @resource_owner_name
12
+ def authority(sym)
13
+ @authority_getter = sym.to_sym
19
14
  end
20
- end
21
-
22
- def index
23
- render json: { resource_name.pluralize => resource_collection.map(&:to_h), meta: index_meta }
24
- end
25
15
 
26
- def show
27
- render json: resource.to_h
28
- end
16
+ def belongs_to(sym, opts = {})
17
+ @owner_class = sym.to_sym
18
+ return @owner_getter = opts[:getter] if opts[:getter]
19
+ return owner_lookup_defaults unless opts[:foreign_key]
20
+ @owner_lookup_field = opts[:foreign_key]
21
+ if opts[:foreign_key_param]
22
+ owner_lookup_param(opts[:foreign_key_param])
23
+ else
24
+ owner_lookup_param(@owner_class, opts[:foreign_key])
25
+ end
26
+ end
29
27
 
30
- def create
31
- new_resource = build_resource
32
- if new_resource.save
33
- render json: new_resource.to_h
34
- else
35
- render json: { errors: new_resource.errors.full_messages }, status: 422
28
+ def owner_lookup_defaults
29
+ owner_lookup_param(@owner_class, :id)
30
+ owner_lookup_field(:id)
36
31
  end
37
- end
38
32
 
39
- def destroy
40
- resource.destroy
41
- head :ok
42
- end
33
+ def owner_lookup_param(*args)
34
+ return @owner_lookup_param = str.to_sym if args.count == 1
35
+ @owner_lookup_param = args.join('_').to_sym
36
+ end
43
37
 
44
- def update
45
- resource.assign_attributes(resource_update_params)
46
- if resource.save
47
- render json: resource.to_h
48
- else
49
- render json: { errors: resource.errors.full_messages }, status: 422
38
+ def owner_lookup_field(str)
39
+ @owner_lookup_field = str.to_sym
50
40
  end
51
- end
52
41
 
53
- private
42
+ def resource_class(str)
43
+ @resource_class = str.to_sym
44
+ end
54
45
 
55
- def index_meta
56
- {
57
- pagination: {
58
- per_page: resource_collection.limit_value,
59
- total_pages: resource_collection.total_pages,
60
- total_objects: resource_collection.count,
61
- }
62
- }
46
+ def lookup_param(str)
47
+ @resource_lookup_param = str.to_sym
63
48
  end
64
49
 
65
- def resource_required_param
66
- resource_name.to_sym
50
+ def attr_permitted(*ary)
51
+ @resource_permitted_params = ary.map(&:to_sym)
67
52
  end
68
53
 
69
- def resource_create_permitted_params
70
- []
54
+ def free_from_authority!
55
+ @free_from_authority = true
71
56
  end
72
57
 
73
- def resource_update_permitted_params
74
- []
58
+ def permit_all_params!
59
+ @permit_all_params = true
75
60
  end
61
+ end
76
62
 
77
- def resource_update_params
78
- params
79
- .require(resource_required_param)
80
- .permit(resource_update_permitted_params)
63
+ private
64
+
65
+ def authority
66
+ @authority ||= begin
67
+ if setting(:free_from_authority)
68
+ nil
69
+ else
70
+ send(setting(:authority_getter))
71
+ end
72
+ end
81
73
  end
82
74
 
83
- def resource_create_params
84
- params
85
- .require(resource_required_param)
86
- .permit(resource_create_permitted_params)
75
+ def resource_permitted_params
76
+ @resource_permitted_params ||=
77
+ setting(:resource_permitted_params)
87
78
  end
88
79
 
89
- def build_resource_params
90
- {
91
- resource_owner_reference.to_sym => resource_owner.id
92
- }.merge(resource_create_params)
80
+ def resource_params
81
+ base = params.require(resource_class_name)
82
+ if setting(:permit_all_params)
83
+ base.permit!
84
+ else
85
+ base.permit(resource_permitted_params)
86
+ end
93
87
  end
94
88
 
95
89
  def build_resource
96
- resource_class.new(build_resource_params)
90
+ owner.send(resource_class_name.pluralize).new(resource_params)
97
91
  end
98
92
 
99
93
  def resource_collection
100
- resource_class
101
- .where("#{resource_owner_reference} = ?", resource_owner.id)
102
- .page(params[:page])
94
+ @resource_collection ||= begin
95
+ raise RecordNotFound unless owner
96
+ owner.send(resource_class_name.pluralize).page(params[:page])
97
+ end
98
+ end
99
+
100
+ def owner_class
101
+ @owner_class ||= begin
102
+ name = setting(:owner_class)
103
+ name.to_s.camelize.constantize
104
+ rescue NameError
105
+ raise BadOwnerClassName, name
106
+ end
103
107
  end
104
108
 
105
- def resource_owner_name
106
- return self.class.resource_owner_name if self.class.resource_owner_name
107
- @resource_owner_name ||= resource_owner.class.name.underscore
109
+ def owner_class_name
110
+ @owner_class_name ||= owner_class.name.downcase
108
111
  end
109
112
 
110
- def resource_owner_class
111
- @resource_owner_class ||= resource_owner_name.camelize.constantize
113
+ def owner_lookup_param
114
+ @owner_lookup_param ||=
115
+ setting(:owner_lookup_param).to_s
112
116
  end
113
117
 
114
- def resource_owner_reference
115
- "#{resource_owner_name}_id"
118
+ def owner_lookup_field
119
+ @owner_lookup_field ||=
120
+ (setting(:owner_lookup_field) || owner_lookup_param).to_s
116
121
  end
117
122
 
118
- def resource_owner
119
- @resource_owner ||= resource_owner_class.find(params[resource_owner_reference])
123
+ def owner
124
+ @owner ||= begin
125
+ if setting(:owner_getter)
126
+ send(setting(:owner_getter))
127
+ else
128
+ if setting(:free_from_authority)
129
+ base = owner_class
130
+ else
131
+ base = authority.send(owner_class_name.pluralize)
132
+ end
133
+ base.find_by!(owner_lookup_field => params[owner_lookup_param])
134
+ end
135
+ rescue ActiveRecord::RecordNotFound
136
+ raise RecordNotFound
137
+ end
120
138
  end
121
139
 
122
140
  def resource
123
- @resource ||=
124
- resource_class
125
- .where("#{resource_owner_reference} = ?", resource_owner.id)
126
- .find(params[:id])
141
+ @resource ||= begin
142
+ owner
143
+ .send(resource_class_name.pluralize)
144
+ .find_by!(resource_lookup_param => params[resource_lookup_param])
145
+ rescue ActiveRecord::RecordNotFound
146
+ raise RecordNotFound
147
+ end
127
148
  end
128
149
 
129
- def resource_reference
130
- "#{resource_name}_id"
150
+ def resource_lookup_param
151
+ @resource_lookup_param ||=
152
+ setting(:resource_lookup_param) || :id
131
153
  end
132
154
 
133
155
  def resource_class
134
156
  @resource_class ||=
135
- resource_controller_class.constantize
157
+ (setting(:resource_class) ||
158
+ resource_class_from_controller).to_s.camelize.constantize
136
159
  end
137
160
 
138
- def resource_name(name = nil)
139
- return @resource_name = name if name
140
- @resource_name ||= resource_controller_class.underscore
161
+ def resource_class_name(name = nil)
162
+ @resource_class_name ||= resource_class.name.underscore
141
163
  end
142
164
 
143
- def resource_controller_class
144
- @resource_controller_class ||=
145
- self.class.name.split('::')[-1].remove('Controller').singularize
165
+ def resource_class_from_controller
166
+ self.class.name.split('::')[-1].remove('Controller').singularize.underscore
146
167
  end
147
168
 
148
- class ResourceOwnerNameNotSpecified < StandardError; end
169
+ def setting(var)
170
+ self.class.instance_variable_get("@#{var}")
171
+ end
149
172
  end
150
173
  end
@@ -0,0 +1,8 @@
1
+ module Rapido
2
+ module Errors
3
+ class BadOwnerClassName < StandardError; end
4
+ class ResourceOwnerNameNotSpecified < StandardError; end
5
+ class RecordNotFound < StandardError; end
6
+ class AuthorityIsNotDefined < StandardError; end
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module Rapido
2
- VERSION = '0.1.0'
2
+ VERSION = '0.3.2'
3
3
  end
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
22
  spec.require_paths = ['lib']
23
23
 
24
+ spec.add_dependency 'kaminari', '~> 1.1'
24
25
  spec.add_development_dependency 'bundler', '~> 1.14'
25
26
  spec.add_development_dependency 'rake', '~> 10.0'
26
27
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-rapido
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Kirst
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-25 00:00:00.000000000 Z
11
+ date: 2017-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: kaminari
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.1'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,10 +66,21 @@ files:
52
66
  - Gemfile
53
67
  - README.md
54
68
  - Rakefile
69
+ - app/views/rapido/app/edit.slim
70
+ - app/views/rapido/app/index.slim
71
+ - app/views/rapido/app/new.slim
72
+ - app/views/rapido/app/show.slim
55
73
  - bin/console
56
74
  - bin/setup
57
75
  - lib/rapido.rb
76
+ - lib/rapido/api_controller.rb
77
+ - lib/rapido/app_controller.rb
78
+ - lib/rapido/app_record_not_found.rb
79
+ - lib/rapido/app_views.rb
80
+ - lib/rapido/auth.rb
81
+ - lib/rapido/auth/api_key.rb
58
82
  - lib/rapido/controller.rb
83
+ - lib/rapido/errors.rb
59
84
  - lib/rapido/version.rb
60
85
  - rapido.gemspec
61
86
  homepage: https://github.com/jskirst/rapido
@@ -78,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
103
  version: '0'
79
104
  requirements: []
80
105
  rubyforge_project:
81
- rubygems_version: 2.6.11
106
+ rubygems_version: 2.5.2
82
107
  signing_key:
83
108
  specification_version: 4
84
109
  summary: Rails API Dryer-o