blacksheep 0.1.0 → 0.3.1

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
  SHA256:
3
- metadata.gz: 5e39f0b5524839016bc9a6811e51257f49a2d5f00cf42d3d9fe07ab01de6b602
4
- data.tar.gz: c0d169df550b722a11ffa2aaf7ea0ef5657f3c64ad5f7b8b6ac2c10419ba7ef0
3
+ metadata.gz: 7e104e67c03822bfb437736bf0beb1dca0cb9c4ced32a3027c359193cf730573
4
+ data.tar.gz: 6bff8f6260ab533267122865740890643bc1cd2e59870cfb48bc85c47fb8a8d3
5
5
  SHA512:
6
- metadata.gz: 589637c6979dbaebe1756f95ebe0038a7b707059b4a809f56d1d6575bbd4b5e2f8822bb54815e93491f0517b22a71ccb06d690da05b5396ea30fbe6c9acabb59
7
- data.tar.gz: b12064a64112255dc2b75aacf1a3ff2245131c96ccd5a12a863242e5642c10d97096f19010981c97b53940a905988bffd04508d77f337846e24dded666e874de
6
+ metadata.gz: 34aed33d507dec1a11a3b372bb8fcb5cc5d824ea213e512ef2b5ecc27f5e89cb3550d1c1b6e6d0a02c7a4bd380a103373ad30e4a4317d48cc75287633be22ba5
7
+ data.tar.gz: 3b95215a11cc3f7937f3db323de40596d15839adc87e644eb2cf7a99e79f621c687faa45f4b62446212280e3b13b8750951147e29968018a69b55da446ff3861
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- blacksheep (0.1.0)
4
+ blacksheep (0.3.1)
5
5
  dry-matcher
6
6
 
7
7
  GEM
@@ -38,4 +38,4 @@ DEPENDENCIES
38
38
  rspec (~> 3.0)
39
39
 
40
40
  BUNDLED WITH
41
- 1.17.2
41
+ 1.17.3
data/README.md CHANGED
@@ -22,7 +22,108 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ ### Actions
26
+
27
+ Core of blacksheep is the `Blacksheep::Action`. It provides basic functionality to handle rest API actions - but can handle other actions as well. The core methods of actions are:
28
+
29
+ * #perform with a block that implements the action
30
+ * #call on an action instance for processing and a potential block for result matching (see dcorators below).
31
+
32
+ `#perform` takes a block that is executed with the params passed. #perform has the following api:
33
+ `#perform(params, current_user: (default to nil), **options)`
34
+
35
+ `#call` can be used when a Blacksheep::Action is sublassed as an action processing its opertation in a call method with the same signature of `#perform`. When using the `ResultMatcher` decorator a block can be used for result matching.
36
+
37
+
38
+ ```ruby
39
+ #perform sample
40
+ action_result = Blacksheep::Action.new.perform(params) do |params|
41
+ # do somethin with the params that return a `Blacksheep::ActionResult`
42
+ end
43
+
44
+ #call sample
45
+ action_result = MyAction.new.call(params, current_user: current_user)
46
+ ```
47
+
48
+ `Blacksheeep::ActionResult` has a data and a status attribute. In case of json api actions its expected to store a json response into the data attribute, and the respective http status into the status attribute.
49
+
50
+
51
+ ### Decorators
52
+
53
+ This alone does not give any benefit. Modifying the action with decorators adds additional functionality:
54
+
55
+ * `JsonTransformer`
56
+ * `Localizer`
57
+ * `DefaultErrorHandler`
58
+ * `ResultMatcher`
59
+
60
+ The decaorators can be configured globally by defining them in an initializer.
61
+
62
+ ```ruby
63
+ # Defining decorator wheras innermost is first
64
+ Blacksheep::Action.add_decorator(Blacksheep::Decorators::Localizer)
65
+ Blacksheep::Action.add_decorator(Blacksheep::Decorators::DefaultErrorHandler)
66
+ Blacksheep::Action.add_decorator(Blacksheep::Decorators::JsonTransformer)
67
+ Blacksheep::Action.add_decorator(Blacksheep::Decorators::ResultMatcher)
68
+ ```
69
+
70
+ #### Blacksheep::Decorators::Localizer
71
+
72
+ A localizer sets the I18n locale when passed in a request parameter named `_locale`.
73
+
74
+
75
+ #### Blacksheep::Decorators::DefaultErrorHandler
76
+
77
+ A default error handler can be used in API opertions. The handler catches an error and returns an ActionResult such as…
78
+
79
+ ```ruby
80
+ def handle_exception(exception)
81
+ json = {
82
+ errors: [
83
+ pointer: {
84
+ source: 'Internal'
85
+ },
86
+ title: "#{exception.class}",
87
+ detail: "#{exception.message}",
88
+ ]
89
+ }
90
+ status = :internal_server_error # 500
91
+
92
+ ActionResult.new(json, status)
93
+ end
94
+ ```
95
+
96
+ You can write your own ErrorHandler by including the module `Blacksheep::Decorators::ErrorHandler` and implementing the method `#handle_exception(<Exception>)`.
97
+
98
+
99
+ #### Blacksheep::Decorators::JsonTransformer
100
+
101
+ Assuming the params is a json payload with a specific caseing (e.g. camelCase when used in a JS application such as Vue) the JsonTransfomer takes the params and transforms it's keys into snake_case as used in ruby often.
102
+ The request has to define the case passed (and hence desired response casing) in the parameter `_case`. If the case is requests as `camel` then parameter keys are transformed to `snake_case` before beeing passed into the action and are transformed back into CamelCase when leaving the operation.
103
+
104
+ If JsonTransfomer is used the action should return a simple JSON structure which is transfformed and stored in an ActionResult.
105
+
106
+
107
+ #### Blacksheep::Decorators::ResultMatcher
108
+
109
+ This decorator can be used when implementing your own actions by subclassing `Blacksheep::Action` and using the `#call` style for processing. Adding the `ResultMatcher` decorator enables to write a matcher block such as…
110
+
111
+ ```ruby
112
+ MyAction.new.call(params) do |m|
113
+ m.success do |action_result|
114
+ # do something in success case
115
+ end
116
+ m.failure :unauthorized do |action_result|
117
+ # special handling for unauthorized access
118
+ end
119
+ m.failure do |v|
120
+ # any other failure
121
+ end
122
+ end
123
+ ```
124
+
125
+ The action has to return a Blacksheep::ActionResult which is checked for status `:ok` for success case and any other status in failure case.
126
+
26
127
 
27
128
  ## Development
28
129
 
@@ -30,6 +131,11 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
30
131
 
31
132
  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).
32
133
 
134
+ ```
135
+ gem build blacksheep
136
+ gem push blacksheep-0.x.y.gem
137
+ ``
138
+
33
139
  ## Contributing
34
140
 
35
141
  Bug reports and pull requests are welcome on GitHub at https://github.com/verticonaut/blacksheep.
data/blacksheep.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
19
  if spec.respond_to?(:metadata)
20
20
  spec.metadata["homepage_uri"] = spec.homepage
21
- # spec.metadata["source_code_uri"] = "Put your gem's public repo URL here."
21
+ spec.metadata["source_code_uri"] = "https://github.com/verticonaut/blacksheep"
22
22
  # spec.metadata["changelog_uri"] = "Put your gem's CHANGELOG.md URL here."
23
23
  else
24
24
  raise "RubyGems 2.0 or newer is required to protect against " \
data/lib/blacksheep.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  require "blacksheep/version"
2
- require "blacksheep/json_meta"
3
- require "blacksheep/json_result"
2
+ require "blacksheep/action_result"
3
+ require "blacksheep/action_error"
4
4
  require "blacksheep/action_decorator"
5
+ require "blacksheep/decorators/error_handler"
5
6
  require "blacksheep/decorators/default_error_handler"
6
7
  require "blacksheep/decorators/json_transformer"
7
8
  require "blacksheep/decorators/result_matcher"
9
+ require "blacksheep/decorators/localizer"
8
10
  require "blacksheep/action"
9
11
  require "blacksheep/version"
10
12
 
@@ -28,11 +28,16 @@ module Blacksheep
28
28
  @@decorators ||= []
29
29
  end
30
30
 
31
+ #
32
+ # Adds a decorator to the list of decorated to be applied on Balcksheep::Actions
33
+ # @param decorator [type] [description]
34
+ #
35
+ # @return [type] [description]
31
36
  def add_decorator(decorator)
32
- decorators << decorator
37
+ decorators << decorator unless decorators.include?(decorator)
33
38
  end
34
39
 
35
- def new(*)
40
+ def new(*arguments, &block)
36
41
  instance = super
37
42
 
38
43
  decorators.each do |decorator|
@@ -57,8 +62,8 @@ module Blacksheep
57
62
  block.call(params)
58
63
  end
59
64
 
60
- def json_result(json, status: :ok)
61
- JsonResult.new(json, status)
65
+ def action_result(data, status: :ok)
66
+ ActionResult.new(data, status)
62
67
  end
63
68
 
64
69
  end
@@ -1,9 +1,29 @@
1
1
  require 'delegate'
2
2
 
3
3
  module Blacksheep
4
+ # @class Blacksheep::ActionDecorator
4
5
  class ActionDecorator < SimpleDelegator
6
+
7
+ # Access to the decorators class - since original class is overwritten to return the model class.
8
+ #
9
+ # @return [Class] The class of the deocrator.
10
+ # @see [#class]
11
+ alias_method :__class__, :class
12
+
5
13
  def class
6
14
  __getobj__.class
7
15
  end
16
+
17
+ #
18
+ # Just for curiosity - get the decorators chain
19
+ #
20
+ # @return [type] [description]
21
+ def decorators_chain
22
+ decorated = __getobj__
23
+ chain = decorated.kind_of?(Blacksheep::ActionDecorator) ? decorated.decorators_chain : [ decorated.class ]
24
+
25
+ chain.unshift(self.__class__)
26
+ end
27
+
8
28
  end
9
29
  end
@@ -0,0 +1,15 @@
1
+ module Blacksheep
2
+ #
3
+ # @class Blacksheep::ActionError
4
+ class ActionError < StandardError
5
+ attr_reader :identifier, :title
6
+
7
+ def initialize(message, title: 'Error', identifier: 'undefined')
8
+ @identifier = identifier
9
+ @title = title
10
+
11
+ super(message)
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,70 @@
1
+ module Blacksheep
2
+ class ActionResult
3
+
4
+ attr_reader :data, :status
5
+
6
+ def initialize(data, status)
7
+ @data = data
8
+ @status = status
9
+ end
10
+
11
+ class << self
12
+ def success(message)
13
+ json = {
14
+ _meta: {
15
+ message: message
16
+ }
17
+ }
18
+
19
+ new(json, :ok)
20
+ end
21
+
22
+ def error(title: 'Error', message:, status: :internal_server_error, pointer: 'unspecified')
23
+ json = {
24
+ errors: [
25
+ pointer: {
26
+ source: pointer
27
+ },
28
+ title: title,
29
+ detail: message,
30
+ ]
31
+ }
32
+ status = :internal_server_error
33
+
34
+ new(json, status)
35
+ end
36
+ end
37
+
38
+ def set_data(value)
39
+ @data = value
40
+
41
+ self
42
+ end
43
+
44
+ def set_status(value)
45
+ @status = value
46
+
47
+ self
48
+ end
49
+
50
+ def success?
51
+ @status == :ok
52
+ end
53
+
54
+ def render_json(json_wrap: 'data')
55
+ {
56
+ json: wrap(@data, json_wrap: json_wrap),
57
+ status: status
58
+ }
59
+ end
60
+
61
+ private
62
+
63
+ def wrap(json, json_wrap:)
64
+ wrap = success? ? json_wrap : nil
65
+
66
+ wrap.present? ? { wrap => json } : json
67
+ end
68
+
69
+ end
70
+ end
@@ -2,83 +2,61 @@ module Blacksheep
2
2
  module Decorators
3
3
  # @class Blacksheep::Decorators::DefaultErrorHandler
4
4
  class DefaultErrorHandler < ActionDecorator
5
-
6
- def call(*)
7
- puts error_handler: "*" * 50
8
- super
9
- rescue => exception
10
- handle(exception)
11
- end
12
-
13
- def perform(*)
14
- super
15
- rescue => exception
16
- handle(exception)
17
- end
5
+ include ErrorHandler
18
6
 
19
7
  def handle(exception)
20
- json = status = nil
8
+ json = nil
9
+ status = :internal_server_error
10
+
11
+ case exception
12
+ when Blacksheep::ActionError
13
+ json = {
14
+ errors: [
15
+ pointer: {
16
+ source: exception.backtrace.first,
17
+ identifier: exception.identifier,
18
+ },
19
+ title: exception.title,
20
+ detail: exception.message,
21
+ ]
22
+ }
21
23
 
22
- # case exception
23
- # when Exceptions::ValidationException
24
- # errors = []
25
- # exception.model.errors.each do |attribute, message|
26
- # errors << {
27
- # title: "'#{attribute}' validation error",
28
- # detail: message,
29
- # }
30
- # end
31
- # json = {
32
- # errors: errors
33
- # }
34
- # status = :unprocessable_entity # 422
35
- # when Pundit::NotAuthorizedError
36
- # json = {
37
- # errors: [
38
- # pointer: {
39
- # source: not_authorized_pointer(exception)
40
- # },
41
- # title: "#{exception.class}",
42
- # detail: "#{exception.message}",
43
- # ]
44
- # }
45
- # status = :unauthorized # 401
46
- # when Exceptions::AuthenticationInvalid
47
- # json = {
48
- # errors: [
49
- # pointer: {
50
- # source: 'Secured Module'
51
- # },
52
- # title: "#{exception.class}",
53
- # detail: "#{exception.message}",
54
- # ]
55
- # }
56
- # status = :unauthorized # 401
57
- # else
58
- # json = {
59
- # errors: [
60
- # pointer: {
61
- # source: 'Internal'
62
- # },
63
- # title: "#{exception.class}",
64
- # detail: "#{exception.message}",
65
- # ]
66
- # }
67
- # status = :internal_server_error # 500
68
- # end
24
+ # when Pundit::NotAuthorizedError
25
+ # json = {
26
+ # errors: [
27
+ # pointer: {
28
+ # source: not_authorized_pointer(exception)
29
+ # },
30
+ # title: "#{exception.class}",
31
+ # detail: "#{exception.message}",
32
+ # ]
33
+ # }
34
+ # status = :unauthorized # 401
35
+ # when Exceptions::AuthenticationInvalid
36
+ # json = {
37
+ # errors: [
38
+ # pointer: {
39
+ # source: 'Secured Module'
40
+ # },
41
+ # title: "#{exception.class}",
42
+ # detail: "#{exception.message}",
43
+ # ]
44
+ # }
45
+ # status = :unauthorized # 401
69
46
 
70
- json = {
71
- errors: [
72
- pointer: {
73
- source: 'Internal'
74
- },
75
- title: "#{exception.class}",
76
- detail: "#{exception.message}",
77
- ]
78
- }
79
- status = :internal_server_error # 500
47
+ else
48
+ json = {
49
+ errors: [
50
+ pointer: {
51
+ source: 'Internal'
52
+ },
53
+ title: "#{exception.class}",
54
+ detail: "#{exception.message}",
55
+ ]
56
+ }
57
+ end
80
58
 
81
- JsonResult.new(json, status)
59
+ ActionResult.new(json, status)
82
60
  end
83
61
 
84
62
  # def not_authorized_pointer(exception)
@@ -0,0 +1,24 @@
1
+ module Blacksheep
2
+ module Decorators
3
+ # @module Blacksheep::Decorators::ErrorHandler
4
+ module ErrorHandler
5
+
6
+ def call(*)
7
+ super
8
+ rescue => exception
9
+ handle(exception)
10
+ end
11
+
12
+ def perform(*)
13
+ super
14
+ rescue => exception
15
+ handle(exception)
16
+ end
17
+
18
+ def handle(exception)
19
+ raise Blacksheep::Error, 'Subclass responsibility'
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -5,28 +5,28 @@ module Blacksheep
5
5
 
6
6
  attr_reader :case, :params
7
7
 
8
- def call(params, **options)
9
- puts transformer: "*" * 50
8
+ def call(params, current_user: nil, **options)
10
9
  detect_case(params)
11
10
 
12
- transformed_params = self.transformed_params(params)
11
+ transformed_params = self.transform_params(params)
13
12
 
14
13
  json = super(transformed_params, **options)
15
14
 
16
15
  transformed_json = transform_result(json)
17
16
 
18
- JsonResult.new(transformed_json, :ok)
17
+ ActionResult.new(transformed_json, :ok)
19
18
  end
20
19
 
21
20
  def perform(params, current_user: nil, **options, &block)
22
21
  detect_case(params)
23
22
 
24
- transformed_params = self.transformed_params(params)
23
+ transformed_params = self.transform_params(params)
24
+
25
+ json = super(transformed_params, current_user: current_user, **options, &block)
25
26
 
26
- json = block.call(transformed_params)
27
27
  transformed_json = transform_result(json)
28
28
 
29
- JsonResult.new(transformed_json, :ok)
29
+ ActionResult.new(transformed_json, :ok)
30
30
  end
31
31
 
32
32
 
@@ -35,14 +35,14 @@ module Blacksheep
35
35
  #
36
36
  # @return [Array, Hash] The params converted into snake_case
37
37
  # @see #snakecase_keys
38
- def transformed_params(params)
38
+ def transform_params(params)
39
39
  case @case
40
40
  when 'snake', 'as_is'
41
41
  params
42
42
  when 'camel'
43
43
  snakecase_keys(params)
44
44
  else
45
- raise Blackseep::Error, "unknown_case #{@case}"
45
+ raise Blacksheep::Error, "unknown_case #{@case}"
46
46
  end
47
47
  end
48
48
 
@@ -54,14 +54,22 @@ module Blacksheep
54
54
  # @return [Array, Hash] The rsult structure with keys converted to source caseing
55
55
  # @see #camelize_keys
56
56
  def transform_result(obj)
57
- case @case
57
+ is_action_result, data = if obj.kind_of?(Blacksheep::ActionResult)
58
+ [ true, obj.data ]
59
+ else
60
+ [ false, obj ]
61
+ end
62
+
63
+ converted_data = case @case
58
64
  when 'snake', 'as_is'
59
- obj
65
+ data
60
66
  when 'camel'
61
- camelize_keys(obj)
67
+ camelize_keys(data)
62
68
  else
63
- raise Blackseep::Error, "unknown_case #{@case}"
69
+ raise Blacksheep::Error, "unknown_case #{@case}"
64
70
  end
71
+
72
+ is_action_result ? obj.set_data(converted_data) : converted_data
65
73
  end
66
74
 
67
75
  #
@@ -1,10 +1,10 @@
1
1
  module Blacksheep
2
2
  module Decorators
3
3
 
4
- # @class Blacksheep::Decorators::Localozer
4
+ # @class Blacksheep::Decorators::Localizer
5
5
  class Localizer < ActionDecorator
6
6
 
7
- def call(params, **)
7
+ def call(params, current_user: nil, **options)
8
8
  if (locale = params[:_locale])
9
9
  I18n.with_locale(locale) do
10
10
  super
@@ -14,7 +14,8 @@ module Blacksheep
14
14
  end
15
15
  end
16
16
 
17
- def perform(params, **)
17
+ def perform(params, current_user: nil, **options)
18
+
18
19
  if (locale = params[:_locale])
19
20
  I18n.with_locale(locale) do
20
21
  super
@@ -5,19 +5,19 @@ module Blacksheep
5
5
  # @class Blacksheep::Decorators::ResultMatcher
6
6
  class ResultMatcher < ActionDecorator
7
7
  Matcher = -> {
8
- # Match `json_result` with status :ok for success
9
- success_case = Dry::Matcher::Case.new do |json_result, _|
10
- if json_result.success?
11
- json_result
8
+ # Match `action_result` with status :ok for success
9
+ success_case = Dry::Matcher::Case.new do |action_result, _|
10
+ if action_result.success?
11
+ action_result
12
12
  else
13
13
  # this is a constant from dry/core/constants
14
14
  Dry::Matcher::Undefined
15
15
  end
16
16
  end
17
17
 
18
- # Match `json_result` with status not :ok` for failure - other status' can be distinguished
19
- failure_case = Dry::Matcher::Case.new do |json_result, patterns|
20
- if !json_result.success! && (patterns.empty? || patterns.include?(json_result.status))
18
+ # Match `action_result` with status not :ok` for failure - other status' can be distinguished
19
+ failure_case = Dry::Matcher::Case.new do |action_result, patterns|
20
+ if !action_result.success! && (patterns.empty? || patterns.include?(action_result.status))
21
21
  value
22
22
  else
23
23
  Dry::Matcher::Undefined
@@ -31,12 +31,11 @@ module Blacksheep
31
31
  include Dry::Matcher.for(:call, with: Matcher)
32
32
 
33
33
  def call(*)
34
- puts matcher: "*" * 50
35
34
  super
36
35
  end
37
36
 
38
37
  def perform(*)
39
- raise Blackseep::Error, 'JsonResultMatcher does not support #perform'
38
+ raise Blacksheep::Error, 'ResultMatcher does not support #perform'
40
39
  end
41
40
 
42
41
  end
@@ -1,3 +1,3 @@
1
1
  module Blacksheep
2
- VERSION = "0.1.0"
2
+ VERSION = "0.3.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blacksheep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Schweizer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-17 00:00:00.000000000 Z
11
+ date: 2021-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-matcher
@@ -87,18 +87,20 @@ files:
87
87
  - lib/blacksheep.rb
88
88
  - lib/blacksheep/action.rb
89
89
  - lib/blacksheep/action_decorator.rb
90
+ - lib/blacksheep/action_error.rb
91
+ - lib/blacksheep/action_result.rb
90
92
  - lib/blacksheep/decorators/default_error_handler.rb
93
+ - lib/blacksheep/decorators/error_handler.rb
91
94
  - lib/blacksheep/decorators/json_transformer.rb
92
95
  - lib/blacksheep/decorators/localizer.rb
93
96
  - lib/blacksheep/decorators/result_matcher.rb
94
- - lib/blacksheep/json_meta.rb
95
- - lib/blacksheep/json_result.rb
96
97
  - lib/blacksheep/version.rb
97
98
  homepage: http://verticonaut.me
98
99
  licenses:
99
100
  - MIT
100
101
  metadata:
101
102
  homepage_uri: http://verticonaut.me
103
+ source_code_uri: https://github.com/verticonaut/blacksheep
102
104
  post_install_message:
103
105
  rdoc_options: []
104
106
  require_paths:
@@ -1,41 +0,0 @@
1
- module Blacksheep
2
- class JsonMeta
3
-
4
- attr_reader :json
5
-
6
- def initialize(json = {})
7
- @json = json
8
- end
9
-
10
- class << self
11
- def success(title: nil, detail: nil)
12
- new.success(title: title, detail: detail)
13
- end
14
- end
15
-
16
- def success(title: nil, detail: nil)
17
- result = {
18
- success: true,
19
- }
20
-
21
- if title.present?
22
- result[:title] = title
23
- elsif detail.present?
24
- result[:title] = 'Success'
25
- end
26
-
27
- result[:detail] = detail if detail.present?
28
-
29
- json[:result] = result
30
-
31
- self
32
- end
33
-
34
- def as_json
35
- {
36
- jsonMeta: json
37
- }
38
- end
39
-
40
- end
41
- end
@@ -1,43 +0,0 @@
1
- module Blacksheep
2
- class JsonResult
3
-
4
- attr_reader :json, :status
5
-
6
- def initialize(json, status)
7
- @json = json
8
- @status = status
9
- end
10
-
11
- def set_json(value)
12
- @json = value
13
-
14
- self
15
- end
16
-
17
- def set_status(value)
18
- @status = value
19
-
20
- self
21
- end
22
-
23
- def success?
24
- @status == :ok
25
- end
26
-
27
- def render(json_wrap: 'data')
28
- {
29
- json: wrap(json, json_wrap: json_wrap),
30
- status: status
31
- }
32
- end
33
-
34
- private
35
-
36
- def wrap(json, json_wrap:)
37
- wrap = success? ? json_wrap : nil
38
-
39
- wrap.present? ? { wrap => json } : json
40
- end
41
-
42
- end
43
- end