functions_framework 0.3.1 → 0.5.2
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 +4 -4
- data/CHANGELOG.md +32 -1
- data/README.md +9 -9
- data/docs/deploying-functions.md +29 -14
- data/docs/overview.md +4 -4
- data/docs/testing-functions.md +9 -11
- data/docs/writing-functions.md +38 -26
- data/lib/functions_framework.rb +11 -18
- data/lib/functions_framework/function.rb +82 -23
- data/lib/functions_framework/legacy_event_converter.rb +29 -30
- data/lib/functions_framework/registry.rb +2 -16
- data/lib/functions_framework/server.rb +20 -14
- data/lib/functions_framework/testing.rb +24 -12
- data/lib/functions_framework/version.rb +1 -1
- metadata +22 -106
- data/lib/functions_framework/cloud_events.rb +0 -43
- data/lib/functions_framework/cloud_events/content_type.rb +0 -139
- data/lib/functions_framework/cloud_events/errors.rb +0 -42
- data/lib/functions_framework/cloud_events/event.rb +0 -79
- data/lib/functions_framework/cloud_events/event/v1.rb +0 -363
- data/lib/functions_framework/cloud_events/http_binding.rb +0 -270
- data/lib/functions_framework/cloud_events/json_format.rb +0 -122
@@ -16,22 +16,59 @@ module FunctionsFramework
|
|
16
16
|
##
|
17
17
|
# Representation of a function.
|
18
18
|
#
|
19
|
-
# A function has a name, a type, and
|
19
|
+
# A function has a name, a type, and an implementation.
|
20
|
+
#
|
21
|
+
# The implementation in general is an object that responds to the `call`
|
22
|
+
# method. For a function of type `:http`, the `call` method takes a single
|
23
|
+
# `Rack::Request` argument and returns one of various HTTP response types.
|
24
|
+
# See {FunctionsFramework::Registry.add_http}. For a function of type
|
25
|
+
# `:cloud_event`, the `call` method takes a single
|
26
|
+
# [CloudEvent](https://cloudevents.github.io/sdk-ruby/latest/CloudEvents/Event)
|
27
|
+
# argument, and does not return a value.
|
28
|
+
# See {FunctionsFramework::Registry.add_cloud_event}.
|
29
|
+
#
|
30
|
+
# If a callable object is provided directly, its `call` method is invoked for
|
31
|
+
# every function execution. Note that this means it may be called multiple
|
32
|
+
# times concurrently in separate threads.
|
33
|
+
#
|
34
|
+
# Alternately, the implementation may be provided as a class that should be
|
35
|
+
# instantiated to produce a callable object. If a class is provided, it should
|
36
|
+
# either subclass {FunctionsFramework::Function::CallBase} or respond to the
|
37
|
+
# same constructor interface, i.e. accepting arbitrary keyword arguments. A
|
38
|
+
# separate callable object will be instantiated from this class for every
|
39
|
+
# function invocation, so each instance will be used for only one invocation.
|
40
|
+
#
|
41
|
+
# Finally, an implementation can be provided as a block. If a block is
|
42
|
+
# provided, it will be recast as a `call` method in an anonymous subclass of
|
43
|
+
# {FunctionsFramework::Function::CallBase}. Thus, providing a block is really
|
44
|
+
# just syntactic sugar for providing a class. (This means, for example, that
|
45
|
+
# the `return` keyword will work within the block because it is treated as a
|
46
|
+
# method.)
|
20
47
|
#
|
21
48
|
class Function
|
22
49
|
##
|
23
50
|
# Create a new function definition.
|
24
51
|
#
|
25
52
|
# @param name [String] The function name
|
26
|
-
# @param type [Symbol] The type of function. Valid types are
|
27
|
-
# `:
|
28
|
-
# @param
|
53
|
+
# @param type [Symbol] The type of function. Valid types are `:http` and
|
54
|
+
# `:cloud_event`.
|
55
|
+
# @param callable [Class,#call] A callable object or class.
|
56
|
+
# @param block [Proc] The function code as a block.
|
29
57
|
#
|
30
|
-
def initialize name, type, &block
|
58
|
+
def initialize name, type, callable = nil, &block
|
31
59
|
@name = name
|
32
60
|
@type = type
|
33
|
-
@
|
34
|
-
|
61
|
+
@callable = @callable_class = nil
|
62
|
+
if callable.respond_to? :call
|
63
|
+
@callable = callable
|
64
|
+
elsif callable.is_a? ::Class
|
65
|
+
@callable_class = callable
|
66
|
+
elsif block_given?
|
67
|
+
@callable_class = ::Class.new CallBase do
|
68
|
+
define_method :call, &block
|
69
|
+
end
|
70
|
+
else
|
71
|
+
raise ::ArgumentError, "No callable given for function"
|
35
72
|
end
|
36
73
|
end
|
37
74
|
|
@@ -46,26 +83,48 @@ module FunctionsFramework
|
|
46
83
|
attr_reader :type
|
47
84
|
|
48
85
|
##
|
49
|
-
#
|
50
|
-
#
|
86
|
+
# Get a callable for performing a function invocation. This will either
|
87
|
+
# return the singleton callable object, or instantiate a new callable from
|
88
|
+
# the configured class.
|
51
89
|
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
# {FunctionsFramework::CloudEvents::Event} argument, and does not
|
56
|
-
# return a value. See {FunctionsFramework::Registry.add_cloud_event}.
|
90
|
+
# @param logger [::Logger] The logger for use by function executions. This
|
91
|
+
# may or may not be used by the callable.
|
92
|
+
# @return [#call]
|
57
93
|
#
|
58
|
-
|
59
|
-
|
94
|
+
def new_call logger: nil
|
95
|
+
return @callable unless @callable.nil?
|
96
|
+
logger ||= FunctionsFramework.logger
|
97
|
+
@callable_class.new logger: logger, function_name: name, function_type: type
|
98
|
+
end
|
99
|
+
|
100
|
+
##
|
101
|
+
# A base class for a callable object that provides calling context.
|
60
102
|
#
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
103
|
+
# An object of this class is `self` while a function block is running.
|
104
|
+
#
|
105
|
+
class CallBase
|
106
|
+
##
|
107
|
+
# Create a callable object with the given context.
|
108
|
+
#
|
109
|
+
# @param context [keywords] A set of context arguments. See {#context} for
|
110
|
+
# a list of keys that will generally be passed in. However,
|
111
|
+
# implementations should be prepared to accept any abritrary keys.
|
112
|
+
#
|
113
|
+
def initialize **context
|
114
|
+
@context = context
|
68
115
|
end
|
116
|
+
|
117
|
+
##
|
118
|
+
# A keyed hash of context information. Common context keys include:
|
119
|
+
#
|
120
|
+
# * **:logger** (`Logger`) A logger for use by this function call.
|
121
|
+
# * **:function_name** (`String`) The name of the running function.
|
122
|
+
# * **:function_type** (`Symbol`) The type of the running function,
|
123
|
+
# either `:http` or `:cloud_event`.
|
124
|
+
#
|
125
|
+
# @return [Hash]
|
126
|
+
#
|
127
|
+
attr_reader :context
|
69
128
|
end
|
70
129
|
end
|
71
130
|
end
|
@@ -23,19 +23,17 @@ module FunctionsFramework
|
|
23
23
|
# Decode an event from the given Rack environment hash.
|
24
24
|
#
|
25
25
|
# @param env [Hash] The Rack environment
|
26
|
-
# @return [
|
27
|
-
# be converted
|
26
|
+
# @return [::CloudEvents::Event] if the request could be converted
|
28
27
|
# @return [nil] if the event format was not recognized.
|
29
28
|
#
|
30
29
|
def decode_rack_env env
|
31
|
-
content_type = CloudEvents::ContentType.new env["CONTENT_TYPE"]
|
32
|
-
return nil unless content_type.media_type == "application" && content_type.
|
30
|
+
content_type = ::CloudEvents::ContentType.new env["CONTENT_TYPE"]
|
31
|
+
return nil unless content_type.media_type == "application" && content_type.subtype_base == "json"
|
33
32
|
input = read_input_json env["rack.input"], content_type.charset
|
34
33
|
return nil unless input
|
35
|
-
|
36
|
-
context = normalized_context raw_context
|
34
|
+
context = normalized_context input
|
37
35
|
return nil unless context
|
38
|
-
construct_cloud_event context, input["data"]
|
36
|
+
construct_cloud_event context, input["data"], content_type.charset
|
39
37
|
end
|
40
38
|
|
41
39
|
private
|
@@ -50,27 +48,27 @@ module FunctionsFramework
|
|
50
48
|
nil
|
51
49
|
end
|
52
50
|
|
53
|
-
def normalized_context
|
54
|
-
|
55
|
-
|
56
|
-
timestamp = raw_context["timestamp"]
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
return nil unless service && resource
|
51
|
+
def normalized_context input
|
52
|
+
raw_context = input["context"]
|
53
|
+
id = raw_context&.[]("eventId") || input["eventId"]
|
54
|
+
timestamp = raw_context&.[]("timestamp") || input["timestamp"]
|
55
|
+
type = raw_context&.[]("eventType") || input["eventType"]
|
56
|
+
service, resource = analyze_resource raw_context&.[]("resource") || input["resource"]
|
57
|
+
service ||= service_from_type type
|
58
|
+
return nil unless id && timestamp && type && service && resource
|
62
59
|
{ id: id, timestamp: timestamp, type: type, service: service, resource: resource }
|
63
60
|
end
|
64
61
|
|
65
|
-
def analyze_resource raw_resource
|
62
|
+
def analyze_resource raw_resource
|
63
|
+
service = resource = nil
|
66
64
|
case raw_resource
|
67
65
|
when ::Hash
|
68
|
-
|
66
|
+
service = raw_resource["service"]
|
67
|
+
resource = raw_resource["name"]
|
69
68
|
when ::String
|
70
|
-
|
71
|
-
else
|
72
|
-
[nil, nil]
|
69
|
+
resource = raw_resource
|
73
70
|
end
|
71
|
+
[service, resource]
|
74
72
|
end
|
75
73
|
|
76
74
|
def service_from_type type
|
@@ -80,19 +78,20 @@ module FunctionsFramework
|
|
80
78
|
nil
|
81
79
|
end
|
82
80
|
|
83
|
-
def construct_cloud_event context, data
|
81
|
+
def construct_cloud_event context, data, charset
|
84
82
|
source, subject = convert_source context[:service], context[:resource]
|
85
83
|
type = LEGACY_TYPE_TO_CE_TYPE[context[:type]]
|
86
84
|
return nil unless type && source
|
87
85
|
ce_data = convert_data context[:service], data
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
86
|
+
content_type = "application/json; charset=#{charset}"
|
87
|
+
::CloudEvents::Event.new id: context[:id],
|
88
|
+
source: source,
|
89
|
+
type: type,
|
90
|
+
spec_version: "1.0",
|
91
|
+
data_content_type: content_type,
|
92
|
+
data: ce_data,
|
93
|
+
subject: subject,
|
94
|
+
time: context[:timestamp]
|
96
95
|
end
|
97
96
|
|
98
97
|
def convert_source service, resource
|
@@ -75,27 +75,13 @@ module FunctionsFramework
|
|
75
75
|
self
|
76
76
|
end
|
77
77
|
|
78
|
-
##
|
79
|
-
# This is an obsolete interface that defines an event function taking two
|
80
|
-
# arguments (data and context) rather than one.
|
81
|
-
#
|
82
|
-
# @deprecated Use {Registry#add_cloud_event} instead.
|
83
|
-
#
|
84
|
-
def add_event name, &block
|
85
|
-
name = name.to_s
|
86
|
-
synchronize do
|
87
|
-
raise ::ArgumentError, "Function already defined: #{name}" if @functions.key? name
|
88
|
-
@functions[name] = Function.new name, :event, &block
|
89
|
-
end
|
90
|
-
self
|
91
|
-
end
|
92
|
-
|
93
78
|
##
|
94
79
|
# Add a CloudEvent function to the registry.
|
95
80
|
#
|
96
81
|
# You must provide a name for the function, and a block that implemets the
|
97
82
|
# function. The block should take _one_ argument: the event object of type
|
98
|
-
#
|
83
|
+
# [`CloudEvents::Event`](https://cloudevents.github.io/sdk-ruby/latest/CloudEvents/Event).
|
84
|
+
# Any return value is ignored.
|
99
85
|
#
|
100
86
|
# @param name [String] The function name
|
101
87
|
# @param block [Proc] The function code as a proc
|
@@ -47,7 +47,7 @@ module FunctionsFramework
|
|
47
47
|
case function.type
|
48
48
|
when :http
|
49
49
|
HttpApp.new function, @config
|
50
|
-
when :
|
50
|
+
when :cloud_event
|
51
51
|
EventApp.new function, @config
|
52
52
|
else
|
53
53
|
raise "Unrecognized function type: #{function.type}"
|
@@ -149,8 +149,12 @@ module FunctionsFramework
|
|
149
149
|
::Signal.trap "SIGINT" do
|
150
150
|
Server.signal_enqueue "SIGINT", @config.logger, @server
|
151
151
|
end
|
152
|
-
|
153
|
-
|
152
|
+
begin
|
153
|
+
::Signal.trap "SIGHUP" do
|
154
|
+
Server.signal_enqueue "SIGHUP", @config.logger, @server
|
155
|
+
end
|
156
|
+
rescue ::ArgumentError # rubocop:disable Lint/HandleExceptions
|
157
|
+
# Not available on all systems
|
154
158
|
end
|
155
159
|
@signals_installed = true
|
156
160
|
end
|
@@ -340,7 +344,7 @@ module FunctionsFramework
|
|
340
344
|
string_response response, "text/plain", 200
|
341
345
|
when ::Hash
|
342
346
|
string_response ::JSON.dump(response), "application/json", 200
|
343
|
-
when CloudEvents::CloudEventsError
|
347
|
+
when ::CloudEvents::CloudEventsError
|
344
348
|
cloud_events_error_response response
|
345
349
|
when ::StandardError
|
346
350
|
error_response "#{response.class}: #{response.message}\n#{response.backtrace}\n"
|
@@ -384,10 +388,11 @@ module FunctionsFramework
|
|
384
388
|
return notfound_response if excluded_path? env
|
385
389
|
response =
|
386
390
|
begin
|
387
|
-
logger = env["rack.logger"]
|
391
|
+
logger = env["rack.logger"] ||= @config.logger
|
388
392
|
request = ::Rack::Request.new env
|
389
393
|
logger.info "FunctionsFramework: Handling HTTP #{request.request_method} request"
|
390
|
-
@function.
|
394
|
+
calling_context = @function.new_call logger: logger
|
395
|
+
calling_context.call request
|
391
396
|
rescue ::StandardError => e
|
392
397
|
e
|
393
398
|
end
|
@@ -400,21 +405,21 @@ module FunctionsFramework
|
|
400
405
|
def initialize function, config
|
401
406
|
super config
|
402
407
|
@function = function
|
403
|
-
@cloud_events = CloudEvents::HttpBinding.default
|
408
|
+
@cloud_events = ::CloudEvents::HttpBinding.default
|
404
409
|
@legacy_events = LegacyEventConverter.new
|
405
410
|
end
|
406
411
|
|
407
412
|
def call env
|
408
413
|
return notfound_response if excluded_path? env
|
409
|
-
logger = env["rack.logger"]
|
414
|
+
logger = env["rack.logger"] ||= @config.logger
|
410
415
|
event = decode_event env
|
411
416
|
response =
|
412
417
|
case event
|
413
|
-
when CloudEvents::Event
|
418
|
+
when ::CloudEvents::Event
|
414
419
|
handle_cloud_event event, logger
|
415
420
|
when ::Array
|
416
|
-
CloudEvents::HttpContentError.new "Batched CloudEvents are not supported"
|
417
|
-
when CloudEvents::CloudEventsError
|
421
|
+
::CloudEvents::HttpContentError.new "Batched CloudEvents are not supported"
|
422
|
+
when ::CloudEvents::CloudEventsError
|
418
423
|
event
|
419
424
|
else
|
420
425
|
raise "Unexpected event type: #{event.class}"
|
@@ -427,14 +432,15 @@ module FunctionsFramework
|
|
427
432
|
def decode_event env
|
428
433
|
@cloud_events.decode_rack_env(env) ||
|
429
434
|
@legacy_events.decode_rack_env(env) ||
|
430
|
-
raise(CloudEvents::HttpContentError, "Unrecognized event format")
|
431
|
-
rescue CloudEvents::CloudEventsError => e
|
435
|
+
raise(::CloudEvents::HttpContentError, "Unrecognized event format")
|
436
|
+
rescue ::CloudEvents::CloudEventsError => e
|
432
437
|
e
|
433
438
|
end
|
434
439
|
|
435
440
|
def handle_cloud_event event, logger
|
436
441
|
logger.info "FunctionsFramework: Handling CloudEvent"
|
437
|
-
@function.
|
442
|
+
calling_context = @function.new_call logger: logger
|
443
|
+
calling_context.call event
|
438
444
|
"ok"
|
439
445
|
rescue ::StandardError => e
|
440
446
|
e
|
@@ -87,7 +87,7 @@ module FunctionsFramework
|
|
87
87
|
function = ::FunctionsFramework.global_registry[name]
|
88
88
|
case function&.type
|
89
89
|
when :http
|
90
|
-
Testing.interpret_response { function.call request }
|
90
|
+
Testing.interpret_response { function.new_call.call request }
|
91
91
|
when nil
|
92
92
|
raise "Unknown function name #{name}"
|
93
93
|
else
|
@@ -97,17 +97,17 @@ module FunctionsFramework
|
|
97
97
|
|
98
98
|
##
|
99
99
|
# Call the given event function for testing. The underlying function must
|
100
|
-
# be of type
|
100
|
+
# be of type :cloud_event`.
|
101
101
|
#
|
102
102
|
# @param name [String] The name of the function to call
|
103
|
-
# @param event [
|
103
|
+
# @param event [::CloudEvents::Event] The event to send
|
104
104
|
# @return [nil]
|
105
105
|
#
|
106
106
|
def call_event name, event
|
107
107
|
function = ::FunctionsFramework.global_registry[name]
|
108
108
|
case function&.type
|
109
|
-
when :
|
110
|
-
function.call event
|
109
|
+
when :cloud_event
|
110
|
+
function.new_call.call event
|
111
111
|
nil
|
112
112
|
when nil
|
113
113
|
raise "Unknown function name #{name}"
|
@@ -174,23 +174,35 @@ module FunctionsFramework
|
|
174
174
|
# @param source [String,URI] Event source (optional)
|
175
175
|
# @param type [String] Event type (optional)
|
176
176
|
# @param spec_version [String] Spec version (optional)
|
177
|
-
# @param data_content_type [String
|
177
|
+
# @param data_content_type [String,::CloudEvents::ContentType]
|
178
178
|
# Content type for the data (optional)
|
179
179
|
# @param data_schema [String,URI] Data schema (optional)
|
180
180
|
# @param subject [String] Subject (optional)
|
181
181
|
# @param time [String,DateTime] Event timestamp (optional)
|
182
|
-
# @return [
|
182
|
+
# @return [::CloudEvents::Event]
|
183
183
|
#
|
184
184
|
def make_cloud_event data,
|
185
|
-
id: nil,
|
186
|
-
|
185
|
+
id: nil,
|
186
|
+
source: nil,
|
187
|
+
type: nil,
|
188
|
+
spec_version: nil,
|
189
|
+
data_content_type: nil,
|
190
|
+
data_schema: nil,
|
191
|
+
subject: nil,
|
192
|
+
time: nil
|
187
193
|
id ||= "random-id-#{rand 100_000_000}"
|
188
194
|
source ||= "functions-framework-testing"
|
189
195
|
type ||= "com.example.test"
|
190
196
|
spec_version ||= "1.0"
|
191
|
-
CloudEvents::Event.new id:
|
192
|
-
|
193
|
-
|
197
|
+
::CloudEvents::Event.new id: id,
|
198
|
+
source: source,
|
199
|
+
type: type,
|
200
|
+
spec_version: spec_version,
|
201
|
+
data_content_type: data_content_type,
|
202
|
+
data_schema: data_schema,
|
203
|
+
subject: subject,
|
204
|
+
time: time,
|
205
|
+
data: data
|
194
206
|
end
|
195
207
|
|
196
208
|
extend self
|
metadata
CHANGED
@@ -1,142 +1,61 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: functions_framework
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Azuma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: cloud_events
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: puma
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '4.3'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: google-style
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 1.24.0
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 1.24.0
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: minitest
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '5.13'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '5.13'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: minitest-focus
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.1'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.1'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: minitest-rg
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '5.2'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '5.2'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: redcarpet
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '3.5'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '3.5'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: toys
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 0.10.0
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: 0.10.0
|
40
|
+
version: '4.3'
|
125
41
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
42
|
+
name: rack
|
127
43
|
requirement: !ruby/object:Gem::Requirement
|
128
44
|
requirements:
|
129
45
|
- - "~>"
|
130
46
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
132
|
-
type: :
|
47
|
+
version: '2.1'
|
48
|
+
type: :runtime
|
133
49
|
prerelease: false
|
134
50
|
version_requirements: !ruby/object:Gem::Requirement
|
135
51
|
requirements:
|
136
52
|
- - "~>"
|
137
53
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
139
|
-
description: The Functions Framework
|
54
|
+
version: '2.1'
|
55
|
+
description: The Functions Framework is an open source framework for writing lightweight,
|
56
|
+
portable Ruby functions that run in a serverless environment. Functions written
|
57
|
+
to this Framework will run Google Cloud Google Cloud Functions, Google Cloud Run,
|
58
|
+
or any other Knative-based environment.
|
140
59
|
email:
|
141
60
|
- dazuma@google.com
|
142
61
|
executables:
|
@@ -158,13 +77,6 @@ files:
|
|
158
77
|
- docs/writing-functions.md
|
159
78
|
- lib/functions_framework.rb
|
160
79
|
- lib/functions_framework/cli.rb
|
161
|
-
- lib/functions_framework/cloud_events.rb
|
162
|
-
- lib/functions_framework/cloud_events/content_type.rb
|
163
|
-
- lib/functions_framework/cloud_events/errors.rb
|
164
|
-
- lib/functions_framework/cloud_events/event.rb
|
165
|
-
- lib/functions_framework/cloud_events/event/v1.rb
|
166
|
-
- lib/functions_framework/cloud_events/http_binding.rb
|
167
|
-
- lib/functions_framework/cloud_events/json_format.rb
|
168
80
|
- lib/functions_framework/function.rb
|
169
81
|
- lib/functions_framework/legacy_event_converter.rb
|
170
82
|
- lib/functions_framework/registry.rb
|
@@ -174,7 +86,11 @@ files:
|
|
174
86
|
homepage: https://github.com/GoogleCloudPlatform/functions-framework-ruby
|
175
87
|
licenses:
|
176
88
|
- Apache-2.0
|
177
|
-
metadata:
|
89
|
+
metadata:
|
90
|
+
changelog_uri: https://googlecloudplatform.github.io/functions-framework-ruby/v0.5.2/file.CHANGELOG.html
|
91
|
+
source_code_uri: https://github.com/GoogleCloudPlatform/functions-framework-ruby
|
92
|
+
bug_tracker_uri: https://github.com/GoogleCloudPlatform/functions-framework-ruby/issues
|
93
|
+
documentation_uri: https://googlecloudplatform.github.io/functions-framework-ruby/v0.5.2
|
178
94
|
post_install_message:
|
179
95
|
rdoc_options: []
|
180
96
|
require_paths:
|
@@ -190,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
106
|
- !ruby/object:Gem::Version
|
191
107
|
version: '0'
|
192
108
|
requirements: []
|
193
|
-
rubygems_version: 3.
|
109
|
+
rubygems_version: 3.0.3
|
194
110
|
signing_key:
|
195
111
|
specification_version: 4
|
196
112
|
summary: Functions Framework for Ruby
|