repia 0.1.1 → 0.2.0

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: 48cc1f107f305100b05ac5988d7b423c39c59871
4
- data.tar.gz: d72b0acc3d21385ffceb17fd4da2b7e6779048ee
3
+ metadata.gz: 58b009fb035768295085359fa8691131240bc972
4
+ data.tar.gz: cca0b9c1a35e7c92a489fe24362cae9128a019a8
5
5
  SHA512:
6
- metadata.gz: 41f69c5cb1c7312a558da4e468a60cdcbdace45c11819a3410caa493e71096151d7f1fa3f4eaa161f973bb36c2082205f525b146fba10590baeac5d2ba1d0c6f
7
- data.tar.gz: d854fb71bcedadac0a6d28bb7b65cf26c0d40cc0e1178ca4aef7f8c47b19c450370f60a97c537289dafda9441c5c6cff1381595ddf99b0e3fd34f9e566306356
6
+ metadata.gz: 8ac3b531337a59b00877e1e80ef38cf046bb0131db0a053971b64f1dca261219872dfa72b74525424f3504fcac9c02e024978aad4082c78fcea595d9d6b676ae
7
+ data.tar.gz: e9a7c31828bdecbae836a3a53e9abba1c26ada136a7f046a53d21aa8fabbc2a92a4f55d14ce81dae5259a0843c5ac4e7ac7a4ccd0bf11fd30edf5ee4a4c4777b
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 David An
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # repia
2
+
3
+ [![Build Status](https://travis-ci.org/davidan1981/repia.svg?branch=master)](https://travis-ci.org/davidan1981/repia)
4
+ [![Coverage Status](https://coveralls.io/repos/github/davidan1981/repia/badge.svg?branch=master)](https://coveralls.io/github/davidan1981/repia?branch=master)
5
+ [![Code Climate](https://codeclimate.com/github/davidan1981/repia/badges/gpa.svg)](https://codeclimate.com/github/davidan1981/repia)
6
+ [![Gem Version](https://badge.fury.io/rb/repia.svg)](https://badge.fury.io/rb/repia)
7
+
8
+ Rails Essential Plug-in for API (or repia) is a Rails plugin that serves as
9
+ a collection of features that are useful for RESTful API development.
10
+
11
+ ## Install
12
+
13
+ Add `gem 'repia'` to your project `Gemfile`.
14
+
15
+ ## How to Use Repia
16
+
17
+ Edit `application_controller.rb` as the following:
18
+
19
+ class ApplicationController < Repia::BaseController
20
+ end
21
+
22
+ This will allow all controllers in the project to inherit from
23
+ `Repia::BaseController`, which gracefully handles all _code_ errors using
24
+ pre-defined HTTP errors.
25
+
26
+ Next, update all models that need UUID as a primary identifier:
27
+
28
+ class Something < ActiveRecord::Base
29
+ include Repia::UUIDModel
30
+ end
31
+
32
+ This will trigger UUID generation before a record object is created. Note
33
+ that migration must look similar to this:
34
+
35
+ class CreateSomethings < ActiveRecord::Migration
36
+ def change
37
+ create_table :somethings, id: false do |t|
38
+ t.string :uuid, primary_key: true, null: false
39
+ t.string :name
40
+ t.timestamps null: false
41
+ end
42
+ end
43
+ end
44
+
45
+ ## Middleware
46
+
47
+ When developing a JSON API, it is annoying to see non-JSON error responses
48
+ from a middleware. There are two prominent cases: `405 Method Not Allowed`
49
+ and `404 Not Found`. The former occurs when the request method is invalid
50
+ and the latter happens when the route does not match any controller or
51
+ action. Since these are caught within middleware, `rescue_from` does not
52
+ really help. So repia provides two useful components for this.
53
+
54
+ ### Method Not Allowed
55
+
56
+ This class is a middleware that can be inserted (preferrably after
57
+ `ActionDispatch::RequestId`) to catch 405 errors. Instead of using a view
58
+ template, it will return a simple JSON response with a status of 405.
59
+
60
+ ### Routing Error
61
+
62
+ Routing errors can be caught using `BaseController#exceptions_app`. To
63
+ configure it, add this to `config/application.rb`:
64
+
65
+ config.exceptions_app = lambda {|env| ApplicationController.action(:exceptions_app).call(env)}
66
+
67
+ *NOTE*: To enable this feature in development and in test,
68
+ `config/environments/development.rb` and `config/environments/test.rb` must
69
+ have
70
+
71
+ config.consider_all_requests_local = false
data/Rakefile CHANGED
@@ -28,6 +28,7 @@ Rake::TestTask.new(:test) do |t|
28
28
  t.libs << 'test'
29
29
  t.pattern = 'test/**/*_test.rb'
30
30
  t.verbose = false
31
+ t.warning = false
31
32
  end
32
33
 
33
34
 
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+ require 'repia/errors'
3
+ require 'repia/base_helper'
4
+
5
+ module Repia
6
+
7
+ ##
8
+ # This controller is a base controller for RESTful API. Two primary
9
+ # features:
10
+ #
11
+ # - Error (exception) handling
12
+ # - Options request handling
13
+ #
14
+ class BaseController < ActionController::Base
15
+ include BaseHelper
16
+
17
+ # This is a catch-all.
18
+ rescue_from StandardError do |exception|
19
+ logger.error exception.message
20
+ render_error 500, "Unknown error occurred: #{exception.message}"
21
+ end
22
+
23
+ # Catch all manually thrown HTTP errors (predefined by repia)
24
+ rescue_from Errors::HTTPError do |exception|
25
+ status_code = exception.class.const_get("STATUS_CODE")
26
+ message = exception.message || exception.class::MESSAGE
27
+ logger.error "#{status_code} - #{message}"
28
+ render_error status_code, message
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -1,41 +1,26 @@
1
- require 'json'
2
1
  require 'repia/errors'
3
2
 
4
3
  module Repia
5
4
 
6
5
  ##
7
- # This module is a mixin that allows the model to use UUIDs instead of
8
- # normal IDs. By including this module, the model class declares that the
9
- # primary key is called "uuid" and an UUID is generated right before
10
- # save(). You may assign an UUID prior to save, in which case, no new UUID
11
- # will be generated.
6
+ # This helper module includes methods that are essential for building a
7
+ # RESTful API.
12
8
  #
13
- module UUIDModel
14
-
15
- ##
16
- # Triggered when this module is included.
17
- #
18
- def self.included(klass)
19
- klass.primary_key = "uuid"
20
- klass.before_create :generate_uuid
21
- end
22
-
23
- ##
24
- # Generates an UUID for the model object.
25
- #
26
- def generate_uuid()
27
- self.uuid = UUIDTools::UUID.timestamp_create().to_s if self.uuid.nil?
28
- end
29
- end
30
-
31
9
  module BaseHelper
32
10
 
33
11
  ##
34
12
  # Use this as an action triggered by exceptions_app to return a JSON
35
- # response to any middleware level exceptions
13
+ # response to any middleware level exceptions.
14
+ #
15
+ # For example,
16
+ #
17
+ # config.exceptions_app = lambda { |env|
18
+ # ApplicationController.action(:exceptions_app).call(env)
19
+ # }
36
20
  #
37
21
  def exceptions_app
38
- status = ActionDispatch::ExceptionWrapper.new(env, @exception).status_code.to_i
22
+ ex_wrapper = ActionDispatch::ExceptionWrapper.new(Rails.env, @exception)
23
+ status = ex_wrapper.status_code.to_i
39
24
  error = Errors::STATUS_CODE_TO_ERROR[status]
40
25
  if error
41
26
  message = error::MESSAGE
@@ -76,6 +61,7 @@ module Repia
76
61
  render json: {errors: msgs}, status: status
77
62
  end
78
63
 
64
+ # undef :find_object if method_defined? :find_object
79
65
  ##
80
66
  # Finds an object by model and UUID and throws an error (which will be
81
67
  # caught and re-thrown as an HTTP error) if the object does not exist.
@@ -94,31 +80,4 @@ module Repia
94
80
  end
95
81
 
96
82
  end
97
-
98
- ##
99
- # This controller is a base controller for RESTful API. Two primary
100
- # features:
101
- #
102
- # - Error (exception) handling
103
- # - Options request handling
104
- #
105
- class BaseController < ActionController::Base
106
- include BaseHelper
107
-
108
- # This is a catch-all.
109
- rescue_from StandardError do |exception|
110
- logger.error exception.message
111
- render_error 500, "Unknown error occurred: #{exception.message}"
112
- end
113
-
114
- # Catch all manually thrown HTTP errors (predefined by repia)
115
- rescue_from Errors::HTTPError do |exception|
116
- status_code = exception.class.const_get("STATUS_CODE")
117
- message = exception.message || exception.class::MESSAGE
118
- logger.error "#{status_code} - #{message}"
119
- render_error status_code, message
120
- end
121
-
122
- end
123
-
124
83
  end
@@ -0,0 +1,28 @@
1
+
2
+ module Repia
3
+
4
+ ##
5
+ # This module is a mixin that allows the model to use UUIDs instead of
6
+ # normal IDs. By including this module, the model class declares that the
7
+ # primary key is called "uuid" and an UUID is generated right before
8
+ # save(). You may assign an UUID prior to save, in which case, no new UUID
9
+ # will be generated.
10
+ #
11
+ module UUIDModel
12
+
13
+ ##
14
+ # Triggered when this module is included.
15
+ #
16
+ def self.included(klass)
17
+ klass.primary_key = "uuid"
18
+ klass.before_create :generate_uuid
19
+ end
20
+
21
+ ##
22
+ # Generates an UUID for the model object.
23
+ #
24
+ def generate_uuid()
25
+ self.uuid = UUIDTools::UUID.timestamp_create().to_s if self.uuid.nil?
26
+ end
27
+ end
28
+ end
data/lib/repia/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Repia
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/repia.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'repia/errors'
2
2
  require 'repia/middlewares'
3
- require 'repia/core'
3
+ require 'repia/uuid_model'
4
+ require 'repia/base_helper'
5
+ require 'repia/base_controller'
4
6
 
5
7
  module Repia
6
8
  end
@@ -1,3 +1,4 @@
1
1
  class UniqueModel < ActiveRecord::Base
2
2
  include Repia::UUIDModel
3
3
  end
4
+
@@ -20,7 +20,7 @@ module Dummy
20
20
  # config.i18n.default_locale = :de
21
21
 
22
22
  # Do not swallow errors in after_commit/after_rollback callbacks.
23
- config.active_record.raise_in_transactional_callbacks = true
23
+ # config.active_record.raise_in_transactional_callbacks = true
24
24
  end
25
25
  end
26
26
 
@@ -13,8 +13,8 @@ Rails.application.configure do
13
13
  config.eager_load = false
14
14
 
15
15
  # Configure static file server for tests with Cache-Control for performance.
16
- config.serve_static_files = true
17
- config.static_cache_control = 'public, max-age=3600'
16
+ config.public_file_server.enabled = true
17
+ config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
18
18
 
19
19
  # Show full error reports and disable caching.
20
20
  config.consider_all_requests_local = true