carbonyte 0.1.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 +7 -0
- data/README.md +22 -0
- data/Rakefile +21 -0
- data/app/controllers/carbonyte/application_controller.rb +7 -0
- data/app/controllers/carbonyte/concerns/rescuable.rb +61 -0
- data/app/interactors/carbonyte/application_interactor.rb +8 -0
- data/app/interactors/carbonyte/finders/application_finder.rb +68 -0
- data/app/models/carbonyte/application_record.rb +8 -0
- data/app/serializers/carbonyte/application_serializer.rb +40 -0
- data/config/routes.rb +4 -0
- data/lib/carbonyte.rb +7 -0
- data/lib/carbonyte/engine.rb +8 -0
- data/lib/carbonyte/version.rb +6 -0
- data/lib/tasks/carbonyte_tasks.rake +5 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f88398d2111a4b6f2423dd798eb0d629fb7e9f78b54d49eea3b6fe28d60590ef
|
4
|
+
data.tar.gz: ddf8b9fe408fa7f2fa8b85bdc7157db5bfd07aa17fb165d68c76c7e7148b6d6e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7875ec1d6d77312e7d7a0ad4f9f2db33aae0db243ca0d4d9edcb55ec4d90816d94027821d6e7abeb9a06757064da42a84fccb9becb8097cbea19fe0f9047733c
|
7
|
+
data.tar.gz: 5ff2e50321cb295d0726465488d2094152c30c63849c5af32bfb2a4b17dd70bb573a595d53d0d9a2306b42a54ff4c5ce8d371602728997515cc84df2e8ef55ab
|
data/README.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Carbonyte
|
2
|
+
Build Microservices-oriented Architectures with ease.
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
Add this line to your microservice Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'carbonyte'
|
9
|
+
```
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
```bash
|
13
|
+
$ bundle
|
14
|
+
```
|
15
|
+
|
16
|
+
## Usage
|
17
|
+
TBD
|
18
|
+
|
19
|
+
## Contributing
|
20
|
+
Before pushing:
|
21
|
+
* Run `rubocop` to show code styles offences
|
22
|
+
* Run `inch` to show documentation state
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
rescue LoadError
|
6
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'rdoc/task'
|
10
|
+
|
11
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
12
|
+
rdoc.rdoc_dir = 'rdoc'
|
13
|
+
rdoc.title = 'Carbonyte'
|
14
|
+
rdoc.options << '--line-numbers'
|
15
|
+
rdoc.rdoc_files.include('README.md')
|
16
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
17
|
+
end
|
18
|
+
|
19
|
+
load 'rails/tasks/statistics.rake'
|
20
|
+
|
21
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Carbonyte
|
4
|
+
# The Rescuable concern rescues controllers from bubbling up the most common exceptions
|
5
|
+
# and provides a uniformed response body in case of such errors.
|
6
|
+
# @see https://jsonapi.org/format/#error-objects
|
7
|
+
module Rescuable
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
rescue_from Pundit::NotAuthorizedError, with: :unauthorized
|
12
|
+
rescue_from Interactor::Failure, with: :interactor_failure
|
13
|
+
rescue_from ActiveRecord::RecordInvalid, with: :record_invalid
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def serialized_errors(payload)
|
19
|
+
payload = [payload] unless payload.is_a?(Enumerable)
|
20
|
+
payload.to_json
|
21
|
+
end
|
22
|
+
|
23
|
+
def unauthorized(exc)
|
24
|
+
payload = {
|
25
|
+
code: exc.class.name,
|
26
|
+
source: { policy: exc.policy.class.name },
|
27
|
+
title: 'Not Authorized By Policy',
|
28
|
+
detail: exc.message
|
29
|
+
}
|
30
|
+
render json: serialized_errors(payload), status: :unauthorized
|
31
|
+
end
|
32
|
+
|
33
|
+
def interactor_failure(exc)
|
34
|
+
payload = {
|
35
|
+
code: exc.class.name,
|
36
|
+
source: { interactor: exc.context._called.last.class.name },
|
37
|
+
title: 'Interactor Failure',
|
38
|
+
detail: exc.context.error
|
39
|
+
}
|
40
|
+
render json: serialized_errors(payload), status: :unprocessable_entity
|
41
|
+
end
|
42
|
+
|
43
|
+
def record_invalid(exc)
|
44
|
+
payload = errors_for_record(exc.record, exc.class.name).flatten
|
45
|
+
render json: serialized_errors(payload), status: :unprocessable_entity
|
46
|
+
end
|
47
|
+
|
48
|
+
def errors_for_record(record, code)
|
49
|
+
record.messages.map do |field, errors|
|
50
|
+
errors.map do |error_message|
|
51
|
+
{
|
52
|
+
code: code,
|
53
|
+
source: { pointer: "attributes/#{field}" },
|
54
|
+
title: 'Invalid Field ',
|
55
|
+
detail: error_message
|
56
|
+
}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Carbonyte
|
4
|
+
# Carbonyte module for Finders.
|
5
|
+
# Finders are Interactors whose main task is to build a query
|
6
|
+
module Finders
|
7
|
+
# Carbonyte base class for all finders interactors.
|
8
|
+
# Finders are used to build queries based on parameters
|
9
|
+
class ApplicationFinder < ApplicationInteractor
|
10
|
+
# Default limit for pagination
|
11
|
+
DEFAULT_LIMIT = 25
|
12
|
+
|
13
|
+
# Starts building the query (:scope)
|
14
|
+
#
|
15
|
+
# @option context:params [Hash] the parameters used to build the query scope
|
16
|
+
# @option context:params:include [String] a comma-separated list of relations to include
|
17
|
+
# @option context:params:sort [String] a comma-separated list of columns to use to sort.
|
18
|
+
# If the "-" prefix is provided then the sort will be descending, ascending otherwise
|
19
|
+
# @option context:params:limit [Integer] the number of items per page.
|
20
|
+
# Defaults to +DEFAULT_LIMIT+
|
21
|
+
# @option context:params:page [Integer] the page to load. Defaults to 1
|
22
|
+
def call
|
23
|
+
include_relations if context.params[:include].present?
|
24
|
+
sort if context.params[:sort].present?
|
25
|
+
paginate
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
# Returns true if the provided relation can be included
|
31
|
+
# @param _rel [Symbol] the relation to include
|
32
|
+
def can_include?(_rel)
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def include_relations
|
39
|
+
context.params[:include].split(',').each do |relation|
|
40
|
+
next unless can_include?(relation)
|
41
|
+
|
42
|
+
context.scope = context.scope.includes(relation)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def sort_properties
|
47
|
+
context.params[:sort].split(',')
|
48
|
+
end
|
49
|
+
|
50
|
+
def sort_exp(prop)
|
51
|
+
return prop unless prop.start_with?('-')
|
52
|
+
|
53
|
+
{ prop[1..] => :desc }
|
54
|
+
end
|
55
|
+
|
56
|
+
def sort
|
57
|
+
sort_properties.each do |prop|
|
58
|
+
context.scope = context.scope.order(sort_exp(prop))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def paginate
|
63
|
+
context.scope = context.scope.limit(context.params[:limit] || DEFAULT_LIMIT)
|
64
|
+
context.scope = context.scope.page(context.params[:page] || 1)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Carbonyte
|
4
|
+
# Carbonyte base class for all serializers
|
5
|
+
class ApplicationSerializer
|
6
|
+
include JSONAPI::Serializer
|
7
|
+
|
8
|
+
# Initializes the serializer.
|
9
|
+
# @param resource [Object] the resource(s) to serialize
|
10
|
+
# @param options [Hash] the serializer options.
|
11
|
+
# @see https://github.com/jsonapi-serializer/jsonapi-serializer/blob/master/README.md
|
12
|
+
def initialize(resource, options = {})
|
13
|
+
parse_options(resource, options)
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# Adds additional options automatically based on the resource
|
20
|
+
def parse_options(resource, options)
|
21
|
+
resource_options = if resource.is_a?(Enumerable)
|
22
|
+
options_for_list(resource)
|
23
|
+
else
|
24
|
+
options_for_object(resource)
|
25
|
+
end
|
26
|
+
options.merge!(resource_options)
|
27
|
+
end
|
28
|
+
|
29
|
+
# For collections, the :meta option will be added to support pagination
|
30
|
+
def options_for_list(list)
|
31
|
+
options = {}
|
32
|
+
options[:meta] = { total: list.total_entries } if list.respond_to?(:total_entries)
|
33
|
+
options
|
34
|
+
end
|
35
|
+
|
36
|
+
def options_for_object(_resource)
|
37
|
+
{}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/config/routes.rb
ADDED
data/lib/carbonyte.rb
ADDED
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: carbonyte
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- iMacTia
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-08-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: interactor-rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jsonapi-serializer
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pundit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.1'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 6.0.3
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 6.0.3.2
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - "~>"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 6.0.3
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 6.0.3.2
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: inch
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.8.0
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.8.0
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rspec-rails
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '4.0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '4.0'
|
103
|
+
description: Carbonyte is the core of great Microservices-oriented Architectures.
|
104
|
+
email:
|
105
|
+
- giuffrida.mattia@gmail.com
|
106
|
+
executables: []
|
107
|
+
extensions: []
|
108
|
+
extra_rdoc_files: []
|
109
|
+
files:
|
110
|
+
- README.md
|
111
|
+
- Rakefile
|
112
|
+
- app/controllers/carbonyte/application_controller.rb
|
113
|
+
- app/controllers/carbonyte/concerns/rescuable.rb
|
114
|
+
- app/interactors/carbonyte/application_interactor.rb
|
115
|
+
- app/interactors/carbonyte/finders/application_finder.rb
|
116
|
+
- app/models/carbonyte/application_record.rb
|
117
|
+
- app/serializers/carbonyte/application_serializer.rb
|
118
|
+
- config/routes.rb
|
119
|
+
- lib/carbonyte.rb
|
120
|
+
- lib/carbonyte/engine.rb
|
121
|
+
- lib/carbonyte/version.rb
|
122
|
+
- lib/tasks/carbonyte_tasks.rake
|
123
|
+
homepage: https://github.com/iMacTia/carbonyte
|
124
|
+
licenses:
|
125
|
+
- Copyright
|
126
|
+
metadata: {}
|
127
|
+
post_install_message:
|
128
|
+
rdoc_options: []
|
129
|
+
require_paths:
|
130
|
+
- lib
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
requirements: []
|
142
|
+
rubygems_version: 3.1.2
|
143
|
+
signing_key:
|
144
|
+
specification_version: 4
|
145
|
+
summary: Build Microservices-oriented Architectures with ease
|
146
|
+
test_files: []
|