functions_framework 0.4.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,42 +0,0 @@
1
- # Copyright 2020 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module FunctionsFramework
16
- module CloudEvents
17
- ##
18
- # Base class for all CloudEvents errors.
19
- #
20
- class CloudEventsError < ::StandardError
21
- end
22
-
23
- ##
24
- # Errors indicating unsupported or incorrectly formatted HTTP content or
25
- # headers.
26
- #
27
- class HttpContentError < CloudEventsError
28
- end
29
-
30
- ##
31
- # Errors indicating an unsupported or incorrect spec version.
32
- #
33
- class SpecVersionError < CloudEventsError
34
- end
35
-
36
- ##
37
- # Errors related to CloudEvent attributes.
38
- #
39
- class AttributeError < CloudEventsError
40
- end
41
- end
42
- end
@@ -1,84 +0,0 @@
1
- # Copyright 2020 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require "date"
16
- require "uri"
17
-
18
- require "functions_framework/cloud_events/event/field_interpreter"
19
- require "functions_framework/cloud_events/event/v0"
20
- require "functions_framework/cloud_events/event/v1"
21
-
22
- module FunctionsFramework
23
- module CloudEvents
24
- ##
25
- # An Event object represents a complete CloudEvent, including both data and
26
- # context attributes. The following are true of all event objects:
27
- #
28
- # * Event classes are defined within this module. For example, events
29
- # conforming to the CloudEvents 1.0 specification are of type
30
- # {FunctionsFramework::CloudEvents::Event::V1}.
31
- # * All event classes include this module, so you can use
32
- # `is_a? FunctionsFramework::CloudEvents::Event` to test whether an
33
- # object is an event.
34
- # * All event objects are immutable. Data and atribute values can be
35
- # retrieved but not modified. To "modify" an event, make a copy with
36
- # the desired changes. Generally, event classes will provide a helper
37
- # method for this purpose.
38
- # * All event objects have a `spec_version` method that returns the
39
- # version of the CloudEvents spec implemented by that event. (Other
40
- # methods may be different, depending on the spec version.)
41
- #
42
- # To create an event, you may either:
43
- #
44
- # * Construct an instance of the event class directly, for example by
45
- # calling {Event::V1.new} and passing a set of attributes.
46
- # * Call {Event.create} and pass a spec version and a set of attributes.
47
- # This will choose the appropriate event class based on the version.
48
- # * Decode an event from another representation. For example, use
49
- # {CloudEvents::JsonFormat} to decode an event from JSON, or use
50
- # {CloudEvents::HttpBinding} to decode an event from an HTTP request.
51
- #
52
- # See https://github.com/cloudevents/spec for more information about
53
- # CloudEvents. The documentation for the individual event classes
54
- # {FunctionsFramework::CloudEvents::Event::V0} and
55
- # {FunctionsFramework::CloudEvents::Event::V1} also include links to their
56
- # respective specifications.
57
- #
58
- module Event
59
- class << self
60
- ##
61
- # Create a new cloud event object with the given version. Generally,
62
- # you must also pass additional keyword arguments providing the event's
63
- # data and attributes. For example, if you pass `1.0` as the
64
- # `spec_version`, the remaining keyword arguments will be passed
65
- # through to the {Event::V1.new} constructor.
66
- #
67
- # @param spec_version [String] The required `specversion` field.
68
- # @param kwargs [keywords] Additional parameters for the event.
69
- #
70
- def create spec_version:, **kwargs
71
- case spec_version
72
- when "0.3"
73
- V0.new spec_version: spec_version, **kwargs
74
- when /^1(\.|$)/
75
- V1.new spec_version: spec_version, **kwargs
76
- else
77
- raise SpecVersionError, "Unrecognized specversion: #{spec_version}"
78
- end
79
- end
80
- alias new create
81
- end
82
- end
83
- end
84
- end
@@ -1,150 +0,0 @@
1
- # Copyright 2020 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module FunctionsFramework
16
- module CloudEvents
17
- module Event
18
- ##
19
- # A helper that extracts and interprets event fields from an input hash.
20
- #
21
- # @private
22
- #
23
- class FieldInterpreter
24
- def initialize args
25
- @args = keys_to_strings args
26
- @attributes = {}
27
- end
28
-
29
- def finish_attributes
30
- @attributes.merge! @args
31
- @args = {}
32
- @attributes
33
- end
34
-
35
- def string keys, required: false
36
- object keys, required: required do |value|
37
- case value
38
- when ::String
39
- raise AttributeError, "The #{keys.first} field cannot be empty" if value.empty?
40
- [value, value]
41
- else
42
- raise AttributeError, "Illegal type for #{keys.first}:" \
43
- " String expected but #{value.class} found"
44
- end
45
- end
46
- end
47
-
48
- def uri keys, required: false
49
- object keys, required: required do |value|
50
- case value
51
- when ::String
52
- raise AttributeError, "The #{keys.first} field cannot be empty" if value.empty?
53
- begin
54
- [::URI.parse(value), value]
55
- rescue ::URI::InvalidURIError => e
56
- raise AttributeError, "Illegal format for #{keys.first}: #{e.message}"
57
- end
58
- when ::URI::Generic
59
- [value, value.to_s]
60
- else
61
- raise AttributeError, "Illegal type for #{keys.first}:" \
62
- " String or URI expected but #{value.class} found"
63
- end
64
- end
65
- end
66
-
67
- def rfc3339_date_time keys, required: false
68
- object keys, required: required do |value|
69
- case value
70
- when ::String
71
- begin
72
- [::DateTime.rfc3339(value), value]
73
- rescue ::Date::Error => e
74
- raise AttributeError, "Illegal format for #{keys.first}: #{e.message}"
75
- end
76
- when ::DateTime
77
- [value, value.rfc3339]
78
- when ::Time
79
- value = value.to_datetime
80
- [value, value.rfc3339]
81
- else
82
- raise AttributeError, "Illegal type for #{keys.first}:" \
83
- " String, Time, or DateTime expected but #{value.class} found"
84
- end
85
- end
86
- end
87
-
88
- def content_type keys, required: false
89
- object keys, required: required do |value|
90
- case value
91
- when ::String
92
- raise AttributeError, "The #{keys.first} field cannot be empty" if value.empty?
93
- [ContentType.new(value), value]
94
- when ContentType
95
- [value, value.to_s]
96
- else
97
- raise AttributeError, "Illegal type for #{keys.first}:" \
98
- " String, or ContentType expected but #{value.class} found"
99
- end
100
- end
101
- end
102
-
103
- def spec_version keys, accept:
104
- object keys, required: true do |value|
105
- case value
106
- when ::String
107
- raise SpecVersionError, "Unrecognized specversion: #{value}" unless accept =~ value
108
- [value, value]
109
- else
110
- raise AttributeError, "Illegal type for #{keys.first}:" \
111
- " String expected but #{value.class} found"
112
- end
113
- end
114
- end
115
-
116
- UNDEFINED = Object.new
117
-
118
- def object keys, required: false, allow_nil: false
119
- value = UNDEFINED
120
- keys.each do |key|
121
- key_present = @args.key? key
122
- val = @args.delete key
123
- value = val if allow_nil && key_present || !allow_nil && !val.nil?
124
- end
125
- if value == UNDEFINED
126
- raise AttributeError, "The #{keys.first} field is required" if required
127
- return nil
128
- end
129
- if block_given?
130
- converted, raw = yield value
131
- else
132
- converted = raw = value
133
- end
134
- @attributes[keys.first] = raw
135
- converted
136
- end
137
-
138
- private
139
-
140
- def keys_to_strings hash
141
- result = {}
142
- hash.each do |key, val|
143
- result[key.to_s] = val
144
- end
145
- result
146
- end
147
- end
148
- end
149
- end
150
- end
@@ -1,236 +0,0 @@
1
- # Copyright 2020 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- require "date"
16
- require "uri"
17
-
18
- module FunctionsFramework
19
- module CloudEvents
20
- module Event
21
- ##
22
- # A CloudEvents V0 data type.
23
- #
24
- # This object represents a complete CloudEvent, including the event data
25
- # and context attributes. It supports the standard required and optional
26
- # attributes defined in CloudEvents V0.3, and arbitrary extension
27
- # attributes. All attribute values can be obtained (in their string form)
28
- # via the {Event::V0#[]} method. Additionally, standard attributes have
29
- # their own accessor methods that may return typed objects (such as
30
- # `DateTime` for the `time` attribute).
31
- #
32
- # This object is immutable. The data and attribute values can be
33
- # retrieved but not modified. To obtain an event with modifications, use
34
- # the {#with} method to create a copy with the desired changes.
35
- #
36
- # See https://github.com/cloudevents/spec/blob/v0.3/spec.md for
37
- # descriptions of the standard attributes.
38
- #
39
- class V0
40
- include Event
41
-
42
- ##
43
- # Create a new cloud event object with the given data and attributes.
44
- #
45
- # Event attributes may be presented as keyword arguments, or as a Hash
46
- # passed in via the `attributes` argument (but not both).
47
- #
48
- # The following standard attributes are supported and exposed as
49
- # attribute methods on the object.
50
- #
51
- # * **:spec_version** (or **:specversion**) [`String`] - _required_ -
52
- # The CloudEvents spec version (i.e. the `specversion` field.)
53
- # * **:id** [`String`] - _required_ - The event `id` field.
54
- # * **:source** [`String`, `URI`] - _required_ - The event `source`
55
- # field.
56
- # * **:type** [`String`] - _required_ - The event `type` field.
57
- # * **:data** [`Object`] - _optional_ - The data associated with the
58
- # event (i.e. the `data` field.)
59
- # * **:data_content_encoding** (or **:datacontentencoding**)
60
- # [`String`] - _optional_ - The content-encoding for the data (i.e.
61
- # the `datacontentencoding` field.)
62
- # * **:data_content_type** (or **:datacontenttype**) [`String`,
63
- # {ContentType}] - _optional_ - The content-type for the data, if
64
- # the data is a string (i.e. the event `datacontenttype` field.)
65
- # * **:schema_url** (or **:schemaurl**) [`String`, `URI`] -
66
- # _optional_ - The event `schemaurl` field.
67
- # * **:subject** [`String`] - _optional_ - The event `subject` field.
68
- # * **:time** [`String`, `DateTime`, `Time`] - _optional_ - The
69
- # event `time` field.
70
- #
71
- # Any additional attributes are assumed to be extension attributes.
72
- # They are not available as separate methods, but can be accessed via
73
- # the {Event::V1#[]} operator.
74
- #
75
- # @param attributes [Hash] The data and attributes, as a hash.
76
- # @param args [keywords] The data and attributes, as keyword arguments.
77
- #
78
- def initialize attributes: nil, **args
79
- interpreter = FieldInterpreter.new attributes || args
80
- @spec_version = interpreter.spec_version ["specversion", "spec_version"], accept: /^0\.3$/
81
- @id = interpreter.string ["id"], required: true
82
- @source = interpreter.uri ["source"], required: true
83
- @type = interpreter.string ["type"], required: true
84
- @data = interpreter.object ["data"], allow_nil: true
85
- @data_content_encoding = interpreter.string ["datacontentencoding", "data_content_encoding"]
86
- @data_content_type = interpreter.content_type ["datacontenttype", "data_content_type"]
87
- @schema_url = interpreter.uri ["schemaurl", "schema_url"]
88
- @subject = interpreter.string ["subject"]
89
- @time = interpreter.rfc3339_date_time ["time"]
90
- @attributes = interpreter.finish_attributes
91
- end
92
-
93
- ##
94
- # Create and return a copy of this event with the given changes. See
95
- # the constructor for the parameters that can be passed. In general,
96
- # you can pass a new value for any attribute, or pass `nil` to remove
97
- # an optional attribute.
98
- #
99
- # @param changes [keywords] See {#initialize} for a list of arguments.
100
- # @return [FunctionFramework::CloudEvents::Event]
101
- #
102
- def with **changes
103
- attributes = @attributes.merge changes
104
- V0.new attributes: attributes
105
- end
106
-
107
- ##
108
- # Return the value of the given named attribute. Both standard and
109
- # extension attributes are supported.
110
- #
111
- # Attribute names must be given as defined in the standard CloudEvents
112
- # specification. For example `specversion` rather than `spec_version`.
113
- #
114
- # Results are given in their "raw" form, generally a string. This may
115
- # be different from the Ruby object returned from corresponding
116
- # attribute methods. For example:
117
- #
118
- # event["time"] # => String rfc3339 representation
119
- # event.time # => DateTime object
120
- #
121
- # @param key [String,Symbol] The attribute name.
122
- # @return [String,nil]
123
- #
124
- def [] key
125
- @attributes[key.to_s]
126
- end
127
-
128
- ##
129
- # Return a hash representation of this event.
130
- #
131
- # @return [Hash]
132
- #
133
- def to_h
134
- @attributes.dup
135
- end
136
-
137
- ##
138
- # The `id` field. Required.
139
- #
140
- # @return [String]
141
- #
142
- attr_reader :id
143
-
144
- ##
145
- # The `source` field as a `URI` object. Required.
146
- #
147
- # @return [URI]
148
- #
149
- attr_reader :source
150
-
151
- ##
152
- # The `type` field. Required.
153
- #
154
- # @return [String]
155
- #
156
- attr_reader :type
157
-
158
- ##
159
- # The `specversion` field. Required.
160
- #
161
- # @return [String]
162
- #
163
- attr_reader :spec_version
164
- alias specversion spec_version
165
-
166
- ##
167
- # The event-specific data, or `nil` if there is no data.
168
- #
169
- # Data may be one of the following types:
170
- # * Binary data, represented by a `String` using the `ASCII-8BIT`
171
- # encoding.
172
- # * A string in some other encoding such as `UTF-8` or `US-ASCII`.
173
- # * Any JSON data type, such as a Boolean, Integer, Array, Hash, or
174
- # `nil`.
175
- #
176
- # @return [Object]
177
- #
178
- attr_reader :data
179
-
180
- ##
181
- # The optional `datacontentencoding` field as a `String` object, or
182
- # `nil` if the field is absent.
183
- #
184
- # @return [String,nil]
185
- #
186
- attr_reader :data_content_encoding
187
- alias datacontentencoding data_content_encoding
188
-
189
- ##
190
- # The optional `datacontenttype` field as a
191
- # {FunctionsFramework::CloudEvents::ContentType} object, or `nil` if
192
- # the field is absent.
193
- #
194
- # @return [FunctionsFramework::CloudEvents::ContentType,nil]
195
- #
196
- attr_reader :data_content_type
197
- alias datacontenttype data_content_type
198
-
199
- ##
200
- # The optional `schemaurl` field as a `URI` object, or `nil` if the
201
- # field is absent.
202
- #
203
- # @return [URI,nil]
204
- #
205
- attr_reader :schema_url
206
- alias schemaurl schema_url
207
-
208
- ##
209
- # The optional `subject` field, or `nil` if the field is absent.
210
- #
211
- # @return [String,nil]
212
- #
213
- attr_reader :subject
214
-
215
- ##
216
- # The optional `time` field as a `DateTime` object, or `nil` if the
217
- # field is absent.
218
- #
219
- # @return [DateTime,nil]
220
- #
221
- attr_reader :time
222
-
223
- ## @private
224
- def == other
225
- other.is_a?(V1) && @attributes == other.instance_variable_get(:@attributes)
226
- end
227
- alias eql? ==
228
-
229
- ## @private
230
- def hash
231
- @hash ||= @attributes.hash
232
- end
233
- end
234
- end
235
- end
236
- end