Skip to content

Commit 1dede51

Browse files
authored
Release v0.3.4 (#18)
* fix rubynext integration * bump version & update changelog
1 parent bf5ef19 commit 1dede51

6 files changed

Lines changed: 188 additions & 2 deletions

File tree

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
/spec/reports/
88
/tmp/
99

10-
.rbnext/
1110
gemfiles/*.lock
1211

1312
Gemfile.lock

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,7 @@
3737
- Finish readme
3838
- Fix callbacks broken by `prepend` change
3939
- Add more tests for `#process` public interface
40+
41+
# [0.3.4] - 2023-05-02
42+
43+
- Fix RubyNext runtime integration
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# frozen_string_literal: true
2+
3+
require "forwardable"
4+
5+
module ActiveFunction
6+
class ParameterMissingError < Error
7+
MESSAGE_TEMPLATE = "Missing parameter: %s"
8+
9+
attr_reader :message
10+
11+
def initialize(param)
12+
MESSAGE_TEMPLATE % param
13+
end
14+
end
15+
16+
class UnpermittedParameterError < Error
17+
MESSAGE_TEMPLATE = "Unpermitted parameter: %s"
18+
19+
attr_reader :message
20+
21+
def initialize(param)
22+
MESSAGE_TEMPLATE % param
23+
end
24+
end
25+
26+
module Functions
27+
module StrongParameters
28+
def params
29+
@_params ||= Parameters.new(@request)
30+
end
31+
32+
class Parameters
33+
extend Forwardable
34+
def_delegators :@parameters, :each, :map
35+
include Enumerable
36+
37+
def initialize(parameters, permitted: false)
38+
@parameters = parameters
39+
@permitted = permitted
40+
end
41+
42+
def [](attribute)
43+
nested_attribute(parameters[attribute])
44+
end
45+
46+
def require(attribute)
47+
value = self[attribute]
48+
49+
raise ParameterMissingError, attribute if value.nil?
50+
51+
value
52+
end
53+
54+
def permit(*attributes)
55+
pparams = {}
56+
57+
attributes.each do |attribute|
58+
if attribute.is_a? Hash
59+
attribute.each do |k, v|
60+
pparams[k] = process_nested(self[k], :permit, v)
61+
end
62+
else
63+
next unless parameters.key?(attribute)
64+
65+
pparams[attribute] = self[attribute]
66+
end
67+
end
68+
69+
Parameters.new(pparams, permitted: true)
70+
end
71+
72+
def to_h
73+
raise UnpermittedParameterError, parameters.keys unless @permitted
74+
75+
parameters.transform_values { |_1| process_nested(_1, :to_h) }
76+
end
77+
78+
private
79+
80+
def nested_attribute(attribute)
81+
if attribute.is_a? Hash
82+
Parameters.new(attribute)
83+
elsif attribute.is_a?(Array) && attribute[0].is_a?(Hash)
84+
attribute.map { |_1| Parameters.new(_1) }
85+
else
86+
attribute
87+
end
88+
end
89+
90+
def process_nested(attribute, method, options = [])
91+
if attribute.is_a? Parameters
92+
attribute.send(method, *options)
93+
elsif attribute.is_a?(Array) && attribute[0].is_a?(Parameters)
94+
attribute.map { |_1| _1.send(method, *options) }
95+
else
96+
attribute
97+
end
98+
end
99+
100+
attr_reader :parameters
101+
end
102+
end
103+
end
104+
end
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# frozen_string_literal: true
2+
3+
module ActiveFunction
4+
class MissingRouteMethod < Error
5+
MESSAGE_TEMPLATE = "Missing function route: %s"
6+
7+
attr_reader :message
8+
9+
def initialize(context)
10+
@message = MESSAGE_TEMPLATE % context
11+
end
12+
end
13+
14+
class NotRenderedError < Error
15+
MESSAGE_TEMPLATE = "render was not called: %s"
16+
17+
attr_reader :message
18+
19+
def initialize(context)
20+
@message = MESSAGE_TEMPLATE % context
21+
end
22+
end
23+
24+
module Functions
25+
module Core
26+
attr_reader :action_name, :request, :response
27+
28+
def dispatch(action_name, request, response)
29+
@action_name = action_name
30+
@request = request
31+
@response = response
32+
33+
raise MissingRouteMethod, @action_name unless respond_to?(action_name)
34+
35+
process(@action_name)
36+
37+
raise NotRenderedError, @action_name unless performed?
38+
39+
@response.to_h
40+
end
41+
42+
private
43+
44+
def process(action) ; public_send(action); end
45+
46+
def performed? ; @response.committed?; end
47+
end
48+
end
49+
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# frozen_string_literal: true
2+
3+
module ActiveFunction
4+
module Functions
5+
class Response
6+
attr_accessor :status, :headers, :body
7+
8+
def initialize(status: 200, headers: {}, body: nil)
9+
@status = status
10+
@headers = headers
11+
@body = body
12+
@committed = false
13+
end
14+
15+
def to_h
16+
{
17+
statusCode: status,
18+
headers: headers,
19+
body: body
20+
}
21+
end
22+
23+
def commit!
24+
@committed = true
25+
end
26+
27+
def committed? ; @committed; end
28+
end
29+
end
30+
end

lib/active_function/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module ActiveFunction
4-
VERSION = "0.3.3"
4+
VERSION = "0.3.4"
55
end

0 commit comments

Comments
 (0)